From a22660a146c1ebe2223f0eca8580afd2f35eea49 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 23 Oct 2024 22:08:26 +0100 Subject: [PATCH 01/25] WIP: console game --- src/Command/GameFlagsCommand.php | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/Command/GameFlagsCommand.php diff --git a/src/Command/GameFlagsCommand.php b/src/Command/GameFlagsCommand.php new file mode 100644 index 0000000..334ed95 --- /dev/null +++ b/src/Command/GameFlagsCommand.php @@ -0,0 +1,80 @@ +flagsGenerator = new FlagsGenerator(); + $this->isoCodes = FlagsGenerator::getAvailableCodes(); + } + + protected function configure(): void + { + $this + ->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description') + ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $output->setDecorated(true); // Ensures proper emoji and color support + + + $io = new SymfonyStyle($input, $output); + $arg1 = $input->getArgument('arg1'); + + if ($arg1) { + $io->note(sprintf('You passed an argument: %s', $arg1)); + } + + if ($input->getOption('option1')) { + // ... + } + + $choices = []; + for ($total = count($this->isoCodes), $max = 4, $i = 0; $i < $max; ++$i) { + $choices[] = strtolower($this->isoCodes[rand(0, $total)]); + } + + $correctIndex = rand(0, 3); + + dump(Countries::getName('uk')); + + $options = array_map(fn (string $code) => $this->flagsGenerator->getEmojiFlagOrNull($code), $choices); + + $choice = $io->choice( + 'Select the flag of ' . $choices[$correctIndex], + $options, + ); + + if ($choice === $this->flagsGenerator->getEmojiFlagOrNull($choices[$correctIndex])) { + $io->success('Yes! :]'); + } else { + $io->warning('No :['); + } + + return Command::SUCCESS; + } +} From 8a7fea6d029c8dc5c469148783efaf7d13c923c9 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 23 Oct 2024 23:05:20 +0100 Subject: [PATCH 02/25] feat: capitals console game --- capitals-africa.json | 12 ++++ capitals-americas.json | 13 ++++ capitals-asia.json | 25 +++++++ capitals-europe.json | 18 +++++ composer.lock | 12 ++-- config/services.yaml | 2 + src/Command/GameCapitalsCommand.php | 101 ++++++++++++++++++++++++++++ src/Command/GameFlagsCommand.php | 26 +++---- 8 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 src/Command/GameCapitalsCommand.php diff --git a/capitals-africa.json b/capitals-africa.json index fcc6a1c..c80f825 100644 --- a/capitals-africa.json +++ b/capitals-africa.json @@ -24,6 +24,12 @@ "region": "Africa", "isoCode": "BW" }, + { + "name": "Bouvet Island", + "capital": "Oslo", + "region": "Africa", + "isoCode": "BV" + }, { "name": "Burkina Faso", "capital": "Ouagadougou", @@ -204,6 +210,12 @@ "region": "Africa", "isoCode": "MU" }, + { + "name": "Mayotte", + "capital": "Mamoudzou", + "region": "Asia", + "isoCode": "YT" + }, { "name": "Morocco", "capital": "Rabat", diff --git a/capitals-americas.json b/capitals-americas.json index 470b681..8c80253 100644 --- a/capitals-americas.json +++ b/capitals-americas.json @@ -12,6 +12,12 @@ "region": "Americas", "isoCode": "AR" }, + { + "name": "Netherlands Antilles", + "capital": "Willemstad", + "region": "Americas", + "isoCode": "AN" + }, { "name": "Bahamas", "capital": "Nassau", @@ -312,6 +318,13 @@ "region": "Americas", "isoCode": "PM" }, + + { + "name": " South Georgia and the South Sandwich Islands", + "capital": "King Edward Point", + "region": "Americas", + "isoCode": "SG" + }, { "name": "Sint Maarten", "capital": "Philipsburg", diff --git a/capitals-asia.json b/capitals-asia.json index 5ddbc9f..dde6066 100644 --- a/capitals-asia.json +++ b/capitals-asia.json @@ -66,6 +66,12 @@ "region": "Asia", "isoCode": "GE" }, + { + "name": "Hong Kong", + "capital": "Hong Kong", + "region": "Asia", + "isoCode": "HK" + }, { "name": "India", "capital": "New Delhi", @@ -78,6 +84,13 @@ "region": "Asia", "isoCode": "ID" }, + + { + "name": "British Indian Ocean Territory", + "capital": "Camp Thunder Cove", + "region": "Asia", + "isoCode": "IO" + }, { "name": "Iran", "capital": "Tehran", @@ -138,6 +151,12 @@ "region": "Asia", "isoCode": "LB" }, + { + "name": "Macau", + "capital": "Macau", + "region": "Asia", + "isoCode": "MO" + }, { "name": "Malaysia", "capital": "Kuala Lumpur", @@ -234,6 +253,12 @@ "region": "Asia", "isoCode": "SY" }, + { + "name": "Taiwan", + "capital": "Taipei", + "region": "Asia", + "isoCode": "TW" + }, { "name": "Tajikistan", "capital": "Dushanbe", diff --git a/capitals-europe.json b/capitals-europe.json index 8b39bb2..e30b62c 100644 --- a/capitals-europe.json +++ b/capitals-europe.json @@ -90,12 +90,24 @@ "region": "Europe", "isoCode": "DE" }, + { + "name": "Gibraltar", + "capital": "Gibraltar", + "region": "Europe", + "isoCode": "GI" + }, { "name": "Greece", "capital": "Athens", "region": "Europe", "isoCode": "GR" }, + { + "name": "Faroe Islands", + "capital": "Torshavn", + "region": "Europe", + "isoCode": "FO" + }, { "name": "Hungary", "capital": "Budapest", @@ -114,6 +126,12 @@ "region": "Europe", "isoCode": "IE" }, + { + "name": "Isle of Man", + "capital": "Douglas", + "region": "Europe", + "isoCode": "IM" + }, { "name": "Italy", "capital": "Rome", diff --git a/composer.lock b/composer.lock index 6ca1dde..35331d0 100644 --- a/composer.lock +++ b/composer.lock @@ -2260,16 +2260,16 @@ }, { "name": "rteeom/isoflags", - "version": "1.1.6", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/mainstreamer/isoflags.git", - "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492" + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/fba4ac13a942808a0cbc7c6b19fdf9700ab33492", - "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492", + "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f", "shasum": "" }, "require": { @@ -2299,9 +2299,9 @@ "description": "library for easy emoji flags generation from iso country codes", "support": { "issues": "https://github.com/mainstreamer/isoflags/issues", - "source": "https://github.com/mainstreamer/isoflags/tree/1.1.6" + "source": "https://github.com/mainstreamer/isoflags/tree/1.2.0" }, - "time": "2024-01-03T15:35:58+00:00" + "time": "2024-10-23T19:44:49+00:00" }, { "name": "sensio/framework-extra-bundle", diff --git a/config/services.yaml b/config/services.yaml index 3dc86e6..f11b85b 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -18,6 +18,8 @@ services: App\Flags\: resource: '../src/Flags/*' exclude: '../src/Flags/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + App\Command\: + resource: '../src/Command/*' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class diff --git a/src/Command/GameCapitalsCommand.php b/src/Command/GameCapitalsCommand.php new file mode 100644 index 0000000..43af353 --- /dev/null +++ b/src/Command/GameCapitalsCommand.php @@ -0,0 +1,101 @@ +flagsGenerator = new FlagsGenerator(); + $this->isoCodes = FlagsGenerator::getAvailableCodes(); + } + + protected function configure(): void + { + $this + ->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description') + ->addOption('option1', null, InputOption::VALUE_NONE, 'Option description') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $db = $this->load(); + + $choices = []; + for ($total = count($this->isoCodes), $max = 4, $i = 0; $i < $max; ++$i) { + if ($randomChoice = $this->isoCodes[rand(0, $total)]) { + $choices[] = $randomChoice; + } + + } + + $correctIndex = rand(0, 3); + $options = array_map(fn (string $code) => $db[$code]->getName(), $choices); + + $choice = $io->choice( + 'Select the capital of ' . Countries::getName(strtoupper($choices[$correctIndex])) . " " . $this->flagsGenerator->getEmojiFlagOrNull(strtolower($choices[$correctIndex])) . " ", + $options, + ); + + if ($choice === $db[$choices[$correctIndex]]->getName()) { + $io->success('Yes! :]'); + } else { + $io->warning('No :['); + } + + return Command::SUCCESS; + } + + private const COUNTRY_FILES = [ + 'capitals-africa.json', + 'capitals-americas.json', + 'capitals-asia.json', + 'capitals-europe.json', + 'capitals-oceania.json', + ]; + + public function load(): array + { + $result = []; + foreach (self::COUNTRY_FILES as $fileName) { + $result = array_merge($result, $this->loadFileContent($fileName)); + } + + return $result; + } + + private function loadFileContent(string $fileName): array + { + if (file_exists($fileName)) { + ['countries' => $countries] = json_decode(file_get_contents($fileName), true); + } + + $capitals = []; + foreach ($countries ?? [] as $country) { + $capitals[$country['isoCode']] = new Capital($country['capital'], $country['name'], $country['isoCode'], $country['region']); + } + + return $capitals; + } +} diff --git a/src/Command/GameFlagsCommand.php b/src/Command/GameFlagsCommand.php index 334ed95..7b3f072 100644 --- a/src/Command/GameFlagsCommand.php +++ b/src/Command/GameFlagsCommand.php @@ -39,19 +39,16 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $output->setDecorated(true); // Ensures proper emoji and color support - - $io = new SymfonyStyle($input, $output); - $arg1 = $input->getArgument('arg1'); - - if ($arg1) { - $io->note(sprintf('You passed an argument: %s', $arg1)); - } - - if ($input->getOption('option1')) { - // ... - } +// $arg1 = $input->getArgument('arg1'); +// +// if ($arg1) { +// $io->note(sprintf('You passed an argument: %s', $arg1)); +// } +// +// if ($input->getOption('option1')) { +// // ... +// } $choices = []; for ($total = count($this->isoCodes), $max = 4, $i = 0; $i < $max; ++$i) { @@ -59,13 +56,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int } $correctIndex = rand(0, 3); - - dump(Countries::getName('uk')); - $options = array_map(fn (string $code) => $this->flagsGenerator->getEmojiFlagOrNull($code), $choices); $choice = $io->choice( - 'Select the flag of ' . $choices[$correctIndex], + 'Select the flag of ' . Countries::getName(strtoupper($choices[$correctIndex])), $options, ); From 7d867831779aeb8c91e3e514496ce4603057cfaa Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 3 Nov 2024 20:09:22 +0000 Subject: [PATCH 03/25] feat: console game --- .phpactor.json | 11 + capitals-africa.json | 6 + capitals-americas.json | 6 + capitals-asia.json | 6 + capitals-europe.json | 18 + composer.json | 1 + composer.lock | 1737 +++++++++++++++++++++++---- src/Command/GameCapitalsCommand.php | 45 +- 8 files changed, 1593 insertions(+), 237 deletions(-) create mode 100644 .phpactor.json diff --git a/.phpactor.json b/.phpactor.json new file mode 100644 index 0000000..c399e9c --- /dev/null +++ b/.phpactor.json @@ -0,0 +1,11 @@ +{ + "$schema": "/Users/artem/.composer/vendor/phpactor/phpactor/phpactor.schema.json", + "language_server_psalm.enabled": true, + "symfony.enabled": true, + "indexer.exclude_patterns": [ + "/vendor/**/Tests/**/*", + "/vendor/**/tests/**/*", + "/var/cache/**/*", + "/vendor/composer/**/*" + ] +} \ No newline at end of file diff --git a/capitals-africa.json b/capitals-africa.json index c80f825..24a0748 100644 --- a/capitals-africa.json +++ b/capitals-africa.json @@ -60,6 +60,12 @@ "region": "Africa", "isoCode": "CF" }, + { + "name": "Western Sahara", + "capital": "Laayoune", + "region": "Africa", + "isoCode": "EH" + }, { "name": "Chad", "capital": "N'Djamena", diff --git a/capitals-americas.json b/capitals-americas.json index 8c80253..cd23b4e 100644 --- a/capitals-americas.json +++ b/capitals-americas.json @@ -270,6 +270,12 @@ "region": "Americas", "isoCode": "FK" }, + { + "name": "French Guiana", + "capital": "Cayenne", + "region": "Americas", + "isoCode": "GF" + }, { "name": "Greenland", "capital": "Nuuk", diff --git a/capitals-asia.json b/capitals-asia.json index dde6066..b11f346 100644 --- a/capitals-asia.json +++ b/capitals-asia.json @@ -42,6 +42,12 @@ "region": "Asia", "isoCode": "BN" }, + { + "name": "Cocos (Keeling) Islands", + "capital": "West Island", + "region": "Asia", + "isoCode": "CC" + }, { "name": "Cambodia", "capital": "Phnom Penh", diff --git a/capitals-europe.json b/capitals-europe.json index e30b62c..84f420a 100644 --- a/capitals-europe.json +++ b/capitals-europe.json @@ -18,6 +18,12 @@ "region": "Europe", "isoCode": "AT" }, + { + "name": "Aland", + "capital": "Mariehamn", + "region": "Europe", + "isoCode": "AX" + }, { "name": "Belarus", "capital": "Minsk", @@ -90,6 +96,12 @@ "region": "Europe", "isoCode": "DE" }, + { + "name": "Guernsey", + "capital": "Saint Peter Port", + "region": "Europe", + "isoCode": "GG" + }, { "name": "Gibraltar", "capital": "Gibraltar", @@ -138,6 +150,12 @@ "region": "Europe", "isoCode": "IT" }, + { + "name": "Jersey", + "capital": "Saint Helier", + "region": "Europe", + "isoCode": "JE" + }, { "name": "Kosovo", "capital": "Pristina", diff --git a/composer.json b/composer.json index f929b66..fe4c75f 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "doctrine/orm": "*", "lexik/jwt-authentication-bundle": "*", "nelmio/cors-bundle": "^2.3", + "phpactor/language-server": "^6.1", "rteeom/isoflags": "^1.1", "sensio/framework-extra-bundle": "*", "symfony/console": "*", diff --git a/composer.lock b/composer.lock index 35331d0..3b6ed4b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,44 +4,920 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0c6f99db745c439aba06f4970de96864", + "content-hash": "5f7a3875d3d62313d9c8b8b41bd62006", "packages": [ + { + "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": "amphp/cache", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/cache.git", + "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/cache/zipball/fe78cfae2fb8c92735629b8cd1893029c73c9b63", + "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/serialization": "^1", + "amphp/sync": "^1.2", + "php": ">=7.1" + }, + "conflict": { + "amphp/file": "<0.2 || >=3" + }, + "require-dev": { + "amphp/file": "^1 || ^2", + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.1", + "phpunit/phpunit": "^6 | ^7 | ^8 | ^9", + "vimeo/psalm": "^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Cache\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A promise-aware caching API for Amp.", + "homepage": "https://github.com/amphp/cache", + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v1.5.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:35:02+00:00" + }, + { + "name": "amphp/dns", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/dns.git", + "reference": "852292532294d7972c729a96b49756d781f7c59d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/dns/zipball/852292532294d7972c729a96b49756d781f7c59d", + "reference": "852292532294d7972c729a96b49756d781f7c59d", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.1", + "amphp/cache": "^1.2", + "amphp/parser": "^1", + "amphp/windows-registry": "^0.3", + "daverandom/libdns": "^2.0.1", + "ext-filter": "*", + "ext-json": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + } + ], + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", + "keywords": [ + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" + ], + "support": { + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v1.2.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2020-07-21T19:04:57+00:00" + }, + { + "name": "amphp/parser", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Parser\\": "src" + } + }, + "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 generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", + "keywords": [ + "async", + "non-blocking", + "parser", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" + }, + { + "name": "amphp/process", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/amphp/process.git", + "reference": "1949d85b6d71af2818ff68144304a98495628f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/process/zipball/1949d85b6d71af2818ff68144304a98495628f19", + "reference": "1949d85b6d71af2818ff68144304a98495628f19", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.4", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\Process\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Asynchronous process manager.", + "homepage": "https://github.com/amphp/process", + "support": { + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v1.1.7" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:00:28+00:00" + }, + { + "name": "amphp/serialization", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Serialization\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/master" + }, + "time": "2020-03-25T21:39:07+00:00" + }, + { + "name": "amphp/socket", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/socket.git", + "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/socket/zipball/b00528bd75548b7ae06a502358bb3ff8b106f5ab", + "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.6", + "amphp/dns": "^1 || ^0.9", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri-parser": "^1.4", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6 || ^7 || ^8", + "vimeo/psalm": "^3.9@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Async socket connection / server tools for Amp.", + "homepage": "https://github.com/amphp/socket", + "keywords": [ + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" + ], + "support": { + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v1.2.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T18:12:22+00:00" + }, + { + "name": "amphp/sync", + "version": "v1.4.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/sync.git", + "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/sync/zipball/85ab06764f4f36d63b1356b466df6111cf4b89cf", + "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.1", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/ConcurrentIterator/functions.php" + ], + "psr-4": { + "Amp\\Sync\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Mutex, Semaphore, and other synchronization tools for Amp.", + "homepage": "https://github.com/amphp/sync", + "keywords": [ + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" + ], + "support": { + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v1.4.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-10-25T18:29:10+00:00" + }, + { + "name": "amphp/windows-registry", + "version": "v0.3.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/windows-registry.git", + "reference": "0f56438b9197e224325e88f305346f0221df1f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/windows-registry/zipball/0f56438b9197e224325e88f305346f0221df1f71", + "reference": "0f56438b9197e224325e88f305346f0221df1f71", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.4", + "amphp/process": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\WindowsRegistry\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Windows Registry Reader.", + "support": { + "issues": "https://github.com/amphp/windows-registry/issues", + "source": "https://github.com/amphp/windows-registry/tree/master" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2020-07-10T16:13:29+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+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" + "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": "dantleech/argument-resolver", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://gitlab.com/dantleech/argument-resolver.git", + "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/dantleech%2Fargument-resolver/repository/archive.zip?sha=e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", + "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.10.1", + "phpunit/phpunit": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "DTL\\ArgumentResolver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Leech", + "email": "daniel@dantleech.com" + } + ], + "description": "Resolve method arguments from an associative array", + "support": { + "issues": "https://gitlab.com/api/v4/projects/7322320/issues" + }, + "time": "2020-04-09T09:32:31+00:00" + }, + { + "name": "dantleech/invoke", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/dantleech/invoke.git", + "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/dantleech/invoke/zipball/9b002d746d2c1b86cfa63a47bb5909cee58ef50c", + "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" + "php": "^7.2||^8.0" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "friendsofphp/php-cs-fixer": "^2.13", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^8.0" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.2-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "DTL\\Invoke\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -50,34 +926,60 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "daniel leech", + "email": "daniel@dantleech.com" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "Emulate named parameters", "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/dantleech/invoke/issues", + "source": "https://github.com/dantleech/invoke/tree/2.0.0" }, - "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": "2021-05-01T17:22:58+00:00" + }, + { + "name": "daverandom/libdns", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "Required for IDN support" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "LibDNS\\": "src/" } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2022-01-17T14:14:24+00:00" + "description": "DNS protocol implementation written in pure PHP", + "keywords": [ + "dns" + ], + "support": { + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + }, + "time": "2024-04-12T12:12:48+00:00" }, { "name": "doctrine/annotations", @@ -1560,6 +2462,64 @@ ], "time": "2023-05-24T07:17:17+00:00" }, + { + "name": "kelunik/certificate", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Kelunik\\Certificate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Access certificate details and transform between different formats.", + "keywords": [ + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" + ], + "support": { + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + }, + "time": "2023-02-03T21:26:53+00:00" + }, { "name": "laminas/laminas-code", "version": "4.13.0", @@ -1760,6 +2720,76 @@ ], "time": "2023-11-20T21:17:42+00:00" }, + { + "name": "league/uri-parser", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-parser.git", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-parser/zipball/671548427e4c932352d9b9279fdfa345bf63fa00", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-intl": "Allow parsing RFC3987 compliant hosts", + "league/uri-schemes": "Allow validating and normalizing URI parsing results" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Uri\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "userland URI parser RFC 3986 compliant", + "homepage": "https://github.com/thephpleague/uri-parser", + "keywords": [ + "parse_url", + "parser", + "rfc3986", + "rfc3987", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/thephpleague/uri-parser/issues", + "source": "https://github.com/thephpleague/uri-parser/tree/master" + }, + "abandoned": "league/uri-interfaces", + "time": "2018-11-22T07:55:51+00:00" + }, { "name": "lexik/jwt-authentication-bundle", "version": "v2.20.3", @@ -1971,16 +3001,143 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", + "keywords": [ + "api", + "cors", + "crossdomain" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + }, + "time": "2023-11-30T16:41:19+00:00" + }, + { + "name": "phpactor/language-server", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/phpactor/language-server.git", + "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpactor/language-server/zipball/18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", + "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", + "shasum": "" + }, + "require": { + "amphp/socket": "^1.1", + "dantleech/argument-resolver": "^1.1", + "dantleech/invoke": "^2.0", + "php": "^8.0", + "phpactor/language-server-protocol": "^3.17", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0", + "ramsey/uuid": "^4.0", + "thecodingmachine/safe": "^1.1" + }, + "require-dev": { + "amphp/phpunit-util": "^1.3", + "ergebnis/composer-normalize": "^2.0", + "friendsofphp/php-cs-fixer": "^3.0", + "jangregor/phpstan-prophecy": "^1.0", + "phpactor/phly-event-dispatcher": "~2.0.0", + "phpactor/test-utils": "~1.1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.0", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phpactor\\LanguageServer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Leech", + "email": "daniel@dantleech.com" + } + ], + "description": "Generic Language Server Platform", + "support": { + "issues": "https://github.com/phpactor/language-server/issues", + "source": "https://github.com/phpactor/language-server/tree/6.1.4" + }, + "time": "2024-03-02T11:34:28+00:00" + }, + { + "name": "phpactor/language-server-protocol", + "version": "3.17.3", + "source": { + "type": "git", + "url": "https://github.com/phpactor/language-server-protocol.git", + "reference": "065fc70b6a26a8d78e034f7db92c8872367356df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpactor/language-server-protocol/zipball/065fc70b6a26a8d78e034f7db92c8872367356df", + "reference": "065fc70b6a26a8d78e034f7db92c8872367356df", + "shasum": "" + }, + "require": { + "dantleech/invoke": "^2.0", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.0", + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "~0.12.0", + "phpunit/phpunit": "^9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.3.x-dev" } }, "autoload": { "psr-4": { - "Nelmio\\CorsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Phpactor\\LanguageServerProtocol\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1988,25 +3145,16 @@ ], "authors": [ { - "name": "Nelmio", - "homepage": "http://nelm.io" - }, - { - "name": "Symfony Community", - "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + "name": "Daniel Leech", + "email": "daniel@dantleech.com" } ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", - "keywords": [ - "api", - "cors", - "crossdomain" - ], + "description": "Langauge Server Protocol for PHP (transpiled)", "support": { - "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + "issues": "https://github.com/phpactor/language-server-protocol/issues", + "source": "https://github.com/phpactor/language-server-protocol/tree/3.17.3" }, - "time": "2023-11-30T16:41:19+00:00" + "time": "2023-03-11T13:19:45+00:00" }, { "name": "psr/cache", @@ -2210,30 +3358,30 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2254,9 +3402,190 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, - "time": "2021-07-14T16:46:02+00:00" + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" }, { "name": "rteeom/isoflags", @@ -4324,26 +5653,23 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4387,7 +5713,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -4403,7 +5729,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", @@ -5721,175 +7047,148 @@ } ], "time": "2023-11-06T11:00:25+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "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", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "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.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" }, { - "name": "amphp/byte-stream", - "version": "v1.8.1", + "name": "thecodingmachine/safe", + "version": "v1.3.3", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", "shasum": "" }, "require": { - "amphp/amp": "^2", - "php": ">=7.1" + "php": ">=7.2" }, "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" + "phpstan/phpstan": "^0.12", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^0.12" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "0.1-dev" } }, "autoload": { "files": [ - "lib/functions.php" + "deprecated/apc.php", + "deprecated/libevent.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "lib/special_cases.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/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/ingres-ii.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/msql.php", + "generated/mysql.php", + "generated/mysqli.php", + "generated/mysqlndMs.php", + "generated/mysqlndQc.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/password.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pdf.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/simplexml.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" ], "psr-4": { - "Amp\\ByteStream\\": "lib" + "Safe\\": [ + "lib/", + "deprecated/", + "generated/" + ] } }, "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": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, + "time": "2020-10-28T17:51:34+00:00" + } + ], + "packages-dev": [ { "name": "composer/pcre", "version": "3.1.1", @@ -8708,5 +10007,5 @@ "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } diff --git a/src/Command/GameCapitalsCommand.php b/src/Command/GameCapitalsCommand.php index 43af353..b1b6adb 100644 --- a/src/Command/GameCapitalsCommand.php +++ b/src/Command/GameCapitalsCommand.php @@ -15,7 +15,7 @@ #[AsCommand( name: 'game:capitals', - description: 'guess flag console game', + description: 'guess capital console game', )] class GameCapitalsCommand extends Command { @@ -41,29 +41,38 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $db = $this->load(); - - $choices = []; - for ($total = count($this->isoCodes), $max = 4, $i = 0; $i < $max; ++$i) { - if ($randomChoice = $this->isoCodes[rand(0, $total)]) { - $choices[] = $randomChoice; + $excluded = ['UM', 'AQ', 'TF', 'HM', 'SH', 'RU', 'CX', 'SJ']; + $lives = 3; + while ($lives > 0) { + $choices = []; + for ($total = count($this->isoCodes), $max = 10, $i = 0; $i < $max; ++$i) { + if ($randomChoice = $this->isoCodes[rand(0, $total - 1)]) { + if (in_array($randomChoice, $excluded) || in_array($randomChoice, $choices)) { + --$i; + continue; + } + $choices[] = $randomChoice; + } } - } - - $correctIndex = rand(0, 3); - $options = array_map(fn (string $code) => $db[$code]->getName(), $choices); + $correctIndex = rand(0, 3); + $options = array_map(fn (string $code) => $db[$code]->getName(), $choices); - $choice = $io->choice( - 'Select the capital of ' . Countries::getName(strtoupper($choices[$correctIndex])) . " " . $this->flagsGenerator->getEmojiFlagOrNull(strtolower($choices[$correctIndex])) . " ", - $options, - ); + $io->text(sprintf('Lives: %d', $lives)); + $choice = $io->choice( + 'Select the capital of ' . Countries::getName(strtoupper($choices[$correctIndex])) . " " . $this->flagsGenerator->getEmojiFlagOrNull(strtolower($choices[$correctIndex])) . " ", + $options, + ); - if ($choice === $db[$choices[$correctIndex]]->getName()) { - $io->success('Yes! :]'); - } else { - $io->warning('No :['); + if ($choice === $db[$choices[$correctIndex]]->getName()) { + $io->success('Yes! :]'); + } else { + $io->warning('No :['); + --$lives; + } } + return Command::SUCCESS; } From 9155746bce765c2c35d4bbb8b25c57ecfc8a03ce Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 15 Jun 2025 23:55:34 +0100 Subject: [PATCH 04/25] fix: bug fixes, test fix, readme update, makefilie change --- Makefile | 54 +++++++++++++++++++++ makefile | 31 ------------ migrations/Version20240904211753.php | 31 ++++++++++++ migrations/Version20240904212530.php | 30 ++++++++++++ migrations/Version20240904220255.php | 31 ++++++++++++ readme.md | 8 ++- src/Command/GameCapitalsCommand.php | 8 +-- src/Flags/Controller/CapitalsController.php | 20 +++++--- tests/Unit/SmokeTest.php | 13 +++-- 9 files changed, 176 insertions(+), 50 deletions(-) create mode 100644 Makefile delete mode 100644 makefile create mode 100644 migrations/Version20240904211753.php create mode 100644 migrations/Version20240904212530.php create mode 100644 migrations/Version20240904220255.php diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..69f4f01 --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +.DEFAULT_GOAL := help +init: build-containers run-containers composer import-db run-api +run: run-containers run-api +build: ## Build docker comoppse project + @docker compose build +up: ## Run docker compose project + @docker compose up -d +run-api: + @symfony server:start +import-db: + @bin/console d:d:i flags.sql +composer: + @docker compose exec php composer install +deploy: + @./vendor/bin/dep deploy production +welcome: + @echo hi +run-tests: + @docker compose exec php vendor/bin/phpunit +psalm: + @docker compose exec php vendor/bin/psalm --no-cache +fix: + @docker compose exec php vendor/bin/php-cs-fixer fix +--: + @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" +sh: ## Shell access into php container + @docker compose exec php sh +dumper: + @docker compose exec php vendor/bin/var-dump-server +domain-upd: ## Set webhook url for bot, needs named argument e.g. domain-upd url=https://url.com + @curl -X POST https://api.telegram.org/bot$(BOT_TOKEN)/setWebhook -d "url=$(url)" +domain-check: ## Check domain + @curl -s "https://api.telegram.org/bot$(BOT_TOKEN)/getWebhookInfo" +domain-me: ## Check domain + @curl -s "https://api.telegram.org/bot$(BOT_TOKEN)/getMe" +%: + @ + +help: + @echo "Usage: make target" + @echo "Available targets:" + @awk '/^[a-zA-Z0-9\-_]+:/ { \ + match($$0, /^[a-zA-Z0-9\-_]+:/, target); \ + target_name = substr(target[0], 1, length(target[0]) - 1); \ + if (match($$0, /##[[:space:]]*(.*)/, desc)) { \ + printf "\033[34m%-20s\033[0m %s\n", target_name, desc[1]; \ + } else { \ + printf "\033[34m%-20s\033[0m \033[30mn/a \033[0m\n", target_name; \ + } \ + }' Makefile | sort + +# BOT_TOKEN received from there +include .env.local + diff --git a/makefile b/makefile deleted file mode 100644 index 776466a..0000000 --- a/makefile +++ /dev/null @@ -1,31 +0,0 @@ -include .env -init: build-containers run-containers composer import-db run-api -run: run-containers run-api -build: - @docker compose build -run-containers: - @docker compose up -d -run-api: - @symfony server:start -import-db: - @bin/console d:d:i flags.sql -composer: - @docker compose exec php composer install -deploy: - @./vendor/bin/dep deploy production -welcome: - @echo hi -test: - @docker compose exec php vendor/bin/phpunit -psalm: - @docker compose exec php vendor/bin/psalm --no-cache -fix: - @docker compose exec php vendor/bin/php-cs-fixer fix ---: - @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" -sh: - @docker compose exec php sh -dumper: - @docker compose exec php vendor/bin/var-dump-server -%: - @ diff --git a/migrations/Version20240904211753.php b/migrations/Version20240904211753.php new file mode 100644 index 0000000..4923b0e --- /dev/null +++ b/migrations/Version20240904211753.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE user ADD email VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your neeCHARACTER SET utf8mb4 NOT NULL COLLATE `utf8mb4_unicode_ci`, executed_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB COMMENT = \'\' '); + $this->addSql('ALTER TABLE user DROP email'); + } +} diff --git a/migrations/Version20240904212530.php b/migrations/Version20240904212530.php new file mode 100644 index 0000000..0f7804e --- /dev/null +++ b/migrations/Version20240904212530.php @@ -0,0 +1,30 @@ +addSql('ALTER TABLE user ADD password VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE user DROP password'); + } +} diff --git a/migrations/Version20240904220255.php b/migrations/Version20240904220255.php new file mode 100644 index 0000000..c2a2c68 --- /dev/null +++ b/migrations/Version20240904220255.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE user CHANGE telegram_id telegram_id VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE user CHANGE telegram_id telegram_id VARCHAR(255) NOT NULL'); + } +} diff --git a/readme.md b/readme.md index 0f9dada..a60ad4c 100644 --- a/readme.md +++ b/readme.md @@ -1,11 +1,15 @@ # Flags quiz api ### development environment: -original .env of simply github secret env is required as pre-requisite +original .env of simply github secret env is required as pre-requisite (BOT_TOKEN value is sensitive, private key that encrypts all symfony credentials to) dc up -d (uses docker-compose.yml + docker-compose.override.yml for dev files sync) +get url from ngrok pointing to local frontend app (port 8080) +update bot's domain via Botfather and use one from ngrok + +run make update with argument url=https://... for webhook (not sure if this step does anything useful at all TODO check) ### deploy (from dev env) To create a deployment you need to tag your images to be deployed: @@ -81,7 +85,7 @@ secret - set ############## -LOCAL PROD REPRODUCTION +LOCAL PROD ENV REPLICATION docker compose -f docker-compose-prod.yml --env-file .env.prod pull docker compose -f docker-compose-prod.yml --env-file .env.prod.local up -d diff --git a/src/Command/GameCapitalsCommand.php b/src/Command/GameCapitalsCommand.php index b1b6adb..3a3f85c 100644 --- a/src/Command/GameCapitalsCommand.php +++ b/src/Command/GameCapitalsCommand.php @@ -41,7 +41,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); $db = $this->load(); - $excluded = ['UM', 'AQ', 'TF', 'HM', 'SH', 'RU', 'CX', 'SJ']; + $excluded = ['UM', 'AQ', 'TF', 'HM', 'SH', 'RU', 'CX', 'SJ', 'RE', 'GS']; $lives = 3; while ($lives > 0) { $choices = []; @@ -55,7 +55,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } } - $correctIndex = rand(0, 3); + $correctIndex = rand(0, 9); $options = array_map(fn (string $code) => $db[$code]->getName(), $choices); $io->text(sprintf('Lives: %d', $lives)); @@ -65,9 +65,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int ); if ($choice === $db[$choices[$correctIndex]]->getName()) { - $io->success('Yes! :]'); + $io->success('YES'); } else { - $io->warning('No :['); + $io->error('No :['); --$lives; } } diff --git a/src/Flags/Controller/CapitalsController.php b/src/Flags/Controller/CapitalsController.php index 03ddf81..11f1aff 100644 --- a/src/Flags/Controller/CapitalsController.php +++ b/src/Flags/Controller/CapitalsController.php @@ -21,10 +21,9 @@ class CapitalsController extends AbstractController protected FlagsGenerator $flagsGenerator; public function __construct( - protected ValidatorInterface $validator, + protected ValidatorInterface $validator, protected string $botToken, - protected readonly EntityManagerInterface $em - + protected readonly EntityManagerInterface $em, ) { $this->flagsGenerator = new FlagsGenerator(); } @@ -52,17 +51,22 @@ public function gameOver(Request $request, CapitalsGameService $service): JsonRe { try { $entity = $service->handleGameOver($request); - return new JsonResponse($entity); + return new JsonResponse($entity); } catch (\Throwable $e) { return new JsonResponse($e->getMessage()); } } #[Route('/capitals/answer/{game}/{countryCode}/{answer}', name: 'get_question_for_game', methods: ['GET'])] - public function getQuestion(Game $game, string $countryCode, string $answer, CapitalsGameService $service): JsonResponse - { - return $this->json($service->giveAnswer($countryCode, base64_decode($answer), $game)); - } + public function getQuestion( + Game $game, + string $countryCode, + string $answer, + CapitalsGameService $service + ): JsonResponse + { + return $this->json($service->giveAnswer($countryCode, base64_decode($answer), $game)); + } #[Route('/capitals/high-scores/{gameType}', name: 'capitals_high_scores', methods: ['GET'])] public function highScores(Request $request, string $gameType, CapitalsGameService $service): JsonResponse diff --git a/tests/Unit/SmokeTest.php b/tests/Unit/SmokeTest.php index 081880f..224fd79 100644 --- a/tests/Unit/SmokeTest.php +++ b/tests/Unit/SmokeTest.php @@ -33,7 +33,10 @@ public function testFlagsGeneratedForAllCountries() if (file_exists($fileName)) { ['countries' => $countries] = json_decode(file_get_contents($fileName), true); foreach ($countries ?? [] as $country) { - $this->assertNotNull($flagsGenerator->getEmojiFlagOrNull($country['isoCode']), 'Error with '.$country['isoCode']); + $this->assertNotNull( + $flagsGenerator->getEmojiFlagOrNull($country['isoCode']), + 'Error with ' . $country['isoCode'], + ); } } } @@ -47,10 +50,10 @@ public function testCountriesCount() if (file_exists($fileName)) { ['countries' => $countries] = json_decode(file_get_contents($fileName), true); match ($fileName) { - 'capitals-africa.json' => self::assertCount(54, $countries), - 'capitals-americas.json' => self::assertCount(55, $countries), - 'capitals-asia.json' => self::assertCount(48, $countries), - 'capitals-europe.json' => self::assertCount(45, $countries), + 'capitals-africa.json' => self::assertCount(57, $countries), + 'capitals-americas.json' => self::assertCount(58, $countries), + 'capitals-asia.json' => self::assertCount(53, $countries), + 'capitals-europe.json' => self::assertCount(51, $countries), 'capitals-oceania.json' => self::assertCount(25, $countries), }; } From 6f9f04bd92031c28b39cc228df3a9195dc63efe1 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 27 Aug 2025 21:05:41 +0100 Subject: [PATCH 05/25] WIP - to review this garbage I've just commited --- .docker/nginx/dev.conf | 20 +++++++ .docker/php-fpm/Dockerfile.dev | 29 ++++++++++ Makefile | 2 +- .../secrets/prod/prod.decrypt.private.php.bkp | 4 ++ docker-compose.dev.yml | 52 ++++++++++++++++++ docker-compose.override.yml | 4 +- my_key.bin | Bin 0 -> 32 bytes readme.md | 7 +++ 8 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 .docker/nginx/dev.conf create mode 100644 .docker/php-fpm/Dockerfile.dev create mode 100755 config/secrets/prod/prod.decrypt.private.php.bkp create mode 100644 docker-compose.dev.yml create mode 100644 my_key.bin diff --git a/.docker/nginx/dev.conf b/.docker/nginx/dev.conf new file mode 100644 index 0000000..87db9b3 --- /dev/null +++ b/.docker/nginx/dev.conf @@ -0,0 +1,20 @@ +# .docker/nginx/dev.conf +server { + listen 80; + root /var/www/webapp/public; + index index.php; + + location / { + try_files $uri $uri/ /index.php$is_args$args; + } + + location ~ \.php$ { + fastcgi_pass php:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + error_log /var/log/nginx/error.log; + access_log /var/log/nginx/access.log; +} diff --git a/.docker/php-fpm/Dockerfile.dev b/.docker/php-fpm/Dockerfile.dev new file mode 100644 index 0000000..bdb0d36 --- /dev/null +++ b/.docker/php-fpm/Dockerfile.dev @@ -0,0 +1,29 @@ +# .docker/php-fpm/Dockerfile.dev +FROM php:8.2-fpm-alpine + +# Install system dependencies +RUN apk add --no-cache \ + bash \ + git \ + mysql-client \ + libpng-dev \ + libzip-dev \ + postgresql-dev \ + $PHPIZE_DEPS + +# Install PHP extensions +RUN docker-php-ext-install \ + pdo \ + pdo_mysql \ + pdo_pgsql \ + zip \ + intl + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer + +# Create user matching host +RUN adduser -u 1000 -D -s /bin/bash appuser +USER appuser + +WORKDIR /var/www/webapp diff --git a/Makefile b/Makefile index 69f4f01..34dbb5e 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ fix: --: @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" sh: ## Shell access into php container - @docker compose exec php sh + @docker compose exec -u 1000 php sh dumper: @docker compose exec php vendor/bin/var-dump-server domain-upd: ## Set webhook url for bot, needs named argument e.g. domain-upd url=https://url.com diff --git a/config/secrets/prod/prod.decrypt.private.php.bkp b/config/secrets/prod/prod.decrypt.private.php.bkp new file mode 100755 index 0000000..0473d9a --- /dev/null +++ b/config/secrets/prod/prod.decrypt.private.php.bkp @@ -0,0 +1,4 @@ +<-4$$ Date: Wed, 14 Aug 2024 00:43:55 +0100 Subject: [PATCH 06/25] docker updated --- docker-compose-prod.yml | 1 - docker-compose-staging.yml | 1 - docker-compose.override.yml | 1 - docker-compose.yml | 2 -- 4 files changed, 5 deletions(-) diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml index 7caad79..82f70a8 100644 --- a/docker-compose-prod.yml +++ b/docker-compose-prod.yml @@ -1,4 +1,3 @@ -version: "3.6" services: php: environment: diff --git a/docker-compose-staging.yml b/docker-compose-staging.yml index e90025d..29dbb86 100644 --- a/docker-compose-staging.yml +++ b/docker-compose-staging.yml @@ -1,4 +1,3 @@ -version: "3.6" services: php: container_name: "php-staging-${PROJECT_NAME}" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 1b8e7e7..1e643a4 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,4 +1,3 @@ -version: "3.6" services: php: volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 8e8b3af..7607c49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.8" - services: php: container_name: "php-${PROJECT_NAME}" From 11e3d7d3214536b5a4dcbcf3f1506f6d82ea9d7d Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 27 Aug 2025 22:08:53 +0100 Subject: [PATCH 07/25] fix: GET /incorrect shows wrong error rate --- src/Flags/Controller/GameController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Flags/Controller/GameController.php b/src/Flags/Controller/GameController.php index 98db5c3..9543564 100644 --- a/src/Flags/Controller/GameController.php +++ b/src/Flags/Controller/GameController.php @@ -261,7 +261,7 @@ public function getRight(#[CurrentUser] $user, AnswerRepository $repository): Re if (!isset($result[$key]['rate'])) { $result[$key]['rate'] = 0; - $result[$key]['times'] = $result[$key]['times'].'/'.$result[$key]['times']; + $result[$key]['times'] = "0/".$result[$key]['times']; } } From 46a34b0c99954c3bbc4e0bffe679dc8bdebcf44c Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 7 Dec 2025 02:35:24 +0000 Subject: [PATCH 08/25] feat(oauth2): added oauth2 authentication # Conflicts: # composer.lock # makefile --- composer.json | 2 + composer.lock | 2273 ++++++----------- config/bundles.php | 1 + config/jwt/pair/private.pem | 30 + config/jwt/pair/public.pem | 9 + config/packages/knpu_oauth2_client.yaml | 18 + config/packages/lexik_jwt_authentication.yaml | 10 +- config/packages/secrity.yaml | 48 + config/packages/security.yaml | 31 - config/packages/security.yaml.bkp | 96 + http-requests/OAuth2-login.http | 3 + http-requests/Test Auth.http | 5 + http-requests/http-client.env.json | 7 + makefile | 33 + migrations/Version20251206170339.php | 33 + request.md | 12 + src/DataFixtures/AppFixtures.php | 1 + src/Flags/Controller/GameController.php | 3 +- src/Flags/Controller/SecurityController.php | 71 + src/Flags/Entity/User.php | 55 +- src/Flags/Repository/UserRepository.php | 37 +- src/Flags/Security/HqAuthAuthenticator.php | 183 ++ src/Flags/Service/HqAuthProvider.php | 29 + src/package.json | 14 + symfony.lock | 21 + 25 files changed, 1508 insertions(+), 1517 deletions(-) create mode 100644 config/jwt/pair/private.pem create mode 100644 config/jwt/pair/public.pem create mode 100644 config/packages/knpu_oauth2_client.yaml create mode 100644 config/packages/secrity.yaml delete mode 100644 config/packages/security.yaml create mode 100644 config/packages/security.yaml.bkp create mode 100644 http-requests/OAuth2-login.http create mode 100644 http-requests/Test Auth.http create mode 100644 http-requests/http-client.env.json create mode 100644 makefile create mode 100644 migrations/Version20251206170339.php create mode 100644 request.md create mode 100644 src/Flags/Controller/SecurityController.php create mode 100644 src/Flags/Security/HqAuthAuthenticator.php create mode 100644 src/Flags/Service/HqAuthProvider.php create mode 100644 src/package.json diff --git a/composer.json b/composer.json index fe4c75f..5acac49 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,8 @@ "doctrine/doctrine-bundle": "*", "doctrine/doctrine-migrations-bundle": "*", "doctrine/orm": "*", + "knpuniversity/oauth2-client-bundle": "^2.20", + "league/oauth2-client": "^2.9", "lexik/jwt-authentication-bundle": "*", "nelmio/cors-bundle": "^2.3", "phpactor/language-server": "^6.1", diff --git a/composer.lock b/composer.lock index 3b6ed4b..c348df4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,769 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5f7a3875d3d62313d9c8b8b41bd62006", + "content-hash": "d0aa5bfc24d05eed328cac457b1e8f4a", "packages": [ - { - "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": "amphp/cache", - "version": "v1.5.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/cache.git", - "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/cache/zipball/fe78cfae2fb8c92735629b8cd1893029c73c9b63", - "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "amphp/serialization": "^1", - "amphp/sync": "^1.2", - "php": ">=7.1" - }, - "conflict": { - "amphp/file": "<0.2 || >=3" - }, - "require-dev": { - "amphp/file": "^1 || ^2", - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.1", - "phpunit/phpunit": "^6 | ^7 | ^8 | ^9", - "vimeo/psalm": "^4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Cache\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "description": "A promise-aware caching API for Amp.", - "homepage": "https://github.com/amphp/cache", - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/cache/issues", - "source": "https://github.com/amphp/cache/tree/v1.5.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T19:35:02+00:00" - }, - { - "name": "amphp/dns", - "version": "v1.2.3", - "source": { - "type": "git", - "url": "https://github.com/amphp/dns.git", - "reference": "852292532294d7972c729a96b49756d781f7c59d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/852292532294d7972c729a96b49756d781f7c59d", - "reference": "852292532294d7972c729a96b49756d781f7c59d", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "amphp/byte-stream": "^1.1", - "amphp/cache": "^1.2", - "amphp/parser": "^1", - "amphp/windows-registry": "^0.3", - "daverandom/libdns": "^2.0.1", - "ext-filter": "*", - "ext-json": "*", - "php": ">=7.0" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "phpunit/phpunit": "^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\Dns\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "Async DNS resolution for Amp.", - "homepage": "https://github.com/amphp/dns", - "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" - ], - "support": { - "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v1.2.3" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2020-07-21T19:04:57+00:00" - }, - { - "name": "amphp/parser", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Parser\\": "src" - } - }, - "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 generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", - "keywords": [ - "async", - "non-blocking", - "parser", - "stream" - ], - "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T19:16:53+00:00" - }, - { - "name": "amphp/process", - "version": "v1.1.7", - "source": { - "type": "git", - "url": "https://github.com/amphp/process.git", - "reference": "1949d85b6d71af2818ff68144304a98495628f19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/1949d85b6d71af2818ff68144304a98495628f19", - "reference": "1949d85b6d71af2818ff68144304a98495628f19", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "amphp/byte-stream": "^1.4", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "phpunit/phpunit": "^6" - }, - "type": "library", - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Amp\\Process\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Asynchronous process manager.", - "homepage": "https://github.com/amphp/process", - "support": { - "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v1.1.7" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-19T03:00:28+00:00" - }, - { - "name": "amphp/serialization", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Serialization\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", - "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" - }, - "time": "2020-03-25T21:39:07+00:00" - }, - { - "name": "amphp/socket", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/socket.git", - "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/b00528bd75548b7ae06a502358bb3ff8b106f5ab", - "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "amphp/byte-stream": "^1.6", - "amphp/dns": "^1 || ^0.9", - "ext-openssl": "*", - "kelunik/certificate": "^1.1", - "league/uri-parser": "^1.4", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1", - "phpunit/phpunit": "^6 || ^7 || ^8", - "vimeo/psalm": "^3.9@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php" - ], - "psr-4": { - "Amp\\Socket\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Async socket connection / server tools for Amp.", - "homepage": "https://github.com/amphp/socket", - "keywords": [ - "amp", - "async", - "encryption", - "non-blocking", - "sockets", - "tcp", - "tls" - ], - "support": { - "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v1.2.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T18:12:22+00:00" - }, - { - "name": "amphp/sync", - "version": "v1.4.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/85ab06764f4f36d63b1356b466df6111cf4b89cf", - "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf", - "shasum": "" - }, - "require": { - "amphp/amp": "^2.2", - "php": ">=7.1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "amphp/phpunit-util": "^1.1", - "phpunit/phpunit": "^9 || ^8 || ^7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/ConcurrentIterator/functions.php" - ], - "psr-4": { - "Amp\\Sync\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" - } - ], - "description": "Mutex, Semaphore, and other synchronization tools for Amp.", - "homepage": "https://github.com/amphp/sync", - "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" - ], - "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v1.4.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-10-25T18:29:10+00:00" - }, - { - "name": "amphp/windows-registry", - "version": "v0.3.3", - "source": { - "type": "git", - "url": "https://github.com/amphp/windows-registry.git", - "reference": "0f56438b9197e224325e88f305346f0221df1f71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/windows-registry/zipball/0f56438b9197e224325e88f305346f0221df1f71", - "reference": "0f56438b9197e224325e88f305346f0221df1f71", - "shasum": "" - }, - "require": { - "amphp/amp": "^2", - "amphp/byte-stream": "^1.4", - "amphp/process": "^1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "dev-master" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\WindowsRegistry\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Windows Registry Reader.", - "support": { - "issues": "https://github.com/amphp/windows-registry/issues", - "source": "https://github.com/amphp/windows-registry/tree/master" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2020-07-10T16:13:29+00:00" - }, - { - "name": "brick/math", - "version": "0.12.1", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Arbitrary-precision arithmetic library", - "keywords": [ - "Arbitrary-precision", - "BigInteger", - "BigRational", - "arithmetic", - "bigdecimal", - "bignum", - "bignumber", - "brick", - "decimal", - "integer", - "math", - "mathematics", - "rational" - ], - "support": { - "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - } - ], - "time": "2023-11-29T23:19:16+00:00" - }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.5", @@ -795,129 +34,14 @@ }, "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": "dantleech/argument-resolver", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://gitlab.com/dantleech/argument-resolver.git", - "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc" - }, - "dist": { - "type": "zip", - "url": "https://gitlab.com/api/v4/projects/dantleech%2Fargument-resolver/repository/archive.zip?sha=e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", - "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", - "shasum": "" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.16", - "phpstan/phpstan": "^0.10.1", - "phpunit/phpunit": "^7.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "DTL\\ArgumentResolver\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniel Leech", - "email": "daniel@dantleech.com" - } - ], - "description": "Resolve method arguments from an associative array", - "support": { - "issues": "https://gitlab.com/api/v4/projects/7322320/issues" - }, - "time": "2020-04-09T09:32:31+00:00" - }, - { - "name": "dantleech/invoke", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/dantleech/invoke.git", - "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dantleech/invoke/zipball/9b002d746d2c1b86cfa63a47bb5909cee58ef50c", - "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c", - "shasum": "" - }, - "require": { - "php": "^7.2||^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.13", - "phpbench/phpbench": "^1.0", - "phpstan/phpstan": "^0.12.0", - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "extra": { + "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "DTL\\Invoke\\": "src/" + "PackageVersions\\": "src/PackageVersions" } }, "notification-url": "https://packagist.org/downloads/", @@ -926,60 +50,34 @@ ], "authors": [ { - "name": "daniel leech", - "email": "daniel@dantleech.com" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "description": "Emulate named parameters", + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { - "issues": "https://github.com/dantleech/invoke/issues", - "source": "https://github.com/dantleech/invoke/tree/2.0.0" - }, - "time": "2021-05-01T17:22:58+00:00" - }, - { - "name": "daverandom/libdns", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/DaveRandom/LibDNS.git", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "Required for IDN support" + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "LibDNS\\": "src/" + "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" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "description": "DNS protocol implementation written in pure PHP", - "keywords": [ - "dns" - ], - "support": { - "issues": "https://github.com/DaveRandom/LibDNS/issues", - "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" - }, - "time": "2024-04-12T12:12:48+00:00" + "time": "2022-01-17T14:14:24+00:00" }, { "name": "doctrine/annotations", @@ -2309,52 +1407,316 @@ "persistence" ], "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.2.0" + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/3.2.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%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2023-05-17T18:32:04+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" + }, + "time": "2022-05-23T21:33:49+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.16", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2023-05-24T07:17:17+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "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.10.0" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/Nyholm", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", "type": "tidelift" } ], - "time": "2023-05-17T18:32:04+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { - "name": "doctrine/sql-formatter", - "version": "1.1.3", + "name": "guzzlehttp/promises", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, - "bin": [ - "bin/sql-formatter" - ], "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "Doctrine\\SqlFormatter\\": "src" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2363,63 +1725,92 @@ ], "authors": [ { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "https://jeremydorn.com/" + "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": "a PHP SQL highlighting library", - "homepage": "https://github.com/doctrine/sql-formatter/", + "description": "Guzzle promises library", "keywords": [ - "highlight", - "sql" + "promise" ], "support": { - "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, - "time": "2022-05-23T21:33:49+00:00" + "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": "2025-08-22T14:34:08+00:00" }, { - "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.16", + "name": "guzzlehttp/psr7", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { - "laminas/laminas-code": "~3.4.1|^4.0", - "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" - }, - "conflict": { - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" }, - "replace": { - "ocramius/proxy-manager": "^2.1" + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "thanks": { - "name": "ocramius/proxy-manager", - "url": "https://github.com/Ocramius/ProxyManager" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "ProxyManager\\": "src/ProxyManager" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2428,71 +1819,108 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "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": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", - "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { - "url": "https://github.com/Ocramius", + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], - "time": "2023-05-24T07:17:17+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { - "name": "kelunik/certificate", - "version": "v1.1.3", + "name": "knpuniversity/oauth2-client-bundle", + "version": "v2.20.1", "source": { "type": "git", - "url": "https://github.com/kelunik/certificate.git", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", + "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/d59e4dc61484e777b6f19df2efcf8b1bcc03828a", + "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a", "shasum": "" }, "require": { - "ext-openssl": "*", - "php": ">=7.0" + "league/oauth2-client": "^2.0", + "php": ">=8.1", + "symfony/dependency-injection": "^6.4|^7.3|^8.0", + "symfony/framework-bundle": "^6.4|^7.3|^8.0", + "symfony/http-foundation": "^6.4|^7.3|^8.0", + "symfony/routing": "^6.4|^7.3|^8.0", + "symfony/security-core": "^6.4|^7.3|^8.0", + "symfony/security-http": "^6.4|^7.3|^8.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + "league/oauth2-facebook": "^1.1|^2.0", + "symfony/phpunit-bridge": "^7.3", + "symfony/yaml": "^6.4|^7.3|^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "suggest": { + "symfony/security-guard": "For integration with Symfony's Guard Security layer" }, + "type": "symfony-bundle", "autoload": { "psr-4": { - "Kelunik\\Certificate\\": "src" + "KnpU\\OAuth2ClientBundle\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2501,24 +1929,21 @@ ], "authors": [ { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Ryan Weaver", + "email": "ryan@symfonycasts.com" } ], - "description": "Access certificate details and transform between different formats.", + "description": "Integration with league/oauth2-client to provide services", + "homepage": "https://symfonycasts.com", "keywords": [ - "DER", - "certificate", - "certificates", - "openssl", - "pem", - "x509" + "oauth", + "oauth2" ], "support": { - "issues": "https://github.com/kelunik/certificate/issues", - "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", + "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.20.1" }, - "time": "2023-02-03T21:26:53+00:00" + "time": "2025-12-04T15:46:43+00:00" }, { "name": "laminas/laminas-code", @@ -2721,45 +2146,34 @@ "time": "2023-11-20T21:17:42+00:00" }, { - "name": "league/uri-parser", - "version": "1.4.1", + "name": "league/oauth2-client", + "version": "2.9.0", "source": { "type": "git", - "url": "https://github.com/thephpleague/uri-parser.git", - "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-parser/zipball/671548427e4c932352d9b9279fdfa345bf63fa00", - "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", "shasum": "" }, "require": { - "php": ">=7.0.0" + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "php": "^7.1 || >=8.0.0 <8.6.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-phpunit": "^0.9.4", - "phpstan/phpstan-strict-rules": "^0.9.0", - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-intl": "Allow parsing RFC3987 compliant hosts", - "league/uri-schemes": "Allow validating and normalizing URI parsing results" + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "League\\Uri\\": "src" + "League\\OAuth2\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2768,27 +2182,33 @@ ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" } ], - "description": "userland URI parser RFC 3986 compliant", - "homepage": "https://github.com/thephpleague/uri-parser", + "description": "OAuth 2.0 Client Library", "keywords": [ - "parse_url", - "parser", - "rfc3986", - "rfc3987", - "uri", - "url" + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" ], "support": { - "issues": "https://github.com/thephpleague/uri-parser/issues", - "source": "https://github.com/thephpleague/uri-parser/tree/master" + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" }, - "abandoned": "league/uri-interfaces", - "time": "2018-11-22T07:55:51+00:00" + "time": "2025-11-25T22:17:17+00:00" }, { "name": "lexik/jwt-authentication-bundle", @@ -3039,52 +2459,31 @@ "time": "2023-11-30T16:41:19+00:00" }, { - "name": "phpactor/language-server", - "version": "6.1.4", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/phpactor/language-server.git", - "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpactor/language-server/zipball/18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", - "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "amphp/socket": "^1.1", - "dantleech/argument-resolver": "^1.1", - "dantleech/invoke": "^2.0", - "php": "^8.0", - "phpactor/language-server-protocol": "^3.17", - "psr/event-dispatcher": "^1.0", - "psr/log": "^1.0", - "ramsey/uuid": "^4.0", - "thecodingmachine/safe": "^1.1" - }, - "require-dev": { - "amphp/phpunit-util": "^1.3", - "ergebnis/composer-normalize": "^2.0", - "friendsofphp/php-cs-fixer": "^3.0", - "jangregor/phpstan-prophecy": "^1.0", - "phpactor/phly-event-dispatcher": "~2.0.0", - "phpactor/test-utils": "~1.1.3", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.0", - "phpunit/phpunit": "^9.0", - "symfony/var-dumper": "^5.1" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Phpactor\\LanguageServer\\": "lib/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3093,50 +2492,42 @@ ], "authors": [ { - "name": "Daniel Leech", - "email": "daniel@dantleech.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Generic Language Server Platform", + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], "support": { - "issues": "https://github.com/phpactor/language-server/issues", - "source": "https://github.com/phpactor/language-server/tree/6.1.4" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2024-03-02T11:34:28+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "phpactor/language-server-protocol", - "version": "3.17.3", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/phpactor/language-server-protocol.git", - "reference": "065fc70b6a26a8d78e034f7db92c8872367356df" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpactor/language-server-protocol/zipball/065fc70b6a26a8d78e034f7db92c8872367356df", - "reference": "065fc70b6a26a8d78e034f7db92c8872367356df", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "dantleech/invoke": "^2.0", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.0", - "friendsofphp/php-cs-fixer": "^2.17", - "phpstan/phpstan": "~0.12.0", - "phpunit/phpunit": "^9.2" + "php": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3.x-dev" - } - }, "autoload": { "psr-4": { - "Phpactor\\LanguageServerProtocol\\": "src/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3145,43 +2536,51 @@ ], "authors": [ { - "name": "Daniel Leech", - "email": "daniel@dantleech.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Langauge Server Protocol for PHP (transpiled)", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], "support": { - "issues": "https://github.com/phpactor/language-server-protocol/issues", - "source": "https://github.com/phpactor/language-server-protocol/tree/3.17.3" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2023-03-11T13:19:45+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3194,38 +2593,47 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for caching libraries", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "cache", - "psr", - "psr-6" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "psr/clock", + "name": "psr/event-dispatcher", "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": ">=7.2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Clock\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3235,50 +2643,48 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "Standard interfaces for event handling.", "keywords": [ - "clock", - "now", + "events", "psr", - "psr-20", - "time" + "psr-14" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "psr/http-client", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3291,37 +2697,36 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "http", + "http-client", + "psr", + "psr-18" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -3331,7 +2736,7 @@ }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3341,47 +2746,51 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Standard interfaces for event handling.", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "events", + "factory", + "http", + "message", "psr", - "psr-14" + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "psr/log", - "version": "1.1.4", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3394,69 +2803,47 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "log", + "http", + "http-message", "psr", - "psr-3" + "psr-7", + "request", + "response" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "ramsey/collection", - "version": "2.0.0", + "name": "psr/log", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": "^8.1" - }, - "require-dev": { - "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", - "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php": ">=8.0.0" }, "type": "library", "extra": { - "captainhook": { - "force-install": true - }, - "ramsey/conventional-commits": { - "configFile": "conventional-commits.json" + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Ramsey\\Collection\\": "src/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3465,140 +2852,78 @@ ], "authors": [ { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A PHP library for representing and manipulating collections.", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { - "name": "ramsey/uuid", - "version": "4.7.6", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", - "php": "^8.0", - "ramsey/collection": "^1.2 || ^2.0" - }, - "replace": { - "rhumsaa/uuid": "self.version" + "php": ">=5.6" }, "require-dev": { - "captainhook/captainhook": "^5.10", - "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", - "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "captainhook": { - "force-install": true - } - }, "autoload": { "files": [ - "src/functions.php" - ], - "psr-4": { - "Ramsey\\Uuid\\": "src/" - } + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" - }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" } ], - "time": "2024-04-27T21:32:50+00:00" + "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": "rteeom/isoflags", - "version": "1.2.0", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/mainstreamer/isoflags.git", - "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f" + "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/ec3a4cc808a86cb001cbbc19651ffd514f76684f", - "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/fba4ac13a942808a0cbc7c6b19fdf9700ab33492", + "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492", "shasum": "" }, "require": { @@ -3628,9 +2953,9 @@ "description": "library for easy emoji flags generation from iso country codes", "support": { "issues": "https://github.com/mainstreamer/isoflags/issues", - "source": "https://github.com/mainstreamer/isoflags/tree/1.2.0" + "source": "https://github.com/mainstreamer/isoflags/tree/1.1.6" }, - "time": "2024-10-23T19:44:49+00:00" + "time": "2024-01-03T15:35:58+00:00" }, { "name": "sensio/framework-extra-bundle", @@ -5653,23 +4978,26 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5713,7 +5041,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -5729,7 +5057,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", @@ -7047,148 +6375,175 @@ } ], "time": "2023-11-06T11:00:25+00:00" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "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", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" + }, + "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.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2022-02-20T17:52:18+00:00" }, { - "name": "thecodingmachine/safe", - "version": "v1.3.3", + "name": "amphp/byte-stream", + "version": "v1.8.1", "source": { "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", "shasum": "" }, "require": { - "php": ">=7.2" + "amphp/amp": "^2", + "php": ">=7.1" }, "require-dev": { - "phpstan/phpstan": "^0.12", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^0.12" + "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", "extra": { "branch-alias": { - "dev-master": "0.1-dev" + "dev-master": "1.x-dev" } }, "autoload": { "files": [ - "deprecated/apc.php", - "deprecated/libevent.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "lib/special_cases.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/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/ingres-ii.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/msql.php", - "generated/mysql.php", - "generated/mysqli.php", - "generated/mysqlndMs.php", - "generated/mysqlndQc.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/password.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pdf.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/simplexml.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" + "lib/functions.php" ], "psr-4": { - "Safe\\": [ - "lib/", - "deprecated/", - "generated/" - ] + "Amp\\ByteStream\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "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": "http://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" }, - "time": "2020-10-28T17:51:34+00:00" - } - ], - "packages-dev": [ + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-03-30T17:13:30+00:00" + }, { "name": "composer/pcre", "version": "3.1.1", @@ -10007,5 +9362,5 @@ "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.6.0" } diff --git a/config/bundles.php b/config/bundles.php index 49c5b01..e05aa3f 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -9,4 +9,5 @@ Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true], ]; diff --git a/config/jwt/pair/private.pem b/config/jwt/pair/private.pem new file mode 100644 index 0000000..0dec58d --- /dev/null +++ b/config/jwt/pair/private.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIDG1wPypQrFICAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECBiCAI6o2J9IBIIEyGAWj/h8U/io +OO9PYr7eq2Sbq1WGFl2doSikrpvRNTF96YRPJqlXYwXIWZ065Rb8ezBY6f055SIJ +Gx4qUKBxlMCTwHw6SgfKFiJR57H73fgemk1U54bLibn8rc6mPAYJIZooopyLOtzi +Gw2gNyvFcYFI4SlRTYbC5EnZbB0V3zUzBwmSKfEth5sjygCst3m2HtsjT4bw8Omt +UOnOmaSgWwVm78AbSzKmJ8/8GfZ+gLZl+LKeAdlK8PKM2NurK3em+Mn2pddjmSIY +HoUbfzhwEEy3gryRYaewjZLATFUVFB3jeNSadJbrApM2G3KD1KiBiGmq4rJVudbZ +NWdZCkE+vOyYfho6fRGaCBJl8Kvb3LAAhO4LGy3VKxlLOHJVQohe6+XLhRFyawLe +Aaznrm8FJOUldcKlXuWcNVP4xSGXrU6meQezdkje5Pur1UjuM/2maUClzyGQ4FCz +BjwDhN23fTGfrKRa9GPUvsLc7tfU+OgEVSjgoiIKH8sh5e2VMAFW+4O6sB8EfLPz +WTBOfTV7ehwMxQa5yx5Bt3VHo7E0rezUv9zMwPqL4sF1uykDBdCNBJCrDeZJbLSO +4F6E52DmHBfFHFn88s9Bmf2xRSFnb/BCdikxa9vO/GCMBwgyFYnLKBMjfBCy1z7c +NcHayZiqeFL03fC1FvBvaNf+bwYwBSVOEvz4Iqe9qLdErVVg3Ght1U8ypYk/3BbZ +8/+nYqeb8oFM4/YssOnd8NjsUoshinkYJdRUYm3KN5HbvulExmeTgJz37g6mi3Xx +b5DPW8fCWi16Grjn6DI56LzfpImOzhMNGUosib1NEDdOh1mW9U5dg1K3XisRrw1t +2aDAMvyMyb2SP6M238jPFaLSLoEvdR/P9Cfcn9JCTNiRWr9BZP1duwGzLPG7bxbs +RVlmpa13a+DYwvKcDGQjShQ7laQ+mr+pOCKwu1LOoiX9UBZRxIBDEXKwGtFo6DrI +lAo9ONNtaIIaTd2o1jYukW4teGfkYJ1PlMk7LCg6M0Y2bN5W/K4qnq6IjQ8Mq5zC +EaKGupBAkZ65Gc65EezfzrUm7tBnq/LmVPR9T8IusYElihVWlPGPpzPyjk/wbufW +J5iGmAk9IV593Y07pHfYwQ4pxjC3XTX9YGyB405L6AfDIlnu8AK7U+ep9JuJiAUY +p7tlpwUdmGSG9RWbfC71lVH+mEc3Lzt8BeA5gJRzMBw4VR6p0mDW9fpIKJhL144y +zOGfc+7WxX1PFd054jam1rKpffbJ9fTWgYXELBvjCiu274fize2lnMc8hb7oz8u4 +D5QnYuR7HqtptTPOuvGRMZH+qDSVnOJmoErY21eogAWrnY3Z/7r+6DyAKllrULx2 +Sn1GJBO5mqfmgLcTl9xw4rqgxgh2FuMVgPpcdxYxtOqWdLPIJxj/5/vfP0x37eb8 +I481rwa7Md+a6QYcTi4dcJrnjeNFOXJ0zbvDm4BXn43vTUFbZkasOruIq9+rIOx7 +QtVpd7dhy0O9gUpWDO142JsDLjM3WYJVrjnpT+02+T7RkS85ABj0StV9oxNyMeL8 +mbDhrJ3JTp38gX3Av01VakYs0J1T9pclImzTg+mPfeRXeIvWz89dCl3j52ggK5Ya +/+lKnbSqxndOqJSI+a8Mdg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/config/jwt/pair/public.pem b/config/jwt/pair/public.pem new file mode 100644 index 0000000..27d9f70 --- /dev/null +++ b/config/jwt/pair/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Z5nsvdlCe48OFUUhG4L +JBEbltcyGY5z8rhrkchwEbX3O1aZwNzAwvZRu8iwZY0R12KXGjbneduXX0dpzS2b +cz5AOT1YffiNwO02g2lP5G/oal1k6H+dfExKUysvWZTjG6Z6bUgo6i+Ig2wx089F +X5syOxmke/KLW9IZoGIEoYLqGlInAxqXd9/aByFWowSd3p1OKRx5FzgrrwAQ7sGY +Ehmqu3ChdYh+0FAVdzfjZep2EtJDJjDebzBZ2Yc0VC94hAMZfdo5i5kwLHGSyQTN +si0FLCmKjqzZKP+4FH4AyYfSRvoMgyr+j1PjWMQAayoe/dE65ko3LQKq2V6E7JVj +owIDAQAB +-----END PUBLIC KEY----- diff --git a/config/packages/knpu_oauth2_client.yaml b/config/packages/knpu_oauth2_client.yaml new file mode 100644 index 0000000..395aa76 --- /dev/null +++ b/config/packages/knpu_oauth2_client.yaml @@ -0,0 +1,18 @@ + +# configure your clients as described here: https://github.com/knpuniversity/oauth2-client-bundle#configuration +# config/packages/knpu_oauth2_client.yaml +knpu_oauth2_client: + clients: + flags_app: + type: generic + provider_class: App\Flags\Service\HqAuthProvider + client_id: '%env(OAUTH_CLIENT_ID)%' + client_secret: '%env(OAUTH_CLIENT_SECRET)%' + redirect_route: oauth_check + redirect_params: {} + # Your OAuth2 server's base URL + provider_options: + domain: '%env(OAUTH_SERVER_URL)%' + urlAuthorize: '%env(OAUTH_SERVER_URL)%/oauth2/authorize' + urlAccessToken: '%env(OAUTH_SERVER_URL)%/oauth2/token' + urlResourceOwnerDetails: '%env(OAUTH_SERVER_URL)%/oauth2/me' \ No newline at end of file diff --git a/config/packages/lexik_jwt_authentication.yaml b/config/packages/lexik_jwt_authentication.yaml index e24f344..e189bb7 100644 --- a/config/packages/lexik_jwt_authentication.yaml +++ b/config/packages/lexik_jwt_authentication.yaml @@ -1,6 +1,6 @@ lexik_jwt_authentication: - secret_key: '%env(resolve:JWT_SECRET_KEY)%' - public_key: '%env(resolve:JWT_PUBLIC_KEY)%' - pass_phrase: '%env(JWT_PASSPHRASE)%' - token_ttl: '%env(JWT_TOKEN_TTL)%' - \ No newline at end of file + # secret_key: '%env(resolve:JWT_SECRET_KEY)%' + public_key: '%env(resolve:JWT_PUBLIC_KEY)%' + pass_phrase: '%env(JWT_PASSPHRASE)%' + token_ttl: '%env(JWT_TOKEN_TTL)%' + # TODO - add public key from oauth server to reuse their accesstokens! diff --git a/config/packages/secrity.yaml b/config/packages/secrity.yaml new file mode 100644 index 0000000..cf9ee10 --- /dev/null +++ b/config/packages/secrity.yaml @@ -0,0 +1,48 @@ +security: + enable_authenticator_manager: true + + providers: + database_provider: + entity: + class: App\Flags\Entity\User + property: email + + password_hashers: + App\Flags\Entity\User: + algorithm: bcrypt + + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + # OAuth login flow (needs sessions for state parameter) + oauth: + pattern: ^/(login|oauth) + stateless: false + provider: database_provider + custom_authenticators: + - App\Flags\Security\HqAuthAuthenticator + + # API endpoints protected by JWT + api: + pattern: ^/api + stateless: true + provider: database_provider + jwt: ~ + + # Main firewall for web pages + main: + lazy: true + provider: database_provider + logout: + path: app_logout + + access_control: + - { path: ^/login, roles: PUBLIC_ACCESS } + - { path: ^/oauth/check, roles: PUBLIC_ACCESS } + - { path: ^/api/public, roles: PUBLIC_ACCESS } + - { path: ^/api, roles: ROLE_USER } + - { path: ^/capitals/test$, roles: PUBLIC_ACCESS } + - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } + - { path: ^/capitals, roles: ROLE_USER } \ No newline at end of file diff --git a/config/packages/security.yaml b/config/packages/security.yaml deleted file mode 100644 index d0e1cbb..0000000 --- a/config/packages/security.yaml +++ /dev/null @@ -1,31 +0,0 @@ -security: - enable_authenticator_manager: true - # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers - providers: - database_provider: - entity: - class: App\Flags\Entity\User - property: telegramId - password_hashers: - App\Entity\User: - algorithm: bcrypt - firewalls: - dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ - security: false - main: - jwt: ~ - # activate different ways to authenticate - # https://symfony.com/doc/current/security.html#firewalls-authentication - - # Easy way to control access for large sections of your site - # Note: Only the *first* access control that matches will be used - access_control: - - { path: ^/check, roles: PUBLIC_ACCESS } - - { path: ^/capitals/test, roles: PUBLIC_ACCESS } - - { path: ^/capitals/test2, roles: ROLE_USER } - - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } - - { path: ^/api/tg/login, roles: PUBLIC_ACCESS } - - { path: ^/test, roles: ROLE_USER } - - { path: ^/profile, roles: ROLE_USER } - - { path: ^/capitals, roles: ROLE_USER } diff --git a/config/packages/security.yaml.bkp b/config/packages/security.yaml.bkp new file mode 100644 index 0000000..937e999 --- /dev/null +++ b/config/packages/security.yaml.bkp @@ -0,0 +1,96 @@ +security: + enable_authenticator_manager: true + + providers: + database_provider: + entity: + class: App\Flags\Entity\User + property: email + + password_hashers: + App\Flags\Entity\User: + algorithm: bcrypt + + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + main: + lazy: true + provider: database_provider + + stateless: true # Important for API! + jwt: ~ # Enable JWT authentication + + custom_authenticators: + - App\Flags\Security\HqAuthAuthenticator + - lexik_jwt_authentication.jwt_token_authenticator # For JWT validation + + logout: + path: app_logout + target: app_login + + access_control: + - { path: ^/login, roles: PUBLIC_ACCESS } + - { path: ^/oauth/check, roles: PUBLIC_ACCESS } + - { path: ^/check, roles: PUBLIC_ACCESS } + - { path: ^/capitals/test, roles: PUBLIC_ACCESS } + - { path: ^/capitals/test2, roles: ROLE_USER } + - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } + - { path: ^/api/tg/login, roles: PUBLIC_ACCESS } + - { path: ^/test, roles: ROLE_USER } + - { path: ^/profile, roles: ROLE_USER } + - { path: ^/capitals, roles: ROLE_USER } + + +#security: +# enable_authenticator_manager: true +# # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers +# providers: +# database_provider: +# entity: +# class: App\Flags\Entity\User +## property: telegramId +# # Add a separate provider for OAuth users if needed +## oauth_user_provider: +## entity: +## class: App\Flags\Entity\User +## property: email # or whatever identifier your OAuth returns +# password_hashers: +# App\Entity\User: +# algorithm: bcrypt +# firewalls: +# dev: +# pattern: ^/(_(profiler|wdt)|css|images|js)/ +# security: false +# main: +## jwt: ~ +# lazy: true +# provider: database_provider +# +# custom_authenticators: +# - App\Flags\Security\HqAuthAuthenticator +## - lexic_jwt_authentication.jwt_token_authenticator +# +# logout: +# path: app_logout +# target: app_login +## main: +## jwt: ~ +# # activate different ways to authenticate +# # https://symfony.com/doc/current/security.html#firewalls-authentication +# +# # Easy way to control access for large sections of your site +# # Note: Only the *first* access control that matches will be used +# access_control: +# - { path: ^/login, roles: PUBLIC_ACCESS } +# - { path: ^/oauth/check, roles: PUBLIC_ACCESS } +# - { path: ^/check, roles: PUBLIC_ACCESS } +# - { path: ^/capitals/test, roles: PUBLIC_ACCESS } +# - { path: ^/capitals/test2, roles: ROLE_USER } +# - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } +# - { path: ^/api/tg/login, roles: PUBLIC_ACCESS } +# - { path: ^/test, roles: ROLE_USER } +# - { path: ^/profile, roles: ROLE_USER } +# - { path: ^/capitals, roles: ROLE_USER } diff --git a/http-requests/OAuth2-login.http b/http-requests/OAuth2-login.http new file mode 100644 index 0000000..8388776 --- /dev/null +++ b/http-requests/OAuth2-login.http @@ -0,0 +1,3 @@ +### GET request to example server +GET https://auth.izeebot.top/oauth2/authorize?client_id=flags_app&redirect_uri={{redirect_url}}&response_type=code&scope=openid +### \ No newline at end of file diff --git a/http-requests/Test Auth.http b/http-requests/Test Auth.http new file mode 100644 index 0000000..a6b4e6f --- /dev/null +++ b/http-requests/Test Auth.http @@ -0,0 +1,5 @@ +### GET request to example server +GET http://localhost/test +Authorization: Bearer {{oauth_token}} + +### \ No newline at end of file diff --git a/http-requests/http-client.env.json b/http-requests/http-client.env.json new file mode 100644 index 0000000..b3d1c95 --- /dev/null +++ b/http-requests/http-client.env.json @@ -0,0 +1,7 @@ +{ + "dev": { + "auth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiIxM2EwMmU2NDg3NzYzNjcyODI2MzQwZWQ4NDA0NGMxMzMwY2E4MDgxYWYzNGEwYjJiYmE5MjgyNzI2M2RlYjU0MDY2Njk5MDJmZDU2NzQxNyIsImlhdCI6MTc2NTA1ODcwMS4xNjYyODksIm5iZiI6MTc2NTA1ODcwMS4xNjYyOTEsImV4cCI6MTc2NTA2MjMwMS4xNjI2Miwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.aBzIJkh_Ri4wjCcQBHg9hucg5JkiZ7T-P22WBN0xcTvQbxbsjyrkyrW2vUR_wgpfvHPNVouA8QB-ndEVqU3LuTI7YNmMwMORLc33rdnrbU_nxgKPY_UEWGHWy85H_SWJyKiMewde48MS-fjXObKKnMMQI1YkpuzP6u6XcxrKYBinsVB-9XAHW5ct_r59gpZPMgKoHlZm2KaLAl3VHSVznov7yfsYBOWFZHepyoxRS1WqbDb5agJANN70tXAi5SPftff9EewzyULe5vxTpblkoAO1aYl7rMqWharWnwqRukGqKdAp1Jc2Vg1qxa0AINCjIFjM1HG8XKTue_MECiou_w", + "redirect_url": "https://3bd5404da6bd.ngrok-free.app/oauth/check", + "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA" + } +} \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..d72d5a7 --- /dev/null +++ b/makefile @@ -0,0 +1,33 @@ +include .env +init: build-containers run-containers composer import-db run-api +run: run-containers run-api +build: + @docker compose build +run-containers: + @docker compose up -d +run-api: + @symfony server:start +import-db: + @bin/console d:d:i flags.sql +composer: + @docker compose exec php composer install +deploy: + @./vendor/bin/dep deploy production +welcome: + @echo hi +test: + @docker compose exec php vendor/bin/phpunit +psalm: + @docker compose exec php vendor/bin/psalm --no-cache +fix: + @docker compose exec php vendor/bin/php-cs-fixer fix +--: + @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" +sh: + @docker compose exec php sh +dumper: + @docker compose exec php vendor/bin/var-dump-server +network: + @docker network create backend-flags +%: + @ diff --git a/migrations/Version20251206170339.php b/migrations/Version20251206170339.php new file mode 100644 index 0000000..73f71c1 --- /dev/null +++ b/migrations/Version20251206170339.php @@ -0,0 +1,33 @@ +addSql('DROP TABLE migration_versions'); + $this->addSql('ALTER TABLE user ADD sub VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE TABLE migration_versions (version VARCHAR(14) CHARACTER SET utf8mb4 NOT NULL COLLATE `utf8mb4_unicode_ci`, executed_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\', PRIMARY KEY(version)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB COMMENT = \'\' '); + $this->addSql('ALTER TABLE user DROP sub'); + } +} diff --git a/request.md b/request.md new file mode 100644 index 0000000..b62c566 --- /dev/null +++ b/request.md @@ -0,0 +1,12 @@ +https://auth.izeebot.top/oauth2/authorize?client_id=flags_app&redirect_uri=https%3A%2F%2Fapi.flags.izeebot.top/oauth/check&response_type=code&scope=openid + + +https://auth.izeebot.top/oauth2/authorize?client_id=flags_app&redirect_uri=http%3A%2F%2Flocalhost/oauth/check&response_type=code&scope=openid + +https://auth.izeebot.top/oauth2/authorize?client_id=flags_app&redirect_uri=https://3bd5404da6bd.ngrok-free.app/oauth/check&response_type=code&scope=openid + +QUICK DEBUG PGSQL QUERY: + +UPDATE oauth2_client +SET redirect_uris = 'https://3bd5404da6bd.ngrok-free.app/oauth/check' +WHERE identifier = 'flags_app'; diff --git a/src/DataFixtures/AppFixtures.php b/src/DataFixtures/AppFixtures.php index a6234ae..4ab2a1d 100644 --- a/src/DataFixtures/AppFixtures.php +++ b/src/DataFixtures/AppFixtures.php @@ -16,6 +16,7 @@ public function load(ObjectManager $manager): void if (!$user) { $user = new User(); $user->setTelegramId('994310081'); + $user->setSub('1'); $manager->persist($user); $manager->flush(); } diff --git a/src/Flags/Controller/GameController.php b/src/Flags/Controller/GameController.php index 9543564..2382934 100644 --- a/src/Flags/Controller/GameController.php +++ b/src/Flags/Controller/GameController.php @@ -189,7 +189,8 @@ public function getToken( #[Autowire(service: 'lexik_jwt_authentication.handler.authentication_success')] AuthenticationSuccessHandlerInterface $handler ): Response { - $user = $repository->getAnyUser(); +// $user = $repository->getAnyUser(); + $user = $repository->findOneBySub('1'); // $token = $encoder // ->encode([ // 'username' => $user->getTelegramId(), diff --git a/src/Flags/Controller/SecurityController.php b/src/Flags/Controller/SecurityController.php new file mode 100644 index 0000000..6546667 --- /dev/null +++ b/src/Flags/Controller/SecurityController.php @@ -0,0 +1,71 @@ +getClient('flags_app') + ->redirect(['openid', 'profile', 'email'], []); + } + + #[Route('/oauth/check', name: 'oauth_check')] + public function check() + { + // This route is handled by the authenticator + } + + #[Route('/logout', name: 'app_logout')] + public function logout() + { + throw new \LogicException('This should never be reached'); + } + + #[Route('/api/refresh', name: 'api_refresh', methods: ['POST'])] + public function refresh(Request $request): JsonResponse + { + # TODO Check if it works at all + + $data = json_decode($request->getContent(), true); + $refreshToken = $data['refresh_token'] ?? null; + + if (!$refreshToken) { + return new JsonResponse(['error' => 'No refresh token provided'], 400); + } + + try { + $response = $this->httpClient->request('POST', $_ENV['OAUTH_SERVER_URL'] . '/oauth2/token', [ + 'body' => [ + 'grant_type' => 'refresh_token', + 'refresh_token' => $refreshToken, + 'client_id' => $_ENV['OAUTH_CLIENT_ID'], + 'client_secret' => $_ENV['OAUTH_CLIENT_SECRET'], + ] + ]); + + $tokens = $response->toArray(); + + return new JsonResponse([ + 'access_token' => $tokens['access_token'], + 'refresh_token' => $tokens['refresh_token'] ?? $refreshToken, + 'expires_in' => $tokens['expires_in'], + ]); + } catch (\Exception $e) { + return new JsonResponse(['error' => 'Failed to refresh token'], 401); + } + } +} \ No newline at end of file diff --git a/src/Flags/Entity/User.php b/src/Flags/Entity/User.php index 9ac1e11..d3886a2 100644 --- a/src/Flags/Entity/User.php +++ b/src/Flags/Entity/User.php @@ -45,38 +45,43 @@ class User implements UserInterface * @ORM\Column(type="string", length=255, nullable=true) */ private ?string $telegramPhotoUrl; - + /** * @ORM\Column(type="integer") */ private int $highScore = 0; - + /** * @ORM\Column(type="integer") */ private int $gamesTotal = 0; - + /** * @ORM\Column(type="integer") */ private int $bestTime = 0; - + /** * @ORM\Column(type="integer") */ private int $timeTotal = 0; - + + /** + * @ORM\Column(type="string", length=255, nullable=true) + */ + private ?string $sub = null; // OAuth2 subject identifier + /** * @OneToMany(targetEntity="Answer", mappedBy="user", cascade={"persist"}) * @Ignore */ private ?Collection $answers; - + public function __construct() { $this->answers = new ArrayCollection(); } - + public function getId(): ?int { return $this->id; @@ -166,17 +171,17 @@ public function eraseCredentials() { // TODO: Implement eraseCredentials() method. } - + public function getHighScore(): int { return $this->highScore; } - + public function setHighScore(int $score): void { - $this->highScore = $score; + $this->highScore = $score; } - + /** * @return int */ @@ -184,7 +189,7 @@ public function getGamesTotal(): int { return $this->gamesTotal; } - + /** * @param int $gamesTotal */ @@ -192,7 +197,7 @@ public function setGamesTotal(int $gamesTotal): void { $this->gamesTotal = $gamesTotal; } - + /** * @return int */ @@ -200,7 +205,7 @@ public function getBestTime(): int { return $this->bestTime; } - + /** * @param int $bestTime */ @@ -208,7 +213,7 @@ public function setBestTime(int $bestTime): void { $this->bestTime = $bestTime; } - + /** * @return int */ @@ -216,7 +221,7 @@ public function getTimeTotal(): int { return $this->timeTotal; } - + /** * @param Score $score * @param array[App\Entity\Answer] $answers @@ -236,19 +241,19 @@ public function finalizeGame(Score $score, array $answers): void $this->addAnswer($item); } } - + public function addAnswer(Answer $answer): void { $answer->setUser($this); $this->answers[] = $answer; } - + public function removeAnswer(Answer $answer): void { $answer->setUser(null); $this->answers->removeElement($answer); } - + /** * @return ArrayCollection|Collection */ @@ -259,6 +264,16 @@ public function getAnswers(): ?Collection public function getUserIdentifier(): string { - return $this->id; + return $this->sub ?? $this->telegramId ?? $this->id; + } + + public function getSub(): ?string + { + return $this->sub; + } + + public function setSub(string $sub): void + { + $this->sub = $sub; } } diff --git a/src/Flags/Repository/UserRepository.php b/src/Flags/Repository/UserRepository.php index 81ea2d8..6092188 100644 --- a/src/Flags/Repository/UserRepository.php +++ b/src/Flags/Repository/UserRepository.php @@ -6,6 +6,9 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Criteria; use Doctrine\Persistence\ManagerRegistry; +use League\OAuth2\Client\Provider\GenericResourceOwner; +use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface; +use Symfony\Component\Security\Core\User\UserInterface; /** * @method User|null find($id, $lockMode = null, $lockVersion = null) @@ -13,7 +16,7 @@ * @method User[] findAll() * @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ -class UserRepository extends ServiceEntityRepository +class UserRepository extends ServiceEntityRepository implements UserLoaderInterface { public function __construct(ManagerRegistry $registry) { @@ -76,4 +79,36 @@ public function findOneBySomeField($value): ?User ; } */ + + public function loadUserByIdentifier(string $identifier): ?UserInterface + { + return $this->findOneBySub($identifier) ?? $this->findOneByTelegramId($identifier); + } + + public function loadOrCreateFromOAuth(GenericResourceOwner $userInfo): User + { + // Assuming your OAuth server returns "sub" as unique identifier + $sub = $userInfo->getId(); // or ->getUid(), ->getEmail(), depending on your provider +// $email = $userInfo->getEmail(); + + // Try to find existing user + $user = $this->findOneBy(['sub' => $sub]); + + if ($user) { + return $user; + } + +// $userInfoArray = $userInfo->toArray() + // Create new user + $user = new User(); + $user->setSub($sub); +// $user->setEmail($userInfoArray['email'] ?? null); +// $user->setRoles(['ROLE_USER']); + + $em = $this->getEntityManager(); + $em->persist($user); + $em->flush(); + + return $user; + } } diff --git a/src/Flags/Security/HqAuthAuthenticator.php b/src/Flags/Security/HqAuthAuthenticator.php new file mode 100644 index 0000000..e925c57 --- /dev/null +++ b/src/Flags/Security/HqAuthAuthenticator.php @@ -0,0 +1,183 @@ +attributes->get('_route') === 'oauth_check'; +// } +// +// public function authenticate(Request $request): Passport +// { +// $client = $this->clientRegistry->getClient('flags_app'); +// $accessToken = $this->fetchAccessToken($client); +// +// // Store the access token in the request for later use +// $request->attributes->set('oauth_access_token', $accessToken->getToken()); +// $request->attributes->set('oauth_refresh_token', $accessToken->getRefreshToken()); +// $request->attributes->set('oauth_expires_in', $accessToken->getExpires()); +// +// return new SelfValidatingPassport( +// new UserBadge($accessToken->getToken(), function () use ($accessToken, $client) { +// $userInfo = $client->fetchUserFromToken($accessToken); +// return $this->userRepository->loadOrCreateFromOAuth($userInfo); +// }) +// ); +// } +// +// public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response +// { +// // Get the JWT access token +// $accessToken = $request->attributes->get('oauth_access_token'); +// $refreshToken = $request->attributes->get('oauth_refresh_token'); +// $expiresIn = $request->attributes->get('oauth_expires_in'); +// +// // Return JSON with the tokens for the frontend +// return new JsonResponse([ +// 'success' => true, +// 'access_token' => $accessToken, +// 'refresh_token' => $refreshToken, +// 'expires_in' => $expiresIn, +// 'token_type' => 'Bearer', +// 'user' => [ +//// 'email' => $token->getUser()->getEmail(), +// 'roles' => $token->getUser()->getRoles(), +// ] +// ]); +// } +// +// public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response +// { +// return new JsonResponse([ +// 'success' => false, +// 'error' => $exception->getMessage() +// ], Response::HTTP_UNAUTHORIZED); +// } +//} + + + +namespace App\Flags\Security; + +use App\Flags\Repository\UserRepository; +use KnpU\OAuth2ClientBundle\Client\ClientRegistry; +use KnpU\OAuth2ClientBundle\Security\Authenticator\OAuth2Authenticator; +use Lcobucci\JWT\Parser; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\RouterInterface; +use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Exception\AuthenticationException; +use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; +use Symfony\Component\Security\Http\Authenticator\Passport\Passport; +use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; + +class HqAuthAuthenticator extends OAuth2Authenticator +{ + public function __construct( + private ClientRegistry $clientRegistry, + private RouterInterface $router, + private UserRepository $userRepository, +// private Parser $jwtParser, + ) {} + + public function supports(Request $request): ?bool + { + return $request->attributes->get('_route') === 'oauth_check'; + } + + public function authenticate(Request $request): Passport + { + $client = $this->clientRegistry->getClient('flags_app'); + $accessToken = $this->fetchAccessToken($client); + + +// // Optional: parse & verify JWT locally +// $jwt = $accessToken->getToken(); +// $token = $this->jwtParser->parse($jwt); // e.g., lcobucci/jwt +// if (!$token->verify($signer, $publicKey) || $token->isExpired(new \DateTimeImmutable())) { +// throw new AuthenticationException('Invalid or expired token'); +// } + +// Store the access token in the request for later use + $request->attributes->set('oauth_access_token', $accessToken->getToken()); + $request->attributes->set('oauth_refresh_token', $accessToken->getRefreshToken()); + $request->attributes->set('oauth_expires_in', $accessToken->getExpires()); + + return new SelfValidatingPassport( + new UserBadge($accessToken->getToken(), function() use ($accessToken, $client) { + $userInfo = $client->fetchUserFromToken($accessToken); + + return $this->userRepository->loadOrCreateFromOAuth($userInfo); + // Here you'd load or create your user based on the OAuth data + // For example, using the 'sub' claim as the user identifier +// return $this->loadOrCreateUser($userInfo); + }) + ); + } + +// public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response +// { +// return new JsonResponse([$token->getUser()->getUserIdentifier(), implode($token->getUser()->getRoles())]); +//// return new RedirectResponse($this->router->generate('app_dashboard')); +// } + + public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response + { +// dd($request->toArray()); + // Get the JWT access token + $accessToken = $request->attributes->get('oauth_access_token'); + $refreshToken = $request->attributes->get('oauth_refresh_token'); + $expiresIn = $request->attributes->get('oauth_expires_in'); + + // Return JSON with the tokens for the frontend + return new JsonResponse([ + 'success' => true, + 'access_token' => $accessToken, + 'refresh_token' => $refreshToken, + 'expires_in' => $expiresIn, + 'token_type' => 'Bearer', + 'user' => [ +// 'email' => $token->getUser()->getEmail(), + 'roles' => $token->getUser()->getRoles(), + ] + ]); + } + + public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response + { + return new RedirectResponse($this->router->generate('app_login')); + } + +// private function loadOrCreateUser($userInfo) +// { +// // Implement your user loading/creation logic +// // You might want to inject UserRepository here +// } +} \ No newline at end of file diff --git a/src/Flags/Service/HqAuthProvider.php b/src/Flags/Service/HqAuthProvider.php new file mode 100644 index 0000000..174262d --- /dev/null +++ b/src/Flags/Service/HqAuthProvider.php @@ -0,0 +1,29 @@ + Date: Sun, 7 Dec 2025 22:53:43 +0000 Subject: [PATCH 09/25] feat(oauth2): experimenting with oauth, fixes, improvements --- .docker/nginx/host.conf | 11 +++++++ config/packages/lexik_jwt_authentication.yaml | 1 + config/packages/secrity.yaml | 10 +++++- config/services.yaml | 6 +++- http-requests/Correct.http | 6 ++++ http-requests/Incorrect.http | 6 ++++ http-requests/Profile.http | 6 ++++ http-requests/ProtectedEndpoint.http | 6 ++++ http-requests/Protected[OPTIONS].http | 5 +++ http-requests/http-client.env.json | 3 +- public/index.php | 3 ++ request.md | 9 +++++- src/EventListener/NgrokHeaderListener.php | 23 +++++++++++++ src/Flags/Controller/GameController.php | 17 ++++++++-- src/Flags/Entity/User.php | 1 + src/Flags/Security/HqAuthAuthenticator.php | 32 ++++++++++++------- 16 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 http-requests/Correct.http create mode 100644 http-requests/Incorrect.http create mode 100644 http-requests/Profile.http create mode 100644 http-requests/ProtectedEndpoint.http create mode 100644 http-requests/Protected[OPTIONS].http create mode 100644 src/EventListener/NgrokHeaderListener.php diff --git a/.docker/nginx/host.conf b/.docker/nginx/host.conf index 25ae095..d7cfd63 100644 --- a/.docker/nginx/host.conf +++ b/.docker/nginx/host.conf @@ -12,6 +12,17 @@ server { } location ~ ^/index\.php(/|$) { + # 1. Add this Preflight check + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' always; + add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since' always; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + fastcgi_pass php-upstream; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; diff --git a/config/packages/lexik_jwt_authentication.yaml b/config/packages/lexik_jwt_authentication.yaml index e189bb7..70d25d5 100644 --- a/config/packages/lexik_jwt_authentication.yaml +++ b/config/packages/lexik_jwt_authentication.yaml @@ -3,4 +3,5 @@ lexik_jwt_authentication: public_key: '%env(resolve:JWT_PUBLIC_KEY)%' pass_phrase: '%env(JWT_PASSPHRASE)%' token_ttl: '%env(JWT_TOKEN_TTL)%' + user_identity_field: sub # TODO - add public key from oauth server to reuse their accesstokens! diff --git a/config/packages/secrity.yaml b/config/packages/secrity.yaml index cf9ee10..d9b7abf 100644 --- a/config/packages/secrity.yaml +++ b/config/packages/secrity.yaml @@ -5,7 +5,7 @@ security: database_provider: entity: class: App\Flags\Entity\User - property: email + property: sub password_hashers: App\Flags\Entity\User: @@ -16,6 +16,12 @@ security: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false + # NEW: Dedicated firewall to handle API Preflights (OPTIONS) + api_preflight: + pattern: ^/api + methods: [OPTIONS] + security: false # Bypasses all security/authenticators for OPTIONS + # OAuth login flow (needs sessions for state parameter) oauth: pattern: ^/(login|oauth) @@ -39,6 +45,8 @@ security: path: app_logout access_control: + # Allow OPTIONS requests for all API paths without a token + - { path: ^/api, methods: [OPTIONS], roles: PUBLIC_ACCESS } - { path: ^/login, roles: PUBLIC_ACCESS } - { path: ^/oauth/check, roles: PUBLIC_ACCESS } - { path: ^/api/public, roles: PUBLIC_ACCESS } diff --git a/config/services.yaml b/config/services.yaml index f11b85b..e34dfdf 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -31,4 +31,8 @@ services: # please note that last definitions always *replace* previous ones App\DataFixtures\: - resource: '../src/DataFixtures/*' \ No newline at end of file + resource: '../src/DataFixtures/*' + + App\EventListener\NgrokHeaderListener: + tags: + - { name: kernel.event_subscriber } \ No newline at end of file diff --git a/http-requests/Correct.http b/http-requests/Correct.http new file mode 100644 index 0000000..2080992 --- /dev/null +++ b/http-requests/Correct.http @@ -0,0 +1,6 @@ +### GET request to example server +GET https://369c0297b669.ngrok-free.app/api/correct +Authorization: Bearer {{t1}} +ngrok-skip-browser-warning: true + +###http://localhost/test \ No newline at end of file diff --git a/http-requests/Incorrect.http b/http-requests/Incorrect.http new file mode 100644 index 0000000..19344f6 --- /dev/null +++ b/http-requests/Incorrect.http @@ -0,0 +1,6 @@ +### GET request to example server +GET https://369c0297b669.ngrok-free.app/api/incorrect +Authorization: Bearer {{t1}} +ngrok-skip-browser-warning: true + +###http://localhost/test \ No newline at end of file diff --git a/http-requests/Profile.http b/http-requests/Profile.http new file mode 100644 index 0000000..931a691 --- /dev/null +++ b/http-requests/Profile.http @@ -0,0 +1,6 @@ +### GET request to example server +GET https://localhost:4430/api/profile +Authorization: Bearer {{t1}} +ngrok-skip-browser-warning: true + +###http://localhost/test \ No newline at end of file diff --git a/http-requests/ProtectedEndpoint.http b/http-requests/ProtectedEndpoint.http new file mode 100644 index 0000000..1f574ff --- /dev/null +++ b/http-requests/ProtectedEndpoint.http @@ -0,0 +1,6 @@ +### GET request to example server +GET https://369c0297b669.ngrok-free.app/api/protected +Authorization: Bearer {{t1}} +ngrok-skip-browser-warning: true + +###http://localhost/test \ No newline at end of file diff --git a/http-requests/Protected[OPTIONS].http b/http-requests/Protected[OPTIONS].http new file mode 100644 index 0000000..574958f --- /dev/null +++ b/http-requests/Protected[OPTIONS].http @@ -0,0 +1,5 @@ +### GET request to example server +OPTIONS https://localhost:4430/api/protected +ngrok-skip-browser-warning: true + +###http://localhost/test \ No newline at end of file diff --git a/http-requests/http-client.env.json b/http-requests/http-client.env.json index b3d1c95..8f4bdb8 100644 --- a/http-requests/http-client.env.json +++ b/http-requests/http-client.env.json @@ -2,6 +2,7 @@ "dev": { "auth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiIxM2EwMmU2NDg3NzYzNjcyODI2MzQwZWQ4NDA0NGMxMzMwY2E4MDgxYWYzNGEwYjJiYmE5MjgyNzI2M2RlYjU0MDY2Njk5MDJmZDU2NzQxNyIsImlhdCI6MTc2NTA1ODcwMS4xNjYyODksIm5iZiI6MTc2NTA1ODcwMS4xNjYyOTEsImV4cCI6MTc2NTA2MjMwMS4xNjI2Miwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.aBzIJkh_Ri4wjCcQBHg9hucg5JkiZ7T-P22WBN0xcTvQbxbsjyrkyrW2vUR_wgpfvHPNVouA8QB-ndEVqU3LuTI7YNmMwMORLc33rdnrbU_nxgKPY_UEWGHWy85H_SWJyKiMewde48MS-fjXObKKnMMQI1YkpuzP6u6XcxrKYBinsVB-9XAHW5ct_r59gpZPMgKoHlZm2KaLAl3VHSVznov7yfsYBOWFZHepyoxRS1WqbDb5agJANN70tXAi5SPftff9EewzyULe5vxTpblkoAO1aYl7rMqWharWnwqRukGqKdAp1Jc2Vg1qxa0AINCjIFjM1HG8XKTue_MECiou_w", "redirect_url": "https://3bd5404da6bd.ngrok-free.app/oauth/check", - "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA" + "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA", + "t1" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJkNzE1OTc5YmE0YjNiZDJkODIzZjYzYWYyY2Q5N2M2OWU0YzI0OWRlOWMxN2I3Njc0MTQ3NTA0YWZhZGU2YjFlOTA1NmIyMWRkMzA3YWI4OSIsImlhdCI6MTc2NTEyMzEzMi4zNTc0MTMsIm5iZiI6MTc2NTEyMzEzMi4zNTc0MTcsImV4cCI6MTc2NTEyNjczMi4zNTAzMiwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.IeX6GCpHqZG5kJ1JoVxFE8gy7v1NOz6vpPPF7GqlJsKL4kaW8-KfsmElfZEk3XVVOvCEeZv01sO7fM5-sr9mhLPKfhHpPf9Sr0Roq80klKJFW3YJ2RSEfPHWnz3PAbSOB6wM00FkXNqixsW4hUVj_q7aIJ4KNy_WA-_A-K17J2n6WodsNvJzIE94G499fKfXfMJJiuxeZntdTzaPT8_p9MR0ORaXGc-8GmpxR-iS_uHftGT4fBSxGY4eiAIPtwZ9SBeluZL7OqKbfyFN5kAJW_iT4H7hRQUxZSrXc_g2il2Kc2zlGRBb5t6yogrSNauzs9VAEZ6zW2i52L_WpVTOqw" } } \ No newline at end of file diff --git a/public/index.php b/public/index.php index f094a9b..dd87b7a 100644 --- a/public/index.php +++ b/public/index.php @@ -1,9 +1,12 @@ 'onKernelResponse', + ]; + } + + public function onKernelResponse(ResponseEvent $event): void + { + $response = $event->getResponse(); + $response->headers->set('ngrok-skip-browser-warning', 'true'); + } +} \ No newline at end of file diff --git a/src/Flags/Controller/GameController.php b/src/Flags/Controller/GameController.php index 2382934..2bedb9a 100644 --- a/src/Flags/Controller/GameController.php +++ b/src/Flags/Controller/GameController.php @@ -137,7 +137,7 @@ public function authAction(Request $request, JWTEncoderInterface $encoder): Resp } /** @Security("is_granted('ROLE_USER')") */ - #[Route('/protected', name: 'get_profile', methods: ['GET'])] + #[Route('/api/protected', name: 'get_profile', methods: ['GET', 'OPTIONS'])] public function getProfile(): Response { return $this->json($this->getUser()); @@ -207,7 +207,7 @@ public function getToken( } /** @Security("is_granted('ROLE_USER')") */ - #[Route('/incorrect', name: 'incorrect', methods: ['GET'])] + #[Route('/api/incorrect', name: 'incorrect', methods: ['GET', 'OPTIONS'])] public function getStat(#[CurrentUser] $user, AnswerRepository $repository): Response { $correctResults = $repository->findCorrectGuesses($user->getId()); @@ -240,7 +240,7 @@ public function getStat(#[CurrentUser] $user, AnswerRepository $repository): Res } /** @Security("is_granted('ROLE_USER')") */ - #[Route('/correct', name: 'correct', methods: ['GET'])] + #[Route('/api/correct', name: 'correct', methods: ['GET', 'OPTIONS'])] public function getRight(#[CurrentUser] $user, AnswerRepository $repository): Response { $correctResults = $repository->findCorrectGuesses($user->getId()); @@ -270,4 +270,15 @@ public function getRight(#[CurrentUser] $user, AnswerRepository $repository): Re return $this->json($result); } + + #[Route('/test-header', name: 'test_header')] + public function testHeader(): Response + { + return new JsonResponse([ + 'message' => 'If you see this without ngrok warning, headers work!', + 'headers' => [ + 'ngrok-skip' => 'true' + ] + ]); + } } diff --git a/src/Flags/Entity/User.php b/src/Flags/Entity/User.php index d3886a2..e59ffc7 100644 --- a/src/Flags/Entity/User.php +++ b/src/Flags/Entity/User.php @@ -262,6 +262,7 @@ public function getAnswers(): ?Collection return $this->answers; } + public function getUserIdentifier(): string { return $this->sub ?? $this->telegramId ?? $this->id; diff --git a/src/Flags/Security/HqAuthAuthenticator.php b/src/Flags/Security/HqAuthAuthenticator.php index e925c57..8a821b8 100644 --- a/src/Flags/Security/HqAuthAuthenticator.php +++ b/src/Flags/Security/HqAuthAuthenticator.php @@ -156,18 +156,28 @@ public function onAuthenticationSuccess(Request $request, TokenInterface $token, $refreshToken = $request->attributes->get('oauth_refresh_token'); $expiresIn = $request->attributes->get('oauth_expires_in'); + + return new Response(""); + // Return JSON with the tokens for the frontend - return new JsonResponse([ - 'success' => true, - 'access_token' => $accessToken, - 'refresh_token' => $refreshToken, - 'expires_in' => $expiresIn, - 'token_type' => 'Bearer', - 'user' => [ -// 'email' => $token->getUser()->getEmail(), - 'roles' => $token->getUser()->getRoles(), - ] - ]); +// return new JsonResponse([ +// 'success' => true, +// 'access_token' => $accessToken, +// 'refresh_token' => $refreshToken, +// 'expires_in' => $expiresIn, +// 'token_type' => 'Bearer', +// 'user' => [ +//// 'email' => $token->getUser()->getEmail(), +// 'roles' => $token->getUser()->getRoles(), +// ] +// ]); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response From 5f71df5b3ade7d97d9d913359ab83671512135e1 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Thu, 11 Dec 2025 23:43:47 +0000 Subject: [PATCH 10/25] Restructure project: move app files to app/ directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move Symfony application files into app/ subdirectory - Update Docker configs for new structure - Reorganize environment and config files 🤖 Generated with [Claude Code](https://claude.ai/claude-code) Co-Authored-By: Claude Opus 4.5 --- .docker/caddy/Caddyfile | 49 + .docker/caddy/Caddyfile.prod | 50 + .docker/caddy/Dockerfile | 32 + .docker/certs/ca-key.pem | 54 + .docker/certs/ca.pem | 32 + .docker/certs/ca.srl | 1 + .docker/certs/cert.pem | 32 + .docker/certs/key.pem | 52 + .docker/certs/server-cert.pem | 32 + .docker/certs/server-key.pem | 52 + .docker/mysql/Dockerfile | 8 +- .docker/mysql/my.cnf | 4 - .docker/nginx/Dockerfile | 8 +- .docker/php-fpm.old/Dockerfile | 13 + .../{php-fpm => php-fpm.old}/Dockerfile-base | 0 .docker/{php-fpm => php-fpm.old}/build.md | 0 .docker/{php-fpm => php-fpm.old}/php.ini | 0 .docker/php-fpm/Dockerfile | 171 +- .docker/php-fpm/README.md | 11 + .docker/php-fpm/docker-entrypoint.sh | 11 + .idea/.gitignore | 8 + .../Symfony_15_08_2024__22_28.xml | 3271 +++++++++++++++++ .../frameworkDescriptionVersion1.1.4.xsd | 47 + .idea/dataSources.xml | 12 + .idea/flags-api.iml | 135 + .idea/inspectionProfiles/Project_Default.xml | 13 + .idea/modules.xml | 8 + .idea/php.xml | 159 + .idea/phpunit.xml | 10 + .idea/vcs.xml | 6 + .env.prod => app/.env.prod | 0 .env.staging => app/.env.staging | 0 .env.test => app/.env.test | 0 .gitignore => app/.gitignore | 1 + {bin => app/bin}/console | 0 {bin => app/bin}/phpunit | 0 .../capitals-africa.json | 0 .../capitals-americas.json | 0 capitals-asia.json => app/capitals-asia.json | 0 .../capitals-europe.json | 0 .../capitals-oceania.json | 0 composer.json => app/composer.json | 2 +- composer.lock => app/composer.lock.old | 0 {config => app/config}/bootstrap.php | 0 {config => app/config}/bundles.php | 0 {config => app/config}/jwt/.gitkeep | 0 {config => app/config}/jwt/pair/private.pem | 0 {config => app/config}/jwt/pair/public.pem | 0 {config => app/config}/packages/cache.yaml | 0 {config => app/config}/packages/doctrine.yaml | 0 .../config}/packages/doctrine_migrations.yaml | 0 .../config}/packages/framework.yaml | 0 .../config}/packages/knpu_oauth2_client.yaml | 0 .../packages/lexik_jwt_authentication.yaml | 0 .../config}/packages/nelmio_cors.yaml | 0 .../config}/packages/prod/doctrine.yaml | 0 .../config}/packages/prod/routing.yaml | 0 {config => app/config}/packages/routing.yaml | 0 {config => app/config}/packages/secrity.yaml | 0 .../config}/packages/security.yaml.bkp | 0 .../config}/packages/test/framework.yaml | 0 .../config}/packages/test/validator.yaml | 0 .../config}/packages/validator.yaml | 0 {config => app/config}/preload.php | 0 {config => app/config}/routes.yaml | 0 {config => app/config}/routes/attributes.yaml | 0 {config => app/config}/routes/framework.yaml | 0 .../dev/dev.MYSQL_ROOT_PASSWORD.c07213.php | 0 .../secrets/dev/dev.encrypt.public.php | 0 .../config}/secrets/dev/dev.list.php | 0 .../secrets/prod/prod.BOT_TOKEN.f41697.php | 0 .../secrets/prod/prod.DATABASE_URL.8ea85a.php | 0 .../prod/prod.MYSQL_DATABASE.bef43b.php | 0 .../prod/prod.MYSQL_PASSWORD.32327a.php | 0 .../prod/prod.MYSQL_ROOT_PASSWORD.c07213.php | 0 .../secrets/prod/prod.MYSQL_USER.8e3cb8.php | 0 .../secrets/prod/prod.encrypt.public.php | 0 .../config}/secrets/prod/prod.list.php | 0 .../staging/staging.BOT_TOKEN.f41697.php | 0 .../staging/staging.DATABASE_URL.8ea85a.php | 0 .../staging/staging.MYSQL_DATABASE.bef43b.php | 0 .../staging/staging.MYSQL_PASSWORD.32327a.php | 0 .../staging/staging.MYSQL_ROOT.1ea6ef.php | 0 .../staging/staging.MYSQL_USER.8e3cb8.php | 0 .../staging/staging.encrypt.public.php | 0 .../config}/secrets/staging/staging.list.php | 0 {config => app/config}/services.yaml | 0 .../docker-compose-prod.yml | 0 .../docker-compose-staging.yml | 0 .../docker-compose.override.yml | 8 +- app/docker-compose.yml | 62 + docker.md => app/docker.md | 0 flags.sql => app/flags.sql | 0 .../http-requests}/Correct.http | 0 .../http-requests}/Incorrect.http | 0 .../http-requests}/OAuth2-login.http | 0 .../http-requests}/Profile.http | 0 .../http-requests}/ProtectedEndpoint.http | 0 .../http-requests}/Protected[OPTIONS].http | 0 .../http-requests}/Test Auth.http | 0 .../http-requests}/http-client.env.json | 0 makefile => app/makefile | 2 +- {migrations => app/migrations}/.gitignore | 0 .../migrations}/Version20200322114725.php | 0 .../migrations}/Version20210103221647.php | 0 .../migrations}/Version20210109193151.php | 0 .../migrations}/Version20210109213855.php | 0 .../migrations}/Version20210109232957.php | 0 .../migrations}/Version20210109233702.php | 0 .../migrations}/Version20210110000325.php | 0 .../migrations}/Version20231022221730.php | 0 .../migrations}/Version20231103235658.php | 0 .../migrations}/Version20231112194737.php | 0 .../migrations}/Version20231112201521.php | 0 .../migrations}/Version20231119013323.php | 0 .../migrations}/Version20231119205647.php | 0 .../migrations}/Version20231120235309.php | 0 .../migrations}/Version20240102024927.php | 0 .../migrations}/Version20240904211753.php | 0 .../migrations}/Version20240904212530.php | 0 .../migrations}/Version20240904220255.php | 0 .../migrations}/Version20251206170339.php | 0 phpunit.xml.dist => app/phpunit.xml.dist | 0 psalm.xml => app/psalm.xml | 0 {public => app/public}/index.php | 0 readme.md => app/readme.md | 0 request.md => app/request.md | 0 {src => app/src}/Controller/.gitignore | 0 {src => app/src}/DataFixtures/AppFixtures.php | 0 .../src}/DataFixtures/CapitalsFixtures.php | 0 {src => app/src}/Entity/.gitignore | 0 {src => app/src}/Entity/CapitalsStat.php | 0 .../EventListener/NgrokHeaderListener.php | 0 .../Flags/Application/PostParamConverter.php | 0 .../Flags/ConsoleCommand/GetTokenCommand.php | 0 .../ConsoleCommand/SetWebhookCommand.php | 0 {src => app/src}/Flags/Controller/.gitignore | 0 .../Flags/Controller/CapitalsController.php | 0 .../src}/Flags/Controller/GameController.php | 0 .../Flags/Controller/SecurityController.php | 0 .../src}/Flags/DTO/CapitalsStatDTO.php | 0 {src => app/src}/Flags/DTO/ScoreDTO.php | 0 {src => app/src}/Flags/Entity/.gitignore | 0 {src => app/src}/Flags/Entity/Answer.php | 0 {src => app/src}/Flags/Entity/Capital.php | 0 .../src}/Flags/Entity/CapitalsStat.php | 0 .../src}/Flags/Entity/Enum/GameType.php | 0 .../src}/Flags/Entity/Enum/WorldRegions.php | 0 {src => app/src}/Flags/Entity/Flag.php | 0 {src => app/src}/Flags/Entity/Game.php | 0 {src => app/src}/Flags/Entity/Score.php | 0 {src => app/src}/Flags/Entity/User.php | 0 {src => app/src}/Flags/Repository/.gitignore | 0 .../Flags/Repository/AnswerRepository.php | 0 .../Flags/Repository/CapitalRepository.php | 0 .../Repository/CapitalsStatRepository.php | 0 .../src}/Flags/Repository/FlagRepository.php | 0 .../src}/Flags/Repository/GameRepository.php | 0 .../src}/Flags/Repository/ScoreRepository.php | 0 .../src}/Flags/Repository/UserRepository.php | 0 .../Flags/Security/HqAuthAuthenticator.php | 0 .../src}/Flags/Serializer/UserNormalizer.php | 0 .../Flags/Service/CapitalsGameService.php | 0 .../src}/Flags/Service/HqAuthProvider.php | 0 {src => app/src}/Kernel.php | 0 {src => app/src}/Repository/.gitignore | 0 {src => app/src}/package.json | 0 symfony.lock => app/symfony.lock | 0 test => app/test | 0 {tests => app/tests}/Unit/Entity/GameTest.php | 0 {tests => app/tests}/Unit/SmokeTest.php | 0 {tests => app/tests}/bootstrap.php | 0 config/.DS_Store | Bin 6148 -> 0 bytes .../secrets/prod/prod.decrypt.private.php.bkp | 4 - deploy.php | 40 - docker-compose.yml | 42 - env/._.env | Bin 4096 -> 0 bytes env/._.env.staging.local | Bin 4096 -> 0 bytes 178 files changed, 4328 insertions(+), 114 deletions(-) create mode 100644 .docker/caddy/Caddyfile create mode 100644 .docker/caddy/Caddyfile.prod create mode 100644 .docker/caddy/Dockerfile create mode 100755 .docker/certs/ca-key.pem create mode 100755 .docker/certs/ca.pem create mode 100755 .docker/certs/ca.srl create mode 100755 .docker/certs/cert.pem create mode 100755 .docker/certs/key.pem create mode 100755 .docker/certs/server-cert.pem create mode 100755 .docker/certs/server-key.pem delete mode 100644 .docker/mysql/my.cnf create mode 100644 .docker/php-fpm.old/Dockerfile rename .docker/{php-fpm => php-fpm.old}/Dockerfile-base (100%) rename .docker/{php-fpm => php-fpm.old}/build.md (100%) rename .docker/{php-fpm => php-fpm.old}/php.ini (100%) create mode 100644 .docker/php-fpm/README.md create mode 100644 .docker/php-fpm/docker-entrypoint.sh create mode 100644 .idea/.gitignore create mode 100644 .idea/commandlinetools/Symfony_15_08_2024__22_28.xml create mode 100644 .idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd create mode 100644 .idea/dataSources.xml create mode 100644 .idea/flags-api.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/phpunit.xml create mode 100644 .idea/vcs.xml rename .env.prod => app/.env.prod (100%) rename .env.staging => app/.env.staging (100%) rename .env.test => app/.env.test (100%) rename .gitignore => app/.gitignore (98%) rename {bin => app/bin}/console (100%) rename {bin => app/bin}/phpunit (100%) rename capitals-africa.json => app/capitals-africa.json (100%) rename capitals-americas.json => app/capitals-americas.json (100%) rename capitals-asia.json => app/capitals-asia.json (100%) rename capitals-europe.json => app/capitals-europe.json (100%) rename capitals-oceania.json => app/capitals-oceania.json (100%) rename composer.json => app/composer.json (99%) rename composer.lock => app/composer.lock.old (100%) rename {config => app/config}/bootstrap.php (100%) rename {config => app/config}/bundles.php (100%) rename {config => app/config}/jwt/.gitkeep (100%) rename {config => app/config}/jwt/pair/private.pem (100%) rename {config => app/config}/jwt/pair/public.pem (100%) rename {config => app/config}/packages/cache.yaml (100%) rename {config => app/config}/packages/doctrine.yaml (100%) rename {config => app/config}/packages/doctrine_migrations.yaml (100%) rename {config => app/config}/packages/framework.yaml (100%) rename {config => app/config}/packages/knpu_oauth2_client.yaml (100%) rename {config => app/config}/packages/lexik_jwt_authentication.yaml (100%) rename {config => app/config}/packages/nelmio_cors.yaml (100%) rename {config => app/config}/packages/prod/doctrine.yaml (100%) rename {config => app/config}/packages/prod/routing.yaml (100%) rename {config => app/config}/packages/routing.yaml (100%) rename {config => app/config}/packages/secrity.yaml (100%) rename {config => app/config}/packages/security.yaml.bkp (100%) rename {config => app/config}/packages/test/framework.yaml (100%) rename {config => app/config}/packages/test/validator.yaml (100%) rename {config => app/config}/packages/validator.yaml (100%) rename {config => app/config}/preload.php (100%) rename {config => app/config}/routes.yaml (100%) rename {config => app/config}/routes/attributes.yaml (100%) rename {config => app/config}/routes/framework.yaml (100%) rename {config => app/config}/secrets/dev/dev.MYSQL_ROOT_PASSWORD.c07213.php (100%) rename {config => app/config}/secrets/dev/dev.encrypt.public.php (100%) rename {config => app/config}/secrets/dev/dev.list.php (100%) rename {config => app/config}/secrets/prod/prod.BOT_TOKEN.f41697.php (100%) rename {config => app/config}/secrets/prod/prod.DATABASE_URL.8ea85a.php (100%) rename {config => app/config}/secrets/prod/prod.MYSQL_DATABASE.bef43b.php (100%) rename {config => app/config}/secrets/prod/prod.MYSQL_PASSWORD.32327a.php (100%) rename {config => app/config}/secrets/prod/prod.MYSQL_ROOT_PASSWORD.c07213.php (100%) rename {config => app/config}/secrets/prod/prod.MYSQL_USER.8e3cb8.php (100%) rename {config => app/config}/secrets/prod/prod.encrypt.public.php (100%) rename {config => app/config}/secrets/prod/prod.list.php (100%) rename {config => app/config}/secrets/staging/staging.BOT_TOKEN.f41697.php (100%) rename {config => app/config}/secrets/staging/staging.DATABASE_URL.8ea85a.php (100%) rename {config => app/config}/secrets/staging/staging.MYSQL_DATABASE.bef43b.php (100%) rename {config => app/config}/secrets/staging/staging.MYSQL_PASSWORD.32327a.php (100%) rename {config => app/config}/secrets/staging/staging.MYSQL_ROOT.1ea6ef.php (100%) rename {config => app/config}/secrets/staging/staging.MYSQL_USER.8e3cb8.php (100%) rename {config => app/config}/secrets/staging/staging.encrypt.public.php (100%) rename {config => app/config}/secrets/staging/staging.list.php (100%) rename {config => app/config}/services.yaml (100%) rename docker-compose-prod.yml => app/docker-compose-prod.yml (100%) rename docker-compose-staging.yml => app/docker-compose-staging.yml (100%) rename docker-compose.override.yml => app/docker-compose.override.yml (58%) create mode 100644 app/docker-compose.yml rename docker.md => app/docker.md (100%) rename flags.sql => app/flags.sql (100%) rename {http-requests => app/http-requests}/Correct.http (100%) rename {http-requests => app/http-requests}/Incorrect.http (100%) rename {http-requests => app/http-requests}/OAuth2-login.http (100%) rename {http-requests => app/http-requests}/Profile.http (100%) rename {http-requests => app/http-requests}/ProtectedEndpoint.http (100%) rename {http-requests => app/http-requests}/Protected[OPTIONS].http (100%) rename {http-requests => app/http-requests}/Test Auth.http (100%) rename {http-requests => app/http-requests}/http-client.env.json (100%) rename makefile => app/makefile (99%) rename {migrations => app/migrations}/.gitignore (100%) rename {migrations => app/migrations}/Version20200322114725.php (100%) rename {migrations => app/migrations}/Version20210103221647.php (100%) rename {migrations => app/migrations}/Version20210109193151.php (100%) rename {migrations => app/migrations}/Version20210109213855.php (100%) rename {migrations => app/migrations}/Version20210109232957.php (100%) rename {migrations => app/migrations}/Version20210109233702.php (100%) rename {migrations => app/migrations}/Version20210110000325.php (100%) rename {migrations => app/migrations}/Version20231022221730.php (100%) rename {migrations => app/migrations}/Version20231103235658.php (100%) rename {migrations => app/migrations}/Version20231112194737.php (100%) rename {migrations => app/migrations}/Version20231112201521.php (100%) rename {migrations => app/migrations}/Version20231119013323.php (100%) rename {migrations => app/migrations}/Version20231119205647.php (100%) rename {migrations => app/migrations}/Version20231120235309.php (100%) rename {migrations => app/migrations}/Version20240102024927.php (100%) rename {migrations => app/migrations}/Version20240904211753.php (100%) rename {migrations => app/migrations}/Version20240904212530.php (100%) rename {migrations => app/migrations}/Version20240904220255.php (100%) rename {migrations => app/migrations}/Version20251206170339.php (100%) rename phpunit.xml.dist => app/phpunit.xml.dist (100%) rename psalm.xml => app/psalm.xml (100%) rename {public => app/public}/index.php (100%) rename readme.md => app/readme.md (100%) rename request.md => app/request.md (100%) rename {src => app/src}/Controller/.gitignore (100%) rename {src => app/src}/DataFixtures/AppFixtures.php (100%) rename {src => app/src}/DataFixtures/CapitalsFixtures.php (100%) rename {src => app/src}/Entity/.gitignore (100%) rename {src => app/src}/Entity/CapitalsStat.php (100%) rename {src => app/src}/EventListener/NgrokHeaderListener.php (100%) rename {src => app/src}/Flags/Application/PostParamConverter.php (100%) rename {src => app/src}/Flags/ConsoleCommand/GetTokenCommand.php (100%) rename {src => app/src}/Flags/ConsoleCommand/SetWebhookCommand.php (100%) rename {src => app/src}/Flags/Controller/.gitignore (100%) rename {src => app/src}/Flags/Controller/CapitalsController.php (100%) rename {src => app/src}/Flags/Controller/GameController.php (100%) rename {src => app/src}/Flags/Controller/SecurityController.php (100%) rename {src => app/src}/Flags/DTO/CapitalsStatDTO.php (100%) rename {src => app/src}/Flags/DTO/ScoreDTO.php (100%) rename {src => app/src}/Flags/Entity/.gitignore (100%) rename {src => app/src}/Flags/Entity/Answer.php (100%) rename {src => app/src}/Flags/Entity/Capital.php (100%) rename {src => app/src}/Flags/Entity/CapitalsStat.php (100%) rename {src => app/src}/Flags/Entity/Enum/GameType.php (100%) rename {src => app/src}/Flags/Entity/Enum/WorldRegions.php (100%) rename {src => app/src}/Flags/Entity/Flag.php (100%) rename {src => app/src}/Flags/Entity/Game.php (100%) rename {src => app/src}/Flags/Entity/Score.php (100%) rename {src => app/src}/Flags/Entity/User.php (100%) rename {src => app/src}/Flags/Repository/.gitignore (100%) rename {src => app/src}/Flags/Repository/AnswerRepository.php (100%) rename {src => app/src}/Flags/Repository/CapitalRepository.php (100%) rename {src => app/src}/Flags/Repository/CapitalsStatRepository.php (100%) rename {src => app/src}/Flags/Repository/FlagRepository.php (100%) rename {src => app/src}/Flags/Repository/GameRepository.php (100%) rename {src => app/src}/Flags/Repository/ScoreRepository.php (100%) rename {src => app/src}/Flags/Repository/UserRepository.php (100%) rename {src => app/src}/Flags/Security/HqAuthAuthenticator.php (100%) rename {src => app/src}/Flags/Serializer/UserNormalizer.php (100%) rename {src => app/src}/Flags/Service/CapitalsGameService.php (100%) rename {src => app/src}/Flags/Service/HqAuthProvider.php (100%) rename {src => app/src}/Kernel.php (100%) rename {src => app/src}/Repository/.gitignore (100%) rename {src => app/src}/package.json (100%) rename symfony.lock => app/symfony.lock (100%) rename test => app/test (100%) rename {tests => app/tests}/Unit/Entity/GameTest.php (100%) rename {tests => app/tests}/Unit/SmokeTest.php (100%) rename {tests => app/tests}/bootstrap.php (100%) delete mode 100644 config/.DS_Store delete mode 100755 config/secrets/prod/prod.decrypt.private.php.bkp delete mode 100644 deploy.php delete mode 100644 docker-compose.yml delete mode 100755 env/._.env delete mode 100755 env/._.env.staging.local diff --git a/.docker/caddy/Caddyfile b/.docker/caddy/Caddyfile new file mode 100644 index 0000000..9bf8ece --- /dev/null +++ b/.docker/caddy/Caddyfile @@ -0,0 +1,49 @@ +{ + # Global options + auto_https off # We'll handle HTTPS at ingress level in K8s + admin off # Disable admin API for security +} + +:80 { + # Root directory + root * /var/www/webapp/public + + # PHP-FPM configuration + php_fastcgi php:9000 { + split .php + index index.php + resolve_root_symlink + } + + # Serve static files + file_server + + # Logging + log { + output file /var/log/caddy/access.log + format json + } + + # CORS headers + @options { + method OPTIONS + } + handle @options { + header Access-Control-Allow-Origin "*" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" + header Access-Control-Max-Age "1728000" + respond 204 + } + + # Apply CORS to all responses + header Access-Control-Allow-Origin "*" + + # Gzip compression + encode gzip + + # Max body size (for file uploads) + request_body { + max_size 50MB + } +} \ No newline at end of file diff --git a/.docker/caddy/Caddyfile.prod b/.docker/caddy/Caddyfile.prod new file mode 100644 index 0000000..7c3c515 --- /dev/null +++ b/.docker/caddy/Caddyfile.prod @@ -0,0 +1,50 @@ +{ + email your-email@example.com # For Let's Encrypt notifications +} + +flags-api.izeebot.top { +# Root directory + root * /var/www/webapp/public + +# PHP-FPM + php_fastcgi php:9000 { + split .php + index index.php + resolve_root_symlink + } + +# Serve static files + file_server + +# Logging + log { + output file /var/log/caddy/access.log + format json + } + +# CORS + @options method OPTIONS + handle @options { + header Access-Control-Allow-Origin "*" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" + header Access-Control-Max-Age "1728000" + respond 204 + } + + header Access-Control-Allow-Origin "*" + +# Compression + encode gzip zstd + +# Request body size + request_body { + max_size 50MB + } + +# Security headers + header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + header X-Content-Type-Options "nosniff" + header X-Frame-Options "SAMEORIGIN" + header Referrer-Policy "strict-origin-when-cross-origin" +} \ No newline at end of file diff --git a/.docker/caddy/Dockerfile b/.docker/caddy/Dockerfile new file mode 100644 index 0000000..69670c8 --- /dev/null +++ b/.docker/caddy/Dockerfile @@ -0,0 +1,32 @@ +FROM caddy:2.7-alpine + +# Install necessary packages +RUN apk add --no-cache \ + shadow \ + && rm -rf /var/cache/apk/* + +# Modify existing www-data group/user to match PHP-FPM (UID/GID 1000) +RUN deluser www-data 2>/dev/null || true && \ + delgroup www-data 2>/dev/null || true && \ + addgroup -g 1000 www-data && \ + adduser -D -u 1000 -G www-data www-data + +# Copy Caddyfile +COPY .docker/caddy/Caddyfile /etc/caddy/Caddyfile + +# Create log directory +RUN mkdir -p /var/log/caddy && \ + chown -R www-data:www-data /var/log/caddy + +# Expose ports +EXPOSE 80 443 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:80 || exit 1 + +# Caddy runs as root by default, which is fine for binding to port 80/443 +# If you want to run as www-data, you'd need to use ports >1024 + +# Caddy runs in foreground by default +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] \ No newline at end of file diff --git a/.docker/certs/ca-key.pem b/.docker/certs/ca-key.pem new file mode 100755 index 0000000..f92aec9 --- /dev/null +++ b/.docker/certs/ca-key.pem @@ -0,0 +1,54 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIZGJuhRBU54YCAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDQwefmfwQG/1g95sQNNgqVBIIJ +UF6oOu4uqe2nOyHa5YA2pxps5V9zdwhskyY0mmlXwSa7kCwfpDt0il8y9R6t8j5M +X3ztt4FRC/JKhg1bafwQWf/kxwAtA3UOMUXSqT9myfzaryylRmhf9MwHO2kZuVUm +N4TuDMD+XQSaQlL1cJI57nA2GqI/FUIiWru6PkD5lujvXo6JhSWSfU1R/vTQqPrO +jYIDQbtxAtgd24+Hu2BDdZBANP5Pvmy7G4biwck9VwxpsE64VqiSrrR6lY76o1SC +xclX9Io4VXDX5M5SPiS1HrctDAYgiS/M2sFtaCi1KNq3H44joBy3CVcdD75A0+Uy +TFsGrgFDWNm/Mo7xhXHa9/sTN5V1glpvq/55PgBP7Kvn5hs7hDRGoc0kICPqa+av +MFyzdUlQXp0/F4evjjHRE5P3Lr3AXoBecKZ6YfjBF43KIBBiZsORRZUOwxFh+emx +2BX4Qca1Os+uQLVsJiloKMr09dLlfSIwP4l9W+3tko5Fa9N1VWjiH+HM+dLLQ7h8 +SGgmc3Ug9SNzcS0EyqIgfoG8CyTIfLkMy9QsOMuiLAFQ30/ZKeEMNcaUSeB9yPPe +/axOXitZ3uzrvLItsx3K5HfcW8JjA8sR/l0V9VWqB+qxL6EVMydcOHIKcKSMoGyL +cxf2y6FXA/e9fTiGesxQpsS3BLn3TucYMIfXBfPU8xm09RJazpb8iX3xzJNPihoZ +FlATro5Z45CdlOY8rKZf9tbAenQDdO6o81UytTtf0TMhMIO8wAiD1h9HkozXaDU7 +/g5Xeh8+5zyflCIEAhXybbdjnbSXF1Hy9WmYLjsKTyh9lrGkNhgPWCqRWV+ZDV3d +z3b8TLl7jN+M2wqI1P1KR3Qtj/qlRur8WMh69uO6C4tt/LNC4+folz379gbPlWWk +Os0sOzmv2/7sYvFy54p8EmcHiLPt4rq2YV+6NQfVsavxI1o4H/ZGT2fL2ywzKHV1 +Zc+Aqbp0L28Mm3ZXjq6Ss+uw9L6lejbU38aIwyTG6aC0RYMeWRMSPhMDUNdH7p1i +WI9jbYGLJr1FA4loy5OePLRZNnIeL3sqZ5BLOByAfeVgeYn4m+Zgxfc5EK8s0MhY +4vHXwJi8ButOHMTqpmhcwR91QgDVyuMufEe/ow/DKHmlrgaPK3S8JARBVdXGXb/U +A608cWZyoLwyUOJ2CBlcI4cflc5KwDs6hEXkKa5dA5TFXipUpflHHwK2wndxLGi5 +il9TG+Q8Pj6Q/TYjHgKhBuuN44JmIUq4Q8B7REBRh8d7dhsfbVUS/8L9yfwHeO64 +R26EOZeI0FQ91RavD6zIcIvJzMrUUZgypG1Jgs1C+7bef6ltE2hskCNpiuHLUCVl +F2eK10mY+oE50jeRq5/GGf13KpNeJlu594VBU8ax13MVkXU4AjfdCgGIKT2egZjS +/rvUFbo8UePEAibPAJw8bbLwXH8nmtHVdH0vGL2YdeWQIf2iZOMFn7w3g2mFxmLl +SuMLRrwjoN1fDyitiPPHO4QvH2MU4SydMX94e4jJXzL92aE0WbPP8sgnbLLHfA0o +fW7wPKiTvlfqsOBJmy1T0MaAhpMSlp2XM4/Zrh8bHlXd3r23n1Hfj/+3QcRqzQSs +oPVNnKQS7dePrw/8+Wv5WRU1N7siWCryU0j3It1dA78cXcmHXGT4wRYPC3IUxQQ3 +k/hovaZ0/BtNiFGcMrkUs9BMeNhpqTXBsRdMTpUnPYWqB50nMVc8XMaw9+dhExL+ +skDLLR7dqlRFjiWOvGDvRCNzzTB+M1VbI1mTKuvkl7K/oCdsKaM/5n4uXo4fQ68k +B5nvjT1zVR0dSo2NxMmWtTGOpfgEDhkOdIohaj4CpR0zpOaAskk2G6LymIrqWA4O +OHJvkWHxrSaRe6/nVValgJ1CLHRHbEk+3tdx3MFPz7pvzMLUzy3b+qGyKuRgPA26 +dGPifGzjN+qmSQznFaDfbkWEPiapVX9YOFAh7gruJhCWclq8RjXr4+/npSMB7Qjk +FlWikVUu9LxUCoSubBm/dHu89AETTnrq4TTESw9Zf4Q8Ks19R2E+QGLJxynrPt5g +SsT+VbL8kxzgVKW+zlZy6O+RS7Gi0xII/k3ckQdF7DvhreyAC1scP+WqK3guQBa9 +dj9RM5TOGRQId+MwC2RMhlpZKR0p/wk2kovGJGM/4+IdseGPhbF7bX2iNhVyF5E5 +4uF1+WL0I1w4Sw8LguCu/AXZo3EjJtN759ZX18cKEh3gUHhasOPbXMmbZdZAzXS1 +cs5+mPojlvEc5z3FYReiR9wmzoLvpqoHNHQcInTh/verWYCmhaXbUHqF+6eO19Bs +R9x+bFhJM/Dq4iv/pgnWM/J2YpRo8iMGXaQFi1rD3K4BaQQ9WNrTyM+Vrk7zw/wL +YCdqGIQ6QV+WfHaGhRmzXrRVUlK1EC/L9GqQfXq48M7SfXS1JxnhlQJ5Oufs3uTR +4GvraP+RG1hfHyrsRB5mU9KJYdyNGBwIG4+vRD1If52bqMSnyfHP0MAQ7EuOt/rP +l9HGm+0VA/NdfI+zmjLqxwn1/VosquQM0x1gtqPQMVpL3Mg5bIKSA4l/05IuuiXj +iy3NhP7/BUVL/oo68r6HAQFDT0R8jjz/SaXfA9h0QhuWCIcQujpqrD6iwUzPjxF/ +AniTZrDuA2zazAItKSay+ejqkhrFfnfNVJRrOFNnuXI/xpzfnGmJLKj9vgq6sYvG +FCN0T3d1igVzld3z3plof75iGT92AkaMSZLmi2XhRuabXWiwzpqJtF/ePsZlvGUh +/q0n9UZTQYAO8K91nrekpnGr1zn9Wn/sRBUm6VciySwMfClE7CT0JoNogYBOKSVS +FuJcN+XFK60VTWFvbwm07M/rPmCTV44v0pvtaK430sjXeGhRNOvBEfzjB/w3HGg0 +mn1wPefo1C0+6ZtCeS5j4tL1MTRdVciEJrzC6SB1OV0DABGIwaS64WCINxeTsRIy +bG5xAhMv2mAZl31/CQNf6VMTEuh7gkKLEKgD6/bJfvAUEdwaLMfy2DJyAsDM8uni +NdnkoN9w3wa59zfcbu6+7CAUPPWbCS5swjpWYQXoezuKfDIgX/PMvn9pi/KQoM+p +QqKqeCjkKIxteTnTmD4412kpmNUOVQ8VgbtFKlXlfmLiMCKTyvtAeGtuexSWNUQm +LvF0fNR8gehE4ym1rFeKenq/hHRKRnnFJLtF2xpdtJDE +-----END ENCRYPTED PRIVATE KEY----- diff --git a/.docker/certs/ca.pem b/.docker/certs/ca.pem new file mode 100755 index 0000000..e188744 --- /dev/null +++ b/.docker/certs/ca.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFczCCA1ugAwIBAgIUO+3xKOWVVCpkSZdg7DH3cGE5vccwDQYJKoZIhvcNAQEL +BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV +BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM1WhcN +MjYwNzI5MDE0NjM1WjBJMQswCQYDVQQGEwJUUjEKMAgGA1UECAwBLjEKMAgGA1UE +BwwBLjEKMAgGA1UECgwBLjEWMBQGA1UEAwwNMTM4LjY4LjE4NC42OTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAOnVLUkdkTn1A+W2dlaX4HH1ea0+6HVy +eMo/sjfyHDVj/98CXtZNLffwPRL88+aKXh1S6S0V4IytgAejQzCgym8gj1zF5qx+ +w9Pw+ciBBtdGPkIt96FiwGqKYCrU/SmmjLy6vJJfeZnxWSu7JQJVlalEpfS+xvVk +jjxE7UuxTm8/KmtWLiDw9mQXGpDRkbUlbKbf6XRBvmHjbuI5Uz51wzxvfOdqZ4JN +3YLczui9gEL/TmaYhrIjtwYZGW1aQvGTfvFcWQa54AL/BQSH7YxInmv3Rf6/bJxA +awllVwX4Mc7cUCZGldIeqtFiPjOdPyVpssQhzjU4v+zgcjI79XJUc7w8YPDn7zja +SjvLqDUTaN2tiJG/TfbSMsroMdiwvvU3SUPPny9PzihYa5LOwALOV7nBwyIkBYan +r6t1mCiWXz/yIstvu5yT65391UwQwpMgEJZy93OiSNoD09f6iHi83ZeGPQPKq/Hc +sMFab/62lA1Vnmr3V7qMQCzny7Rys8fQxmK/hCw63JtTJJvJYPOtgXEds30C8S8b +OySELOzkG0PlHfBHJn1PElAJCj4QOH8PM8yt2Senp6TMEnvQjCO38k8eApqHHcmE +/9LMeEpfVFJvOdzBzxOOwuzkVqjSClnhneHinBX8j/VZhlzggPlzD9Bg0j4NrOXi +J2QyYFZR0p+fAgMBAAGjUzBRMB0GA1UdDgQWBBRQpjPvSEuTCxoWoDStoF7Zoy1K +RDAfBgNVHSMEGDAWgBRQpjPvSEuTCxoWoDStoF7Zoy1KRDAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAN57EaVb3dU52dkfQphcOd5c4K3MX4oUjX +eDxEYSGukWq3pIC35gsLVMSiPEAjcFTDiBTN2TBb/Ooej5YGGituVK1/FGirJdXa +gyleEXplGdUS7GjOAXDXarhVUqZ0LH1849qHiCuDg7Q0hs1FkCAKWwMFVPSBed/4 +2PbMMz821H6V2il6Z7Uu1N5WNloKiX4lBZRt+6nctKQ79g+D0CBEF3l/J64j3OGC +SjIHKUBuEGchGNwMUKSfCvhs6ZyoavoCocefdXlc98R4wUEBIl8NCWiD2S79COgS +UzQMrIpSuD1E1DLUOF8ijGx6BWRljke+udR7eL8S3SMi5AKr16DBDPtFXpqzdnuX +xciJgEGodKU10/SLRueZSj1/WPeWC5mV6m0cL/0dDO8O/oyq7vRE5fjZ0z3geyR/ +9y7BfZCq0otnRof1LqOkDgxfoLDGheUPi0ICaaIq/zOKPXkjL+XnvhYUfT2pfW76 +kysXoiLBMXjtOuGp4J9Q8UjcaQ4zKGSb8FZ2XeNMncjnbdcuwTjjH0OVyaLo+hUo +XZ28l6aQBbA4zLEnaVlaQ4CpF/UKfsaB4yyIyBs/pFQzTqmA7oNyqYKAcyck2/yB +Qu/j2lA8qj+qGehQ9XT2mxiNri7TjSGm57ml7m1CJ0jkmUjETLw6PSVRzb+eEHUt +mXBB4o9QKg== +-----END CERTIFICATE----- diff --git a/.docker/certs/ca.srl b/.docker/certs/ca.srl new file mode 100755 index 0000000..51daa67 --- /dev/null +++ b/.docker/certs/ca.srl @@ -0,0 +1 @@ +72F5C9838D75EFE222CD4CE36E0AC0F09157083B diff --git a/.docker/certs/cert.pem b/.docker/certs/cert.pem new file mode 100755 index 0000000..2e6fa86 --- /dev/null +++ b/.docker/certs/cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFbTCCA1WgAwIBAgIUcvXJg4117+IizUzjbgrA8JFXCDswDQYJKoZIhvcNAQEL +BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV +BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM2WhcN +MjYwNzI5MDE0NjM2WjARMQ8wDQYDVQQDDAZjbGllbnQwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsFOR87giKmC1OejpRTNCyXd8BJCpE2lbXq/qaa26e +i/cKavKMoTDmGURiDy5Og+9WdOkgoJTSTpDk7Bhl3aui2idav0qodkKcLdex1YPm +fA+oIoeo/2VTazymjTysPPcjs4ADinE2i04lGtYZM9joGsNGXUqB3fucHLkbWbqW +v1bCRFX5dHilSkt2KpU7g1G/E/xVJDiIPim3DbtPaiUq/4Qy7eQIS5ClviLv7nQz +wVMS84DQVhNh5e6E65TgMXmuYtO/+7uvJYfeFCzxFFexvSArLWD66SgG9F4yldeH +hfRJTleuVkoxHOvwCR6wFCEDJT5CimqAZEp1k52yxUPXp8BdLFGPeoQ0CY9oj954 +QAMPxkClxNgE+CoiVF0odE0zgDLJIUJ8P8tg5h/1wj2Kj+sELRFDhMdGd+d8/4aU +sirzyzZxo2OH2NXFrne6+Hw7WBSIOa8BAK6jXNcMIXAEXPXvMZ9jQDDfv6cmuoaj +qyE8+IYPrbI/999rHCQUfBn7c9I01X80Ftvkpo78hUzN4mUPFcGaX+iJq7VrNCQb ++J1LtJrw58qChl7MzREjlPnXQ6RpM1DYsDMbZBij3M2tTQJ08UdhPTMNitO5GziW +O54Bh+qukX45z21tS5p4Ah2xOnQ2gLu/Xuk3IWfNGGfHcPIUHA4l6DUKDVaiV8vR +rQIDAQABo4GEMIGBMCoGA1UdEQQjMCGCDTEzOC42OC4xODQuNjmHBIpEuEWHBH8A +AAGHBAAAAAAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFNzopbLh6LZ3 +EnWLejynENDEmMqcMB8GA1UdIwQYMBaAFFCmM+9IS5MLGhagNK2gXtmjLUpEMA0G +CSqGSIb3DQEBCwUAA4ICAQBeaHnSXFcX/Myckr02sIxxba3imxUUjZjJaFryihix +mZy72AWxbpNriSf1rZ8uRwBVU7/RGq4gHgczELm2qTShOBvTVjlDI+amEGu6pf6U +YFJ4/TS3rjU9Bj2yDgKoH6/l1ApPS/EMAnY9SMcEEcw+Ddoh7OKXxG/0CdV1DYWB +1eL+6aZvkglzy05RYthun2AkjbScmB1kQwkCdbgy8jKNtvgr1MK/ySPFQvxruHlO +Gu3+fmaXhSMp3ooQPesPorxd0oc3WHhp9JixNFrgEgSMrTkZcN/fOD4v8WbhQSQe +mROGf7Kke8n3QKSTeEPlhdyEHlrsqPyfOut0T66O6qRvgIkPNH80YczkBc88EAWT +qjY2HPNf5YvGanyNsQDRyhpmCgh/FCkeR8BY8EGZ8ZvMQnjIpSVM5Svlh42NY7G1 +G9kZy1zQ0S0TOMvKYYTNmETFhmfczzHcPAsNLxT1YFry/dGrXC/Hxj4wxOszuZvZ +6L03WJlsU5RWphpANqngoJVyS4IVyCWk26t4hRQB/JcuRRvHStvfEhj7CuXqpmyy +nVDQJkDgkVf08AwsJ5GL+fx+bAaXvW/GFUj1CQRTW735o2lS4Zw4+0uxjAxSogow +CVI7nFA7cPVfpKSx27tyLf9aVQPPU/cpqxRJrq8eIsOXMeCM/+8Ruh32eSUU+GQl +Pw== +-----END CERTIFICATE----- diff --git a/.docker/certs/key.pem b/.docker/certs/key.pem new file mode 100755 index 0000000..0cbbe06 --- /dev/null +++ b/.docker/certs/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCsFOR87giKmC1O +ejpRTNCyXd8BJCpE2lbXq/qaa26ei/cKavKMoTDmGURiDy5Og+9WdOkgoJTSTpDk +7Bhl3aui2idav0qodkKcLdex1YPmfA+oIoeo/2VTazymjTysPPcjs4ADinE2i04l +GtYZM9joGsNGXUqB3fucHLkbWbqWv1bCRFX5dHilSkt2KpU7g1G/E/xVJDiIPim3 +DbtPaiUq/4Qy7eQIS5ClviLv7nQzwVMS84DQVhNh5e6E65TgMXmuYtO/+7uvJYfe +FCzxFFexvSArLWD66SgG9F4yldeHhfRJTleuVkoxHOvwCR6wFCEDJT5CimqAZEp1 +k52yxUPXp8BdLFGPeoQ0CY9oj954QAMPxkClxNgE+CoiVF0odE0zgDLJIUJ8P8tg +5h/1wj2Kj+sELRFDhMdGd+d8/4aUsirzyzZxo2OH2NXFrne6+Hw7WBSIOa8BAK6j +XNcMIXAEXPXvMZ9jQDDfv6cmuoajqyE8+IYPrbI/999rHCQUfBn7c9I01X80Ftvk +po78hUzN4mUPFcGaX+iJq7VrNCQb+J1LtJrw58qChl7MzREjlPnXQ6RpM1DYsDMb +ZBij3M2tTQJ08UdhPTMNitO5GziWO54Bh+qukX45z21tS5p4Ah2xOnQ2gLu/Xuk3 +IWfNGGfHcPIUHA4l6DUKDVaiV8vRrQIDAQABAoICABQ72Kn/6y0wu5MQuC67E4cF +lqUxtW6nJbLyW+MwYq9t0bx92stCYNeNfQbytgUxakEGOitF9nnMFylzwWKo7/eU +IzB+ca7hSO/ITCZy7rF5QPYKKV1rumRWpakHzmyKNp0SDClea/V359ZhE2+fMxAH +pZJugcZHbcBreDCJGnGDShZJprpQQadd1wWr+CQpSsFm/jKcsbEDbjBCAxZRatFl +fgvnAPsgt39lngIMTcmQH86Ip0rX9Ct8t9EVSkoaRy6EHFXkqarshM9OHAK026Lg +lBm/mjmmlLhMn47fI5qh25mLBrBPISYpOmzdBai6lS8jf/CfCerS4BZ3JwHQRCuz +jrIQtZFKLamhHkVeiwfatj+GTtQK0Ig09ToB+y1RTRjPJ/wyYfbKdeyWBNARXoMs +O8awWm6vtxIVoMVqppsyBaJV3BxI2DvmaeRC+JRQ+bySADUNZvXe8wTKTzpDB2wm +Q9cJrjUd0tO2bPwYBP7UtSJuZJ2im3UuiHIXTa8JFHttPusog0Zn09mYd8qcd70J +nbHP5t9x4lgOmooO2MrVwjJnoG9tMDDu1A0ED+2jmmebjtBka8WkMCHYI6CqiMWt +olaEtH5RA9yhGaDqHRqsAfTUHbn/wHMZcj/4yHaoK2LTjKRA6w6vuXkLUtZv5LXw +LtyTTruQV42ZtGYZzy6ZAoIBAQDxDVYSsuZrhLik+vr0J5OrLlOLQKAVOaarQK1g +VCVamLCP8JXaLju08+5GdvVGHIa8+s/VO8MPWZ2CzmR08rAW/8QifWUmzHDH2fHX +rj0gbP8uUfxRznZIJFv7mlEJUTFhsO1ceyY/+CCie5VNbyZT7DwZn2MLf7Gv7Juu +Fcz0VZjOM1g0/H2YaU2y4IF2MqnyTXCfIGs7+CdfS2olgb/x8JShth7YOy/FuGdx +Pn2bTlYrQ6gOM8Y+A2SusbNgiA2jLtBOK3RiGK5sDkh+q7MnUxrdZ0LP6xC+GcXw +aX5EY0uD+JPTHXYGihsDOgVK7oCoRx3np8IRmzp77uzbejgLAoIBAQC2wKkr1kWr +kcsH1Jg8n34A/qbzXTpz3lFcemaPzTzjipVEnPswSMS/TosCep9oT1+OI7uMOCIb +RmZLC5LQNTf4OdugiSO1pXu0POr/nu0VDR+8GvIKKR7SjkYjxy0qiQZ797EwMRn8 +K6xE8hQmbZHhijXXKLdsRuTa3RAnCXv+crYsWljTUvopU8ekouJNA6IQ0t7s34c3 +i9wOAWchzsDMxQcCUmoXi6o48Xry0EQwSJlIAK5vDsj2ermwgMIrkF0TROvT+gGJ +G6VRMSQ2S79++iWEfYD36MaJvaXLMpa4z1wdODQiPxawzNiWLTDBm+Xy1O1+xXBt +L+eT/xHVLNgnAoIBAQCqDbh9NIxtqZIBgbXs7Ma2atYxVQQaNTOpeNVXMcWwZiuZ +QCbXZupkO/oK5/0c2x8Kzv4z9hckCxqdnzErd9JWR1V8522ms2+U7eI5QAiLiZl0 +eg5BQCAdwNjLZRBqPEdUHdc1+QMA+fE772di21j0t6GmidT71bfq3kbtxx9x97j3 +Ly25I68PCKrx2IQ8eH2AHLWo7Nv50JUmGzPlBeX9rrWMZ8jWztpi6DbBo05FdDxC +BVbXvhrKwOYUf/SF0zWbu3jkzK8sTTEvtdva0RJwWaaIL0LpH3IOSmxjsGiNomcx +0PmoZA5RiriHzDTTqfJFxPYJ6UV12kamC+Y4574FAoIBAQCrxXR8tp6vf45k4sbg +nEyT5MbJEcSiKcExef6yhQcJHDXm0uIqZQtAgTOZdeYk5g37jMx4JD6ygj4dpVgu +CQd9cexj/OKqlksqguOith9C3R4J8Q20zSeiYoW8lTZ3t2l31b0efdhdtDLsbtjP +sccfRYgLnsKgrBXpPUU0W+7Gn81o7NZ2cpSdiZipv0uTdam7xGgyHnt6kyOXqmvk +U+/VyA8peIstbGHnudmFJoohE+u2yKUrz6rGOV4Vb0CSL9O8C9jZWjBdTbXaFaVi +v1nToIzo9gnlek46Ix4VWoxeUtDSygP+eGv8a93bcchVAhJlZwt/T1a32gIBkgqR +4t+bAoIBACbWkf4OOYM2utVc8MHZa8soNrzLINFCQnGVMPDBs6Al3/b+F30ABnO5 +Aymu08dde3LJGqoXZQhcRUUkFVUncVyMGALAzPmSWDyvs9BomduF6oPMKBs57XBK +mreyhZss7byO+6j+gIKemL08ESYVvJoWo/b2Imsp5/YQspMHuxz+K6iOmUvmEeQM +1po8Hu7r4P/K4rhUmRhc94xE7NRxO4x+BAQJvggU16CacK1/IP6QEjr0ijVy5+di +FJhT1GviA1c6WYCeAGWuaCOFAlq6zv0C7ZkwHyPP213Zqr+o43cjeLk3/Rd/K11L +HoMBmhBXJzs8Sa0pe+y11oR7XoJBOcg= +-----END PRIVATE KEY----- diff --git a/.docker/certs/server-cert.pem b/.docker/certs/server-cert.pem new file mode 100755 index 0000000..8a4c395 --- /dev/null +++ b/.docker/certs/server-cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIUcvXJg4117+IizUzjbgrA8JFXCDowDQYJKoZIhvcNAQEL +BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV +BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM2WhcN +MjYwNzI5MDE0NjM2WjAYMRYwFAYDVQQDDA0xMzguNjguMTg0LjY5MIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuYZAb2U3f5KcrvG+WHDc6M+MnortPgh1 +WaJMxc31icMkTUqfY42ePZq2ckoOUp9BENO1cYIJT4/Ne3PQZpAOMr5IqzapLswE +jwlva7ea1IoR6iflgGH91cRtzVXzSsRmFuMojDspnZ/UC1t4xwhD2NozdJtx8NMN +gelnId9qxzBUZaP43BYl+Nl57Lt37DBurVNHJYCsG8SRAFy+o2na2aDpe5RnVxp1 +32pcg9lUPFFENM6nPU/sD06WwOIBVUVDDT+2+5q8U6CIC7m2UGmsVevVNzwtKWwp +MlwjliRpxGOfG9K+/3kLlZy1wcqz7FUQoBQfDClWNokQT4k8dzAJItaBFNH5YF1E +HThzKo2ud+bDHYNiZch34C9sAKcbSgUT+njzSK2lMN3+pqbCw0ttCB7lL0Rb81Dr +a5+pBELoemSDodzmDfEVJetE7jUGYENAzpO3NgAh/fG7XU37DYPMi389HA/g0wKY +9cgWO8GeplZVwNlxdaeph+Ps+rlTc2Vqtx/LOvOMz7G08jAySVFinv/k3RW48xpq +cNsK5tVZ/fNss6w9y2xQ8wewPw+lVw8tTEHBfWY2H3NW33ubAhkP6PaEBGfVgkUc +Qvp9zxhXKNzhwvPyAQxqkgaD/wWGWwWd9ndR+ZcykwzkgNbyqYqoaIAiuanGnTKL +t7WlsZqd5BECAwEAAaOBhDCBgTAqBgNVHREEIzAhgg0xMzguNjguMTg0LjY5hwSK +RLhFhwR/AAABhwQAAAAAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBTp +xfQdB1Qjbgib2Ub10EaoDrF1yzAfBgNVHSMEGDAWgBRQpjPvSEuTCxoWoDStoF7Z +oy1KRDANBgkqhkiG9w0BAQsFAAOCAgEA1Jp2V01MC5WgDvfnZKZXo+W19O8aZgmQ +6Ab5/u03QW3mKP3o79h4ot6P3IKKleeugMS64elA9aE1tJbCCrcnOeg9oLkg3VcF +OW7CLwJQEoUg/9LHQYJ2lHIxiz8M5Td1de6+vQqvvYysePMFEpbhYV0YHQgxsQ3/ +u/BnchEeBIFRMI3NZotb77e4gLWFsgNhq7BFnNkrF34xFyXBQRLCzwGycJQRSaHH +cokyhjKx+SuBvJcXaymsHDRiBgDgIWR8MdngwiAR3FdtBnlJR/6TQNz30mP8CFLc +QXmQSLTJ0QAS7evwS4s0diVpBJ+HJBFvb4BfoZloNFkQ5sZsOE7q2vRxXrTA9U9I +98lzuaQvE9Ob+o++b/eObnsi15jHLoofkFARbGsueSubkv03XFqby/4x40rkPqIK +5Q23CE8fJCNHwN+yws16qjMrdKMM3m9w7/C3sBbyBp1yAavUI5r3vIqDg2LVh/WL +fVjYd6vIew0zr6deGthoZjN0jDJewu05I3qapuPM3W5dNNTke+m9toz5PlvyBmre +E9quR84IDcwlND1l/3sLrL3yzyg8/T5Wwu19NP7Gf4ZjmHB1/+dtOlHBY0X67dfD +mCcCR4998odC2KTbszcSBIBIbMgKyUKi/m/8CVtW1gKsZxCA7dVVh2oEvTBZJsir +cx57zf8HK7A= +-----END CERTIFICATE----- diff --git a/.docker/certs/server-key.pem b/.docker/certs/server-key.pem new file mode 100755 index 0000000..5b95740 --- /dev/null +++ b/.docker/certs/server-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC5hkBvZTd/kpyu +8b5YcNzoz4yeiu0+CHVZokzFzfWJwyRNSp9jjZ49mrZySg5Sn0EQ07VxgglPj817 +c9BmkA4yvkirNqkuzASPCW9rt5rUihHqJ+WAYf3VxG3NVfNKxGYW4yiMOymdn9QL +W3jHCEPY2jN0m3Hw0w2B6Wch32rHMFRlo/jcFiX42Xnsu3fsMG6tU0clgKwbxJEA +XL6jadrZoOl7lGdXGnXfalyD2VQ8UUQ0zqc9T+wPTpbA4gFVRUMNP7b7mrxToIgL +ubZQaaxV69U3PC0pbCkyXCOWJGnEY58b0r7/eQuVnLXByrPsVRCgFB8MKVY2iRBP +iTx3MAki1oEU0flgXUQdOHMqja535sMdg2JlyHfgL2wApxtKBRP6ePNIraUw3f6m +psLDS20IHuUvRFvzUOtrn6kEQuh6ZIOh3OYN8RUl60TuNQZgQ0DOk7c2ACH98btd +TfsNg8yLfz0cD+DTApj1yBY7wZ6mVlXA2XF1p6mH4+z6uVNzZWq3H8s684zPsbTy +MDJJUWKe/+TdFbjzGmpw2wrm1Vn982yzrD3LbFDzB7A/D6VXDy1MQcF9ZjYfc1bf +e5sCGQ/o9oQEZ9WCRRxC+n3PGFco3OHC8/IBDGqSBoP/BYZbBZ32d1H5lzKTDOSA +1vKpiqhogCK5qcadMou3taWxmp3kEQIDAQABAoICAFehnlX/zVMpAXFxJqPHy9D8 +GEPbA2zFugh4rSLRwiUsU71efiMcBZ67sWoSqOlF6An2tkHDVnqKRlkFv25ypQI6 +90BINWmxXIXjwwlyVGQIQ6YC6ljV8HxEqEjRTHYIhuBQtBpo56NYl2Q19LquoL2R +c7SkqBFE36B5iwlo6prjrTnFVgs/OvhsYTb85gxeZCjiqTyBpsoG8ybkp/ewTHt3 +klGZK6btDLhXGRP+V9eV203GPyCq26nvSS4akt6gNKfRbLEzybkGnrxLIF6jS4/a +MYBBoGNsf5kWBIkq8fqdw830odsyZdJpj0DWal47X/r9Bh1MeTiRTW8EN9dkjStl +jlfMYV+/UB0KXmKXuCpw2WJ3a/yYzQhiqV72XrklHpV6Wx3KykiGW0fpx30sWhfc +YFpZr6AYJjx6L1URtBESW7GMc5XBENdUHo5OfaXu4oN3sGCm+lYGwfe6UktueO+A +fvJP9b1lFUbSMPJpShkQBlYV4NO/5sUJQSsEwZmNQ+ArCWZWi4guhbHuW0MMg3G+ +rIPGgWSVesR28Mg/kYA9l2/qck/seEa3ib1oGcBfZiiQiz/8xE9MxJtf7PEVi7nd +UHGzqopPxWDXj8ni/p2JR7Ct/bFT2GXBtNdpHkqrxSixd40gUKk3NNYbWXrP5T1Z +PNUPtCbJaheoK54vkZkxAoIBAQDfNScBk/dZVPEITcf/bqJD+vu4YPEdEKwGqmYK +lQI04rE9b7EbT3ZRkJUuJ7oGsC0cRJBjb0capKrt3SRnq3bmIAS+VkY7jHLrnTL2 +Ws55DeZgaIj/ck+kVP8VahWvI3vjnsrQG2UvdBUUKs5cwicIlTKJR47AXayxM/Zu +NNrKrEsdZhxJ/9Xu1pCBlu3Ux1wLeMFsNBRL096rHn72Act0RPOkQ0QULghIdMrs +wY8//hZ9ZLzEHoWvaTObPV3PkCjvcBbBY2CfMzwsEcRIpih95ToIMR3iI0z3HOr+ +Bxn6R6tfyryOSS0wpH+Hz7MsTXOeHZdpOQtpM/gMqND7/SJfAoIBAQDUx9UdS6xs +1GAijiOOMYbEQmX+4v1YqJdutErs/ggBN9jruNkvXHuHAa6WrfdXRKTW1Csmkq66 +V6aoXtGGSBJ92oBOYoJvlUQb9JZiywY5aE99E0NA96+d0MNoakiz+aAm9fy1KzxQ +n932LeDjWhzXqhPinUTPMZ3efB2dvwtVIiTU9tr7klhRU0edfrtzjiS8ZofOZIbC +a54/OpQhKF3FlWUuGbxhXSSjHHNcORZ+x+/ho5IXMKyUGL1FjW7Pfwb5VLSe5toD +MjnOhBymq0Y8NcdcTWnZ2Twtcz39l6KcZAzqE06zQT5daEjkGH3RCl2GZ9sxjt8+ +u83ufkOIf++PAoIBAF7QlkwuTZDt6yFq4P0ZQuZ7s/fjfiipj1mZgpUWLQTIEyAU +1PfT7l/Beg1MJNJ4fgEXAvqqJ1si/dTi7nb3OB+TFFDCFz1ucNazRRWvBywXAniL +jz5rkXct/9lZ4fIusY7EQkTajkX1Goshj92JP8l+jyQPeI0wfY4ck57G5vXW8GWB +nZy1h2vYSzQxJ8AOG4Rn/En5aXG4g0rPPoFDy+gM7i4lwMKNt0kIC7c8lZxKU8Va +SHFKweD8YEaeb74e77SeOZxWmZGm0vWpamat5l9sQxV9v8Ly2dvStePIonlVfm/H +kAclAIQ8LExFp0e3ctiEm2/AIp/CyqieAYA5TCMCggEAH78Y6uAJf8tH9J/kaii1 +hL6rXRYc2od84IWB0E4uf5AHi1PvA4P24jO8Crs19g1F0s+hCIZGD4NYWDKdbD2A +lMpu7kMAVwmcOdeKQH8uFI6dnXmsRRsvVop5PTDuW/vYizeUVqt2uki/4yUBMqqV +NxAnG15/j7JFbZZzDMAePrtzZ1rVXUd+adPVEYiBC0Kf9IQPqxmQiZ1o5OImi7Ps +GbiqefBZDOXKu5NZGt9hndTS04WGHHOkrAvs4V2ytL6tGbIrqLGkwWlS+p73b16K +gh07+2eJbXld4yIYk6d2GYNL8fije1c2qNUQWwfUbcXwIkeIiqJYaJG4reakyM7d +vQKCAQAn8bakg/AdD94eBi8SUru5Zf+QgQsLkUEDx1wWsQuS18oGJQ1ZeiHau9CR +BjrioZcBo5WgxocqeqwEg/836HFAo7m28JcaO25y+2BCr+mfITuxchXWYnQ3KUM7 +ANmRXgtvlWXW8rSAnR97ucGO5Ne9slcVCodt6EuAszo0bSL2eAmkaD7FlDZyVJ/0 +KA31DhaoQunD0n3WaCSeAxIAaKvitkdnJr7DBIFEMhQLVwO7nggXSSdRqRP7BoR5 +97JObVr/9p9Evo42TDB9krG86ekfAXemKwwZQ3mcB/tE83kSx3yPfyXqpsvkcUYq +7rkt3nlIRd/ks5zPqM81+hbTxua9 +-----END PRIVATE KEY----- diff --git a/.docker/mysql/Dockerfile b/.docker/mysql/Dockerfile index be285d4..fddc855 100644 --- a/.docker/mysql/Dockerfile +++ b/.docker/mysql/Dockerfile @@ -1,11 +1,5 @@ -FROM mysql:8.0 +FROM mysql:9.5 RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone -RUN chown -R mysql:root /var/lib/mysql/ - -ADD .docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf - -CMD ["mysqld"] - EXPOSE 3306 \ No newline at end of file diff --git a/.docker/mysql/my.cnf b/.docker/mysql/my.cnf deleted file mode 100644 index d901304..0000000 --- a/.docker/mysql/my.cnf +++ /dev/null @@ -1,4 +0,0 @@ -[mysql] - -[mysqld] -default-authentication-plugin=mysql_native_password \ No newline at end of file diff --git a/.docker/nginx/Dockerfile b/.docker/nginx/Dockerfile index 8524617..d912b8b 100644 --- a/.docker/nginx/Dockerfile +++ b/.docker/nginx/Dockerfile @@ -6,10 +6,10 @@ RUN apk add --update \ RUN rm -rf /var/cache/apk/* && rm -rf /tmp/* -ADD .docker/nginx/nginx.conf /etc/nginx/ -ADD .docker/nginx/host.conf /etc/nginx/conf.d/ -ADD .docker/nginx/cert.crt /etc/ssl/cert.crt -ADD .docker/nginx/cert.key /etc/ssl/cert.key +ADD ../.docker/nginx/nginx.conf /etc/nginx/ +ADD ../.docker/nginx/host.conf /etc/nginx/conf.d/ +ADD ../.docker/nginx/cert.crt /etc/ssl/cert.crt +ADD ../.docker/nginx/cert.key /etc/ssl/cert.key RUN rm /etc/nginx/conf.d/default.conf diff --git a/.docker/php-fpm.old/Dockerfile b/.docker/php-fpm.old/Dockerfile new file mode 100644 index 0000000..215a2e5 --- /dev/null +++ b/.docker/php-fpm.old/Dockerfile @@ -0,0 +1,13 @@ +FROM swiftcode/flags:php-fpm-latest + +ARG KEY + +RUN echo "$KEY" | base64 -d > /home/www-data/.ssh/id_rsa +RUN chmod 0600 /home/www-data/.ssh/id_rsa +RUN chown -R www-data:www-data /home/www-data/.ssh +USER www-data +WORKDIR /var/www/webapp +RUN export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no" && git clone git@github.com:mainstreamer/flags-api.git . +RUN cp .env.prod .env +RUN composer install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader --classmap-authoritative +RUN rm /home/www-data/.ssh/id_rsa diff --git a/.docker/php-fpm/Dockerfile-base b/.docker/php-fpm.old/Dockerfile-base similarity index 100% rename from .docker/php-fpm/Dockerfile-base rename to .docker/php-fpm.old/Dockerfile-base diff --git a/.docker/php-fpm/build.md b/.docker/php-fpm.old/build.md similarity index 100% rename from .docker/php-fpm/build.md rename to .docker/php-fpm.old/build.md diff --git a/.docker/php-fpm/php.ini b/.docker/php-fpm.old/php.ini similarity index 100% rename from .docker/php-fpm/php.ini rename to .docker/php-fpm.old/php.ini diff --git a/.docker/php-fpm/Dockerfile b/.docker/php-fpm/Dockerfile index 215a2e5..a2b35ba 100644 --- a/.docker/php-fpm/Dockerfile +++ b/.docker/php-fpm/Dockerfile @@ -1,13 +1,164 @@ -FROM swiftcode/flags:php-fpm-latest +# ========================================== +# Base stage - shared foundation +# ========================================== +FROM php:8.4-fpm-alpine AS base -ARG KEY +# Copy the PHP extension installer (uses pre-built binaries when available) +COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ + +# Install all extensions in one command - MUCH faster +RUN install-php-extensions \ + pdo_pgsql \ + intl \ + opcache \ + gd \ + xml \ + mbstring \ + zip \ + redis + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +# ========================================== +# Development stage +# ========================================== +FROM base AS development + +ARG USER_ID=1000 +ARG GROUP_ID=1000 + +RUN apk add --no-cache git curl wget vim bash + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'upload_max_filesize = 2M'; \ + echo 'post_max_size = 8M'; \ + echo 'max_execution_time = 30'; \ + echo 'date.timezone = UTC'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.enable_cli = 1'; \ + echo 'opcache.validate_timestamps = 1'; \ + echo 'opcache.revalidate_freq = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = On'; \ + echo 'error_reporting = E_ALL'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +RUN deluser www-data 2>/dev/null || true && \ + addgroup -g ${GROUP_ID} www-data && \ + adduser -u ${USER_ID} -G www-data -s /bin/sh -D www-data && \ + chown -R www-data:www-data /var/www + +COPY .docker/php-fpm/docker-entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh && \ + chown www-data:www-data /entrypoint.sh -RUN echo "$KEY" | base64 -d > /home/www-data/.ssh/id_rsa -RUN chmod 0600 /home/www-data/.ssh/id_rsa -RUN chown -R www-data:www-data /home/www-data/.ssh USER www-data -WORKDIR /var/www/webapp -RUN export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no" && git clone git@github.com:mainstreamer/flags-api.git . -RUN cp .env.prod .env -RUN composer install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader --classmap-authoritative -RUN rm /home/www-data/.ssh/id_rsa + +RUN wget https://get.symfony.com/cli/installer -O - | bash || true && \ + if [ -f ~/.symfony5/bin/symfony ]; then \ + mkdir -p ~/bin && mv ~/.symfony5/bin/symfony ~/bin/symfony; \ + fi + +ENV PATH="/home/www-data/bin:${PATH}" + +EXPOSE 9000 + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["php-fpm"] + +# ========================================== +# Builder stage +# ========================================== +FROM base AS builder + +RUN apk add --no-cache git + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.enable_cli = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = Off'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +# Copy composer files for layer caching +COPY --chown=www-data:www-data ./app/composer.json ./app/composer.lock* ./app/symfony.lock* ./ + +# USE BUILDKIT CACHE for Composer - HUGE speedup +RUN --mount=type=cache,target=/tmp/composer \ + COMPOSER_CACHE_DIR=/tmp/composer \ + composer install \ + --no-dev \ + --no-scripts \ + --no-interaction \ + --prefer-dist \ + --optimize-autoloader \ + --classmap-authoritative + +# Copy application code +COPY --chown=www-data:www-data app/ . + +RUN composer dump-autoload --optimize --classmap-authoritative + +# Skip cache warmup - do it at runtime instead (saves build time) +RUN chown -R www-data:www-data var/ + +# ========================================== +# Production stage +# ========================================== +FROM base AS production + +ARG USER_ID=1000 +ARG GROUP_ID=1000 + +# Match UIDs in production too +RUN deluser www-data 2>/dev/null || true && \ + addgroup -g ${GROUP_ID} www-data && \ + adduser -u ${USER_ID} -G www-data -s /bin/sh -D www-data + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.memory_consumption = 256'; \ + echo 'opcache.validate_timestamps = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = Off'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +# Copy from builder +COPY --from=builder --chown=www-data:www-data /var/www/html ./ + +# Remove dev files +RUN rm -rf tests/ .git/ .github/ .env.local .env.*.local \ + docker-compose.yml Dockerfile Makefile *.md phpunit.xml* \ + /usr/local/bin/composer \ + && mkdir -p var/cache var/log \ + && bin/console cache:clear --env=prod --no-warmup \ + && php bin/console cache:warmup --env=prod \ + && chown -R www-data:www-data var/ + +# Add entrypoint +COPY .docker/php-fpm/docker-entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENV APP_ENV=prod APP_DEBUG=0 + +# Warmup cache as root before switching to www-data +#RUN php bin/console cache:clear --no-warmup \ +# && php bin/console cache:warmup + +USER www-data +EXPOSE 9000 + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["php-fpm"] \ No newline at end of file diff --git a/.docker/php-fpm/README.md b/.docker/php-fpm/README.md new file mode 100644 index 0000000..2c35c22 --- /dev/null +++ b/.docker/php-fpm/README.md @@ -0,0 +1,11 @@ +# UPDATING IMAGE IN REGISTRY + +### 0. Login and registry key + +### 1. Rebuild +make build-prod + or +docker build -t ghcr.io/mainstreamer/flaux:latest --target production -f docker/php/Dockerfile . + +### 2. Push +docker push ghcr.io/mainstreamer/flaux:latest \ No newline at end of file diff --git a/.docker/php-fpm/docker-entrypoint.sh b/.docker/php-fpm/docker-entrypoint.sh new file mode 100644 index 0000000..20ac62e --- /dev/null +++ b/.docker/php-fpm/docker-entrypoint.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# Ensure Symfony directories are writable +if [ -d /var/www/webapp/var ]; then +mkdir -p /var/www/webapp/var/cache /var/www/webapp/var/log +chmod -R 775 /var/www/webapp/var 2>/dev/null || true +fi + +# Execute CMD +exec "$@" \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml b/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml new file mode 100644 index 0000000..ba9eff3 --- /dev/null +++ b/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml @@ -0,0 +1,3271 @@ + + + + + _complete +
Options:
--shell(-s)The shell type ("bash", "fish", "zsh")
--input(-i)An array of input tokens (e.g. COMP_WORDS or argv)
--current(-c)The index of the "input" array that the cursor is in (e.g. COMP_CWORD)
--api-version(-a)The API version of the completion script
--symfony(-S)deprecated
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + + +
+ + about + about command displays information about the current Symfony project.

The PHP section displays important configuration that could affect your application. The values might
be different between web and CLI.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + completion + completion command dumps the shell completion script required
to use shell autocompletion (currently, bash, fish, zsh completion are supported).

Static installation
-------------------

Dump the script to a global completion file and restart your shell:

/home/stx/Projects/flags-api/bin/console completion bash | sudo tee /etc/bash_completion.d/console

Or dump the script to a local file and source it:

/home/stx/Projects/flags-api/bin/console completion bash > completion.sh

# source the file whenever you use the project
source completion.sh

# or add this line at the end of your "~/.bashrc" file:
source /path/to/completion.sh

Dynamic installation
--------------------

Add this to the end of your shell configuration file (e.g. "~/.bashrc"):

eval "$(/home/stx/Projects/flags-api/bin/console completion bash)"

Options:
--debugTail the completion debug log
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ shell[=null] + + + command]]> + + + + + + + + + + + +
+ + help + help command displays help for a given command:

/home/stx/Projects/flags-api/bin/console help list

You can also output the help in other formats by using the --format option:

/home/stx/Projects/flags-api/bin/console help --format=xml list

To display the list of available commands, please use the list command.

Options:
--formatThe output format (txt, xml, json, or md)
--rawTo output raw command help
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]> + command_name[=null] + + + +
command]]> + + + + + + + + + + + + + + list + list command lists all commands:

/home/stx/Projects/flags-api/bin/console list

You can also display the commands for a specific namespace:

/home/stx/Projects/flags-api/bin/console list test

You can also output the information in other formats by using the --format option:

/home/stx/Projects/flags-api/bin/console list --format=xml

It's also possible to get raw list of commands (useful for embedding command runner):

/home/stx/Projects/flags-api/bin/console list --raw

Options:
--rawTo output raw command list
--formatThe output format (txt, xml, json, or md)
--shortTo skip describing commands' arguments
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ namespace[=null] + + + + + + + + + + + + + + + +
+ + app:set-webhook +
Options:
--option1Option description
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ arg1[=null] + + + + + + + + + + + + + +
+ + assets:install + assets:install command installs bundle assets into a given
directory (e.g. the public directory).

php /home/stx/Projects/flags-api/bin/console assets:install public

A "bundles" directory will be created inside the target directory and the
"Resources/public" directory of each bundle will be copied into it.

To create a symlink to each bundle instead of copying its assets, use the
--symlink option (will fall back to hard copies when symbolic links aren't possible:

php /home/stx/Projects/flags-api/bin/console assets:install public --symlink

To make symlink relative, add the --relative option:

php /home/stx/Projects/flags-api/bin/console assets:install public --symlink --relative


Options:
--symlinkSymlink the assets instead of copying them
--relativeMake relative symlinks
--no-cleanupDo not remove the assets of the bundles that no longer exist
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ target[=null] + + + + + + + + + + + + + + + +
+ + cache:clear + cache:clear command clears and warms up the application cache for a given environment
and debug mode:

php /home/stx/Projects/flags-api/bin/console cache:clear --env=dev
php /home/stx/Projects/flags-api/bin/console cache:clear --env=prod --no-debug

Options:
--no-warmupDo not warm up the cache
--no-optional-warmersSkip optional cache warmers (faster)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + cache:pool:clear + cache:pool:clear command clears the given cache pools or cache pool clearers.

/home/stx/Projects/flags-api/bin/console cache:pool:clear [...]

Options:
--allClear all cache pools
--excludeA list of cache pools or cache pool clearers to exclude
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ pools[=null] + + + + + + + + + + + + + + +
+ + cache:pool:delete + cache:pool:delete deletes an item from a given cache pool.

/home/stx/Projects/flags-api/bin/console cache:pool:delete

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ pool key + + + + + + + + + + + + +
+ + cache:pool:invalidate-tags + cache:pool:invalidate-tags command invalidates tags from taggable pools. By default, all pools
have the passed tags invalidated. Pass --pool=my_pool to invalidate tags on a specific pool.

php /home/stx/Projects/flags-api/bin/console cache:pool:invalidate-tags tag1 tag2
php /home/stx/Projects/flags-api/bin/console cache:pool:invalidate-tags tag1 tag2 --pool=cache2 --pool=cache1

Options:
--pool(-p)The pools to invalidate on
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ tags + + + + + + + + + + + + + +
+ + cache:pool:list + cache:pool:list command lists all available cache pools.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + cache:pool:prune + cache:pool:prune command deletes all expired items from all pruneable pools.

/home/stx/Projects/flags-api/bin/console cache:pool:prune

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + cache:warmup + cache:warmup command warms up the cache.

Before running this command, the cache must be empty.


Options:
--no-optional-warmersSkip optional cache warmers (faster)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + +
+ + config:dump-reference + config:dump-reference command dumps the default configuration for an
extension/bundle.

Either the extension alias or bundle name can be used:

php /home/stx/Projects/flags-api/bin/console config:dump-reference framework
php /home/stx/Projects/flags-api/bin/console config:dump-reference FrameworkBundle

The --format option specifies the format of the configuration,
these are "yaml", "xml".

php /home/stx/Projects/flags-api/bin/console config:dump-reference FrameworkBundle --format=xml

For dumping a specific option, add its path as second argument (only available for the yaml format):

php /home/stx/Projects/flags-api/bin/console config:dump-reference framework http_client.default_options


Options:
--formatThe output format ("yaml", "xml")
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name[=null] path[=null] + + + + + + + + + + + + + +
+ + dbal:run-sql + dbal:run-sql command executes the given SQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console dbal:run-sql "SELECT * FROM users"

Options:
--connectionThe named database connection
--depthDumping depth of result set (deprecated).
--force-fetchForces fetching the result.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ sql + + + + + + + + + + + + + + + +
+ + debug:autowiring + debug:autowiring command displays the classes and interfaces that
you can use as type-hints for autowiring:

php /home/stx/Projects/flags-api/bin/console debug:autowiring

You can also pass a search term to filter the list:

php /home/stx/Projects/flags-api/bin/console debug:autowiring log


Options:
--allShow also services that are not aliased
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ search[=null] + + + + + + + + + + + + + +
+ + debug:config + debug:config command dumps the current configuration for an
extension/bundle.

Either the extension alias or bundle name can be used:

php /home/stx/Projects/flags-api/bin/console debug:config framework
php /home/stx/Projects/flags-api/bin/console debug:config FrameworkBundle

The --format option specifies the format of the configuration,
these are "txt", "yaml", "json".

php /home/stx/Projects/flags-api/bin/console debug:config framework --format=json

For dumping a specific option, add its path as second argument:

php /home/stx/Projects/flags-api/bin/console debug:config framework serializer.enabled


Options:
--resolve-envDisplay resolved environment variable values instead of placeholders
--formatThe output format ("txt", "yaml", "json")
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name[=null] path[=null] + + + + + + + + + + + + + + +
+ + debug:container + debug:container command displays all configured public services:

php /home/stx/Projects/flags-api/bin/console debug:container

To see deprecations generated during container compilation and cache warmup, use the --deprecations option:

php /home/stx/Projects/flags-api/bin/console debug:container --deprecations

To get specific information about a service, specify its name:

php /home/stx/Projects/flags-api/bin/console debug:container validator

To get specific information about a service including all its arguments, use the --show-arguments flag:

php /home/stx/Projects/flags-api/bin/console debug:container validator --show-arguments

To see available types that can be used for autowiring, use the --types flag:

php /home/stx/Projects/flags-api/bin/console debug:container --types

To see environment variables used by the container, use the --env-vars flag:

php /home/stx/Projects/flags-api/bin/console debug:container --env-vars

Display a specific environment variable by specifying its name with the --env-var option:

php /home/stx/Projects/flags-api/bin/console debug:container --env-var=APP_ENV

Use the --tags option to display tagged public services grouped by tag:

php /home/stx/Projects/flags-api/bin/console debug:container --tags

Find all services with a specific tag by specifying the tag name with the --tag option:

php /home/stx/Projects/flags-api/bin/console debug:container --tag=form.type

Use the --parameters option to display all parameters:

php /home/stx/Projects/flags-api/bin/console debug:container --parameters

Display a specific parameter by specifying its name with the --parameter option:

php /home/stx/Projects/flags-api/bin/console debug:container --parameter=kernel.debug

By default, internal services are hidden. You can display them
using the --show-hidden flag:

php /home/stx/Projects/flags-api/bin/console debug:container --show-hidden


Options:
--show-argumentsShow arguments in services
--show-hiddenShow hidden (internal) services
--tagShow all services with a specific tag
--tagsDisplay tagged services for an application
--parameterDisplay a specific parameter for an application
--parametersDisplay parameters for an application
--typesDisplay types (classes/interfaces) available in the container
--env-varDisplay a specific environment variable used in the container
--env-varsDisplay environment variables used in the container
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw description
--deprecationsDisplay deprecations generated when compiling and warming up the container
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name[=null] + + + + + + + + + + + + + + + + + + + + + + + + +
+ + debug:dotenv + /home/stx/Projects/flags-api/bin/console debug:dotenv command displays all the environment variables configured by dotenv:

php /home/stx/Projects/flags-api/bin/console debug:dotenv

To get specific variables, specify its full or partial name:

php /home/stx/Projects/flags-api/bin/console debug:dotenv FOO_BAR


Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ filter[=null] + + + + + + + + + + + + +
+ + debug:event-dispatcher + debug:event-dispatcher command displays all configured listeners:

php /home/stx/Projects/flags-api/bin/console debug:event-dispatcher

To get specific listeners for an event, specify its name:

php /home/stx/Projects/flags-api/bin/console debug:event-dispatcher kernel.request

Options:
--dispatcherTo view events of a specific event dispatcher
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw description
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ event[=null] + + + + + + + + + + + + + + + +
+ + debug:firewall + debug:firewall command displays the firewalls that are configured
in your application:

php /home/stx/Projects/flags-api/bin/console debug:firewall

You can pass a firewall name to display more detailed information about
a specific firewall:

php /home/stx/Projects/flags-api/bin/console debug:firewall main

To include all events and event listeners for a specific firewall, use the
events option:

php /home/stx/Projects/flags-api/bin/console debug:firewall --events main


Options:
--eventsInclude a list of event listeners (only available in combination with the "name" argument)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name[=null] + + + + + + + + + + + + + +
+ + debug:router + debug:router displays the configured routes:

php /home/stx/Projects/flags-api/bin/console debug:router


Options:
--show-controllersShow assigned controllers in overview
--show-aliasesShow aliases in overview
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw route(s)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name[=null] + + + + + + + + + + + + + + + + +
+ + debug:serializer + debug:serializer 'App\Entity\Dummy' command dumps the serializer groups for the dummy class.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ class + + + + + + + + + + + + +
+ + debug:validator + debug:validator 'App\Entity\Dummy' command dumps the validators for the dummy class.

The debug:validator src/ command dumps the validators for the `src` directory.

Options:
--show-allShow all classes even if they have no validation constraints
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ class + + + + + + + + + + + + + +
+ + dev:token +
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + doctrine:cache:clear-collection-region + doctrine:cache:clear-collection-region command is meant to clear a second-level cache collection regions for an associated Entity Manager.
It is possible to delete/invalidate all collection region, a specific collection region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for an collection region this command would do the work:

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName'

To invalidate a specific entry you should use :

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName' 1

If you want to invalidate all entries for the all collection regions:

doctrine:cache:clear-collection-region --all

Alternatively, if you want to flush the configured cache provider for an collection region use this command:

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName' --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all entity regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ owner-class[=null] association[=null] owner-id[=null] + + + + + + + + + + + + + + + +
+ + doctrine:cache:clear-entity-region + doctrine:cache:clear-entity-region command is meant to clear a second-level cache entity region for an associated Entity Manager.
It is possible to delete/invalidate all entity region, a specific entity region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for an entity region this command would do the work:

doctrine:cache:clear-entity-region 'Entities\MyEntity'

To invalidate a specific entry you should use :

doctrine:cache:clear-entity-region 'Entities\MyEntity' 1

If you want to invalidate all entries for the all entity regions:

doctrine:cache:clear-entity-region --all

Alternatively, if you want to flush the configured cache provider for an entity region use this command:

doctrine:cache:clear-entity-region 'Entities\MyEntity' --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all entity regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ entity-class[=null] entity-id[=null] + + + + + + + + + + + + + + + +
+ + doctrine:cache:clear-metadata + doctrine:cache:clear-metadata command is meant to clear the metadata cache of associated Entity Manager.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:cache:clear-query + doctrine:cache:clear-query command is meant to clear the query cache of associated Entity Manager.
It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider
instance completely.

The execution type differ on how you execute the command.
If you want to invalidate the entries (and not delete from cache instance), this command would do the work:

doctrine:cache:clear-query

Alternatively, if you want to flush the cache provider using this command:

doctrine:cache:clear-query --flush

Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries,
because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:cache:clear-query-region + doctrine:cache:clear-query-region command is meant to clear a second-level cache query region for an associated Entity Manager.
It is possible to delete/invalidate all query region, a specific query region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for the default query region this command would do the work:

doctrine:cache:clear-query-region

To invalidate entries for a specific query region you should use :

doctrine:cache:clear-query-region my_region_name

If you want to invalidate all entries for the all query region:

doctrine:cache:clear-query-region --all

Alternatively, if you want to flush the configured cache provider use this command:

doctrine:cache:clear-query-region my_region_name --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all query regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ region-name[=null] + + + + + + + + + + + + + + + +
+ + doctrine:cache:clear-result + doctrine:cache:clear-result command is meant to clear the result cache of associated Entity Manager.
It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider
instance completely.

The execution type differ on how you execute the command.
If you want to invalidate the entries (and not delete from cache instance), this command would do the work:

doctrine:cache:clear-result

Alternatively, if you want to flush the cache provider using this command:

doctrine:cache:clear-result --flush

Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries,
because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:database:create + doctrine:database:create command creates the default connections database:

php /home/stx/Projects/flags-api/bin/console doctrine:database:create

You can also optionally specify the name of a connection to create the database for:

php /home/stx/Projects/flags-api/bin/console doctrine:database:create --connection=default

Options:
--connection(-c)The connection to use for this command
--if-not-existsDon't trigger an error, when the database already exists
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:database:drop + doctrine:database:drop command drops the default connections database:

php /home/stx/Projects/flags-api/bin/console doctrine:database:drop

The --force parameter has to be used to actually drop the database.

You can also optionally specify the name of a connection to drop the database for:

php /home/stx/Projects/flags-api/bin/console doctrine:database:drop --connection=default

Be careful: All data in a given database will be lost when executing this command.

Options:
--connection(-c)The connection to use for this command
--if-existsDon't trigger an error, when the database doesn't exist
--force(-f)Set this parameter to execute this action
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:ensure-production-settings +
Options:
--emName of the entity manager to operate on
--completeFlag to also inspect database connection existence.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:fixtures:load + doctrine:fixtures:load command loads data fixtures from your application:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load

Fixtures are services that are tagged with doctrine.fixture.orm.

If you want to append the fixtures instead of flushing the database first you can use the --append option:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --append

By default Doctrine Data Fixtures uses DELETE statements to drop the existing rows from the database.
If you want to use a TRUNCATE statement instead you can use the --purge-with-truncate flag:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --purge-with-truncate

To execute only fixtures that live in a certain group, use:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --group=group1


Options:
--appendAppend the data fixtures instead of deleting all data from the database first.
--groupOnly load fixtures that belong to this group
--emThe entity manager to use for this command.
--purgerThe purger to use for this command
--purge-exclusionsList of database tables to ignore while purging
--purge-with-truncatePurge data by using a database-level TRUNCATE statement
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + + + +
+ + doctrine:mapping:convert +
This is an execute one-time command. It should not be necessary for
you to call this method multiple times, especially when using the --from-database
flag.

Converting an existing database schema into mapping files only solves about 70-80%
of the necessary mapping information. Additionally the detection from an existing
database cannot detect inverse associations, inheritance types,
entities with foreign keys as primary keys and many of the
semantical operations on associations such as cascade.

Hint: There is no need to convert YAML or XML mapping files to annotations
every time you make changes. All mapping drivers are first class citizens
in Doctrine 2 and can be used as runtime mapping for the ORM.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--filterA string pattern used to match entities that should be processed.
--force(-f)Force to overwrite existing mapping files.
--from-databaseWhether or not to convert mapping information from existing database.
--extendDefines a base class to be extended by generated entity classes.
--num-spacesDefines the number of indentation spaces
--namespaceDefines a namespace for the generated entity classes, if converted from database.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ to-type dest-path + + + + + + + + + + + + + + + + + + + +
+ + doctrine:mapping:import + doctrine:mapping:import command imports mapping information
from an existing database:

Generate annotation mappings into the src/ directory using App as the namespace:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import App\\Entity annotation --path=src/Entity

Generate xml mappings into the config/doctrine/ directory using App as the namespace:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import App\\Entity xml --path=config/doctrine

Generate XML mappings into a bundle:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml

You can also optionally specify which entity manager to import from with the
--em option:

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --em=default

If you don't want to map every entity that can be found in the database, use the
--filter option. It will try to match the targeted mapped entity with the
provided pattern string.

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --filter=MyMatchedEntity

Use the --force option, if you want to override existing mapping files:

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --force

Options:
--emThe entity manager to use for this command
--filterA string pattern used to match entities that should be mapped.
--forceForce to overwrite existing mapping files.
--pathThe path where the files would be generated (not used when a bundle is passed).
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name mapping-type[=null] + + + + + + + + + + + + + + + + +
+ + doctrine:mapping:info + doctrine:mapping:info shows basic information about which
entities exist and possibly if their mapping information contains errors or
not.

Options:
--emName of the entity manager to operate on
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + +
+ + doctrine:migrations:current +
Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:diff + doctrine:migrations:diff command generates a migration by comparing your current database to your mapping information:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:diff


Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--namespaceThe namespace to use for the migration (must be in the list of configured namespaces)
--filter-expressionTables which are filtered by Regular Expression.
--formattedFormat the generated SQL.
--line-lengthMax line length of unformatted lines.
--check-database-platformCheck Database Platform to the generated code.
--allow-empty-diffDo not throw an exception when no changes are detected.
--from-empty-schemaGenerate a full migration as if the current database was empty.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + + + + + + + +
+ + doctrine:migrations:dump-schema + doctrine:migrations:dump-schema command dumps the schema for your database to a migration:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:dump-schema

After dumping your schema to a migration, you can rollup your migrations using the migrations:rollup command.

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--formattedFormat the generated SQL.
--namespaceNamespace to use for the generated migrations (defaults to the first namespace definition).
--filter-tablesFilter the tables to dump via Regex.
--line-lengthMax line length of unformatted lines.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + + + + +
+ + doctrine:migrations:execute + doctrine:migrations:execute command executes migration versions up or down manually:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN

You can show more information about the process by increasing the verbosity level. To see the
executed queries, set the level to debug with -vv:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN -vv

If no --up or --down option is specified it defaults to up:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --down

You can also execute the migration as a --dry-run:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --dry-run

You can output the prepared SQL statements to a file with --write-sql:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --write-sql

Or you can also execute the migration without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --no-interaction

All the previous commands accept multiple migration versions, allowing you run execute more than
one migration at once:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN-1 FQCN-2 ...FQCN-n


Options:
--write-sqlThe path to output the migration SQL file. Defaults to current working directory.
--dry-runExecute the migration as a dry run.
--upExecute the migration up.
--downExecute the migration down.
--query-timeTime all the queries individually.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ versions + + + + + + + + + + + + + + + + + + + + +
+ + doctrine:migrations:generate + doctrine:migrations:generate command generates a blank migration class:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:generate


Options:
--namespaceThe namespace to use for the migration (must be in the list of configured namespaces)
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + +
+ + doctrine:migrations:latest +
Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:list + doctrine:migrations:list command outputs a list of all available migrations and their status:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:list

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:migrate + doctrine:migrations:migrate command executes a migration to a specified version or the latest available version:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate

You can show more information about the process by increasing the verbosity level. To see the
executed queries, set the level to debug with -vv:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate -vv

You can optionally manually specify the version you wish to migrate to:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN

You can specify the version you wish to migrate to using an alias:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate prev
These alias are defined: first, latest, prev, current and next

You can specify the version you wish to migrate to using an number against the current version:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate current+3

You can also execute the migration as a --dry-run:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN --dry-run

You can output the prepared SQL statements to a file with --write-sql:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN --write-sql

Or you can also execute the migration without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate --no-interaction

You can also time all the different queries if you wanna know which one is taking so long:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate --query-time

Use the --all-or-nothing option to wrap the entire migration in a transaction.


Options:
--write-sqlThe path to output the migration SQL file. Defaults to current working directory.
--dry-runExecute the migration as a dry run.
--query-timeTime all the queries individually.
--allow-no-migrationDo not throw an exception if no migration is available.
--all-or-nothingWrap the entire migration in a transaction.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ version[=null] + + + + + + + + + + + + + + + + + + + + +
+ + doctrine:migrations:rollup + doctrine:migrations:rollup command rolls up migrations by deleting all tracked versions and
inserts the one version that exists that was created with the migrations:dump-schema command.

/home/stx/Projects/flags-api/bin/console doctrine:migrations:rollup

To dump your schema to a migration version you can use the migrations:dump-schema command.

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:status + doctrine:migrations:status command outputs the status of a set of migrations:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:status

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:sync-metadata-storage + The doctrine:migrations:sync-metadata-storage command updates metadata storage to the latest version,
ensuring it is ready to receive migrations generated by the current version of Doctrine Migrations.


/home/stx/Projects/flags-api/bin/console doctrine:migrations:sync-metadata-storage

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + doctrine:migrations:up-to-date + doctrine:migrations:up-to-date command tells you if your schema is up-to-date:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:up-to-date

Options:
--fail-on-unregistered(-u)Whether to fail when there are unregistered extra migrations found
--list-migrations(-l)Show a list of missing or not migrated versions.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + + +
+ + doctrine:migrations:version + doctrine:migrations:version command allows you to manually add, delete or synchronize migration versions from the version table:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version MIGRATION-FQCN --add

If you want to delete a version you can use the --delete option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version MIGRATION-FQCN --delete

If you want to synchronize by adding or deleting all migration versions available in the version table you can use the --all option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --add --all
/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --delete --all

If you want to synchronize by adding or deleting some range of migration versions available in the version table you can use the --range-from/--range-to option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --add --range-from=MIGRATION-FQCN --range-to=MIGRATION-FQCN
/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --delete --range-from=MIGRATION-FQCN --range-to=MIGRATION-FQCN

You can also execute this command without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --no-interaction

Options:
--addAdd the specified version.
--deleteDelete the specified version.
--allApply to all the versions.
--range-fromApply from specified version.
--range-toApply to specified version.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ version[=null] + + + + + + + + + + + + + + + + + + + + +
+ + doctrine:query:dql + doctrine:query:dql command executes the given DQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u"

You can also optionally specify some additional options like what type of
hydration to use when executing the query:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u" --hydrate=array

Additionally you can specify the first result and maximum amount of results to
show:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u" --first-result=0 --max-result=30

Options:
--emName of the entity manager to operate on
--hydrateHydration mode of result set. Should be either: object, array, scalar or single-scalar.
--first-resultThe first result in the result set.
--max-resultThe maximum number of results in the result set.
--depthDumping depth of Entity graph.
--show-sqlDump generated SQL instead of executing query
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ dql + + + + + + + + + + + + + + + + + + +
+ + doctrine:query:sql + doctrine:query:sql command executes the given SQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console doctrine:query:sql "SELECT * FROM users"

Options:
--connectionThe named database connection
--depthDumping depth of result set (deprecated).
--force-fetchForces fetching the result.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ sql + + + + + + + + + + + + + + + +
+ + doctrine:schema:create +
Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--dump-sqlInstead of trying to apply generated SQLs into EntityManager Storage Connection, output them.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + doctrine:schema:drop + Beware that the complete database is dropped by this command, even tables that are not relevant to your metadata model.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--dump-sqlInstead of trying to apply generated SQLs into EntityManager Storage Connection, output them.
--force(-f)Don't ask for the deletion of the database, but force the operation to run.
--full-databaseInstead of using the Class Metadata to detect the database table schema, drop ALL assets that the database contains.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + +
+ + doctrine:schema:update + doctrine:schema:update command generates the SQL needed to
synchronize the database schema with the current mapping metadata of the
default entity manager.

For example, if you add metadata for a new column to an entity, this command
would generate and output the SQL needed to add the new column to the database:

doctrine:schema:update --dump-sql

Alternatively, you can execute the generated queries:

doctrine:schema:update --force

If both options are specified, the queries are output and then executed:

doctrine:schema:update --dump-sql --force

Finally, be aware that if the --complete option is passed, this
task will drop all database assets (e.g. tables, etc) that are *not* described
by the current metadata. In other words, without this option, this task leaves
untouched any "extra" tables that exist in the database, but which aren't
described by any metadata. Not passing that option is deprecated.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--completeIf defined, all assets of the database which are not relevant to the current metadata will be dropped.
--dump-sqlDumps the generated SQL statements to the screen (does not execute them).
--force(-f)Causes the generated SQL statements to be physically executed against your database.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + +
+ + doctrine:schema:validate +
Options:
--emName of the entity manager to operate on
--skip-mappingSkip the mapping validation check
--skip-syncSkip checking if the mapping is in sync with the database
--skip-property-typesSkip checking if property types match the Doctrine types
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + + +
+ + lexik:jwt:check-config +
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + lexik:jwt:enable-encryption +
Options:
--force(-f)Force the modification of the configuration, even if already set.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + +
+ + lexik:jwt:generate-keypair +
Options:
--dry-runDo not update key files.
--skip-if-existsDo not update key files if they already exist.
--overwriteOverwrite key files if they already exist.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + + +
+ + lexik:jwt:generate-token +
Options:
--ttl(-t)Ttl in seconds to be added to current time. If not provided, the ttl configured in the bundle will be used. Use 0 to generate token without exp
--user-class(-c)Userclass is used to determine which user provider to use
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ username + + + + + + + + + + + + + + +
+ + lexik:jwt:migrate-config +
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + lint:container +
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + lint:yaml + lint:yaml command lints a YAML file and outputs to STDOUT
the first encountered syntax error.

You can validates YAML contents passed from STDIN:

cat filename | php /home/stx/Projects/flags-api/bin/console lint:yaml -

You can also validate the syntax of a file:

php /home/stx/Projects/flags-api/bin/console lint:yaml filename

Or of a whole directory:

php /home/stx/Projects/flags-api/bin/console lint:yaml dirname
php /home/stx/Projects/flags-api/bin/console lint:yaml dirname --format=json

You can also exclude one or more specific files:

php /home/stx/Projects/flags-api/bin/console lint:yaml dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml"

Or find all files in a bundle:

php /home/stx/Projects/flags-api/bin/console lint:yaml @AcmeDemoBundle


Options:
--formatThe output format ("txt", "json", "github")
--excludePath(s) to exclude
--parse-tagsParse custom tags
--no-parse-tagsNegate the "--parse-tags" option
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ filename[=null] + + + + + + + + + + + + + + + + +
+ + router:match + router:match shows which routes match a given request and which don't and for what reason:

php /home/stx/Projects/flags-api/bin/console router:match /foo

or

php /home/stx/Projects/flags-api/bin/console router:match /foo --method POST --scheme https --host symfony.com --verbose


Options:
--methodSet the HTTP method
--schemeSet the URI scheme (usually http or https)
--hostSet the URI host
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ path_info + + + + + + + + + + + + + + + +
+ + secrets:decrypt-to-local + secrets:decrypt-to-local command decrypts all secrets and copies them in the local vault.

/home/stx/Projects/flags-api/bin/console secrets:decrypt-to-local

When the option --force is provided, secrets that already exist in the local vault are overriden.

/home/stx/Projects/flags-api/bin/console secrets:decrypt-to-local --force

Options:
--force(-f)Force overriding of secrets that already exist in the local vault
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + +
+ + secrets:encrypt-from-local + secrets:encrypt-from-local command encrypts all locally overridden secrets to the vault.

/home/stx/Projects/flags-api/bin/console secrets:encrypt-from-local

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + +
+ + secrets:generate-keys + secrets:generate-keys command generates a new encryption key.

/home/stx/Projects/flags-api/bin/console secrets:generate-keys

If encryption keys already exist, the command must be called with
the --rotate option in order to override those keys and re-encrypt
existing secrets.

/home/stx/Projects/flags-api/bin/console secrets:generate-keys --rotate

Options:
--local(-l)Update the local vault.
--rotate(-r)Re-encrypt existing secrets with the newly generated keys.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + + +
+ + secrets:list + secrets:list command list all stored secrets.

/home/stx/Projects/flags-api/bin/console secrets:list

When the option --reveal is provided, the decrypted secrets are also displayed.

/home/stx/Projects/flags-api/bin/console secrets:list --reveal

Options:
--reveal(-r)Display decrypted values alongside names
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ + + + + + + + + + + + + +
+ + secrets:remove + secrets:remove command removes a secret from the vault.

/home/stx/Projects/flags-api/bin/console secrets:remove

Options:
--local(-l)Update the local vault.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name + + + + + + + + + + + + + +
+ + secrets:set + secrets:set command stores a secret in the vault.

/home/stx/Projects/flags-api/bin/console secrets:set

To reference secrets in services.yaml or any other config
files, use "%env()%".

By default, the secret value should be entered interactively.
Alternatively, provide a file where to read the secret from:

php /home/stx/Projects/flags-api/bin/console secrets:set filename

Use "-" as a file name to read from STDIN:

cat filename | php /home/stx/Projects/flags-api/bin/console secrets:set -

Use --local to override secrets for local needs.

Options:
--local(-l)Update the local vault.
--random(-r)Generate a random value.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ name file[=null] + + + + + + + + + + + + + + +
+ + security:hash-password + The security:hash-password command hashes passwords according to your
security configuration. This command is mainly used to generate passwords for
the in_memory user provider type and for changing passwords
in the database while developing the application.

Suppose that you have the following security configuration in your application:


# app/config/security.yml
security:
password_hashers:
Symfony\Component\Security\Core\User\InMemoryUser: plaintext
App\Entity\User: auto


If you execute the command non-interactively, the first available configured
user class under the security.password_hashers key is used and a random salt is
generated to hash the password:

php /home/stx/Projects/flags-api/bin/console security:hash-password --no-interaction [password]

Pass the full user class path as the second argument to hash passwords for
your own entities:

php /home/stx/Projects/flags-api/bin/console security:hash-password --no-interaction [password] 'App\Entity\User'

Executing the command interactively allows you to generate a random salt for
hashing the password:

php /home/stx/Projects/flags-api/bin/console security:hash-password [password] 'App\Entity\User'

In case your hasher doesn't require a salt, add the empty-salt option:

php /home/stx/Projects/flags-api/bin/console security:hash-password --empty-salt [password] 'App\Entity\User'


Options:
--empty-saltDo not generate a salt or let the hasher generate one.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
+ password[=null] user-class[=null] + + + + + + + + + + + + + +
+
+ diff --git a/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd b/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd new file mode 100644 index 0000000..f2efc6d --- /dev/null +++ b/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..ab97382 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/flags + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/flags-api.iml b/.idea/flags-api.iml new file mode 100644 index 0000000..8fcb80d --- /dev/null +++ b/.idea/flags-api.iml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..f86e996 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5a6b16c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..adb87a2 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml new file mode 100644 index 0000000..4f8104c --- /dev/null +++ b/.idea/phpunit.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.env.prod b/app/.env.prod similarity index 100% rename from .env.prod rename to app/.env.prod diff --git a/.env.staging b/app/.env.staging similarity index 100% rename from .env.staging rename to app/.env.staging diff --git a/.env.test b/app/.env.test similarity index 100% rename from .env.test rename to app/.env.test diff --git a/.gitignore b/app/.gitignore similarity index 98% rename from .gitignore rename to app/.gitignore index e10db2e..a0934f4 100644 --- a/.gitignore +++ b/app/.gitignore @@ -31,3 +31,4 @@ deploy.php .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### +*.local \ No newline at end of file diff --git a/bin/console b/app/bin/console similarity index 100% rename from bin/console rename to app/bin/console diff --git a/bin/phpunit b/app/bin/phpunit similarity index 100% rename from bin/phpunit rename to app/bin/phpunit diff --git a/capitals-africa.json b/app/capitals-africa.json similarity index 100% rename from capitals-africa.json rename to app/capitals-africa.json diff --git a/capitals-americas.json b/app/capitals-americas.json similarity index 100% rename from capitals-americas.json rename to app/capitals-americas.json diff --git a/capitals-asia.json b/app/capitals-asia.json similarity index 100% rename from capitals-asia.json rename to app/capitals-asia.json diff --git a/capitals-europe.json b/app/capitals-europe.json similarity index 100% rename from capitals-europe.json rename to app/capitals-europe.json diff --git a/capitals-oceania.json b/app/capitals-oceania.json similarity index 100% rename from capitals-oceania.json rename to app/capitals-oceania.json diff --git a/composer.json b/app/composer.json similarity index 99% rename from composer.json rename to app/composer.json index 5acac49..3888a8d 100644 --- a/composer.json +++ b/app/composer.json @@ -2,7 +2,7 @@ "type": "project", "license": "proprietary", "require": { - "php": "^8.2", + "php": "^8.4", "ext-ctype": "*", "ext-iconv": "*", "composer/package-versions-deprecated": "*", diff --git a/composer.lock b/app/composer.lock.old similarity index 100% rename from composer.lock rename to app/composer.lock.old diff --git a/config/bootstrap.php b/app/config/bootstrap.php similarity index 100% rename from config/bootstrap.php rename to app/config/bootstrap.php diff --git a/config/bundles.php b/app/config/bundles.php similarity index 100% rename from config/bundles.php rename to app/config/bundles.php diff --git a/config/jwt/.gitkeep b/app/config/jwt/.gitkeep similarity index 100% rename from config/jwt/.gitkeep rename to app/config/jwt/.gitkeep diff --git a/config/jwt/pair/private.pem b/app/config/jwt/pair/private.pem similarity index 100% rename from config/jwt/pair/private.pem rename to app/config/jwt/pair/private.pem diff --git a/config/jwt/pair/public.pem b/app/config/jwt/pair/public.pem similarity index 100% rename from config/jwt/pair/public.pem rename to app/config/jwt/pair/public.pem diff --git a/config/packages/cache.yaml b/app/config/packages/cache.yaml similarity index 100% rename from config/packages/cache.yaml rename to app/config/packages/cache.yaml diff --git a/config/packages/doctrine.yaml b/app/config/packages/doctrine.yaml similarity index 100% rename from config/packages/doctrine.yaml rename to app/config/packages/doctrine.yaml diff --git a/config/packages/doctrine_migrations.yaml b/app/config/packages/doctrine_migrations.yaml similarity index 100% rename from config/packages/doctrine_migrations.yaml rename to app/config/packages/doctrine_migrations.yaml diff --git a/config/packages/framework.yaml b/app/config/packages/framework.yaml similarity index 100% rename from config/packages/framework.yaml rename to app/config/packages/framework.yaml diff --git a/config/packages/knpu_oauth2_client.yaml b/app/config/packages/knpu_oauth2_client.yaml similarity index 100% rename from config/packages/knpu_oauth2_client.yaml rename to app/config/packages/knpu_oauth2_client.yaml diff --git a/config/packages/lexik_jwt_authentication.yaml b/app/config/packages/lexik_jwt_authentication.yaml similarity index 100% rename from config/packages/lexik_jwt_authentication.yaml rename to app/config/packages/lexik_jwt_authentication.yaml diff --git a/config/packages/nelmio_cors.yaml b/app/config/packages/nelmio_cors.yaml similarity index 100% rename from config/packages/nelmio_cors.yaml rename to app/config/packages/nelmio_cors.yaml diff --git a/config/packages/prod/doctrine.yaml b/app/config/packages/prod/doctrine.yaml similarity index 100% rename from config/packages/prod/doctrine.yaml rename to app/config/packages/prod/doctrine.yaml diff --git a/config/packages/prod/routing.yaml b/app/config/packages/prod/routing.yaml similarity index 100% rename from config/packages/prod/routing.yaml rename to app/config/packages/prod/routing.yaml diff --git a/config/packages/routing.yaml b/app/config/packages/routing.yaml similarity index 100% rename from config/packages/routing.yaml rename to app/config/packages/routing.yaml diff --git a/config/packages/secrity.yaml b/app/config/packages/secrity.yaml similarity index 100% rename from config/packages/secrity.yaml rename to app/config/packages/secrity.yaml diff --git a/config/packages/security.yaml.bkp b/app/config/packages/security.yaml.bkp similarity index 100% rename from config/packages/security.yaml.bkp rename to app/config/packages/security.yaml.bkp diff --git a/config/packages/test/framework.yaml b/app/config/packages/test/framework.yaml similarity index 100% rename from config/packages/test/framework.yaml rename to app/config/packages/test/framework.yaml diff --git a/config/packages/test/validator.yaml b/app/config/packages/test/validator.yaml similarity index 100% rename from config/packages/test/validator.yaml rename to app/config/packages/test/validator.yaml diff --git a/config/packages/validator.yaml b/app/config/packages/validator.yaml similarity index 100% rename from config/packages/validator.yaml rename to app/config/packages/validator.yaml diff --git a/config/preload.php b/app/config/preload.php similarity index 100% rename from config/preload.php rename to app/config/preload.php diff --git a/config/routes.yaml b/app/config/routes.yaml similarity index 100% rename from config/routes.yaml rename to app/config/routes.yaml diff --git a/config/routes/attributes.yaml b/app/config/routes/attributes.yaml similarity index 100% rename from config/routes/attributes.yaml rename to app/config/routes/attributes.yaml diff --git a/config/routes/framework.yaml b/app/config/routes/framework.yaml similarity index 100% rename from config/routes/framework.yaml rename to app/config/routes/framework.yaml diff --git a/config/secrets/dev/dev.MYSQL_ROOT_PASSWORD.c07213.php b/app/config/secrets/dev/dev.MYSQL_ROOT_PASSWORD.c07213.php similarity index 100% rename from config/secrets/dev/dev.MYSQL_ROOT_PASSWORD.c07213.php rename to app/config/secrets/dev/dev.MYSQL_ROOT_PASSWORD.c07213.php diff --git a/config/secrets/dev/dev.encrypt.public.php b/app/config/secrets/dev/dev.encrypt.public.php similarity index 100% rename from config/secrets/dev/dev.encrypt.public.php rename to app/config/secrets/dev/dev.encrypt.public.php diff --git a/config/secrets/dev/dev.list.php b/app/config/secrets/dev/dev.list.php similarity index 100% rename from config/secrets/dev/dev.list.php rename to app/config/secrets/dev/dev.list.php diff --git a/config/secrets/prod/prod.BOT_TOKEN.f41697.php b/app/config/secrets/prod/prod.BOT_TOKEN.f41697.php similarity index 100% rename from config/secrets/prod/prod.BOT_TOKEN.f41697.php rename to app/config/secrets/prod/prod.BOT_TOKEN.f41697.php diff --git a/config/secrets/prod/prod.DATABASE_URL.8ea85a.php b/app/config/secrets/prod/prod.DATABASE_URL.8ea85a.php similarity index 100% rename from config/secrets/prod/prod.DATABASE_URL.8ea85a.php rename to app/config/secrets/prod/prod.DATABASE_URL.8ea85a.php diff --git a/config/secrets/prod/prod.MYSQL_DATABASE.bef43b.php b/app/config/secrets/prod/prod.MYSQL_DATABASE.bef43b.php similarity index 100% rename from config/secrets/prod/prod.MYSQL_DATABASE.bef43b.php rename to app/config/secrets/prod/prod.MYSQL_DATABASE.bef43b.php diff --git a/config/secrets/prod/prod.MYSQL_PASSWORD.32327a.php b/app/config/secrets/prod/prod.MYSQL_PASSWORD.32327a.php similarity index 100% rename from config/secrets/prod/prod.MYSQL_PASSWORD.32327a.php rename to app/config/secrets/prod/prod.MYSQL_PASSWORD.32327a.php diff --git a/config/secrets/prod/prod.MYSQL_ROOT_PASSWORD.c07213.php b/app/config/secrets/prod/prod.MYSQL_ROOT_PASSWORD.c07213.php similarity index 100% rename from config/secrets/prod/prod.MYSQL_ROOT_PASSWORD.c07213.php rename to app/config/secrets/prod/prod.MYSQL_ROOT_PASSWORD.c07213.php diff --git a/config/secrets/prod/prod.MYSQL_USER.8e3cb8.php b/app/config/secrets/prod/prod.MYSQL_USER.8e3cb8.php similarity index 100% rename from config/secrets/prod/prod.MYSQL_USER.8e3cb8.php rename to app/config/secrets/prod/prod.MYSQL_USER.8e3cb8.php diff --git a/config/secrets/prod/prod.encrypt.public.php b/app/config/secrets/prod/prod.encrypt.public.php similarity index 100% rename from config/secrets/prod/prod.encrypt.public.php rename to app/config/secrets/prod/prod.encrypt.public.php diff --git a/config/secrets/prod/prod.list.php b/app/config/secrets/prod/prod.list.php similarity index 100% rename from config/secrets/prod/prod.list.php rename to app/config/secrets/prod/prod.list.php diff --git a/config/secrets/staging/staging.BOT_TOKEN.f41697.php b/app/config/secrets/staging/staging.BOT_TOKEN.f41697.php similarity index 100% rename from config/secrets/staging/staging.BOT_TOKEN.f41697.php rename to app/config/secrets/staging/staging.BOT_TOKEN.f41697.php diff --git a/config/secrets/staging/staging.DATABASE_URL.8ea85a.php b/app/config/secrets/staging/staging.DATABASE_URL.8ea85a.php similarity index 100% rename from config/secrets/staging/staging.DATABASE_URL.8ea85a.php rename to app/config/secrets/staging/staging.DATABASE_URL.8ea85a.php diff --git a/config/secrets/staging/staging.MYSQL_DATABASE.bef43b.php b/app/config/secrets/staging/staging.MYSQL_DATABASE.bef43b.php similarity index 100% rename from config/secrets/staging/staging.MYSQL_DATABASE.bef43b.php rename to app/config/secrets/staging/staging.MYSQL_DATABASE.bef43b.php diff --git a/config/secrets/staging/staging.MYSQL_PASSWORD.32327a.php b/app/config/secrets/staging/staging.MYSQL_PASSWORD.32327a.php similarity index 100% rename from config/secrets/staging/staging.MYSQL_PASSWORD.32327a.php rename to app/config/secrets/staging/staging.MYSQL_PASSWORD.32327a.php diff --git a/config/secrets/staging/staging.MYSQL_ROOT.1ea6ef.php b/app/config/secrets/staging/staging.MYSQL_ROOT.1ea6ef.php similarity index 100% rename from config/secrets/staging/staging.MYSQL_ROOT.1ea6ef.php rename to app/config/secrets/staging/staging.MYSQL_ROOT.1ea6ef.php diff --git a/config/secrets/staging/staging.MYSQL_USER.8e3cb8.php b/app/config/secrets/staging/staging.MYSQL_USER.8e3cb8.php similarity index 100% rename from config/secrets/staging/staging.MYSQL_USER.8e3cb8.php rename to app/config/secrets/staging/staging.MYSQL_USER.8e3cb8.php diff --git a/config/secrets/staging/staging.encrypt.public.php b/app/config/secrets/staging/staging.encrypt.public.php similarity index 100% rename from config/secrets/staging/staging.encrypt.public.php rename to app/config/secrets/staging/staging.encrypt.public.php diff --git a/config/secrets/staging/staging.list.php b/app/config/secrets/staging/staging.list.php similarity index 100% rename from config/secrets/staging/staging.list.php rename to app/config/secrets/staging/staging.list.php diff --git a/config/services.yaml b/app/config/services.yaml similarity index 100% rename from config/services.yaml rename to app/config/services.yaml diff --git a/docker-compose-prod.yml b/app/docker-compose-prod.yml similarity index 100% rename from docker-compose-prod.yml rename to app/docker-compose-prod.yml diff --git a/docker-compose-staging.yml b/app/docker-compose-staging.yml similarity index 100% rename from docker-compose-staging.yml rename to app/docker-compose-staging.yml diff --git a/docker-compose.override.yml b/app/docker-compose.override.yml similarity index 58% rename from docker-compose.override.yml rename to app/docker-compose.override.yml index 1e643a4..4b29cbd 100644 --- a/docker-compose.override.yml +++ b/app/docker-compose.override.yml @@ -1,12 +1,18 @@ services: php: + build: + args: + KEY: ${GITH_KEY} + USER_ID: 1000 + GROUP_ID: 1000 + target: development volumes: - .:/var/www/webapp:rw,cached user: "1000:1000" db: ports: - "3306:3306" - nginx: + caddy: ports: - "80:80" - "443:443" diff --git a/app/docker-compose.yml b/app/docker-compose.yml new file mode 100644 index 0000000..8d843d8 --- /dev/null +++ b/app/docker-compose.yml @@ -0,0 +1,62 @@ +services: + php: + container_name: "php-flags-api" + build: + context: .. + dockerfile: .docker/php-fpm/Dockerfile + target: production + environment: + SYMFONY_DECRYPTION_SECRET: "${SYMFONY_DECRYPTION_SECRET}" +# depends_on: +# - caddy + networks: + - backend-flags + caddy: + container_name: "caddy-flags-api" + build: + context: .. + dockerfile: .docker/caddy/Dockerfile + restart: always +# ports: +# - "80:80" +# - "443:443" + volumes: + - ./:/var/www/webapp:cached + - caddy_data:/data + - caddy_config:/config + - caddy_logs:/var/log/caddy + networks: + - backend-flags + depends_on: + - php +# nginx: +# container_name: "nginx-php-flags-api" +# build: +# context: . +# dockerfile: ../.docker/nginx/Dockerfile +# restart: always +# networks: +# - backend-flags + db: + build: + context: .. + dockerfile: .docker/mysql/Dockerfile + container_name: "db-flags-api" + environment: + MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" + MYSQL_DATABASE: "${MYSQL_DATABASE}" + MYSQL_USER: "${MYSQL_USER}" + MYSQL_PASSWORD: "${MYSQL_PASSWORD}" + volumes: + - db-data-flags:/var/lib/mysql + restart: always + networks: + - backend-flags +networks: + backend-flags: + external: true +volumes: + db-data-flags: ~ + caddy_logs: ~ + caddy_data: ~ + caddy_config: ~ \ No newline at end of file diff --git a/docker.md b/app/docker.md similarity index 100% rename from docker.md rename to app/docker.md diff --git a/flags.sql b/app/flags.sql similarity index 100% rename from flags.sql rename to app/flags.sql diff --git a/http-requests/Correct.http b/app/http-requests/Correct.http similarity index 100% rename from http-requests/Correct.http rename to app/http-requests/Correct.http diff --git a/http-requests/Incorrect.http b/app/http-requests/Incorrect.http similarity index 100% rename from http-requests/Incorrect.http rename to app/http-requests/Incorrect.http diff --git a/http-requests/OAuth2-login.http b/app/http-requests/OAuth2-login.http similarity index 100% rename from http-requests/OAuth2-login.http rename to app/http-requests/OAuth2-login.http diff --git a/http-requests/Profile.http b/app/http-requests/Profile.http similarity index 100% rename from http-requests/Profile.http rename to app/http-requests/Profile.http diff --git a/http-requests/ProtectedEndpoint.http b/app/http-requests/ProtectedEndpoint.http similarity index 100% rename from http-requests/ProtectedEndpoint.http rename to app/http-requests/ProtectedEndpoint.http diff --git a/http-requests/Protected[OPTIONS].http b/app/http-requests/Protected[OPTIONS].http similarity index 100% rename from http-requests/Protected[OPTIONS].http rename to app/http-requests/Protected[OPTIONS].http diff --git a/http-requests/Test Auth.http b/app/http-requests/Test Auth.http similarity index 100% rename from http-requests/Test Auth.http rename to app/http-requests/Test Auth.http diff --git a/http-requests/http-client.env.json b/app/http-requests/http-client.env.json similarity index 100% rename from http-requests/http-client.env.json rename to app/http-requests/http-client.env.json diff --git a/makefile b/app/makefile similarity index 99% rename from makefile rename to app/makefile index d72d5a7..683e1b5 100644 --- a/makefile +++ b/app/makefile @@ -30,4 +30,4 @@ dumper: network: @docker network create backend-flags %: - @ + @ \ No newline at end of file diff --git a/migrations/.gitignore b/app/migrations/.gitignore similarity index 100% rename from migrations/.gitignore rename to app/migrations/.gitignore diff --git a/migrations/Version20200322114725.php b/app/migrations/Version20200322114725.php similarity index 100% rename from migrations/Version20200322114725.php rename to app/migrations/Version20200322114725.php diff --git a/migrations/Version20210103221647.php b/app/migrations/Version20210103221647.php similarity index 100% rename from migrations/Version20210103221647.php rename to app/migrations/Version20210103221647.php diff --git a/migrations/Version20210109193151.php b/app/migrations/Version20210109193151.php similarity index 100% rename from migrations/Version20210109193151.php rename to app/migrations/Version20210109193151.php diff --git a/migrations/Version20210109213855.php b/app/migrations/Version20210109213855.php similarity index 100% rename from migrations/Version20210109213855.php rename to app/migrations/Version20210109213855.php diff --git a/migrations/Version20210109232957.php b/app/migrations/Version20210109232957.php similarity index 100% rename from migrations/Version20210109232957.php rename to app/migrations/Version20210109232957.php diff --git a/migrations/Version20210109233702.php b/app/migrations/Version20210109233702.php similarity index 100% rename from migrations/Version20210109233702.php rename to app/migrations/Version20210109233702.php diff --git a/migrations/Version20210110000325.php b/app/migrations/Version20210110000325.php similarity index 100% rename from migrations/Version20210110000325.php rename to app/migrations/Version20210110000325.php diff --git a/migrations/Version20231022221730.php b/app/migrations/Version20231022221730.php similarity index 100% rename from migrations/Version20231022221730.php rename to app/migrations/Version20231022221730.php diff --git a/migrations/Version20231103235658.php b/app/migrations/Version20231103235658.php similarity index 100% rename from migrations/Version20231103235658.php rename to app/migrations/Version20231103235658.php diff --git a/migrations/Version20231112194737.php b/app/migrations/Version20231112194737.php similarity index 100% rename from migrations/Version20231112194737.php rename to app/migrations/Version20231112194737.php diff --git a/migrations/Version20231112201521.php b/app/migrations/Version20231112201521.php similarity index 100% rename from migrations/Version20231112201521.php rename to app/migrations/Version20231112201521.php diff --git a/migrations/Version20231119013323.php b/app/migrations/Version20231119013323.php similarity index 100% rename from migrations/Version20231119013323.php rename to app/migrations/Version20231119013323.php diff --git a/migrations/Version20231119205647.php b/app/migrations/Version20231119205647.php similarity index 100% rename from migrations/Version20231119205647.php rename to app/migrations/Version20231119205647.php diff --git a/migrations/Version20231120235309.php b/app/migrations/Version20231120235309.php similarity index 100% rename from migrations/Version20231120235309.php rename to app/migrations/Version20231120235309.php diff --git a/migrations/Version20240102024927.php b/app/migrations/Version20240102024927.php similarity index 100% rename from migrations/Version20240102024927.php rename to app/migrations/Version20240102024927.php diff --git a/migrations/Version20240904211753.php b/app/migrations/Version20240904211753.php similarity index 100% rename from migrations/Version20240904211753.php rename to app/migrations/Version20240904211753.php diff --git a/migrations/Version20240904212530.php b/app/migrations/Version20240904212530.php similarity index 100% rename from migrations/Version20240904212530.php rename to app/migrations/Version20240904212530.php diff --git a/migrations/Version20240904220255.php b/app/migrations/Version20240904220255.php similarity index 100% rename from migrations/Version20240904220255.php rename to app/migrations/Version20240904220255.php diff --git a/migrations/Version20251206170339.php b/app/migrations/Version20251206170339.php similarity index 100% rename from migrations/Version20251206170339.php rename to app/migrations/Version20251206170339.php diff --git a/phpunit.xml.dist b/app/phpunit.xml.dist similarity index 100% rename from phpunit.xml.dist rename to app/phpunit.xml.dist diff --git a/psalm.xml b/app/psalm.xml similarity index 100% rename from psalm.xml rename to app/psalm.xml diff --git a/public/index.php b/app/public/index.php similarity index 100% rename from public/index.php rename to app/public/index.php diff --git a/readme.md b/app/readme.md similarity index 100% rename from readme.md rename to app/readme.md diff --git a/request.md b/app/request.md similarity index 100% rename from request.md rename to app/request.md diff --git a/src/Controller/.gitignore b/app/src/Controller/.gitignore similarity index 100% rename from src/Controller/.gitignore rename to app/src/Controller/.gitignore diff --git a/src/DataFixtures/AppFixtures.php b/app/src/DataFixtures/AppFixtures.php similarity index 100% rename from src/DataFixtures/AppFixtures.php rename to app/src/DataFixtures/AppFixtures.php diff --git a/src/DataFixtures/CapitalsFixtures.php b/app/src/DataFixtures/CapitalsFixtures.php similarity index 100% rename from src/DataFixtures/CapitalsFixtures.php rename to app/src/DataFixtures/CapitalsFixtures.php diff --git a/src/Entity/.gitignore b/app/src/Entity/.gitignore similarity index 100% rename from src/Entity/.gitignore rename to app/src/Entity/.gitignore diff --git a/src/Entity/CapitalsStat.php b/app/src/Entity/CapitalsStat.php similarity index 100% rename from src/Entity/CapitalsStat.php rename to app/src/Entity/CapitalsStat.php diff --git a/src/EventListener/NgrokHeaderListener.php b/app/src/EventListener/NgrokHeaderListener.php similarity index 100% rename from src/EventListener/NgrokHeaderListener.php rename to app/src/EventListener/NgrokHeaderListener.php diff --git a/src/Flags/Application/PostParamConverter.php b/app/src/Flags/Application/PostParamConverter.php similarity index 100% rename from src/Flags/Application/PostParamConverter.php rename to app/src/Flags/Application/PostParamConverter.php diff --git a/src/Flags/ConsoleCommand/GetTokenCommand.php b/app/src/Flags/ConsoleCommand/GetTokenCommand.php similarity index 100% rename from src/Flags/ConsoleCommand/GetTokenCommand.php rename to app/src/Flags/ConsoleCommand/GetTokenCommand.php diff --git a/src/Flags/ConsoleCommand/SetWebhookCommand.php b/app/src/Flags/ConsoleCommand/SetWebhookCommand.php similarity index 100% rename from src/Flags/ConsoleCommand/SetWebhookCommand.php rename to app/src/Flags/ConsoleCommand/SetWebhookCommand.php diff --git a/src/Flags/Controller/.gitignore b/app/src/Flags/Controller/.gitignore similarity index 100% rename from src/Flags/Controller/.gitignore rename to app/src/Flags/Controller/.gitignore diff --git a/src/Flags/Controller/CapitalsController.php b/app/src/Flags/Controller/CapitalsController.php similarity index 100% rename from src/Flags/Controller/CapitalsController.php rename to app/src/Flags/Controller/CapitalsController.php diff --git a/src/Flags/Controller/GameController.php b/app/src/Flags/Controller/GameController.php similarity index 100% rename from src/Flags/Controller/GameController.php rename to app/src/Flags/Controller/GameController.php diff --git a/src/Flags/Controller/SecurityController.php b/app/src/Flags/Controller/SecurityController.php similarity index 100% rename from src/Flags/Controller/SecurityController.php rename to app/src/Flags/Controller/SecurityController.php diff --git a/src/Flags/DTO/CapitalsStatDTO.php b/app/src/Flags/DTO/CapitalsStatDTO.php similarity index 100% rename from src/Flags/DTO/CapitalsStatDTO.php rename to app/src/Flags/DTO/CapitalsStatDTO.php diff --git a/src/Flags/DTO/ScoreDTO.php b/app/src/Flags/DTO/ScoreDTO.php similarity index 100% rename from src/Flags/DTO/ScoreDTO.php rename to app/src/Flags/DTO/ScoreDTO.php diff --git a/src/Flags/Entity/.gitignore b/app/src/Flags/Entity/.gitignore similarity index 100% rename from src/Flags/Entity/.gitignore rename to app/src/Flags/Entity/.gitignore diff --git a/src/Flags/Entity/Answer.php b/app/src/Flags/Entity/Answer.php similarity index 100% rename from src/Flags/Entity/Answer.php rename to app/src/Flags/Entity/Answer.php diff --git a/src/Flags/Entity/Capital.php b/app/src/Flags/Entity/Capital.php similarity index 100% rename from src/Flags/Entity/Capital.php rename to app/src/Flags/Entity/Capital.php diff --git a/src/Flags/Entity/CapitalsStat.php b/app/src/Flags/Entity/CapitalsStat.php similarity index 100% rename from src/Flags/Entity/CapitalsStat.php rename to app/src/Flags/Entity/CapitalsStat.php diff --git a/src/Flags/Entity/Enum/GameType.php b/app/src/Flags/Entity/Enum/GameType.php similarity index 100% rename from src/Flags/Entity/Enum/GameType.php rename to app/src/Flags/Entity/Enum/GameType.php diff --git a/src/Flags/Entity/Enum/WorldRegions.php b/app/src/Flags/Entity/Enum/WorldRegions.php similarity index 100% rename from src/Flags/Entity/Enum/WorldRegions.php rename to app/src/Flags/Entity/Enum/WorldRegions.php diff --git a/src/Flags/Entity/Flag.php b/app/src/Flags/Entity/Flag.php similarity index 100% rename from src/Flags/Entity/Flag.php rename to app/src/Flags/Entity/Flag.php diff --git a/src/Flags/Entity/Game.php b/app/src/Flags/Entity/Game.php similarity index 100% rename from src/Flags/Entity/Game.php rename to app/src/Flags/Entity/Game.php diff --git a/src/Flags/Entity/Score.php b/app/src/Flags/Entity/Score.php similarity index 100% rename from src/Flags/Entity/Score.php rename to app/src/Flags/Entity/Score.php diff --git a/src/Flags/Entity/User.php b/app/src/Flags/Entity/User.php similarity index 100% rename from src/Flags/Entity/User.php rename to app/src/Flags/Entity/User.php diff --git a/src/Flags/Repository/.gitignore b/app/src/Flags/Repository/.gitignore similarity index 100% rename from src/Flags/Repository/.gitignore rename to app/src/Flags/Repository/.gitignore diff --git a/src/Flags/Repository/AnswerRepository.php b/app/src/Flags/Repository/AnswerRepository.php similarity index 100% rename from src/Flags/Repository/AnswerRepository.php rename to app/src/Flags/Repository/AnswerRepository.php diff --git a/src/Flags/Repository/CapitalRepository.php b/app/src/Flags/Repository/CapitalRepository.php similarity index 100% rename from src/Flags/Repository/CapitalRepository.php rename to app/src/Flags/Repository/CapitalRepository.php diff --git a/src/Flags/Repository/CapitalsStatRepository.php b/app/src/Flags/Repository/CapitalsStatRepository.php similarity index 100% rename from src/Flags/Repository/CapitalsStatRepository.php rename to app/src/Flags/Repository/CapitalsStatRepository.php diff --git a/src/Flags/Repository/FlagRepository.php b/app/src/Flags/Repository/FlagRepository.php similarity index 100% rename from src/Flags/Repository/FlagRepository.php rename to app/src/Flags/Repository/FlagRepository.php diff --git a/src/Flags/Repository/GameRepository.php b/app/src/Flags/Repository/GameRepository.php similarity index 100% rename from src/Flags/Repository/GameRepository.php rename to app/src/Flags/Repository/GameRepository.php diff --git a/src/Flags/Repository/ScoreRepository.php b/app/src/Flags/Repository/ScoreRepository.php similarity index 100% rename from src/Flags/Repository/ScoreRepository.php rename to app/src/Flags/Repository/ScoreRepository.php diff --git a/src/Flags/Repository/UserRepository.php b/app/src/Flags/Repository/UserRepository.php similarity index 100% rename from src/Flags/Repository/UserRepository.php rename to app/src/Flags/Repository/UserRepository.php diff --git a/src/Flags/Security/HqAuthAuthenticator.php b/app/src/Flags/Security/HqAuthAuthenticator.php similarity index 100% rename from src/Flags/Security/HqAuthAuthenticator.php rename to app/src/Flags/Security/HqAuthAuthenticator.php diff --git a/src/Flags/Serializer/UserNormalizer.php b/app/src/Flags/Serializer/UserNormalizer.php similarity index 100% rename from src/Flags/Serializer/UserNormalizer.php rename to app/src/Flags/Serializer/UserNormalizer.php diff --git a/src/Flags/Service/CapitalsGameService.php b/app/src/Flags/Service/CapitalsGameService.php similarity index 100% rename from src/Flags/Service/CapitalsGameService.php rename to app/src/Flags/Service/CapitalsGameService.php diff --git a/src/Flags/Service/HqAuthProvider.php b/app/src/Flags/Service/HqAuthProvider.php similarity index 100% rename from src/Flags/Service/HqAuthProvider.php rename to app/src/Flags/Service/HqAuthProvider.php diff --git a/src/Kernel.php b/app/src/Kernel.php similarity index 100% rename from src/Kernel.php rename to app/src/Kernel.php diff --git a/src/Repository/.gitignore b/app/src/Repository/.gitignore similarity index 100% rename from src/Repository/.gitignore rename to app/src/Repository/.gitignore diff --git a/src/package.json b/app/src/package.json similarity index 100% rename from src/package.json rename to app/src/package.json diff --git a/symfony.lock b/app/symfony.lock similarity index 100% rename from symfony.lock rename to app/symfony.lock diff --git a/test b/app/test similarity index 100% rename from test rename to app/test diff --git a/tests/Unit/Entity/GameTest.php b/app/tests/Unit/Entity/GameTest.php similarity index 100% rename from tests/Unit/Entity/GameTest.php rename to app/tests/Unit/Entity/GameTest.php diff --git a/tests/Unit/SmokeTest.php b/app/tests/Unit/SmokeTest.php similarity index 100% rename from tests/Unit/SmokeTest.php rename to app/tests/Unit/SmokeTest.php diff --git a/tests/bootstrap.php b/app/tests/bootstrap.php similarity index 100% rename from tests/bootstrap.php rename to app/tests/bootstrap.php diff --git a/config/.DS_Store b/config/.DS_Store deleted file mode 100644 index 2bd003a7ed21d3f64e76ffd478b984647ea2de5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%T2>T5S=9!vEY&;;2f1}#7dyxAR+ zwVmXMP&6a$JZC=ZmnYfdB_h*X4!cAhB8ssXqa(Nt#(7>1JCF!B8{VVa&x*;kQKtb_ zKo$6(3h=Yrq9=NxMLrIn-_F}QGbz$^kQW0);@8iM_-giX6K01yveUOe30C?|jzYR1o6Qh?tN7KsetHostname('api.izeebot.top') - ->setRemoteUser('root') -// ->setIdentityFile('') - ->set('username', 'root') -// ->set('branch', 'php8') - ->set('branch', 'fixes') -// ->set('stage','production') - ->set('deploy_path', '/var/www/flags-api') -; - -// Tasks -desc('Restart PHP-FPM service'); -task('php-fpm:restart', function () { - // The user must have rights for restart service - // /etc/sudoers: username ALL=NOPASSWD:/bin/systemctl restart php-fpm.service - run('sudo service php8.0-fpm restart'); -}); -after('deploy:symlink', 'php-fpm:restart'); -// [Optional] if deploy fails automatically unlock. -after('deploy:failed', 'deploy:unlock'); -// Migrate database before symlink new release. -//before('deploy:symlink', 'database:migrate'); diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 7607c49..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,42 +0,0 @@ -services: - php: - container_name: "php-${PROJECT_NAME}" - build: - args: - KEY: ${GITH_KEY} - context: . - dockerfile: .docker/php-fpm/Dockerfile - environment: - SYMFONY_DECRYPTION_SECRET: "${SYMFONY_DECRYPTION_SECRET}" - depends_on: - - nginx - networks: - - backend-flags - nginx: - container_name: "nginx-${PROJECT_NAME}" - build: - context: . - dockerfile: .docker/nginx/Dockerfile - restart: always - networks: - - backend-flags - db: - build: - context: . - dockerfile: .docker/mysql/Dockerfile - container_name: "db-${PROJECT_NAME}" - environment: - MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE: "${MYSQL_DATABASE}" - MYSQL_USER: "${MYSQL_USER}" - MYSQL_PASSWORD: "${MYSQL_PASSWORD}" - volumes: - - db-data-flags:/var/lib/mysql - restart: always - networks: - - backend-flags -networks: - backend-flags: - external: true -volumes: - db-data-flags: ~ diff --git a/env/._.env b/env/._.env deleted file mode 100755 index 5fa2cd8211c25c559c36cc45f95a067eaca03038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v`v3p` zZio(s89?RSXj&M7e5kl+a(=E}VnIPps$M}+epzZ>VqS7815m-5>K8M9U01O}(>lr> z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu;s>>&W^Y=STt$c1EN7Aq8`7U!21 zC8sK+$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v`v3p` zUWg8c89?RSXj&M7e5kl+a(=E}VnIPps$M}+epzZ>VqS7815m-5>K8M9U01O}(>lr> z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu;s>>&W^Y=STt$c1EN7Aq8`7U!21 zC8sK+ Date: Thu, 11 Dec 2025 23:43:56 +0000 Subject: [PATCH 11/25] Add CLAUDE.md for Claude Code context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/claude-code) Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3bc48c6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,100 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Flags Quiz API - A Symfony 6.x REST API for a multiplayer flags and capitals quiz game with OAuth2/JWT authentication and Telegram login support. Fully containerized with Docker. + +## Common Commands + +All commands run from the `app/` directory via the makefile: + +```bash +# Full initialization (build, start containers, composer install, run API) +make init + +# Build and run +make build # Docker build +make run-containers # Start containers (docker compose up -d) +make run-api # Start Symfony server + +# Testing and code quality +make test # Run PHPUnit tests +make psalm # Static analysis +make fix # Format code with php-cs-fixer + +# Utilities +make sh # Shell into PHP container +make composer # Run composer install in container +make dumper # Start var-dump server +``` + +## Architecture + +``` +app/ +├── src/Flags/ # Main feature module +│ ├── Controller/ # API endpoints (GameController, CapitalsController, SecurityController) +│ ├── Entity/ # Doctrine entities (User, Game, Answer, Flag, Capital, Score) +│ ├── Repository/ # Doctrine repositories +│ ├── Service/ # Business logic (CapitalsGameService, HqAuthProvider) +│ ├── Security/ # Custom authenticator (HqAuthAuthenticator) +│ ├── DTO/ # Data transfer objects +│ └── ConsoleCommand/ # CLI commands +├── config/ +│ ├── packages/ # Bundle configs (doctrine, security, jwt, cors) +│ ├── jwt/pair/ # JWT public/private keys +│ └── secrets/ # Encrypted secrets per environment (dev/staging/prod) +├── migrations/ # Doctrine migrations +└── tests/Unit/ # PHPUnit tests +``` + +## Docker Architecture + +Four containers: PHP-FPM (8.4-alpine), Caddy (2.7-alpine web server), MySQL (9.5), optional Redis. + +Docker files in `.docker/` with multi-stage builds: +- `docker-compose.yml` - Base config +- `docker-compose.override.yml` - Dev overrides +- `docker-compose-prod.yml` / `docker-compose-staging.yml` - Deployment configs + +Network: `backend-flags` (external) + +## Authentication + +- **JWT** via Lexik JWT Authentication Bundle - stateless API auth +- **OAuth2** via KnpU OAuth2 Client Bundle with custom HqAuthProvider +- **Telegram Login** - validated in SecurityController + +Security firewall configured in `config/packages/secrity.yaml` (note: typo in filename). + +## Key API Routes + +- `/api/login` - Telegram login +- `/login`, `/oauth/check` - OAuth2 flow +- `/flags/correct/{flags}`, `/flags/scores` - Flags game +- `/capitals/game-start/{type}`, `/capitals/question/{game}`, `/capitals/answer/{game}/{country}/{answer}` - Capitals game +- `/api/incorrect`, `/api/correct` - User statistics (protected) + +## Game Types (WorldRegions enum) + +CAPITALS_EUROPE, CAPITALS_ASIA, CAPITALS_AFRICA, CAPITALS_AMERICAS, CAPITALS_OCEANIA + +## Environment Configuration + +- Secrets encrypted in `config/secrets/{env}/` +- JWT keys in `config/jwt/pair/` +- Environment files: `.env.prod`, `.env.staging`, `.env.test` + +## Testing + +```bash +# Run all tests +make test + +# Run single test file +docker compose exec php vendor/bin/phpunit tests/Unit/Entity/GameTest.php +``` + +Test files in `app/tests/Unit/`. HTTP request examples in `app/http-requests/` for IDE testing. From 436fc94f5f4df0fcce4267f0f70f2281a5ee2adc Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 21 Dec 2025 22:12:52 +0000 Subject: [PATCH 12/25] added k8s config --- .docker/caddy/Caddyfile | 5 + .docker/caddy/Caddyfile.prod | 75 ++-- .docker/caddy/Dockerfile | 2 + .docker/caddy/Dockerfile.prod | 34 ++ .idea/flags-api.iml | 1 + .idea/php.xml | 126 ++++++- .idea/phpunit.xml | 1 + app/.gitignore | 4 +- app/docker-compose.override.yml | 13 +- app/docker-compose.yml | 7 +- k8s-deployment/DEPLOYMENT-GUIDE.md | 347 ++++++++++++++++++ k8s-deployment/deploy-flags.sh | 152 ++++++++ k8s-deployment/flags-api-php.Dockerfile | 148 ++++++++ .../flags-frontend-caddy.Dockerfile | 26 ++ k8s/README.md | 37 ++ k8s/caddy-deployment.yaml | 55 +++ k8s/configmap.yaml | 23 ++ k8s/deploy.sh | 96 +++++ k8s/frontend-deployment.yaml | 97 +++++ k8s/ingress.yaml | 32 ++ k8s/iptables-rule-add.sh | 96 +++++ k8s/kustomization.yaml | 27 ++ k8s/mysql-deployment.yaml | 67 ++++ k8s/mysql-pvc.yaml | 16 + k8s/namespace.yaml | 7 + k8s/php-deployment.yaml | 53 +++ k8s/redeploy.sh | 21 ++ k8s/reset-secrets.sh | 26 ++ k8s/secrets.yaml | 23 ++ k8s/services.yaml | 57 +++ 30 files changed, 1625 insertions(+), 49 deletions(-) create mode 100644 .docker/caddy/Dockerfile.prod create mode 100644 k8s-deployment/DEPLOYMENT-GUIDE.md create mode 100644 k8s-deployment/deploy-flags.sh create mode 100644 k8s-deployment/flags-api-php.Dockerfile create mode 100644 k8s-deployment/flags-frontend-caddy.Dockerfile create mode 100644 k8s/README.md create mode 100644 k8s/caddy-deployment.yaml create mode 100644 k8s/configmap.yaml create mode 100755 k8s/deploy.sh create mode 100644 k8s/frontend-deployment.yaml create mode 100644 k8s/ingress.yaml create mode 100644 k8s/iptables-rule-add.sh create mode 100644 k8s/kustomization.yaml create mode 100644 k8s/mysql-deployment.yaml create mode 100644 k8s/mysql-pvc.yaml create mode 100644 k8s/namespace.yaml create mode 100644 k8s/php-deployment.yaml create mode 100755 k8s/redeploy.sh create mode 100644 k8s/reset-secrets.sh create mode 100644 k8s/secrets.yaml create mode 100644 k8s/services.yaml diff --git a/.docker/caddy/Caddyfile b/.docker/caddy/Caddyfile index 9bf8ece..e29581b 100644 --- a/.docker/caddy/Caddyfile +++ b/.docker/caddy/Caddyfile @@ -46,4 +46,9 @@ request_body { max_size 50MB } + + @health path /health + handle @health { + respond "OK" 200 + } } \ No newline at end of file diff --git a/.docker/caddy/Caddyfile.prod b/.docker/caddy/Caddyfile.prod index 7c3c515..3e91b7f 100644 --- a/.docker/caddy/Caddyfile.prod +++ b/.docker/caddy/Caddyfile.prod @@ -1,50 +1,51 @@ { - email your-email@example.com # For Let's Encrypt notifications + # Trust proxies from internal/VPN networks + servers { + trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 + } } -flags-api.izeebot.top { -# Root directory - root * /var/www/webapp/public +:80 { + # Health check (handle locally before proxy) + @health path /health + handle @health { + respond "OK" 200 + } -# PHP-FPM - php_fastcgi php:9000 { - split .php - index index.php - resolve_root_symlink - } - -# Serve static files - file_server - -# Logging - log { - output file /var/log/caddy/access.log - format json - } - -# CORS + # CORS preflight @options method OPTIONS handle @options { - header Access-Control-Allow-Origin "*" - header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" - header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" - header Access-Control-Max-Age "1728000" - respond 204 - } - + header Access-Control-Allow-Origin "*" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" + header Access-Control-Max-Age "1728000" + respond 204 + } + + # CORS header for all responses header Access-Control-Allow-Origin "*" -# Compression + # Compression encode gzip zstd -# Request body size - request_body { - max_size 50MB - } - -# Security headers - header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + # Security headers header X-Content-Type-Options "nosniff" header X-Frame-Options "SAMEORIGIN" header Referrer-Policy "strict-origin-when-cross-origin" -} \ No newline at end of file + + # Proxy everything to PHP-FPM (Symfony front controller) + reverse_proxy php:59000 { + transport fastcgi { + root /var/www/html/public + env SCRIPT_FILENAME /var/www/html/public/index.php + env HTTPS {http.request.header.X-Forwarded-Proto} + env SERVER_PORT {http.request.header.X-Forwarded-Port} + } + } + + # Logging + log { + output stdout + format json + } +} diff --git a/.docker/caddy/Dockerfile b/.docker/caddy/Dockerfile index 69670c8..dae5188 100644 --- a/.docker/caddy/Dockerfile +++ b/.docker/caddy/Dockerfile @@ -14,6 +14,8 @@ RUN deluser www-data 2>/dev/null || true && \ # Copy Caddyfile COPY .docker/caddy/Caddyfile /etc/caddy/Caddyfile +COPY ../../app /var/www/webapp + # Create log directory RUN mkdir -p /var/log/caddy && \ chown -R www-data:www-data /var/log/caddy diff --git a/.docker/caddy/Dockerfile.prod b/.docker/caddy/Dockerfile.prod new file mode 100644 index 0000000..19e3ba1 --- /dev/null +++ b/.docker/caddy/Dockerfile.prod @@ -0,0 +1,34 @@ +FROM caddy:2.7-alpine + +# Install necessary packages +RUN apk add --no-cache \ + shadow \ + && rm -rf /var/cache/apk/* + +# Modify existing www-data group/user to match PHP-FPM (UID/GID 1000) +RUN deluser www-data 2>/dev/null || true && \ + delgroup www-data 2>/dev/null || true && \ + addgroup -g 1000 www-data && \ + adduser -D -u 1000 -G www-data www-data + +# Copy Caddyfile +COPY .docker/caddy/Caddyfile.prod /etc/caddy/Caddyfile + +COPY ../../app /var/www/webapp + +# Create log directory +RUN mkdir -p /var/log/caddy && \ + chown -R www-data:www-data /var/log/caddy + +# Expose ports +EXPOSE 80 443 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:80 || exit 1 + +# Caddy runs as root by default, which is fine for binding to port 80/443 +# If you want to run as www-data, you'd need to use ports >1024 + +# Caddy runs in foreground by default +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] \ No newline at end of file diff --git a/.idea/flags-api.iml b/.idea/flags-api.iml index 8fcb80d..dab296e 100644 --- a/.idea/flags-api.iml +++ b/.idea/flags-api.iml @@ -4,6 +4,7 @@ + diff --git a/.idea/php.xml b/.idea/php.xml index adb87a2..7a2206b 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -136,9 +136,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml index 4f8104c..ffcc995 100644 --- a/.idea/phpunit.xml +++ b/.idea/phpunit.xml @@ -4,6 +4,7 @@ diff --git a/app/.gitignore b/app/.gitignore index a0934f4..14db547 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -15,7 +15,7 @@ ###> lexik/jwt-authentication-bundle ### /config/jwt/*.pem ###< lexik/jwt-authentication-bundle ### -.idea +.idea/* @auto-scripts *.decrypt.*.php ###> phpunit/phpunit ### @@ -31,4 +31,4 @@ deploy.php .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### -*.local \ No newline at end of file +*.local diff --git a/app/docker-compose.override.yml b/app/docker-compose.override.yml index 4b29cbd..714fbc6 100644 --- a/app/docker-compose.override.yml +++ b/app/docker-compose.override.yml @@ -8,11 +8,18 @@ services: target: development volumes: - .:/var/www/webapp:rw,cached - user: "1000:1000" + db: ports: - "3306:3306" caddy: ports: - - "80:80" - - "443:443" + - "8000:80" + - "4430:443" + volumes: + - ./:/var/www/webapp:cached + - caddy_data:/data + - caddy_config:/config + - caddy_logs:/var/log/caddy + build: + dockerfile: .docker/caddy/Dockerfile \ No newline at end of file diff --git a/app/docker-compose.yml b/app/docker-compose.yml index 8d843d8..7057388 100644 --- a/app/docker-compose.yml +++ b/app/docker-compose.yml @@ -15,16 +15,11 @@ services: container_name: "caddy-flags-api" build: context: .. - dockerfile: .docker/caddy/Dockerfile + dockerfile: .docker/caddy/Dockerfile.prod restart: always # ports: # - "80:80" # - "443:443" - volumes: - - ./:/var/www/webapp:cached - - caddy_data:/data - - caddy_config:/config - - caddy_logs:/var/log/caddy networks: - backend-flags depends_on: diff --git a/k8s-deployment/DEPLOYMENT-GUIDE.md b/k8s-deployment/DEPLOYMENT-GUIDE.md new file mode 100644 index 0000000..5fc1d67 --- /dev/null +++ b/k8s-deployment/DEPLOYMENT-GUIDE.md @@ -0,0 +1,347 @@ +# Flags App Deployment Quick Reference + +## File Structure +``` +flags-app/ +├── k8s/ +│ ├── 01-namespace-storage.yaml # Namespace + PV/PVC +│ ├── 02-mysql.yaml # MySQL deployment +│ ├── 03-backend-api.yaml # PHP + Caddy backend +│ └── 04-frontend.yaml # React frontend +├── deploy-flags.sh # Automated deployment +├── docker-compose.local.yaml # Local development +├── flags-api-php.Dockerfile # Updated with public key copy +└── flags-frontend-caddy.Dockerfile # React static server +``` + +## Pre-Deployment Checklist + +### 1. Copy Public Key from HQAUTH +```bash +# Manual method +cp /path/to/hqauth/config/jwt/public.pem /path/to/flags-api/config/jwt/public.pem + +# Or let the build script handle it +``` + +### 2. Update Secrets +Edit these files before deploying: + +**k8s/02-mysql.yaml:** +```yaml +stringData: + root-password: "CHANGE_ME_ROOT_PASSWORD" + database: "flags_db" + username: "flags_user" + password: "CHANGE_ME_USER_PASSWORD" +``` + +**k8s/03-backend-api.yaml:** +```yaml +stringData: + app-secret: "CHANGE_ME_APP_SECRET_32_CHARS_MIN" + database-url: "mysql://flags_user:CHANGE_ME_USER_PASSWORD@mysql:3306/flags_db?serverVersion=8.0&charset=utf8mb4" + oauth-client-id: "your-hqauth-client-id" + oauth-client-secret: "your-hqauth-client-secret" +``` + +### 3. Adjust NodePorts +Edit NodePort values in services (must be 30000-32767): +- Backend HTTP: 30080 → your choice +- Backend HTTPS: 30443 → your choice +- Frontend HTTP: 30081 → your choice +- Frontend HTTPS: 30444 → your choice + +## Deployment Commands + +### Option A: Automated Script +```bash +./deploy-flags.sh +``` + +### Option B: Manual Step-by-Step + +```bash +# 1. Create namespace and storage +kubectl apply -f k8s/01-namespace-storage.yaml + +# 2. Deploy MySQL +kubectl apply -f k8s/02-mysql.yaml + +# Wait for MySQL to be ready +kubectl wait --for=condition=ready pod -l app=mysql -n flags --timeout=120s + +# 3. Deploy backend API +kubectl apply -f k8s/03-backend-api.yaml + +# 4. Deploy frontend +kubectl apply -f k8s/04-frontend.yaml + +# 5. Check status +kubectl get all -n flags +``` + +## Building and Pushing Images + +### Backend API (PHP) +```bash +cd /path/to/flags-api + +# Copy public key first +cp ../hqauth/config/jwt/public.pem config/jwt/public.pem + +# Build PHP image +docker build \ + -f .docker/php-fpm/Dockerfile \ + -t ghcr.io/mainstreamer/flags-api-php:latest \ + --target production \ + . + +# Build Caddy image +docker build \ + -f .docker/caddy/Dockerfile \ + -t ghcr.io/mainstreamer/flags-api-caddy:latest \ + . + +# Push to registry +docker push ghcr.io/mainstreamer/flags-api-php:latest +docker push ghcr.io/mainstreamer/flags-api-caddy:latest +``` + +### Frontend +```bash +cd /path/to/flags-frontend + +# Build React app +npm run build + +# Build Caddy image with React build +docker build \ + -f Dockerfile.caddy \ + -t ghcr.io/mainstreamer/flags-frontend-caddy:latest \ + . + +# Push to registry +docker push ghcr.io/mainstreamer/flags-frontend-caddy:latest +``` + +## Database Initialization + +```bash +# Get PHP pod name +POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') + +# Run migrations +kubectl exec -n flags $POD -- bin/console doctrine:migrations:migrate --no-interaction + +# Verify +kubectl exec -n flags $POD -- bin/console doctrine:migrations:status + +# Load fixtures (if needed) +kubectl exec -n flags $POD -- bin/console doctrine:fixtures:load --no-interaction + +# Check database +kubectl exec -n flags $POD -- bin/console doctrine:query:sql "SELECT COUNT(*) FROM users" +``` + +## WireGuard Configuration + +After deployment, expose NodePorts via WireGuard: + +```bash +# Get NodePort values +kubectl get svc -n flags + +# Example output: +# flags-api-service NodePort 10.x.x.x 80:30080/TCP,443:30443/TCP +# flags-frontend-service NodePort 10.x.x.x 80:30081/TCP,443:30444/TCP +``` + +Configure WireGuard to forward: +- `api.flags.izeebot.top:443` → `k8s-node:30443` +- `flags.izeebot.top:443` → `k8s-node:30444` + +## Debugging Commands + +### Check Pod Status +```bash +kubectl get pods -n flags +kubectl describe pod -n flags +``` + +### View Logs +```bash +# Backend API +kubectl logs -n flags -l component=php --tail=100 -f +kubectl logs -n flags -l component=caddy --tail=100 -f + +# Frontend +kubectl logs -n flags -l app=flags-frontend --tail=100 -f + +# MySQL +kubectl logs -n flags -l app=mysql --tail=100 -f +``` + +### Exec Into Containers +```bash +# PHP container +POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') +kubectl exec -it -n flags $POD -- sh + +# Inside container: +bin/console debug:router +bin/console debug:config +env | grep DATABASE +``` + +### Test Connectivity +```bash +# Test MySQL from PHP pod +kubectl exec -n flags $POD -- bin/console doctrine:query:sql "SELECT 1" + +# Test API endpoints +kubectl run curl --image=curlimages/curl -i --tty --rm -- sh +curl http://flags-api-service.flags.svc.cluster.local +curl http://flags-frontend-service.flags.svc.cluster.local +``` + +### Check Services and Endpoints +```bash +kubectl get svc -n flags +kubectl get endpoints -n flags +kubectl describe svc flags-api-service -n flags +``` + +## Updating Deployments + +### Update Backend API +```bash +# Rebuild and push image +docker build -t ghcr.io/mainstreamer/flags-api-php:v1.0.1 . +docker push ghcr.io/mainstreamer/flags-api-php:v1.0.1 + +# Update deployment +kubectl set image deployment/flags-api-php -n flags \ + php-fpm=ghcr.io/mainstreamer/flags-api-php:v1.0.1 + +# Or force pull latest +kubectl rollout restart deployment/flags-api-php -n flags +``` + +### Update Frontend +```bash +# Rebuild and push +npm run build +docker build -t ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 . +docker push ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 + +# Update +kubectl set image deployment/flags-frontend -n flags \ + caddy=ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 +``` + +### Update Secrets +```bash +# Edit directly +kubectl edit secret flags-api-secret -n flags +kubectl edit secret mysql-secret -n flags + +# Or apply from file +kubectl apply -f k8s/03-backend-api.yaml +``` + +## Local Development + +```bash +# Start local environment (mirrors K8s) +docker-compose -f docker-compose.local.yaml up -d + +# Run migrations locally +docker exec flags-api-php-local bin/console doctrine:migrations:migrate + +# Access services +# Backend API: http://localhost:8080 +# Frontend: http://localhost:3000 +# MySQL: localhost:3306 +# Redis: localhost:6379 +``` + +## Clean Up + +```bash +# Delete everything +kubectl delete namespace flags + +# Or delete individually +kubectl delete -f k8s/04-frontend.yaml +kubectl delete -f k8s/03-backend-api.yaml +kubectl delete -f k8s/02-mysql.yaml +kubectl delete -f k8s/01-namespace-storage.yaml + +# Clean up PV (manual) +sudo rm -rf /mnt/k8s-data/flags-mysql +``` + +## OAuth Integration Testing + +```bash +# Test OAuth discovery from K8s +POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') + +kubectl exec -n flags $POD -- curl https://auth.izeebot.top/.well-known/openid-configuration + +# Check OAuth routes +kubectl exec -n flags $POD -- bin/console debug:router | grep auth + +# Test OAuth login flow (from outside) +curl -v http://:30080/auth/login +``` + +## Common Issues + +### Issue: Pods not starting +```bash +kubectl describe pod -n flags +# Check: image pull errors, resource limits, secrets missing +``` + +### Issue: Database connection failed +```bash +# Check MySQL is ready +kubectl logs -n flags -l app=mysql + +# Test from PHP pod +kubectl exec -n flags $POD -- ping mysql +kubectl exec -n flags $POD -- nc -zv mysql 3306 +``` + +### Issue: Public key not found +```bash +# Verify key is in image +kubectl exec -n flags $POD -- ls -la config/jwt/ +kubectl exec -n flags $POD -- cat config/jwt/public.pem +``` + +### Issue: CORS errors +```bash +# Check CORS config in ConfigMap +kubectl get configmap flags-api-config -n flags -o yaml + +# Update and restart +kubectl edit configmap flags-api-config -n flags +kubectl rollout restart deployment/flags-api-caddy -n flags +``` + +## Monitoring + +```bash +# Watch all resources +watch kubectl get all -n flags + +# Resource usage +kubectl top pods -n flags +kubectl top nodes + +# Events +kubectl get events -n flags --sort-by='.lastTimestamp' +``` diff --git a/k8s-deployment/deploy-flags.sh b/k8s-deployment/deploy-flags.sh new file mode 100644 index 0000000..0680cb1 --- /dev/null +++ b/k8s-deployment/deploy-flags.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# Flags App Deployment Script + +set -e + +echo "=========================================" +echo "Flags App Kubernetes Deployment" +echo "=========================================" + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +NAMESPACE="flags" +HQAUTH_PUBLIC_KEY_PATH="../hqauth/config/jwt/public.pem" +FLAGS_API_PATH="../flags-api" +FLAGS_FRONTEND_PATH="../flags-frontend" + +# Step 1: Check prerequisites +echo -e "\n${YELLOW}Step 1: Checking prerequisites...${NC}" + +if ! command -v kubectl &> /dev/null; then + echo -e "${RED}kubectl not found. Please install kubectl first.${NC}" + exit 1 +fi + +if ! command -v docker &> /dev/null; then + echo -e "${RED}docker not found. Please install docker first.${NC}" + exit 1 +fi + +echo -e "${GREEN}✓ Prerequisites OK${NC}" + +# Step 2: Build and push images +echo -e "\n${YELLOW}Step 2: Building and pushing Docker images...${NC}" + +read -p "Build and push images? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + + # Build backend API + echo -e "\n${YELLOW}Building flags-api-php...${NC}" + cd "$FLAGS_API_PATH" + + # Copy public key from HQAUTH + if [ -f "$HQAUTH_PUBLIC_KEY_PATH" ]; then + mkdir -p config/jwt + cp "$HQAUTH_PUBLIC_KEY_PATH" config/jwt/public.pem + echo -e "${GREEN}✓ Copied public key from HQAUTH${NC}" + else + echo -e "${RED}Warning: Public key not found at $HQAUTH_PUBLIC_KEY_PATH${NC}" + echo "Make sure to manually copy it to config/jwt/public.pem" + read -p "Continue anyway? (y/n) " -n 1 -r + echo + [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 + fi + + docker build -f .docker/php-fpm/Dockerfile -t ghcr.io/mainstreamer/flags-api-php:latest --target production . + docker push ghcr.io/mainstreamer/flags-api-php:latest + echo -e "${GREEN}✓ Pushed flags-api-php${NC}" + + # Build backend Caddy + echo -e "\n${YELLOW}Building flags-api-caddy...${NC}" + docker build -f .docker/caddy/Dockerfile -t ghcr.io/mainstreamer/flags-api-caddy:latest . + docker push ghcr.io/mainstreamer/flags-api-caddy:latest + echo -e "${GREEN}✓ Pushed flags-api-caddy${NC}" + + # Build frontend + echo -e "\n${YELLOW}Building flags-frontend...${NC}" + cd "$FLAGS_FRONTEND_PATH" + + # Build React app + npm run build + echo -e "${GREEN}✓ Built React app${NC}" + + # Build and push frontend Caddy + docker build -f Dockerfile.caddy -t ghcr.io/mainstreamer/flags-frontend-caddy:latest . + docker push ghcr.io/mainstreamer/flags-frontend-caddy:latest + echo -e "${GREEN}✓ Pushed flags-frontend-caddy${NC}" +fi + +# Step 3: Apply Kubernetes manifests +echo -e "\n${YELLOW}Step 3: Applying Kubernetes manifests...${NC}" + +read -p "Apply K8s manifests? (y/n) " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + + # Apply in order + kubectl apply -f k8s/01-namespace-storage.yaml + echo -e "${GREEN}✓ Created namespace and storage${NC}" + + sleep 2 + + kubectl apply -f k8s/02-mysql.yaml + echo -e "${GREEN}✓ Deployed MySQL${NC}" + + # Wait for MySQL to be ready + echo "Waiting for MySQL to be ready..." + kubectl wait --for=condition=ready pod -l app=mysql -n "$NAMESPACE" --timeout=120s + + kubectl apply -f k8s/03-backend-api.yaml + echo -e "${GREEN}✓ Deployed backend API${NC}" + + kubectl apply -f k8s/04-frontend.yaml + echo -e "${GREEN}✓ Deployed frontend${NC}" + + echo -e "\n${GREEN}✓ All manifests applied${NC}" +fi + +# Step 4: Display status +echo -e "\n${YELLOW}Step 4: Checking deployment status...${NC}" +kubectl get all -n "$NAMESPACE" + +echo -e "\n${YELLOW}NodePort services:${NC}" +kubectl get svc -n "$NAMESPACE" -o wide + +# Step 5: Instructions +echo -e "\n${GREEN}=========================================${NC}" +echo -e "${GREEN}Deployment Complete!${NC}" +echo -e "${GREEN}=========================================${NC}" + +echo -e "\n${YELLOW}Next steps:${NC}" +echo "1. Update your secrets:" +echo " kubectl edit secret mysql-secret -n flags" +echo " kubectl edit secret flags-api-secret -n flags" +echo "" +echo "2. Initialize database (run ONCE):" +echo " POD=\$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}')" +echo " kubectl exec -n flags \$POD -- bin/console doctrine:migrations:migrate --no-interaction" +echo "" +echo "3. Configure WireGuard to expose NodePorts:" +BACKEND_HTTP=$(kubectl get svc flags-api-service -n flags -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') +BACKEND_HTTPS=$(kubectl get svc flags-api-service -n flags -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') +FRONTEND_HTTP=$(kubectl get svc flags-frontend-service -n flags -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') +FRONTEND_HTTPS=$(kubectl get svc flags-frontend-service -n flags -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') + +echo " Backend API: NodePort HTTP=$BACKEND_HTTP HTTPS=$BACKEND_HTTPS" +echo " Frontend: NodePort HTTP=$FRONTEND_HTTP HTTPS=$FRONTEND_HTTPS" +echo "" +echo "4. Test endpoints:" +echo " curl http://:$BACKEND_HTTP" +echo " curl http://:$FRONTEND_HTTP" +echo "" +echo "5. Check logs:" +echo " kubectl logs -n flags -l app=flags-api --tail=100 -f" +echo " kubectl logs -n flags -l app=flags-frontend --tail=100 -f" + +echo -e "\n${GREEN}Done!${NC}" diff --git a/k8s-deployment/flags-api-php.Dockerfile b/k8s-deployment/flags-api-php.Dockerfile new file mode 100644 index 0000000..2fbabe7 --- /dev/null +++ b/k8s-deployment/flags-api-php.Dockerfile @@ -0,0 +1,148 @@ +# ========================================== +# Base stage - shared foundation +# ========================================== +FROM php:8.4-fpm-alpine AS base + +# Copy the PHP extension installer (uses pre-built binaries when available) +COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ + +# Install all extensions in one command - MUCH faster +RUN install-php-extensions \ + pdo_mysql \ + intl \ + opcache \ + gd \ + xml \ + mbstring \ + zip \ + redis + +# Install Composer +COPY --from=composer:2 /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +# ========================================== +# Development stage +# ========================================== +FROM base AS development + +ARG USER_ID=1000 +ARG GROUP_ID=1000 + +RUN apk add --no-cache git curl wget vim bash + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'upload_max_filesize = 2M'; \ + echo 'post_max_size = 8M'; \ + echo 'max_execution_time = 30'; \ + echo 'date.timezone = UTC'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.enable_cli = 1'; \ + echo 'opcache.validate_timestamps = 1'; \ + echo 'opcache.revalidate_freq = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = On'; \ + echo 'error_reporting = E_ALL'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +RUN deluser www-data 2>/dev/null || true && \ + addgroup -g ${GROUP_ID} www-data && \ + adduser -u ${USER_ID} -G www-data -s /bin/sh -D www-data && \ + chown -R www-data:www-data /var/www + +USER www-data + +RUN wget https://get.symfony.com/cli/installer -O - | bash || true && \ + if [ -f ~/.symfony5/bin/symfony ]; then \ + mkdir -p ~/bin && mv ~/.symfony5/bin/symfony ~/bin/symfony; \ + fi + +ENV PATH="/home/www-data/bin:${PATH}" + +EXPOSE 9000 +CMD ["php-fpm"] + +# ========================================== +# Builder stage +# ========================================== +FROM base AS builder + +RUN apk add --no-cache git + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.enable_cli = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = Off'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +# Copy composer files for layer caching +COPY --chown=www-data:www-data ./composer.json ./composer.lock* ./symfony.lock* ./ + +# USE BUILDKIT CACHE for Composer - HUGE speedup +RUN --mount=type=cache,target=/tmp/composer \ + COMPOSER_CACHE_DIR=/tmp/composer \ + composer install \ + --no-dev \ + --no-scripts \ + --no-interaction \ + --prefer-dist \ + --optimize-autoloader \ + --classmap-authoritative + +# Copy application code +COPY --chown=www-data:www-data . . + +# === COPY PUBLIC KEY FROM HQAUTH PROJECT === +# This assumes you're building with a build context that includes the HQAUTH public key +# Example: docker build --build-arg HQAUTH_PUBLIC_KEY="$(cat /path/to/hqauth/config/jwt/public.pem)" . +# OR mount it during build if on same machine +# For now, copy from a known location - adjust path as needed +ARG OAUTH_PUBLIC_KEY_PATH=../hqauth/config/jwt/public.pem +COPY ${OAUTH_PUBLIC_KEY_PATH} ./config/jwt/public.pem + +RUN composer dump-autoload --optimize --classmap-authoritative + +# Skip cache warmup - do it at runtime instead (saves build time) +RUN chown -R www-data:www-data var/ + +# ========================================== +# Production stage +# ========================================== +FROM base AS production + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'opcache.enable = 1'; \ + echo 'opcache.memory_consumption = 256'; \ + echo 'opcache.validate_timestamps = 0'; \ + echo 'session.save_handler = redis'; \ + echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'display_errors = Off'; \ + echo 'log_errors = On'; \ +} > /usr/local/etc/php/conf.d/custom.ini + +# Copy from builder +COPY --from=builder --chown=www-data:www-data /var/www/html ./ + +# Remove dev files +RUN rm -rf tests/ .git/ .github/ .env.local .env.*.local \ + docker-compose.yml Dockerfile Makefile *.md phpunit.xml* \ + /usr/local/bin/composer \ + && mkdir -p var/cache var/log \ + && bin/console cache:clear --env=prod --no-warmup \ + && php bin/console cache:warmup --env=prod \ + && chown -R www-data:www-data var/ + +ENV APP_ENV=prod APP_DEBUG=0 + +USER www-data +EXPOSE 9000 +CMD ["php-fpm"] diff --git a/k8s-deployment/flags-frontend-caddy.Dockerfile b/k8s-deployment/flags-frontend-caddy.Dockerfile new file mode 100644 index 0000000..24e52ec --- /dev/null +++ b/k8s-deployment/flags-frontend-caddy.Dockerfile @@ -0,0 +1,26 @@ +# ========================================== +# Frontend Caddy - Serves React Static Files +# ========================================== +FROM caddy:2-alpine + +# Copy the built React app +COPY build/ /usr/share/caddy/ + +# Create Caddyfile for serving React SPA +RUN echo 'flags.izeebot.top {' > /etc/caddy/Caddyfile && \ + echo ' root * /usr/share/caddy' >> /etc/caddy/Caddyfile && \ + echo ' encode gzip' >> /etc/caddy/Caddyfile && \ + echo ' file_server' >> /etc/caddy/Caddyfile && \ + echo ' try_files {path} /index.html' >> /etc/caddy/Caddyfile && \ + echo ' header {' >> /etc/caddy/Caddyfile && \ + echo ' # Security headers' >> /etc/caddy/Caddyfile && \ + echo ' X-Content-Type-Options "nosniff"' >> /etc/caddy/Caddyfile && \ + echo ' X-Frame-Options "DENY"' >> /etc/caddy/Caddyfile && \ + echo ' Referrer-Policy "strict-origin-when-cross-origin"' >> /etc/caddy/Caddyfile && \ + echo ' }' >> /etc/caddy/Caddyfile && \ + echo '}' >> /etc/caddy/Caddyfile + +EXPOSE 80 +EXPOSE 443 + +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] diff --git a/k8s/README.md b/k8s/README.md new file mode 100644 index 0000000..e767c07 --- /dev/null +++ b/k8s/README.md @@ -0,0 +1,37 @@ +Done! I've created a complete Kubernetes deployment setup in k8s/. Here's the structure: + +k8s/ +├── namespace.yaml # flags-api namespace +├── configmap.yaml # Environment variables +├── secrets.yaml # Secrets template (edit with your values) +├── mysql-pvc.yaml # Persistent storage for MySQL +├── mysql-deployment.yaml # MySQL 9.0 database +├── php-deployment.yaml # PHP-FPM (ghcr.io/mainstreamer/flags-api-php:latest) +├── caddy-deployment.yaml # Caddy webserver (ghcr.io/mainstreamer/flags-api-caddy:latest) +├── services.yaml # ClusterIP services for mysql, php, caddy +├── ingress.yaml # Ingress for API (configure your domain) +├── frontend-deployment.yaml # Template for flagsapp:latest (same namespace) +├── kustomization.yaml # Kustomize for easy deployment +└── deploy.sh # Deployment helper script + +To deploy: + +1. Create GHCR credentials secret: + kubectl create secret docker-registry ghcr-credentials \ + --docker-server=ghcr.io \ + --docker-username=YOUR_GITHUB_USERNAME \ + --docker-password=YOUR_GITHUB_PAT \ + -n flags-api + +2. Edit secrets.yaml with your actual values (passwords, APP_SECRET, BOT_TOKEN, etc.) +3. Deploy with kustomize: + cd k8s + kubectl apply -k . + +Or use the helper script: +./deploy.sh + +4. Access the API via port-forward: + kubectl port-forward svc/caddy 8080:80 -n flags-api + +Frontend compatibility: The frontend-deployment.yaml template uses the same flags-api namespace and labels for easy service discovery. The frontend can reach the API at http://caddy internally. diff --git a/k8s/caddy-deployment.yaml b/k8s/caddy-deployment.yaml new file mode 100644 index 0000000..4e4cad7 --- /dev/null +++ b/k8s/caddy-deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: caddy + namespace: flags-api + labels: + app.kubernetes.io/name: caddy + app.kubernetes.io/component: webserver + app.kubernetes.io/part-of: flags-quiz +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: caddy + template: + metadata: + labels: + app.kubernetes.io/name: caddy + app.kubernetes.io/component: webserver + app.kubernetes.io/part-of: flags-quiz + spec: + imagePullSecrets: + - name: ghcr-credentials + containers: + - name: caddy + image: ghcr.io/mainstreamer/flags-api-caddy:latest + imagePullPolicy: Always + ports: + - containerPort: 80 + name: http + - containerPort: 443 + name: https + envFrom: + - configMapRef: + name: flags-api-config + resources: + requests: + memory: "64Mi" + cpu: "50m" + limits: + memory: "256Mi" + cpu: "200m" +# livenessProbe: +# httpGet: +# path: /health +# port: 80 +# initialDelaySeconds: 10 +# periodSeconds: 10 +# failureThreshold: 3 +# readinessProbe: +# httpGet: +# path: /health +# port: 80 +# initialDelaySeconds: 5 +# periodSeconds: 5 diff --git a/k8s/configmap.yaml b/k8s/configmap.yaml new file mode 100644 index 0000000..a0ba63c --- /dev/null +++ b/k8s/configmap.yaml @@ -0,0 +1,23 @@ +# ============================================================================= +# SECURITY NOTE: +# This simplified setup loads all env vars from a single secret created from .env.prod +# For production, consider using: +# - Kubernetes Secrets with proper RBAC +# - External secret managers (HashiCorp Vault, AWS Secrets Manager, etc.) +# - Sealed Secrets for GitOps workflows +# - Separate secrets from non-sensitive config +# ============================================================================= + +# Non-sensitive configuration only +apiVersion: v1 +kind: ConfigMap +metadata: + name: flags-api-config + namespace: flags-api + labels: + app.kubernetes.io/name: flags-api + app.kubernetes.io/part-of: flags-quiz +data: + # PHP-FPM service discovery + PHP_FPM_HOST: "php" + PHP_FPM_PORT: "59000" diff --git a/k8s/deploy.sh b/k8s/deploy.sh new file mode 100755 index 0000000..46456c5 --- /dev/null +++ b/k8s/deploy.sh @@ -0,0 +1,96 @@ +#!/bin/bash +set -e + +NAMESPACE="flags-api" +ENV_FILE="${1:-./.env.prod}" + +echo "=== Flags API Kubernetes Deployment ===" + +# Check if kubectl is available +if ! command -v kubectl &> /dev/null; then + echo "Error: kubectl is not installed" + exit 1 +fi + +# Function to wait for deployment +wait_for_deployment() { + local deployment=$1 + echo "Waiting for $deployment to be ready..." + kubectl rollout status deployment/$deployment -n $NAMESPACE --timeout=120s +} + +# Create namespace first +echo "Creating namespace..." +kubectl apply -f namespace.yaml + +# Create secret from .env.prod file +if [ -f "$ENV_FILE" ]; then + echo "Creating secret from $ENV_FILE..." + kubectl create secret generic flags-api-secrets \ + --from-env-file="$ENV_FILE" \ + -n $NAMESPACE \ + --dry-run=client -o yaml | kubectl apply -f - + + # Create ghcr.io credentials from GITH_KEY + GITH_KEY=$(grep -E "^GITH_KEY=" "$ENV_FILE" | cut -d '=' -f2-) + if [ -n "$GITH_KEY" ]; then + echo "Creating ghcr.io registry credentials..." + kubectl create secret docker-registry ghcr-credentials \ + --docker-server=ghcr.io \ + --docker-username=mainstreamer \ + --docker-password="$GITH_KEY" \ + -n $NAMESPACE \ + --dry-run=client -o yaml | kubectl apply -f - + else + echo "Warning: GITH_KEY not found in $ENV_FILE, skipping ghcr credentials" + fi +else + echo "Warning: $ENV_FILE not found" + echo "Create the secret manually:" + echo " kubectl create secret generic flags-api-secrets --from-env-file=.env.prod -n $NAMESPACE" + read -p "Press Enter to continue without secret, or Ctrl+C to exit..." +fi + +# Apply configmap +echo "Applying configmap..." +kubectl apply -f configmap.yaml + +# Apply storage +echo "Applying persistent volume claim..." +kubectl apply -f mysql-pvc.yaml + +# Apply deployments +echo "Applying deployments..." +kubectl apply -f mysql-deployment.yaml +kubectl apply -f php-deployment.yaml +kubectl apply -f caddy-deployment.yaml + +# Apply services +echo "Applying services..." +kubectl apply -f services.yaml + +# Apply ingress (optional) +echo "Applying ingress..." +kubectl apply -f ingress.yaml + +# Wait for deployments +echo "" +echo "Waiting for deployments to be ready..." +wait_for_deployment mysql +wait_for_deployment php +wait_for_deployment caddy + +echo "" +echo "=== Deployment Complete ===" +echo "" +echo "Services:" +kubectl get svc -n $NAMESPACE +echo "" +echo "Pods:" +kubectl get pods -n $NAMESPACE +echo "" +echo "Access the API:" +echo " kubectl port-forward svc/caddy 58080:58080 -n $NAMESPACE" +echo "" +echo "Run database migrations:" +echo " kubectl exec -it deploy/php -n $NAMESPACE -- php bin/console doctrine:migrations:migrate" diff --git a/k8s/frontend-deployment.yaml b/k8s/frontend-deployment.yaml new file mode 100644 index 0000000..35c380d --- /dev/null +++ b/k8s/frontend-deployment.yaml @@ -0,0 +1,97 @@ +# Frontend deployment template - use same namespace for compatibility +# Image: flagsapp:latest (local registry or configure your registry) +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + namespace: flags-api + labels: + app.kubernetes.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/part-of: flags-quiz +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: frontend + template: + metadata: + labels: + app.kubernetes.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/part-of: flags-quiz + spec: + # Uncomment if using private registry + # imagePullSecrets: + # - name: ghcr-credentials + containers: + - name: frontend + image: flagsapp:latest + imagePullPolicy: Always + ports: + - containerPort: 80 + name: http + env: + # API URL for frontend to connect to backend + - name: API_URL + value: "http://caddy" + resources: + requests: + memory: "64Mi" + cpu: "50m" + limits: + memory: "256Mi" + cpu: "200m" + livenessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 10 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 5 + periodSeconds: 5 +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend + namespace: flags-api + labels: + app.kubernetes.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/part-of: flags-quiz +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 80 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: frontend +--- +# Ingress for frontend - add to main ingress or use separately +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: frontend-ingress + namespace: flags-api + labels: + app.kubernetes.io/name: frontend + app.kubernetes.io/part-of: flags-quiz +spec: + rules: + - host: flags.example.com # Change to your domain + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: frontend + port: + number: 80 diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml new file mode 100644 index 0000000..6ffbcf3 --- /dev/null +++ b/k8s/ingress.yaml @@ -0,0 +1,32 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: flags-api-ingress + namespace: flags-api + labels: + app.kubernetes.io/name: flags-api + app.kubernetes.io/part-of: flags-quiz + annotations: + # Uncomment for nginx ingress controller + # kubernetes.io/ingress.class: nginx + # nginx.ingress.kubernetes.io/ssl-redirect: "true" + + # Uncomment for cert-manager TLS + # cert-manager.io/cluster-issuer: "letsencrypt-prod" +spec: + # Uncomment and configure TLS + # tls: + # - hosts: + # - api.flags.example.com + # secretName: flags-api-tls + rules: + - host: api.flags.example.com # Change to your domain + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: caddy + port: + number: 80 diff --git a/k8s/iptables-rule-add.sh b/k8s/iptables-rule-add.sh new file mode 100644 index 0000000..80e0916 --- /dev/null +++ b/k8s/iptables-rule-add.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# Advanced Port Forwarding Script with Custom Port Mapping +# Usage: ./iptables-port.sh [public_port:internal_port] ... +# Example: ./iptables-port.sh flags-app 4129:3000 4130:8000 + +if [ "$#" -lt 2 ]; then + echo "Usage: $0 [public_port:internal_port] ..." + echo "" + echo "Examples:" + echo " $0 flags-app 4129:3000 4130:8000" + echo " $0 myapp 8080:80" + echo " $0 matrix 3478:3478 5349:5349" + exit 1 +fi + +SERVICE_NAME=$1 +LOCAL_SERVER="10.0.0.3" +AUDIT_DIR="/etc/caddy/audit-logs" +DOCS_FILE="$AUDIT_DIR/port-mappings.log" +IPTABLES_DIR="/etc/iptables" +shift # Remove first argument, leaving only port mappings + +echo "Setting up port forwarding for $SERVICE_NAME..." + +# Enable IP forwarding (idempotent) +if ! grep -q "net.ipv4.ip_forward=1" /etc/sysctl.conf; then + echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf + sysctl -p +fi + +# Create directories if they don't exist +mkdir -p $AUDIT_DIR +mkdir -p $IPTABLES_DIR +if [ ! -f $DOCS_FILE ]; then + echo "# Port Forwarding Mappings" > $DOCS_FILE + echo "# Format: [timestamp] service_name: public_port -> internal_port" >> $DOCS_FILE + echo "" >> $DOCS_FILE +fi + +# Log this operation +echo "# =====================================" >> $DOCS_FILE +echo "# Service: $SERVICE_NAME" >> $DOCS_FILE +echo "# Date: $(date '+%Y-%m-%d %H:%M:%S')" >> $DOCS_FILE +echo "# =====================================" >> $DOCS_FILE + +# Forward each port mapping +for MAPPING in "$@"; do + # Parse public:internal format + if [[ $MAPPING =~ ^([0-9]+):([0-9]+)$ ]]; then + PUBLIC_PORT="${BASH_REMATCH[1]}" + INTERNAL_PORT="${BASH_REMATCH[2]}" + else + echo "⚠ Invalid format: $MAPPING (expected format: public:internal)" + continue + fi + + echo "Forwarding $PUBLIC_PORT -> $LOCAL_SERVER:$INTERNAL_PORT..." + + # Check if rule already exists to avoid duplicates + if ! iptables -t nat -C PREROUTING -p tcp --dport $PUBLIC_PORT -j DNAT --to-destination $LOCAL_SERVER:$INTERNAL_PORT 2>/dev/null; then + iptables -t nat -A PREROUTING -p tcp --dport $PUBLIC_PORT -j DNAT --to-destination $LOCAL_SERVER:$INTERNAL_PORT + iptables -A FORWARD -p tcp --dport $INTERNAL_PORT -d $LOCAL_SERVER -j ACCEPT + echo "✓ Port $PUBLIC_PORT -> $INTERNAL_PORT forwarded" + + # Log successful forward + echo "$PUBLIC_PORT -> $INTERNAL_PORT (added)" >> $DOCS_FILE + else + echo "⚠ Port $PUBLIC_PORT already forwarded" + + # Log that it already existed + echo "$PUBLIC_PORT -> $INTERNAL_PORT (already exists)" >> $DOCS_FILE + fi +done + +echo "" >> $DOCS_FILE + +# Save iptables rules to standard location for persistence +echo "Saving iptables rules..." +iptables-save > $IPTABLES_DIR/rules.v4 + +echo "" +echo "✅ Port forwarding complete for $SERVICE_NAME!" +echo "Mappings configured:" +for MAPPING in "$@"; do + if [[ $MAPPING =~ ^([0-9]+):([0-9]+)$ ]]; then + echo " - Public port ${BASH_REMATCH[1]} -> Internal port ${BASH_REMATCH[2]}" + fi +done +echo "Destination server: $LOCAL_SERVER" +echo "" +echo "📝 Audit log: $DOCS_FILE" +echo "💾 Rules saved: $IPTABLES_DIR/rules.v4" +echo "" +echo "Next steps:" +echo "1. Expose port(s) in Kubernetes (NodePort or hostPort)" +echo "2. Update Caddyfile if needed" diff --git a/k8s/kustomization.yaml b/k8s/kustomization.yaml new file mode 100644 index 0000000..f4e7389 --- /dev/null +++ b/k8s/kustomization.yaml @@ -0,0 +1,27 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: flags-api + +resources: + - namespace.yaml + - configmap.yaml + # secrets.yaml is a placeholder - secret created from .env.prod via deploy.sh + - mysql-pvc.yaml + - mysql-deployment.yaml + - php-deployment.yaml + - caddy-deployment.yaml + - services.yaml + - ingress.yaml + +commonLabels: + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/part-of: flags-quiz + +images: + - name: ghcr.io/mainstreamer/flags-api-php + newTag: latest + - name: ghcr.io/mainstreamer/flags-api-caddy + newTag: latest + - name: mysql + newTag: "9.0" diff --git a/k8s/mysql-deployment.yaml b/k8s/mysql-deployment.yaml new file mode 100644 index 0000000..77d556d --- /dev/null +++ b/k8s/mysql-deployment.yaml @@ -0,0 +1,67 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + namespace: flags-api + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/component: database + app.kubernetes.io/part-of: flags-quiz +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/component: database + app.kubernetes.io/part-of: flags-quiz + spec: + containers: + - name: mysql + image: mysql:9.0 + ports: + - containerPort: 3306 + name: mysql + # Load MYSQL_* variables from the env secret + envFrom: + - secretRef: + name: flags-api-secrets + volumeMounts: + - name: mysql-data + mountPath: /var/lib/mysql + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "1Gi" + cpu: "500m" + livenessProbe: + exec: + command: + - mysqladmin + - ping + - -h + - localhost + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + readinessProbe: + exec: + command: + - mysqladmin + - ping + - -h + - localhost + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 2 + volumes: + - name: mysql-data + persistentVolumeClaim: + claimName: mysql-pvc diff --git a/k8s/mysql-pvc.yaml b/k8s/mysql-pvc.yaml new file mode 100644 index 0000000..46b30ac --- /dev/null +++ b/k8s/mysql-pvc.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pvc + namespace: flags-api + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/part-of: flags-quiz +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + # Uncomment and set storageClassName if needed + # storageClassName: standard diff --git a/k8s/namespace.yaml b/k8s/namespace.yaml new file mode 100644 index 0000000..e1a8198 --- /dev/null +++ b/k8s/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: flags-api + labels: + app.kubernetes.io/name: flags-api + app.kubernetes.io/part-of: flags-quiz diff --git a/k8s/php-deployment.yaml b/k8s/php-deployment.yaml new file mode 100644 index 0000000..bd61060 --- /dev/null +++ b/k8s/php-deployment.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php + namespace: flags-api + labels: + app.kubernetes.io/name: php + app.kubernetes.io/component: backend + app.kubernetes.io/part-of: flags-quiz +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: php + template: + metadata: + labels: + app.kubernetes.io/name: php + app.kubernetes.io/component: backend + app.kubernetes.io/part-of: flags-quiz + spec: + imagePullSecrets: + - name: ghcr-credentials + containers: + - name: php + image: ghcr.io/mainstreamer/flags-api-php:latest + imagePullPolicy: Always + ports: + - containerPort: 9000 + name: php-fpm + # Load all environment variables from secret and configmap + envFrom: + - secretRef: + name: flags-api-secrets + - configMapRef: + name: flags-api-config + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "500m" + livenessProbe: + tcpSocket: + port: 9000 + initialDelaySeconds: 10 + periodSeconds: 10 + readinessProbe: + tcpSocket: + port: 9000 + initialDelaySeconds: 5 + periodSeconds: 5 diff --git a/k8s/redeploy.sh b/k8s/redeploy.sh new file mode 100755 index 0000000..eaebfc4 --- /dev/null +++ b/k8s/redeploy.sh @@ -0,0 +1,21 @@ +#!/bin/bash +NAMESPACE="flags-api" + +echo "=== Redeploying flags-api ===" + +# Restart deployments to pull latest images +echo "Restarting deployments..." +kubectl rollout restart deployment/php deployment/caddy -n $NAMESPACE + +# Wait for rollouts to complete +echo "" +echo "Waiting for php..." +kubectl rollout status deployment/php -n $NAMESPACE --timeout=120s + +echo "" +echo "Waiting for caddy..." +kubectl rollout status deployment/caddy -n $NAMESPACE --timeout=120s + +echo "" +echo "=== Redeploy Complete ===" +kubectl get pods -n $NAMESPACE diff --git a/k8s/reset-secrets.sh b/k8s/reset-secrets.sh new file mode 100644 index 0000000..4432d23 --- /dev/null +++ b/k8s/reset-secrets.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +ENV_FILE="${1:-./.env.prod}" +NAMESPACE="flags-api" + +# Reset env secrets +kubectl delete secret flags-api-secrets -n $NAMESPACE --ignore-not-found +kubectl create secret generic flags-api-secrets --from-env-file="$ENV_FILE" -n $NAMESPACE + +# Reset ghcr credentials +GITH_KEY=$(grep -E "^GITH_KEY=" "$ENV_FILE" | cut -d '=' -f2-) +if [ -n "$GITH_KEY" ]; then + echo "Recreating ghcr.io registry credentials..." + kubectl delete secret ghcr-credentials -n $NAMESPACE --ignore-not-found + kubectl create secret docker-registry ghcr-credentials \ + --docker-server=ghcr.io \ + --docker-username=mainstreamer \ + --docker-password="$GITH_KEY" \ + -n $NAMESPACE +fi + +# Restart deployments to pick up new secrets +kubectl rollout restart deployment/php -n $NAMESPACE +kubectl rollout restart deployment/caddy -n $NAMESPACE + +echo "Secrets reset - done" diff --git a/k8s/secrets.yaml b/k8s/secrets.yaml new file mode 100644 index 0000000..53825f9 --- /dev/null +++ b/k8s/secrets.yaml @@ -0,0 +1,23 @@ +# ============================================================================= +# SECURITY NOTE: +# This file is a placeholder. The actual secret is created from .env.prod file: +# +# kubectl create secret generic flags-api-secrets \ +# --from-env-file=../.env.prod \ +# -n flags-api +# +# For production, consider: +# - HashiCorp Vault with vault-injector +# - External Secrets Operator +# - Sealed Secrets (Bitnami) for GitOps +# - Cloud provider secret managers (AWS/GCP/Azure) +# - NEVER commit actual secrets to git +# ============================================================================= + +# Placeholder - created via kubectl from .env.prod +# apiVersion: v1 +# kind: Secret +# metadata: +# name: flags-api-secrets +# namespace: flags-api +# type: Opaque diff --git a/k8s/services.yaml b/k8s/services.yaml new file mode 100644 index 0000000..c6aa107 --- /dev/null +++ b/k8s/services.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: Service +metadata: + name: mysql + namespace: flags-api + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/component: database + app.kubernetes.io/part-of: flags-quiz +spec: + type: ClusterIP + ports: + - port: 53306 + targetPort: 3306 + protocol: TCP + name: mysql + selector: + app.kubernetes.io/name: mysql +--- +apiVersion: v1 +kind: Service +metadata: + name: php + namespace: flags-api + labels: + app.kubernetes.io/name: php + app.kubernetes.io/component: backend + app.kubernetes.io/part-of: flags-quiz +spec: + type: ClusterIP + ports: + - port: 59000 + targetPort: 9000 + protocol: TCP + name: php-fpm + selector: + app.kubernetes.io/name: php +--- +apiVersion: v1 +kind: Service +metadata: + name: caddy + namespace: flags-api + labels: + app.kubernetes.io/name: caddy + app.kubernetes.io/component: webserver + app.kubernetes.io/part-of: flags-quiz +spec: + type: NodePort + ports: + - port: 80 + targetPort: 80 + nodePort: 31180 + protocol: TCP + name: http + selector: + app.kubernetes.io/name: caddy From 2acd229a898143347a1f229b1ad5105f57d73d11 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Mon, 22 Dec 2025 15:12:57 +0000 Subject: [PATCH 13/25] added root gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0a132d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/* +.DS_Store +.docker/certs/*.pem +.docker/certs/*.srl +*.local \ No newline at end of file From 91f02d0472ac70d6643ca97452b7a57857eaa745 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Mon, 22 Dec 2025 15:13:54 +0000 Subject: [PATCH 14/25] cleanup --- .docker/certs/ca-key.pem | 54 - .docker/certs/ca.pem | 32 - .docker/certs/ca.srl | 1 - .docker/certs/cert.pem | 32 - .docker/certs/key.pem | 52 - .docker/certs/server-cert.pem | 32 - .docker/certs/server-key.pem | 52 - .idea/.gitignore | 8 - .../Symfony_15_08_2024__22_28.xml | 3271 ----------------- .../frameworkDescriptionVersion1.1.4.xsd | 47 - .idea/dataSources.xml | 12 - .idea/flags-api.iml | 136 - .idea/inspectionProfiles/Project_Default.xml | 13 - .idea/modules.xml | 8 - .idea/php.xml | 283 -- .idea/phpunit.xml | 11 - .idea/vcs.xml | 6 - 17 files changed, 4050 deletions(-) delete mode 100755 .docker/certs/ca-key.pem delete mode 100755 .docker/certs/ca.pem delete mode 100755 .docker/certs/ca.srl delete mode 100755 .docker/certs/cert.pem delete mode 100755 .docker/certs/key.pem delete mode 100755 .docker/certs/server-cert.pem delete mode 100755 .docker/certs/server-key.pem delete mode 100644 .idea/.gitignore delete mode 100644 .idea/commandlinetools/Symfony_15_08_2024__22_28.xml delete mode 100644 .idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/flags-api.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/php.xml delete mode 100644 .idea/phpunit.xml delete mode 100644 .idea/vcs.xml diff --git a/.docker/certs/ca-key.pem b/.docker/certs/ca-key.pem deleted file mode 100755 index f92aec9..0000000 --- a/.docker/certs/ca-key.pem +++ /dev/null @@ -1,54 +0,0 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -MIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIZGJuhRBU54YCAggA -MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDQwefmfwQG/1g95sQNNgqVBIIJ -UF6oOu4uqe2nOyHa5YA2pxps5V9zdwhskyY0mmlXwSa7kCwfpDt0il8y9R6t8j5M -X3ztt4FRC/JKhg1bafwQWf/kxwAtA3UOMUXSqT9myfzaryylRmhf9MwHO2kZuVUm -N4TuDMD+XQSaQlL1cJI57nA2GqI/FUIiWru6PkD5lujvXo6JhSWSfU1R/vTQqPrO -jYIDQbtxAtgd24+Hu2BDdZBANP5Pvmy7G4biwck9VwxpsE64VqiSrrR6lY76o1SC -xclX9Io4VXDX5M5SPiS1HrctDAYgiS/M2sFtaCi1KNq3H44joBy3CVcdD75A0+Uy -TFsGrgFDWNm/Mo7xhXHa9/sTN5V1glpvq/55PgBP7Kvn5hs7hDRGoc0kICPqa+av -MFyzdUlQXp0/F4evjjHRE5P3Lr3AXoBecKZ6YfjBF43KIBBiZsORRZUOwxFh+emx -2BX4Qca1Os+uQLVsJiloKMr09dLlfSIwP4l9W+3tko5Fa9N1VWjiH+HM+dLLQ7h8 -SGgmc3Ug9SNzcS0EyqIgfoG8CyTIfLkMy9QsOMuiLAFQ30/ZKeEMNcaUSeB9yPPe -/axOXitZ3uzrvLItsx3K5HfcW8JjA8sR/l0V9VWqB+qxL6EVMydcOHIKcKSMoGyL -cxf2y6FXA/e9fTiGesxQpsS3BLn3TucYMIfXBfPU8xm09RJazpb8iX3xzJNPihoZ -FlATro5Z45CdlOY8rKZf9tbAenQDdO6o81UytTtf0TMhMIO8wAiD1h9HkozXaDU7 -/g5Xeh8+5zyflCIEAhXybbdjnbSXF1Hy9WmYLjsKTyh9lrGkNhgPWCqRWV+ZDV3d -z3b8TLl7jN+M2wqI1P1KR3Qtj/qlRur8WMh69uO6C4tt/LNC4+folz379gbPlWWk -Os0sOzmv2/7sYvFy54p8EmcHiLPt4rq2YV+6NQfVsavxI1o4H/ZGT2fL2ywzKHV1 -Zc+Aqbp0L28Mm3ZXjq6Ss+uw9L6lejbU38aIwyTG6aC0RYMeWRMSPhMDUNdH7p1i -WI9jbYGLJr1FA4loy5OePLRZNnIeL3sqZ5BLOByAfeVgeYn4m+Zgxfc5EK8s0MhY -4vHXwJi8ButOHMTqpmhcwR91QgDVyuMufEe/ow/DKHmlrgaPK3S8JARBVdXGXb/U -A608cWZyoLwyUOJ2CBlcI4cflc5KwDs6hEXkKa5dA5TFXipUpflHHwK2wndxLGi5 -il9TG+Q8Pj6Q/TYjHgKhBuuN44JmIUq4Q8B7REBRh8d7dhsfbVUS/8L9yfwHeO64 -R26EOZeI0FQ91RavD6zIcIvJzMrUUZgypG1Jgs1C+7bef6ltE2hskCNpiuHLUCVl -F2eK10mY+oE50jeRq5/GGf13KpNeJlu594VBU8ax13MVkXU4AjfdCgGIKT2egZjS -/rvUFbo8UePEAibPAJw8bbLwXH8nmtHVdH0vGL2YdeWQIf2iZOMFn7w3g2mFxmLl -SuMLRrwjoN1fDyitiPPHO4QvH2MU4SydMX94e4jJXzL92aE0WbPP8sgnbLLHfA0o -fW7wPKiTvlfqsOBJmy1T0MaAhpMSlp2XM4/Zrh8bHlXd3r23n1Hfj/+3QcRqzQSs -oPVNnKQS7dePrw/8+Wv5WRU1N7siWCryU0j3It1dA78cXcmHXGT4wRYPC3IUxQQ3 -k/hovaZ0/BtNiFGcMrkUs9BMeNhpqTXBsRdMTpUnPYWqB50nMVc8XMaw9+dhExL+ -skDLLR7dqlRFjiWOvGDvRCNzzTB+M1VbI1mTKuvkl7K/oCdsKaM/5n4uXo4fQ68k -B5nvjT1zVR0dSo2NxMmWtTGOpfgEDhkOdIohaj4CpR0zpOaAskk2G6LymIrqWA4O -OHJvkWHxrSaRe6/nVValgJ1CLHRHbEk+3tdx3MFPz7pvzMLUzy3b+qGyKuRgPA26 -dGPifGzjN+qmSQznFaDfbkWEPiapVX9YOFAh7gruJhCWclq8RjXr4+/npSMB7Qjk -FlWikVUu9LxUCoSubBm/dHu89AETTnrq4TTESw9Zf4Q8Ks19R2E+QGLJxynrPt5g -SsT+VbL8kxzgVKW+zlZy6O+RS7Gi0xII/k3ckQdF7DvhreyAC1scP+WqK3guQBa9 -dj9RM5TOGRQId+MwC2RMhlpZKR0p/wk2kovGJGM/4+IdseGPhbF7bX2iNhVyF5E5 -4uF1+WL0I1w4Sw8LguCu/AXZo3EjJtN759ZX18cKEh3gUHhasOPbXMmbZdZAzXS1 -cs5+mPojlvEc5z3FYReiR9wmzoLvpqoHNHQcInTh/verWYCmhaXbUHqF+6eO19Bs -R9x+bFhJM/Dq4iv/pgnWM/J2YpRo8iMGXaQFi1rD3K4BaQQ9WNrTyM+Vrk7zw/wL -YCdqGIQ6QV+WfHaGhRmzXrRVUlK1EC/L9GqQfXq48M7SfXS1JxnhlQJ5Oufs3uTR -4GvraP+RG1hfHyrsRB5mU9KJYdyNGBwIG4+vRD1If52bqMSnyfHP0MAQ7EuOt/rP -l9HGm+0VA/NdfI+zmjLqxwn1/VosquQM0x1gtqPQMVpL3Mg5bIKSA4l/05IuuiXj -iy3NhP7/BUVL/oo68r6HAQFDT0R8jjz/SaXfA9h0QhuWCIcQujpqrD6iwUzPjxF/ -AniTZrDuA2zazAItKSay+ejqkhrFfnfNVJRrOFNnuXI/xpzfnGmJLKj9vgq6sYvG -FCN0T3d1igVzld3z3plof75iGT92AkaMSZLmi2XhRuabXWiwzpqJtF/ePsZlvGUh -/q0n9UZTQYAO8K91nrekpnGr1zn9Wn/sRBUm6VciySwMfClE7CT0JoNogYBOKSVS -FuJcN+XFK60VTWFvbwm07M/rPmCTV44v0pvtaK430sjXeGhRNOvBEfzjB/w3HGg0 -mn1wPefo1C0+6ZtCeS5j4tL1MTRdVciEJrzC6SB1OV0DABGIwaS64WCINxeTsRIy -bG5xAhMv2mAZl31/CQNf6VMTEuh7gkKLEKgD6/bJfvAUEdwaLMfy2DJyAsDM8uni -NdnkoN9w3wa59zfcbu6+7CAUPPWbCS5swjpWYQXoezuKfDIgX/PMvn9pi/KQoM+p -QqKqeCjkKIxteTnTmD4412kpmNUOVQ8VgbtFKlXlfmLiMCKTyvtAeGtuexSWNUQm -LvF0fNR8gehE4ym1rFeKenq/hHRKRnnFJLtF2xpdtJDE ------END ENCRYPTED PRIVATE KEY----- diff --git a/.docker/certs/ca.pem b/.docker/certs/ca.pem deleted file mode 100755 index e188744..0000000 --- a/.docker/certs/ca.pem +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFczCCA1ugAwIBAgIUO+3xKOWVVCpkSZdg7DH3cGE5vccwDQYJKoZIhvcNAQEL -BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV -BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM1WhcN -MjYwNzI5MDE0NjM1WjBJMQswCQYDVQQGEwJUUjEKMAgGA1UECAwBLjEKMAgGA1UE -BwwBLjEKMAgGA1UECgwBLjEWMBQGA1UEAwwNMTM4LjY4LjE4NC42OTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAOnVLUkdkTn1A+W2dlaX4HH1ea0+6HVy -eMo/sjfyHDVj/98CXtZNLffwPRL88+aKXh1S6S0V4IytgAejQzCgym8gj1zF5qx+ -w9Pw+ciBBtdGPkIt96FiwGqKYCrU/SmmjLy6vJJfeZnxWSu7JQJVlalEpfS+xvVk -jjxE7UuxTm8/KmtWLiDw9mQXGpDRkbUlbKbf6XRBvmHjbuI5Uz51wzxvfOdqZ4JN -3YLczui9gEL/TmaYhrIjtwYZGW1aQvGTfvFcWQa54AL/BQSH7YxInmv3Rf6/bJxA -awllVwX4Mc7cUCZGldIeqtFiPjOdPyVpssQhzjU4v+zgcjI79XJUc7w8YPDn7zja -SjvLqDUTaN2tiJG/TfbSMsroMdiwvvU3SUPPny9PzihYa5LOwALOV7nBwyIkBYan -r6t1mCiWXz/yIstvu5yT65391UwQwpMgEJZy93OiSNoD09f6iHi83ZeGPQPKq/Hc -sMFab/62lA1Vnmr3V7qMQCzny7Rys8fQxmK/hCw63JtTJJvJYPOtgXEds30C8S8b -OySELOzkG0PlHfBHJn1PElAJCj4QOH8PM8yt2Senp6TMEnvQjCO38k8eApqHHcmE -/9LMeEpfVFJvOdzBzxOOwuzkVqjSClnhneHinBX8j/VZhlzggPlzD9Bg0j4NrOXi -J2QyYFZR0p+fAgMBAAGjUzBRMB0GA1UdDgQWBBRQpjPvSEuTCxoWoDStoF7Zoy1K -RDAfBgNVHSMEGDAWgBRQpjPvSEuTCxoWoDStoF7Zoy1KRDAPBgNVHRMBAf8EBTAD -AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAN57EaVb3dU52dkfQphcOd5c4K3MX4oUjX -eDxEYSGukWq3pIC35gsLVMSiPEAjcFTDiBTN2TBb/Ooej5YGGituVK1/FGirJdXa -gyleEXplGdUS7GjOAXDXarhVUqZ0LH1849qHiCuDg7Q0hs1FkCAKWwMFVPSBed/4 -2PbMMz821H6V2il6Z7Uu1N5WNloKiX4lBZRt+6nctKQ79g+D0CBEF3l/J64j3OGC -SjIHKUBuEGchGNwMUKSfCvhs6ZyoavoCocefdXlc98R4wUEBIl8NCWiD2S79COgS -UzQMrIpSuD1E1DLUOF8ijGx6BWRljke+udR7eL8S3SMi5AKr16DBDPtFXpqzdnuX -xciJgEGodKU10/SLRueZSj1/WPeWC5mV6m0cL/0dDO8O/oyq7vRE5fjZ0z3geyR/ -9y7BfZCq0otnRof1LqOkDgxfoLDGheUPi0ICaaIq/zOKPXkjL+XnvhYUfT2pfW76 -kysXoiLBMXjtOuGp4J9Q8UjcaQ4zKGSb8FZ2XeNMncjnbdcuwTjjH0OVyaLo+hUo -XZ28l6aQBbA4zLEnaVlaQ4CpF/UKfsaB4yyIyBs/pFQzTqmA7oNyqYKAcyck2/yB -Qu/j2lA8qj+qGehQ9XT2mxiNri7TjSGm57ml7m1CJ0jkmUjETLw6PSVRzb+eEHUt -mXBB4o9QKg== ------END CERTIFICATE----- diff --git a/.docker/certs/ca.srl b/.docker/certs/ca.srl deleted file mode 100755 index 51daa67..0000000 --- a/.docker/certs/ca.srl +++ /dev/null @@ -1 +0,0 @@ -72F5C9838D75EFE222CD4CE36E0AC0F09157083B diff --git a/.docker/certs/cert.pem b/.docker/certs/cert.pem deleted file mode 100755 index 2e6fa86..0000000 --- a/.docker/certs/cert.pem +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFbTCCA1WgAwIBAgIUcvXJg4117+IizUzjbgrA8JFXCDswDQYJKoZIhvcNAQEL -BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV -BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM2WhcN -MjYwNzI5MDE0NjM2WjARMQ8wDQYDVQQDDAZjbGllbnQwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsFOR87giKmC1OejpRTNCyXd8BJCpE2lbXq/qaa26e -i/cKavKMoTDmGURiDy5Og+9WdOkgoJTSTpDk7Bhl3aui2idav0qodkKcLdex1YPm -fA+oIoeo/2VTazymjTysPPcjs4ADinE2i04lGtYZM9joGsNGXUqB3fucHLkbWbqW -v1bCRFX5dHilSkt2KpU7g1G/E/xVJDiIPim3DbtPaiUq/4Qy7eQIS5ClviLv7nQz -wVMS84DQVhNh5e6E65TgMXmuYtO/+7uvJYfeFCzxFFexvSArLWD66SgG9F4yldeH -hfRJTleuVkoxHOvwCR6wFCEDJT5CimqAZEp1k52yxUPXp8BdLFGPeoQ0CY9oj954 -QAMPxkClxNgE+CoiVF0odE0zgDLJIUJ8P8tg5h/1wj2Kj+sELRFDhMdGd+d8/4aU -sirzyzZxo2OH2NXFrne6+Hw7WBSIOa8BAK6jXNcMIXAEXPXvMZ9jQDDfv6cmuoaj -qyE8+IYPrbI/999rHCQUfBn7c9I01X80Ftvkpo78hUzN4mUPFcGaX+iJq7VrNCQb -+J1LtJrw58qChl7MzREjlPnXQ6RpM1DYsDMbZBij3M2tTQJ08UdhPTMNitO5GziW -O54Bh+qukX45z21tS5p4Ah2xOnQ2gLu/Xuk3IWfNGGfHcPIUHA4l6DUKDVaiV8vR -rQIDAQABo4GEMIGBMCoGA1UdEQQjMCGCDTEzOC42OC4xODQuNjmHBIpEuEWHBH8A -AAGHBAAAAAAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFNzopbLh6LZ3 -EnWLejynENDEmMqcMB8GA1UdIwQYMBaAFFCmM+9IS5MLGhagNK2gXtmjLUpEMA0G -CSqGSIb3DQEBCwUAA4ICAQBeaHnSXFcX/Myckr02sIxxba3imxUUjZjJaFryihix -mZy72AWxbpNriSf1rZ8uRwBVU7/RGq4gHgczELm2qTShOBvTVjlDI+amEGu6pf6U -YFJ4/TS3rjU9Bj2yDgKoH6/l1ApPS/EMAnY9SMcEEcw+Ddoh7OKXxG/0CdV1DYWB -1eL+6aZvkglzy05RYthun2AkjbScmB1kQwkCdbgy8jKNtvgr1MK/ySPFQvxruHlO -Gu3+fmaXhSMp3ooQPesPorxd0oc3WHhp9JixNFrgEgSMrTkZcN/fOD4v8WbhQSQe -mROGf7Kke8n3QKSTeEPlhdyEHlrsqPyfOut0T66O6qRvgIkPNH80YczkBc88EAWT -qjY2HPNf5YvGanyNsQDRyhpmCgh/FCkeR8BY8EGZ8ZvMQnjIpSVM5Svlh42NY7G1 -G9kZy1zQ0S0TOMvKYYTNmETFhmfczzHcPAsNLxT1YFry/dGrXC/Hxj4wxOszuZvZ -6L03WJlsU5RWphpANqngoJVyS4IVyCWk26t4hRQB/JcuRRvHStvfEhj7CuXqpmyy -nVDQJkDgkVf08AwsJ5GL+fx+bAaXvW/GFUj1CQRTW735o2lS4Zw4+0uxjAxSogow -CVI7nFA7cPVfpKSx27tyLf9aVQPPU/cpqxRJrq8eIsOXMeCM/+8Ruh32eSUU+GQl -Pw== ------END CERTIFICATE----- diff --git a/.docker/certs/key.pem b/.docker/certs/key.pem deleted file mode 100755 index 0cbbe06..0000000 --- a/.docker/certs/key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCsFOR87giKmC1O -ejpRTNCyXd8BJCpE2lbXq/qaa26ei/cKavKMoTDmGURiDy5Og+9WdOkgoJTSTpDk -7Bhl3aui2idav0qodkKcLdex1YPmfA+oIoeo/2VTazymjTysPPcjs4ADinE2i04l -GtYZM9joGsNGXUqB3fucHLkbWbqWv1bCRFX5dHilSkt2KpU7g1G/E/xVJDiIPim3 -DbtPaiUq/4Qy7eQIS5ClviLv7nQzwVMS84DQVhNh5e6E65TgMXmuYtO/+7uvJYfe -FCzxFFexvSArLWD66SgG9F4yldeHhfRJTleuVkoxHOvwCR6wFCEDJT5CimqAZEp1 -k52yxUPXp8BdLFGPeoQ0CY9oj954QAMPxkClxNgE+CoiVF0odE0zgDLJIUJ8P8tg -5h/1wj2Kj+sELRFDhMdGd+d8/4aUsirzyzZxo2OH2NXFrne6+Hw7WBSIOa8BAK6j -XNcMIXAEXPXvMZ9jQDDfv6cmuoajqyE8+IYPrbI/999rHCQUfBn7c9I01X80Ftvk -po78hUzN4mUPFcGaX+iJq7VrNCQb+J1LtJrw58qChl7MzREjlPnXQ6RpM1DYsDMb -ZBij3M2tTQJ08UdhPTMNitO5GziWO54Bh+qukX45z21tS5p4Ah2xOnQ2gLu/Xuk3 -IWfNGGfHcPIUHA4l6DUKDVaiV8vRrQIDAQABAoICABQ72Kn/6y0wu5MQuC67E4cF -lqUxtW6nJbLyW+MwYq9t0bx92stCYNeNfQbytgUxakEGOitF9nnMFylzwWKo7/eU -IzB+ca7hSO/ITCZy7rF5QPYKKV1rumRWpakHzmyKNp0SDClea/V359ZhE2+fMxAH -pZJugcZHbcBreDCJGnGDShZJprpQQadd1wWr+CQpSsFm/jKcsbEDbjBCAxZRatFl -fgvnAPsgt39lngIMTcmQH86Ip0rX9Ct8t9EVSkoaRy6EHFXkqarshM9OHAK026Lg -lBm/mjmmlLhMn47fI5qh25mLBrBPISYpOmzdBai6lS8jf/CfCerS4BZ3JwHQRCuz -jrIQtZFKLamhHkVeiwfatj+GTtQK0Ig09ToB+y1RTRjPJ/wyYfbKdeyWBNARXoMs -O8awWm6vtxIVoMVqppsyBaJV3BxI2DvmaeRC+JRQ+bySADUNZvXe8wTKTzpDB2wm -Q9cJrjUd0tO2bPwYBP7UtSJuZJ2im3UuiHIXTa8JFHttPusog0Zn09mYd8qcd70J -nbHP5t9x4lgOmooO2MrVwjJnoG9tMDDu1A0ED+2jmmebjtBka8WkMCHYI6CqiMWt -olaEtH5RA9yhGaDqHRqsAfTUHbn/wHMZcj/4yHaoK2LTjKRA6w6vuXkLUtZv5LXw -LtyTTruQV42ZtGYZzy6ZAoIBAQDxDVYSsuZrhLik+vr0J5OrLlOLQKAVOaarQK1g -VCVamLCP8JXaLju08+5GdvVGHIa8+s/VO8MPWZ2CzmR08rAW/8QifWUmzHDH2fHX -rj0gbP8uUfxRznZIJFv7mlEJUTFhsO1ceyY/+CCie5VNbyZT7DwZn2MLf7Gv7Juu -Fcz0VZjOM1g0/H2YaU2y4IF2MqnyTXCfIGs7+CdfS2olgb/x8JShth7YOy/FuGdx -Pn2bTlYrQ6gOM8Y+A2SusbNgiA2jLtBOK3RiGK5sDkh+q7MnUxrdZ0LP6xC+GcXw -aX5EY0uD+JPTHXYGihsDOgVK7oCoRx3np8IRmzp77uzbejgLAoIBAQC2wKkr1kWr -kcsH1Jg8n34A/qbzXTpz3lFcemaPzTzjipVEnPswSMS/TosCep9oT1+OI7uMOCIb -RmZLC5LQNTf4OdugiSO1pXu0POr/nu0VDR+8GvIKKR7SjkYjxy0qiQZ797EwMRn8 -K6xE8hQmbZHhijXXKLdsRuTa3RAnCXv+crYsWljTUvopU8ekouJNA6IQ0t7s34c3 -i9wOAWchzsDMxQcCUmoXi6o48Xry0EQwSJlIAK5vDsj2ermwgMIrkF0TROvT+gGJ -G6VRMSQ2S79++iWEfYD36MaJvaXLMpa4z1wdODQiPxawzNiWLTDBm+Xy1O1+xXBt -L+eT/xHVLNgnAoIBAQCqDbh9NIxtqZIBgbXs7Ma2atYxVQQaNTOpeNVXMcWwZiuZ -QCbXZupkO/oK5/0c2x8Kzv4z9hckCxqdnzErd9JWR1V8522ms2+U7eI5QAiLiZl0 -eg5BQCAdwNjLZRBqPEdUHdc1+QMA+fE772di21j0t6GmidT71bfq3kbtxx9x97j3 -Ly25I68PCKrx2IQ8eH2AHLWo7Nv50JUmGzPlBeX9rrWMZ8jWztpi6DbBo05FdDxC -BVbXvhrKwOYUf/SF0zWbu3jkzK8sTTEvtdva0RJwWaaIL0LpH3IOSmxjsGiNomcx -0PmoZA5RiriHzDTTqfJFxPYJ6UV12kamC+Y4574FAoIBAQCrxXR8tp6vf45k4sbg -nEyT5MbJEcSiKcExef6yhQcJHDXm0uIqZQtAgTOZdeYk5g37jMx4JD6ygj4dpVgu -CQd9cexj/OKqlksqguOith9C3R4J8Q20zSeiYoW8lTZ3t2l31b0efdhdtDLsbtjP -sccfRYgLnsKgrBXpPUU0W+7Gn81o7NZ2cpSdiZipv0uTdam7xGgyHnt6kyOXqmvk -U+/VyA8peIstbGHnudmFJoohE+u2yKUrz6rGOV4Vb0CSL9O8C9jZWjBdTbXaFaVi -v1nToIzo9gnlek46Ix4VWoxeUtDSygP+eGv8a93bcchVAhJlZwt/T1a32gIBkgqR -4t+bAoIBACbWkf4OOYM2utVc8MHZa8soNrzLINFCQnGVMPDBs6Al3/b+F30ABnO5 -Aymu08dde3LJGqoXZQhcRUUkFVUncVyMGALAzPmSWDyvs9BomduF6oPMKBs57XBK -mreyhZss7byO+6j+gIKemL08ESYVvJoWo/b2Imsp5/YQspMHuxz+K6iOmUvmEeQM -1po8Hu7r4P/K4rhUmRhc94xE7NRxO4x+BAQJvggU16CacK1/IP6QEjr0ijVy5+di -FJhT1GviA1c6WYCeAGWuaCOFAlq6zv0C7ZkwHyPP213Zqr+o43cjeLk3/Rd/K11L -HoMBmhBXJzs8Sa0pe+y11oR7XoJBOcg= ------END PRIVATE KEY----- diff --git a/.docker/certs/server-cert.pem b/.docker/certs/server-cert.pem deleted file mode 100755 index 8a4c395..0000000 --- a/.docker/certs/server-cert.pem +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIUcvXJg4117+IizUzjbgrA8JFXCDowDQYJKoZIhvcNAQEL -BQAwSTELMAkGA1UEBhMCVFIxCjAIBgNVBAgMAS4xCjAIBgNVBAcMAS4xCjAIBgNV -BAoMAS4xFjAUBgNVBAMMDTEzOC42OC4xODQuNjkwHhcNMjMxMTAyMDE0NjM2WhcN -MjYwNzI5MDE0NjM2WjAYMRYwFAYDVQQDDA0xMzguNjguMTg0LjY5MIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuYZAb2U3f5KcrvG+WHDc6M+MnortPgh1 -WaJMxc31icMkTUqfY42ePZq2ckoOUp9BENO1cYIJT4/Ne3PQZpAOMr5IqzapLswE -jwlva7ea1IoR6iflgGH91cRtzVXzSsRmFuMojDspnZ/UC1t4xwhD2NozdJtx8NMN -gelnId9qxzBUZaP43BYl+Nl57Lt37DBurVNHJYCsG8SRAFy+o2na2aDpe5RnVxp1 -32pcg9lUPFFENM6nPU/sD06WwOIBVUVDDT+2+5q8U6CIC7m2UGmsVevVNzwtKWwp -MlwjliRpxGOfG9K+/3kLlZy1wcqz7FUQoBQfDClWNokQT4k8dzAJItaBFNH5YF1E -HThzKo2ud+bDHYNiZch34C9sAKcbSgUT+njzSK2lMN3+pqbCw0ttCB7lL0Rb81Dr -a5+pBELoemSDodzmDfEVJetE7jUGYENAzpO3NgAh/fG7XU37DYPMi389HA/g0wKY -9cgWO8GeplZVwNlxdaeph+Ps+rlTc2Vqtx/LOvOMz7G08jAySVFinv/k3RW48xpq -cNsK5tVZ/fNss6w9y2xQ8wewPw+lVw8tTEHBfWY2H3NW33ubAhkP6PaEBGfVgkUc -Qvp9zxhXKNzhwvPyAQxqkgaD/wWGWwWd9ndR+ZcykwzkgNbyqYqoaIAiuanGnTKL -t7WlsZqd5BECAwEAAaOBhDCBgTAqBgNVHREEIzAhgg0xMzguNjguMTg0LjY5hwSK -RLhFhwR/AAABhwQAAAAAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBTp -xfQdB1Qjbgib2Ub10EaoDrF1yzAfBgNVHSMEGDAWgBRQpjPvSEuTCxoWoDStoF7Z -oy1KRDANBgkqhkiG9w0BAQsFAAOCAgEA1Jp2V01MC5WgDvfnZKZXo+W19O8aZgmQ -6Ab5/u03QW3mKP3o79h4ot6P3IKKleeugMS64elA9aE1tJbCCrcnOeg9oLkg3VcF -OW7CLwJQEoUg/9LHQYJ2lHIxiz8M5Td1de6+vQqvvYysePMFEpbhYV0YHQgxsQ3/ -u/BnchEeBIFRMI3NZotb77e4gLWFsgNhq7BFnNkrF34xFyXBQRLCzwGycJQRSaHH -cokyhjKx+SuBvJcXaymsHDRiBgDgIWR8MdngwiAR3FdtBnlJR/6TQNz30mP8CFLc -QXmQSLTJ0QAS7evwS4s0diVpBJ+HJBFvb4BfoZloNFkQ5sZsOE7q2vRxXrTA9U9I -98lzuaQvE9Ob+o++b/eObnsi15jHLoofkFARbGsueSubkv03XFqby/4x40rkPqIK -5Q23CE8fJCNHwN+yws16qjMrdKMM3m9w7/C3sBbyBp1yAavUI5r3vIqDg2LVh/WL -fVjYd6vIew0zr6deGthoZjN0jDJewu05I3qapuPM3W5dNNTke+m9toz5PlvyBmre -E9quR84IDcwlND1l/3sLrL3yzyg8/T5Wwu19NP7Gf4ZjmHB1/+dtOlHBY0X67dfD -mCcCR4998odC2KTbszcSBIBIbMgKyUKi/m/8CVtW1gKsZxCA7dVVh2oEvTBZJsir -cx57zf8HK7A= ------END CERTIFICATE----- diff --git a/.docker/certs/server-key.pem b/.docker/certs/server-key.pem deleted file mode 100755 index 5b95740..0000000 --- a/.docker/certs/server-key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC5hkBvZTd/kpyu -8b5YcNzoz4yeiu0+CHVZokzFzfWJwyRNSp9jjZ49mrZySg5Sn0EQ07VxgglPj817 -c9BmkA4yvkirNqkuzASPCW9rt5rUihHqJ+WAYf3VxG3NVfNKxGYW4yiMOymdn9QL -W3jHCEPY2jN0m3Hw0w2B6Wch32rHMFRlo/jcFiX42Xnsu3fsMG6tU0clgKwbxJEA -XL6jadrZoOl7lGdXGnXfalyD2VQ8UUQ0zqc9T+wPTpbA4gFVRUMNP7b7mrxToIgL -ubZQaaxV69U3PC0pbCkyXCOWJGnEY58b0r7/eQuVnLXByrPsVRCgFB8MKVY2iRBP -iTx3MAki1oEU0flgXUQdOHMqja535sMdg2JlyHfgL2wApxtKBRP6ePNIraUw3f6m -psLDS20IHuUvRFvzUOtrn6kEQuh6ZIOh3OYN8RUl60TuNQZgQ0DOk7c2ACH98btd -TfsNg8yLfz0cD+DTApj1yBY7wZ6mVlXA2XF1p6mH4+z6uVNzZWq3H8s684zPsbTy -MDJJUWKe/+TdFbjzGmpw2wrm1Vn982yzrD3LbFDzB7A/D6VXDy1MQcF9ZjYfc1bf -e5sCGQ/o9oQEZ9WCRRxC+n3PGFco3OHC8/IBDGqSBoP/BYZbBZ32d1H5lzKTDOSA -1vKpiqhogCK5qcadMou3taWxmp3kEQIDAQABAoICAFehnlX/zVMpAXFxJqPHy9D8 -GEPbA2zFugh4rSLRwiUsU71efiMcBZ67sWoSqOlF6An2tkHDVnqKRlkFv25ypQI6 -90BINWmxXIXjwwlyVGQIQ6YC6ljV8HxEqEjRTHYIhuBQtBpo56NYl2Q19LquoL2R -c7SkqBFE36B5iwlo6prjrTnFVgs/OvhsYTb85gxeZCjiqTyBpsoG8ybkp/ewTHt3 -klGZK6btDLhXGRP+V9eV203GPyCq26nvSS4akt6gNKfRbLEzybkGnrxLIF6jS4/a -MYBBoGNsf5kWBIkq8fqdw830odsyZdJpj0DWal47X/r9Bh1MeTiRTW8EN9dkjStl -jlfMYV+/UB0KXmKXuCpw2WJ3a/yYzQhiqV72XrklHpV6Wx3KykiGW0fpx30sWhfc -YFpZr6AYJjx6L1URtBESW7GMc5XBENdUHo5OfaXu4oN3sGCm+lYGwfe6UktueO+A -fvJP9b1lFUbSMPJpShkQBlYV4NO/5sUJQSsEwZmNQ+ArCWZWi4guhbHuW0MMg3G+ -rIPGgWSVesR28Mg/kYA9l2/qck/seEa3ib1oGcBfZiiQiz/8xE9MxJtf7PEVi7nd -UHGzqopPxWDXj8ni/p2JR7Ct/bFT2GXBtNdpHkqrxSixd40gUKk3NNYbWXrP5T1Z -PNUPtCbJaheoK54vkZkxAoIBAQDfNScBk/dZVPEITcf/bqJD+vu4YPEdEKwGqmYK -lQI04rE9b7EbT3ZRkJUuJ7oGsC0cRJBjb0capKrt3SRnq3bmIAS+VkY7jHLrnTL2 -Ws55DeZgaIj/ck+kVP8VahWvI3vjnsrQG2UvdBUUKs5cwicIlTKJR47AXayxM/Zu -NNrKrEsdZhxJ/9Xu1pCBlu3Ux1wLeMFsNBRL096rHn72Act0RPOkQ0QULghIdMrs -wY8//hZ9ZLzEHoWvaTObPV3PkCjvcBbBY2CfMzwsEcRIpih95ToIMR3iI0z3HOr+ -Bxn6R6tfyryOSS0wpH+Hz7MsTXOeHZdpOQtpM/gMqND7/SJfAoIBAQDUx9UdS6xs -1GAijiOOMYbEQmX+4v1YqJdutErs/ggBN9jruNkvXHuHAa6WrfdXRKTW1Csmkq66 -V6aoXtGGSBJ92oBOYoJvlUQb9JZiywY5aE99E0NA96+d0MNoakiz+aAm9fy1KzxQ -n932LeDjWhzXqhPinUTPMZ3efB2dvwtVIiTU9tr7klhRU0edfrtzjiS8ZofOZIbC -a54/OpQhKF3FlWUuGbxhXSSjHHNcORZ+x+/ho5IXMKyUGL1FjW7Pfwb5VLSe5toD -MjnOhBymq0Y8NcdcTWnZ2Twtcz39l6KcZAzqE06zQT5daEjkGH3RCl2GZ9sxjt8+ -u83ufkOIf++PAoIBAF7QlkwuTZDt6yFq4P0ZQuZ7s/fjfiipj1mZgpUWLQTIEyAU -1PfT7l/Beg1MJNJ4fgEXAvqqJ1si/dTi7nb3OB+TFFDCFz1ucNazRRWvBywXAniL -jz5rkXct/9lZ4fIusY7EQkTajkX1Goshj92JP8l+jyQPeI0wfY4ck57G5vXW8GWB -nZy1h2vYSzQxJ8AOG4Rn/En5aXG4g0rPPoFDy+gM7i4lwMKNt0kIC7c8lZxKU8Va -SHFKweD8YEaeb74e77SeOZxWmZGm0vWpamat5l9sQxV9v8Ly2dvStePIonlVfm/H -kAclAIQ8LExFp0e3ctiEm2/AIp/CyqieAYA5TCMCggEAH78Y6uAJf8tH9J/kaii1 -hL6rXRYc2od84IWB0E4uf5AHi1PvA4P24jO8Crs19g1F0s+hCIZGD4NYWDKdbD2A -lMpu7kMAVwmcOdeKQH8uFI6dnXmsRRsvVop5PTDuW/vYizeUVqt2uki/4yUBMqqV -NxAnG15/j7JFbZZzDMAePrtzZ1rVXUd+adPVEYiBC0Kf9IQPqxmQiZ1o5OImi7Ps -GbiqefBZDOXKu5NZGt9hndTS04WGHHOkrAvs4V2ytL6tGbIrqLGkwWlS+p73b16K -gh07+2eJbXld4yIYk6d2GYNL8fije1c2qNUQWwfUbcXwIkeIiqJYaJG4reakyM7d -vQKCAQAn8bakg/AdD94eBi8SUru5Zf+QgQsLkUEDx1wWsQuS18oGJQ1ZeiHau9CR -BjrioZcBo5WgxocqeqwEg/836HFAo7m28JcaO25y+2BCr+mfITuxchXWYnQ3KUM7 -ANmRXgtvlWXW8rSAnR97ucGO5Ne9slcVCodt6EuAszo0bSL2eAmkaD7FlDZyVJ/0 -KA31DhaoQunD0n3WaCSeAxIAaKvitkdnJr7DBIFEMhQLVwO7nggXSSdRqRP7BoR5 -97JObVr/9p9Evo42TDB9krG86ekfAXemKwwZQ3mcB/tE83kSx3yPfyXqpsvkcUYq -7rkt3nlIRd/ks5zPqM81+hbTxua9 ------END PRIVATE KEY----- diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml b/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml deleted file mode 100644 index ba9eff3..0000000 --- a/.idea/commandlinetools/Symfony_15_08_2024__22_28.xml +++ /dev/null @@ -1,3271 +0,0 @@ - - - - - _complete -
Options:
--shell(-s)The shell type ("bash", "fish", "zsh")
--input(-i)An array of input tokens (e.g. COMP_WORDS or argv)
--current(-c)The index of the "input" array that the cursor is in (e.g. COMP_CWORD)
--api-version(-a)The API version of the completion script
--symfony(-S)deprecated
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - - -
- - about - about command displays information about the current Symfony project.

The PHP section displays important configuration that could affect your application. The values might
be different between web and CLI.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - completion - completion command dumps the shell completion script required
to use shell autocompletion (currently, bash, fish, zsh completion are supported).

Static installation
-------------------

Dump the script to a global completion file and restart your shell:

/home/stx/Projects/flags-api/bin/console completion bash | sudo tee /etc/bash_completion.d/console

Or dump the script to a local file and source it:

/home/stx/Projects/flags-api/bin/console completion bash > completion.sh

# source the file whenever you use the project
source completion.sh

# or add this line at the end of your "~/.bashrc" file:
source /path/to/completion.sh

Dynamic installation
--------------------

Add this to the end of your shell configuration file (e.g. "~/.bashrc"):

eval "$(/home/stx/Projects/flags-api/bin/console completion bash)"

Options:
--debugTail the completion debug log
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- shell[=null] - - - command]]> - - - - - - - - - - - -
- - help - help command displays help for a given command:

/home/stx/Projects/flags-api/bin/console help list

You can also output the help in other formats by using the --format option:

/home/stx/Projects/flags-api/bin/console help --format=xml list

To display the list of available commands, please use the list command.

Options:
--formatThe output format (txt, xml, json, or md)
--rawTo output raw command help
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]> - command_name[=null] - - - -
command]]> - - - - - - - - - - - - - - list - list command lists all commands:

/home/stx/Projects/flags-api/bin/console list

You can also display the commands for a specific namespace:

/home/stx/Projects/flags-api/bin/console list test

You can also output the information in other formats by using the --format option:

/home/stx/Projects/flags-api/bin/console list --format=xml

It's also possible to get raw list of commands (useful for embedding command runner):

/home/stx/Projects/flags-api/bin/console list --raw

Options:
--rawTo output raw command list
--formatThe output format (txt, xml, json, or md)
--shortTo skip describing commands' arguments
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- namespace[=null] - - - - - - - - - - - - - - - -
- - app:set-webhook -
Options:
--option1Option description
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- arg1[=null] - - - - - - - - - - - - - -
- - assets:install - assets:install command installs bundle assets into a given
directory (e.g. the public directory).

php /home/stx/Projects/flags-api/bin/console assets:install public

A "bundles" directory will be created inside the target directory and the
"Resources/public" directory of each bundle will be copied into it.

To create a symlink to each bundle instead of copying its assets, use the
--symlink option (will fall back to hard copies when symbolic links aren't possible:

php /home/stx/Projects/flags-api/bin/console assets:install public --symlink

To make symlink relative, add the --relative option:

php /home/stx/Projects/flags-api/bin/console assets:install public --symlink --relative


Options:
--symlinkSymlink the assets instead of copying them
--relativeMake relative symlinks
--no-cleanupDo not remove the assets of the bundles that no longer exist
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- target[=null] - - - - - - - - - - - - - - - -
- - cache:clear - cache:clear command clears and warms up the application cache for a given environment
and debug mode:

php /home/stx/Projects/flags-api/bin/console cache:clear --env=dev
php /home/stx/Projects/flags-api/bin/console cache:clear --env=prod --no-debug

Options:
--no-warmupDo not warm up the cache
--no-optional-warmersSkip optional cache warmers (faster)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - cache:pool:clear - cache:pool:clear command clears the given cache pools or cache pool clearers.

/home/stx/Projects/flags-api/bin/console cache:pool:clear [...]

Options:
--allClear all cache pools
--excludeA list of cache pools or cache pool clearers to exclude
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- pools[=null] - - - - - - - - - - - - - - -
- - cache:pool:delete - cache:pool:delete deletes an item from a given cache pool.

/home/stx/Projects/flags-api/bin/console cache:pool:delete

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- pool key - - - - - - - - - - - - -
- - cache:pool:invalidate-tags - cache:pool:invalidate-tags command invalidates tags from taggable pools. By default, all pools
have the passed tags invalidated. Pass --pool=my_pool to invalidate tags on a specific pool.

php /home/stx/Projects/flags-api/bin/console cache:pool:invalidate-tags tag1 tag2
php /home/stx/Projects/flags-api/bin/console cache:pool:invalidate-tags tag1 tag2 --pool=cache2 --pool=cache1

Options:
--pool(-p)The pools to invalidate on
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- tags - - - - - - - - - - - - - -
- - cache:pool:list - cache:pool:list command lists all available cache pools.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - cache:pool:prune - cache:pool:prune command deletes all expired items from all pruneable pools.

/home/stx/Projects/flags-api/bin/console cache:pool:prune

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - cache:warmup - cache:warmup command warms up the cache.

Before running this command, the cache must be empty.


Options:
--no-optional-warmersSkip optional cache warmers (faster)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - -
- - config:dump-reference - config:dump-reference command dumps the default configuration for an
extension/bundle.

Either the extension alias or bundle name can be used:

php /home/stx/Projects/flags-api/bin/console config:dump-reference framework
php /home/stx/Projects/flags-api/bin/console config:dump-reference FrameworkBundle

The --format option specifies the format of the configuration,
these are "yaml", "xml".

php /home/stx/Projects/flags-api/bin/console config:dump-reference FrameworkBundle --format=xml

For dumping a specific option, add its path as second argument (only available for the yaml format):

php /home/stx/Projects/flags-api/bin/console config:dump-reference framework http_client.default_options


Options:
--formatThe output format ("yaml", "xml")
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name[=null] path[=null] - - - - - - - - - - - - - -
- - dbal:run-sql - dbal:run-sql command executes the given SQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console dbal:run-sql "SELECT * FROM users"

Options:
--connectionThe named database connection
--depthDumping depth of result set (deprecated).
--force-fetchForces fetching the result.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- sql - - - - - - - - - - - - - - - -
- - debug:autowiring - debug:autowiring command displays the classes and interfaces that
you can use as type-hints for autowiring:

php /home/stx/Projects/flags-api/bin/console debug:autowiring

You can also pass a search term to filter the list:

php /home/stx/Projects/flags-api/bin/console debug:autowiring log


Options:
--allShow also services that are not aliased
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- search[=null] - - - - - - - - - - - - - -
- - debug:config - debug:config command dumps the current configuration for an
extension/bundle.

Either the extension alias or bundle name can be used:

php /home/stx/Projects/flags-api/bin/console debug:config framework
php /home/stx/Projects/flags-api/bin/console debug:config FrameworkBundle

The --format option specifies the format of the configuration,
these are "txt", "yaml", "json".

php /home/stx/Projects/flags-api/bin/console debug:config framework --format=json

For dumping a specific option, add its path as second argument:

php /home/stx/Projects/flags-api/bin/console debug:config framework serializer.enabled


Options:
--resolve-envDisplay resolved environment variable values instead of placeholders
--formatThe output format ("txt", "yaml", "json")
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name[=null] path[=null] - - - - - - - - - - - - - - -
- - debug:container - debug:container command displays all configured public services:

php /home/stx/Projects/flags-api/bin/console debug:container

To see deprecations generated during container compilation and cache warmup, use the --deprecations option:

php /home/stx/Projects/flags-api/bin/console debug:container --deprecations

To get specific information about a service, specify its name:

php /home/stx/Projects/flags-api/bin/console debug:container validator

To get specific information about a service including all its arguments, use the --show-arguments flag:

php /home/stx/Projects/flags-api/bin/console debug:container validator --show-arguments

To see available types that can be used for autowiring, use the --types flag:

php /home/stx/Projects/flags-api/bin/console debug:container --types

To see environment variables used by the container, use the --env-vars flag:

php /home/stx/Projects/flags-api/bin/console debug:container --env-vars

Display a specific environment variable by specifying its name with the --env-var option:

php /home/stx/Projects/flags-api/bin/console debug:container --env-var=APP_ENV

Use the --tags option to display tagged public services grouped by tag:

php /home/stx/Projects/flags-api/bin/console debug:container --tags

Find all services with a specific tag by specifying the tag name with the --tag option:

php /home/stx/Projects/flags-api/bin/console debug:container --tag=form.type

Use the --parameters option to display all parameters:

php /home/stx/Projects/flags-api/bin/console debug:container --parameters

Display a specific parameter by specifying its name with the --parameter option:

php /home/stx/Projects/flags-api/bin/console debug:container --parameter=kernel.debug

By default, internal services are hidden. You can display them
using the --show-hidden flag:

php /home/stx/Projects/flags-api/bin/console debug:container --show-hidden


Options:
--show-argumentsShow arguments in services
--show-hiddenShow hidden (internal) services
--tagShow all services with a specific tag
--tagsDisplay tagged services for an application
--parameterDisplay a specific parameter for an application
--parametersDisplay parameters for an application
--typesDisplay types (classes/interfaces) available in the container
--env-varDisplay a specific environment variable used in the container
--env-varsDisplay environment variables used in the container
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw description
--deprecationsDisplay deprecations generated when compiling and warming up the container
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name[=null] - - - - - - - - - - - - - - - - - - - - - - - - -
- - debug:dotenv - /home/stx/Projects/flags-api/bin/console debug:dotenv command displays all the environment variables configured by dotenv:

php /home/stx/Projects/flags-api/bin/console debug:dotenv

To get specific variables, specify its full or partial name:

php /home/stx/Projects/flags-api/bin/console debug:dotenv FOO_BAR


Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- filter[=null] - - - - - - - - - - - - -
- - debug:event-dispatcher - debug:event-dispatcher command displays all configured listeners:

php /home/stx/Projects/flags-api/bin/console debug:event-dispatcher

To get specific listeners for an event, specify its name:

php /home/stx/Projects/flags-api/bin/console debug:event-dispatcher kernel.request

Options:
--dispatcherTo view events of a specific event dispatcher
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw description
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- event[=null] - - - - - - - - - - - - - - - -
- - debug:firewall - debug:firewall command displays the firewalls that are configured
in your application:

php /home/stx/Projects/flags-api/bin/console debug:firewall

You can pass a firewall name to display more detailed information about
a specific firewall:

php /home/stx/Projects/flags-api/bin/console debug:firewall main

To include all events and event listeners for a specific firewall, use the
events option:

php /home/stx/Projects/flags-api/bin/console debug:firewall --events main


Options:
--eventsInclude a list of event listeners (only available in combination with the "name" argument)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name[=null] - - - - - - - - - - - - - -
- - debug:router - debug:router displays the configured routes:

php /home/stx/Projects/flags-api/bin/console debug:router


Options:
--show-controllersShow assigned controllers in overview
--show-aliasesShow aliases in overview
--formatThe output format ("txt", "xml", "json", "md")
--rawTo output raw route(s)
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name[=null] - - - - - - - - - - - - - - - - -
- - debug:serializer - debug:serializer 'App\Entity\Dummy' command dumps the serializer groups for the dummy class.

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- class - - - - - - - - - - - - -
- - debug:validator - debug:validator 'App\Entity\Dummy' command dumps the validators for the dummy class.

The debug:validator src/ command dumps the validators for the `src` directory.

Options:
--show-allShow all classes even if they have no validation constraints
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- class - - - - - - - - - - - - - -
- - dev:token -
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - doctrine:cache:clear-collection-region - doctrine:cache:clear-collection-region command is meant to clear a second-level cache collection regions for an associated Entity Manager.
It is possible to delete/invalidate all collection region, a specific collection region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for an collection region this command would do the work:

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName'

To invalidate a specific entry you should use :

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName' 1

If you want to invalidate all entries for the all collection regions:

doctrine:cache:clear-collection-region --all

Alternatively, if you want to flush the configured cache provider for an collection region use this command:

doctrine:cache:clear-collection-region 'Entities\MyEntity' 'collectionName' --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all entity regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- owner-class[=null] association[=null] owner-id[=null] - - - - - - - - - - - - - - - -
- - doctrine:cache:clear-entity-region - doctrine:cache:clear-entity-region command is meant to clear a second-level cache entity region for an associated Entity Manager.
It is possible to delete/invalidate all entity region, a specific entity region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for an entity region this command would do the work:

doctrine:cache:clear-entity-region 'Entities\MyEntity'

To invalidate a specific entry you should use :

doctrine:cache:clear-entity-region 'Entities\MyEntity' 1

If you want to invalidate all entries for the all entity regions:

doctrine:cache:clear-entity-region --all

Alternatively, if you want to flush the configured cache provider for an entity region use this command:

doctrine:cache:clear-entity-region 'Entities\MyEntity' --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all entity regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- entity-class[=null] entity-id[=null] - - - - - - - - - - - - - - - -
- - doctrine:cache:clear-metadata - doctrine:cache:clear-metadata command is meant to clear the metadata cache of associated Entity Manager.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:cache:clear-query - doctrine:cache:clear-query command is meant to clear the query cache of associated Entity Manager.
It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider
instance completely.

The execution type differ on how you execute the command.
If you want to invalidate the entries (and not delete from cache instance), this command would do the work:

doctrine:cache:clear-query

Alternatively, if you want to flush the cache provider using this command:

doctrine:cache:clear-query --flush

Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries,
because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:cache:clear-query-region - doctrine:cache:clear-query-region command is meant to clear a second-level cache query region for an associated Entity Manager.
It is possible to delete/invalidate all query region, a specific query region or flushes the cache provider.

The execution type differ on how you execute the command.
If you want to invalidate all entries for the default query region this command would do the work:

doctrine:cache:clear-query-region

To invalidate entries for a specific query region you should use :

doctrine:cache:clear-query-region my_region_name

If you want to invalidate all entries for the all query region:

doctrine:cache:clear-query-region --all

Alternatively, if you want to flush the configured cache provider use this command:

doctrine:cache:clear-query-region my_region_name --flush

Finally, be aware that if --flush option is passed,
not all cache providers are able to flush entries, because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--allIf defined, all query regions will be deleted/invalidated.
--flushIf defined, all cache entries will be flushed.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- region-name[=null] - - - - - - - - - - - - - - - -
- - doctrine:cache:clear-result - doctrine:cache:clear-result command is meant to clear the result cache of associated Entity Manager.
It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider
instance completely.

The execution type differ on how you execute the command.
If you want to invalidate the entries (and not delete from cache instance), this command would do the work:

doctrine:cache:clear-result

Alternatively, if you want to flush the cache provider using this command:

doctrine:cache:clear-result --flush

Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries,
because of a limitation of its execution nature.

Options:
--emName of the entity manager to operate on
--flushIf defined, cache entries will be flushed instead of deleted/invalidated.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:database:create - doctrine:database:create command creates the default connections database:

php /home/stx/Projects/flags-api/bin/console doctrine:database:create

You can also optionally specify the name of a connection to create the database for:

php /home/stx/Projects/flags-api/bin/console doctrine:database:create --connection=default

Options:
--connection(-c)The connection to use for this command
--if-not-existsDon't trigger an error, when the database already exists
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:database:drop - doctrine:database:drop command drops the default connections database:

php /home/stx/Projects/flags-api/bin/console doctrine:database:drop

The --force parameter has to be used to actually drop the database.

You can also optionally specify the name of a connection to drop the database for:

php /home/stx/Projects/flags-api/bin/console doctrine:database:drop --connection=default

Be careful: All data in a given database will be lost when executing this command.

Options:
--connection(-c)The connection to use for this command
--if-existsDon't trigger an error, when the database doesn't exist
--force(-f)Set this parameter to execute this action
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:ensure-production-settings -
Options:
--emName of the entity manager to operate on
--completeFlag to also inspect database connection existence.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:fixtures:load - doctrine:fixtures:load command loads data fixtures from your application:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load

Fixtures are services that are tagged with doctrine.fixture.orm.

If you want to append the fixtures instead of flushing the database first you can use the --append option:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --append

By default Doctrine Data Fixtures uses DELETE statements to drop the existing rows from the database.
If you want to use a TRUNCATE statement instead you can use the --purge-with-truncate flag:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --purge-with-truncate

To execute only fixtures that live in a certain group, use:

php /home/stx/Projects/flags-api/bin/console doctrine:fixtures:load --group=group1


Options:
--appendAppend the data fixtures instead of deleting all data from the database first.
--groupOnly load fixtures that belong to this group
--emThe entity manager to use for this command.
--purgerThe purger to use for this command
--purge-exclusionsList of database tables to ignore while purging
--purge-with-truncatePurge data by using a database-level TRUNCATE statement
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - - - -
- - doctrine:mapping:convert -
This is an execute one-time command. It should not be necessary for
you to call this method multiple times, especially when using the --from-database
flag.

Converting an existing database schema into mapping files only solves about 70-80%
of the necessary mapping information. Additionally the detection from an existing
database cannot detect inverse associations, inheritance types,
entities with foreign keys as primary keys and many of the
semantical operations on associations such as cascade.

Hint: There is no need to convert YAML or XML mapping files to annotations
every time you make changes. All mapping drivers are first class citizens
in Doctrine 2 and can be used as runtime mapping for the ORM.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--filterA string pattern used to match entities that should be processed.
--force(-f)Force to overwrite existing mapping files.
--from-databaseWhether or not to convert mapping information from existing database.
--extendDefines a base class to be extended by generated entity classes.
--num-spacesDefines the number of indentation spaces
--namespaceDefines a namespace for the generated entity classes, if converted from database.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- to-type dest-path - - - - - - - - - - - - - - - - - - - -
- - doctrine:mapping:import - doctrine:mapping:import command imports mapping information
from an existing database:

Generate annotation mappings into the src/ directory using App as the namespace:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import App\\Entity annotation --path=src/Entity

Generate xml mappings into the config/doctrine/ directory using App as the namespace:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import App\\Entity xml --path=config/doctrine

Generate XML mappings into a bundle:
php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml

You can also optionally specify which entity manager to import from with the
--em option:

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --em=default

If you don't want to map every entity that can be found in the database, use the
--filter option. It will try to match the targeted mapped entity with the
provided pattern string.

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --filter=MyMatchedEntity

Use the --force option, if you want to override existing mapping files:

php /home/stx/Projects/flags-api/bin/console doctrine:mapping:import "MyCustomBundle" xml --force

Options:
--emThe entity manager to use for this command
--filterA string pattern used to match entities that should be mapped.
--forceForce to overwrite existing mapping files.
--pathThe path where the files would be generated (not used when a bundle is passed).
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name mapping-type[=null] - - - - - - - - - - - - - - - - -
- - doctrine:mapping:info - doctrine:mapping:info shows basic information about which
entities exist and possibly if their mapping information contains errors or
not.

Options:
--emName of the entity manager to operate on
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - -
- - doctrine:migrations:current -
Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:diff - doctrine:migrations:diff command generates a migration by comparing your current database to your mapping information:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:diff


Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--namespaceThe namespace to use for the migration (must be in the list of configured namespaces)
--filter-expressionTables which are filtered by Regular Expression.
--formattedFormat the generated SQL.
--line-lengthMax line length of unformatted lines.
--check-database-platformCheck Database Platform to the generated code.
--allow-empty-diffDo not throw an exception when no changes are detected.
--from-empty-schemaGenerate a full migration as if the current database was empty.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - - - - - - - -
- - doctrine:migrations:dump-schema - doctrine:migrations:dump-schema command dumps the schema for your database to a migration:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:dump-schema

After dumping your schema to a migration, you can rollup your migrations using the migrations:rollup command.

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--formattedFormat the generated SQL.
--namespaceNamespace to use for the generated migrations (defaults to the first namespace definition).
--filter-tablesFilter the tables to dump via Regex.
--line-lengthMax line length of unformatted lines.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - - - - -
- - doctrine:migrations:execute - doctrine:migrations:execute command executes migration versions up or down manually:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN

You can show more information about the process by increasing the verbosity level. To see the
executed queries, set the level to debug with -vv:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN -vv

If no --up or --down option is specified it defaults to up:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --down

You can also execute the migration as a --dry-run:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --dry-run

You can output the prepared SQL statements to a file with --write-sql:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --write-sql

Or you can also execute the migration without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN --no-interaction

All the previous commands accept multiple migration versions, allowing you run execute more than
one migration at once:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:execute FQCN-1 FQCN-2 ...FQCN-n


Options:
--write-sqlThe path to output the migration SQL file. Defaults to current working directory.
--dry-runExecute the migration as a dry run.
--upExecute the migration up.
--downExecute the migration down.
--query-timeTime all the queries individually.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- versions - - - - - - - - - - - - - - - - - - - - -
- - doctrine:migrations:generate - doctrine:migrations:generate command generates a blank migration class:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:generate


Options:
--namespaceThe namespace to use for the migration (must be in the list of configured namespaces)
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - -
- - doctrine:migrations:latest -
Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:list - doctrine:migrations:list command outputs a list of all available migrations and their status:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:list

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:migrate - doctrine:migrations:migrate command executes a migration to a specified version or the latest available version:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate

You can show more information about the process by increasing the verbosity level. To see the
executed queries, set the level to debug with -vv:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate -vv

You can optionally manually specify the version you wish to migrate to:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN

You can specify the version you wish to migrate to using an alias:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate prev
These alias are defined: first, latest, prev, current and next

You can specify the version you wish to migrate to using an number against the current version:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate current+3

You can also execute the migration as a --dry-run:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN --dry-run

You can output the prepared SQL statements to a file with --write-sql:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate FQCN --write-sql

Or you can also execute the migration without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate --no-interaction

You can also time all the different queries if you wanna know which one is taking so long:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:migrate --query-time

Use the --all-or-nothing option to wrap the entire migration in a transaction.


Options:
--write-sqlThe path to output the migration SQL file. Defaults to current working directory.
--dry-runExecute the migration as a dry run.
--query-timeTime all the queries individually.
--allow-no-migrationDo not throw an exception if no migration is available.
--all-or-nothingWrap the entire migration in a transaction.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- version[=null] - - - - - - - - - - - - - - - - - - - - -
- - doctrine:migrations:rollup - doctrine:migrations:rollup command rolls up migrations by deleting all tracked versions and
inserts the one version that exists that was created with the migrations:dump-schema command.

/home/stx/Projects/flags-api/bin/console doctrine:migrations:rollup

To dump your schema to a migration version you can use the migrations:dump-schema command.

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:status - doctrine:migrations:status command outputs the status of a set of migrations:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:status

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:sync-metadata-storage - The doctrine:migrations:sync-metadata-storage command updates metadata storage to the latest version,
ensuring it is ready to receive migrations generated by the current version of Doctrine Migrations.


/home/stx/Projects/flags-api/bin/console doctrine:migrations:sync-metadata-storage

Options:
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - doctrine:migrations:up-to-date - doctrine:migrations:up-to-date command tells you if your schema is up-to-date:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:up-to-date

Options:
--fail-on-unregistered(-u)Whether to fail when there are unregistered extra migrations found
--list-migrations(-l)Show a list of missing or not migrated versions.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - - -
- - doctrine:migrations:version - doctrine:migrations:version command allows you to manually add, delete or synchronize migration versions from the version table:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version MIGRATION-FQCN --add

If you want to delete a version you can use the --delete option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version MIGRATION-FQCN --delete

If you want to synchronize by adding or deleting all migration versions available in the version table you can use the --all option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --add --all
/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --delete --all

If you want to synchronize by adding or deleting some range of migration versions available in the version table you can use the --range-from/--range-to option:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --add --range-from=MIGRATION-FQCN --range-to=MIGRATION-FQCN
/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --delete --range-from=MIGRATION-FQCN --range-to=MIGRATION-FQCN

You can also execute this command without a warning message which you need to interact with:

/home/stx/Projects/flags-api/bin/console doctrine:migrations:version --no-interaction

Options:
--addAdd the specified version.
--deleteDelete the specified version.
--allApply to all the versions.
--range-fromApply from specified version.
--range-toApply to specified version.
--configurationThe path to a migrations configuration file. [default: any of migrations.{php,xml,json,yml,yaml}]
--emThe name of the entity manager to use.
--connThe name of the connection to use.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- version[=null] - - - - - - - - - - - - - - - - - - - - -
- - doctrine:query:dql - doctrine:query:dql command executes the given DQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u"

You can also optionally specify some additional options like what type of
hydration to use when executing the query:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u" --hydrate=array

Additionally you can specify the first result and maximum amount of results to
show:

php /home/stx/Projects/flags-api/bin/console doctrine:query:dql "SELECT u FROM App\Entity\User u" --first-result=0 --max-result=30

Options:
--emName of the entity manager to operate on
--hydrateHydration mode of result set. Should be either: object, array, scalar or single-scalar.
--first-resultThe first result in the result set.
--max-resultThe maximum number of results in the result set.
--depthDumping depth of Entity graph.
--show-sqlDump generated SQL instead of executing query
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- dql - - - - - - - - - - - - - - - - - - -
- - doctrine:query:sql - doctrine:query:sql command executes the given SQL query and
outputs the results:

php /home/stx/Projects/flags-api/bin/console doctrine:query:sql "SELECT * FROM users"

Options:
--connectionThe named database connection
--depthDumping depth of result set (deprecated).
--force-fetchForces fetching the result.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- sql - - - - - - - - - - - - - - - -
- - doctrine:schema:create -
Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--dump-sqlInstead of trying to apply generated SQLs into EntityManager Storage Connection, output them.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - doctrine:schema:drop - Beware that the complete database is dropped by this command, even tables that are not relevant to your metadata model.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--dump-sqlInstead of trying to apply generated SQLs into EntityManager Storage Connection, output them.
--force(-f)Don't ask for the deletion of the database, but force the operation to run.
--full-databaseInstead of using the Class Metadata to detect the database table schema, drop ALL assets that the database contains.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - -
- - doctrine:schema:update - doctrine:schema:update command generates the SQL needed to
synchronize the database schema with the current mapping metadata of the
default entity manager.

For example, if you add metadata for a new column to an entity, this command
would generate and output the SQL needed to add the new column to the database:

doctrine:schema:update --dump-sql

Alternatively, you can execute the generated queries:

doctrine:schema:update --force

If both options are specified, the queries are output and then executed:

doctrine:schema:update --dump-sql --force

Finally, be aware that if the --complete option is passed, this
task will drop all database assets (e.g. tables, etc) that are *not* described
by the current metadata. In other words, without this option, this task leaves
untouched any "extra" tables that exist in the database, but which aren't
described by any metadata. Not passing that option is deprecated.

Hint: If you have a database with tables that should not be managed
by the ORM, you can use a DBAL functionality to filter the tables and sequences down
on a global level:

$config->setSchemaAssetsFilter(function (string|AbstractAsset $assetName): bool {
if ($assetName instanceof AbstractAsset) {
$assetName = $assetName->getName();
}

return !str_starts_with($assetName, 'audit_');
});

Options:
--emName of the entity manager to operate on
--completeIf defined, all assets of the database which are not relevant to the current metadata will be dropped.
--dump-sqlDumps the generated SQL statements to the screen (does not execute them).
--force(-f)Causes the generated SQL statements to be physically executed against your database.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - -
- - doctrine:schema:validate -
Options:
--emName of the entity manager to operate on
--skip-mappingSkip the mapping validation check
--skip-syncSkip checking if the mapping is in sync with the database
--skip-property-typesSkip checking if property types match the Doctrine types
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - - -
- - lexik:jwt:check-config -
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - lexik:jwt:enable-encryption -
Options:
--force(-f)Force the modification of the configuration, even if already set.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - -
- - lexik:jwt:generate-keypair -
Options:
--dry-runDo not update key files.
--skip-if-existsDo not update key files if they already exist.
--overwriteOverwrite key files if they already exist.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - - -
- - lexik:jwt:generate-token -
Options:
--ttl(-t)Ttl in seconds to be added to current time. If not provided, the ttl configured in the bundle will be used. Use 0 to generate token without exp
--user-class(-c)Userclass is used to determine which user provider to use
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- username - - - - - - - - - - - - - - -
- - lexik:jwt:migrate-config -
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - lint:container -
Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - lint:yaml - lint:yaml command lints a YAML file and outputs to STDOUT
the first encountered syntax error.

You can validates YAML contents passed from STDIN:

cat filename | php /home/stx/Projects/flags-api/bin/console lint:yaml -

You can also validate the syntax of a file:

php /home/stx/Projects/flags-api/bin/console lint:yaml filename

Or of a whole directory:

php /home/stx/Projects/flags-api/bin/console lint:yaml dirname
php /home/stx/Projects/flags-api/bin/console lint:yaml dirname --format=json

You can also exclude one or more specific files:

php /home/stx/Projects/flags-api/bin/console lint:yaml dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml"

Or find all files in a bundle:

php /home/stx/Projects/flags-api/bin/console lint:yaml @AcmeDemoBundle


Options:
--formatThe output format ("txt", "json", "github")
--excludePath(s) to exclude
--parse-tagsParse custom tags
--no-parse-tagsNegate the "--parse-tags" option
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- filename[=null] - - - - - - - - - - - - - - - - -
- - router:match - router:match shows which routes match a given request and which don't and for what reason:

php /home/stx/Projects/flags-api/bin/console router:match /foo

or

php /home/stx/Projects/flags-api/bin/console router:match /foo --method POST --scheme https --host symfony.com --verbose


Options:
--methodSet the HTTP method
--schemeSet the URI scheme (usually http or https)
--hostSet the URI host
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- path_info - - - - - - - - - - - - - - - -
- - secrets:decrypt-to-local - secrets:decrypt-to-local command decrypts all secrets and copies them in the local vault.

/home/stx/Projects/flags-api/bin/console secrets:decrypt-to-local

When the option --force is provided, secrets that already exist in the local vault are overriden.

/home/stx/Projects/flags-api/bin/console secrets:decrypt-to-local --force

Options:
--force(-f)Force overriding of secrets that already exist in the local vault
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - -
- - secrets:encrypt-from-local - secrets:encrypt-from-local command encrypts all locally overridden secrets to the vault.

/home/stx/Projects/flags-api/bin/console secrets:encrypt-from-local

Options:
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - -
- - secrets:generate-keys - secrets:generate-keys command generates a new encryption key.

/home/stx/Projects/flags-api/bin/console secrets:generate-keys

If encryption keys already exist, the command must be called with
the --rotate option in order to override those keys and re-encrypt
existing secrets.

/home/stx/Projects/flags-api/bin/console secrets:generate-keys --rotate

Options:
--local(-l)Update the local vault.
--rotate(-r)Re-encrypt existing secrets with the newly generated keys.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - - -
- - secrets:list - secrets:list command list all stored secrets.

/home/stx/Projects/flags-api/bin/console secrets:list

When the option --reveal is provided, the decrypted secrets are also displayed.

/home/stx/Projects/flags-api/bin/console secrets:list --reveal

Options:
--reveal(-r)Display decrypted values alongside names
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- - - - - - - - - - - - - -
- - secrets:remove - secrets:remove command removes a secret from the vault.

/home/stx/Projects/flags-api/bin/console secrets:remove

Options:
--local(-l)Update the local vault.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name - - - - - - - - - - - - - -
- - secrets:set - secrets:set command stores a secret in the vault.

/home/stx/Projects/flags-api/bin/console secrets:set

To reference secrets in services.yaml or any other config
files, use "%env()%".

By default, the secret value should be entered interactively.
Alternatively, provide a file where to read the secret from:

php /home/stx/Projects/flags-api/bin/console secrets:set filename

Use "-" as a file name to read from STDIN:

cat filename | php /home/stx/Projects/flags-api/bin/console secrets:set -

Use --local to override secrets for local needs.

Options:
--local(-l)Update the local vault.
--random(-r)Generate a random value.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- name file[=null] - - - - - - - - - - - - - - -
- - security:hash-password - The security:hash-password command hashes passwords according to your
security configuration. This command is mainly used to generate passwords for
the in_memory user provider type and for changing passwords
in the database while developing the application.

Suppose that you have the following security configuration in your application:


# app/config/security.yml
security:
password_hashers:
Symfony\Component\Security\Core\User\InMemoryUser: plaintext
App\Entity\User: auto


If you execute the command non-interactively, the first available configured
user class under the security.password_hashers key is used and a random salt is
generated to hash the password:

php /home/stx/Projects/flags-api/bin/console security:hash-password --no-interaction [password]

Pass the full user class path as the second argument to hash passwords for
your own entities:

php /home/stx/Projects/flags-api/bin/console security:hash-password --no-interaction [password] 'App\Entity\User'

Executing the command interactively allows you to generate a random salt for
hashing the password:

php /home/stx/Projects/flags-api/bin/console security:hash-password [password] 'App\Entity\User'

In case your hasher doesn't require a salt, add the empty-salt option:

php /home/stx/Projects/flags-api/bin/console security:hash-password --empty-salt [password] 'App\Entity\User'


Options:
--empty-saltDo not generate a salt or let the hasher generate one.
--help(-h)Display help for the given command. When no command is given display help for the list command
--quiet(-q)Do not output any message
--verbose(-v)Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
--version(-V)Display this application version
--ansiForce (or disable --no-ansi) ANSI output
--no-ansiNegate the "--ansi" option
--no-interaction(-n)Do not ask any interactive question
--env(-e)The Environment name.
--no-debugSwitch off debug mode.
--profileEnables profiling (requires debug).

]]>
- password[=null] user-class[=null] - - - - - - - - - - - - - -
-
- diff --git a/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd b/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd deleted file mode 100644 index f2efc6d..0000000 --- a/.idea/commandlinetools/schemas/frameworkDescriptionVersion1.1.4.xsd +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index ab97382..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - mysql.8 - true - com.mysql.cj.jdbc.Driver - jdbc:mysql://localhost:3306/flags - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/flags-api.iml b/.idea/flags-api.iml deleted file mode 100644 index dab296e..0000000 --- a/.idea/flags-api.iml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index f86e996..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 5a6b16c..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml deleted file mode 100644 index 7a2206b..0000000 --- a/.idea/php.xml +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml deleted file mode 100644 index ffcc995..0000000 --- a/.idea/phpunit.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 6de5ac4dc942980df02cbd1b11bb9b6852f5b4c0 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Mon, 22 Dec 2025 22:22:38 +0000 Subject: [PATCH 15/25] WIP prod setup --- ...Caddyfile.prod => Caddyfile.prod.original} | 10 +- app/.env.prod | 2 + app/.env.staging | 2 + app/composer.lock | 9267 +++++++++++++++++ app/config/bundles.php | 1 - app/config/packages/doctrine.yaml | 2 +- .../packages/lexik_jwt_authentication.yaml | 2 +- app/config/packages/nelmio_cors.yaml | 22 - app/public/index.php | 5 +- .../Flags/Controller/SecurityController.php | 16 + app/src/Flags/Entity/Answer.php | 81 +- app/src/Flags/Entity/Capital.php | 28 +- app/src/Flags/Entity/CapitalsStat.php | 32 +- app/src/Flags/Entity/Flag.php | 26 +- app/src/Flags/Entity/Game.php | 24 +- app/src/Flags/Entity/Score.php | 46 +- app/src/Flags/Entity/User.php | 59 +- k8s-deployment/DEPLOYMENT-GUIDE.md | 347 - k8s-deployment/deploy-flags.sh | 152 - k8s-deployment/flags-api-php.Dockerfile | 148 - .../flags-frontend-caddy.Dockerfile | 26 - 21 files changed, 9397 insertions(+), 901 deletions(-) rename .docker/caddy/{Caddyfile.prod => Caddyfile.prod.original} (76%) create mode 100644 app/composer.lock delete mode 100644 app/config/packages/nelmio_cors.yaml delete mode 100644 k8s-deployment/DEPLOYMENT-GUIDE.md delete mode 100644 k8s-deployment/deploy-flags.sh delete mode 100644 k8s-deployment/flags-api-php.Dockerfile delete mode 100644 k8s-deployment/flags-frontend-caddy.Dockerfile diff --git a/.docker/caddy/Caddyfile.prod b/.docker/caddy/Caddyfile.prod.original similarity index 76% rename from .docker/caddy/Caddyfile.prod rename to .docker/caddy/Caddyfile.prod.original index 3e91b7f..ee5d823 100644 --- a/.docker/caddy/Caddyfile.prod +++ b/.docker/caddy/Caddyfile.prod.original @@ -15,15 +15,19 @@ # CORS preflight @options method OPTIONS handle @options { - header Access-Control-Allow-Origin "*" + header Access-Control-Allow-Origin "https://flags.izeebot.top" header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" + header Access-Control-Allow-Credentials "true" + header Access-Control-Expose-Headers "Authorization" header Access-Control-Max-Age "1728000" respond 204 } - # CORS header for all responses - header Access-Control-Allow-Origin "*" + # CORS headers for all responses + header Access-Control-Allow-Origin "https://flags.izeebot.top" + header Access-Control-Allow-Credentials "true" + header Access-Control-Expose-Headers "Authorization" # Compression encode gzip zstd diff --git a/app/.env.prod b/app/.env.prod index 8058a9a..c790d18 100644 --- a/app/.env.prod +++ b/app/.env.prod @@ -23,6 +23,8 @@ CODE_PATH=code APP_ENV=prod APP_SECRET=2b7d3cdbcb5e5a8117488547044f9e7b CORS_ALLOW_ORIGIN=* +# Trust proxies for HTTPS detection (Traefik/Caddy -> PHP) +TRUSTED_PROXIES=127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 ###> doctrine/doctrine-bundle ### # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url diff --git a/app/.env.staging b/app/.env.staging index ec4f0ac..892eca6 100644 --- a/app/.env.staging +++ b/app/.env.staging @@ -23,6 +23,8 @@ CODE_PATH=code APP_ENV=staging APP_SECRET=2b7d3cdbcb5e5a8117488547044f9e7b CORS_ALLOW_ORIGIN=* +# Trust proxies for HTTPS detection (Traefik/Caddy -> PHP) +TRUSTED_PROXIES=127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 ###> doctrine/doctrine-bundle ### # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url diff --git a/app/composer.lock b/app/composer.lock new file mode 100644 index 0000000..8f134bb --- /dev/null +++ b/app/composer.lock @@ -0,0 +1,9267 @@ +{ + "_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": "3bcf407ff3e1e76f57b26bcd7f14c3ea", + "packages": [ + { + "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": "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" + }, + "abandoned": true, + "time": "2024-09-05T10:17:24+00:00" + }, + { + "name": "doctrine/collections", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "9acfeea2e8666536edff3d77c531261c63680160" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/9acfeea2e8666536edff3d77c531261c63680160", + "reference": "9acfeea2e8666536edff3d77c531261c63680160", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1", + "symfony/polyfill-php84": "^1.30" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "ext-json": "*", + "phpstan/phpstan": "^2.1.30", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" + }, + "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.4.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%2Fcollections", + "type": "tidelift" + } + ], + "time": "2025-10-25T09:18:13+00:00" + }, + { + "name": "doctrine/dbal", + "version": "4.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "14.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "11.5.23", + "slevomat/coding-standard": "8.24.0", + "squizlabs/php_codesniffer": "4.0.0", + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "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" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.4.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%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-12-04T10:11:03+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "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.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.18.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ff098b29b8b3c68307c8987dcaed7fd829c6546", + "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/deprecations": "^1.0", + "doctrine/persistence": "^3.1 || ^4", + "doctrine/sql-formatter": "^1.0.1", + "php": "^8.1", + "symfony/cache": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/service-contracts": "^2.5 || ^3" + }, + "conflict": { + "doctrine/annotations": ">=3.0", + "doctrine/cache": "< 1.11", + "doctrine/orm": "<2.17 || >=4.0", + "symfony/var-exporter": "< 6.4.1 || 7.0.0", + "twig/twig": "<2.13 || >=3.0 <3.0.4" + }, + "require-dev": { + "doctrine/annotations": "^1 || ^2", + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^14", + "doctrine/orm": "^2.17 || ^3.1", + "friendsofphp/proxy-manager-lts": "^1.0", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.53 || ^12.3.10", + "psr/log": "^1.1.4 || ^2.0 || ^3.0", + "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.0", + "symfony/security-bundle": "^6.4 || ^7.0", + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/string": "^6.4 || ^7.0", + "symfony/twig-bridge": "^6.4 || ^7.0", + "symfony/validator": "^6.4 || ^7.0", + "symfony/var-exporter": "^6.4.1 || ^7.0.1", + "symfony/web-profiler-bundle": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", + "twig/twig": "^2.14.7 || ^3.0.4" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.18.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%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2025-12-20T21:35:32+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1e380c6dd8ac8488217f39cff6b77e367f1a644b", + "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^2.4 || ^3.0", + "doctrine/migrations": "^3.2", + "php": "^7.2 || ^8.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/coding-standard": "^12 || ^14", + "doctrine/orm": "^2.6 || ^3", + "phpstan/phpstan": "^1.4 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpstan/phpstan-symfony": "^1.3 || ^2", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/phpunit-bridge": "^6.3 || ^7 || ^8", + "symfony/var-exporter": "^5.4 || ^6 || ^7 || ^8" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.7.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%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2025-11-15T19:02:59+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "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" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.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%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "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 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.1.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%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+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": "doctrine/migrations", + "version": "3.9.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "1b823afbc40f932dae8272574faee53f2755eac5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", + "reference": "1b823afbc40f932dae8272574faee53f2755eac5", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/dbal": "^3.6 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2.0", + "php": "^8.1", + "psr/log": "^1.1.3 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.2 || ^7.0 || ^8.0" + }, + "conflict": { + "doctrine/orm": "<2.12 || >=4" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "doctrine/orm": "^2.13 || ^3", + "doctrine/persistence": "^2 || ^3 || ^4", + "doctrine/sql-formatter": "^1.0", + "ext-pdo_sqlite": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2", + "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "suggest": { + "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations" + ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/3.9.5" + }, + "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%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2025-11-20T11:15:36+00:00" + }, + { + "name": "doctrine/orm", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/d4e9276e79602b1eb4c4029c6c999b0d93478e2f", + "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", + "ext-ctype": "*", + "php": "^8.1", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14.0", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.1.23", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.5.0 || ^11.5", + "psr/log": "^1 || ^2 || ^3", + "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "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": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/3.6.0" + }, + "time": "2025-12-19T20:36:14+00:00" + }, + { + "name": "doctrine/persistence", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1 || ^2", + "php": "^8.1", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.58 || ^12", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "src/Persistence" + } + }, + "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" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/4.1.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%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2025-10-16T20:13:18+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "ergebnis/phpunit-slow-test-detector": "^2.20", + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^10.5.58" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "https://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" + }, + "time": "2025-10-26T09:35:14+00:00" + }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.19", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "c20299aa9f48a622052964a75c5a4cef017398b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/c20299aa9f48a622052964a75c5a4cef017398b2", + "reference": "c20299aa9f48a622052964a75c5a4cef017398b2", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0|^8.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/Ocramius/ProxyManager", + "name": "ocramius/proxy-manager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.19" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2025-10-28T10:28:17+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "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.10.0" + }, + "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": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "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.3.0" + }, + "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": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "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.44 || ^9.6.25" + }, + "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.8.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": "2025-08-23T21:21:41+00:00" + }, + { + "name": "knpuniversity/oauth2-client-bundle", + "version": "v2.20.1", + "source": { + "type": "git", + "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", + "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/d59e4dc61484e777b6f19df2efcf8b1bcc03828a", + "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0", + "php": ">=8.1", + "symfony/dependency-injection": "^6.4|^7.3|^8.0", + "symfony/framework-bundle": "^6.4|^7.3|^8.0", + "symfony/http-foundation": "^6.4|^7.3|^8.0", + "symfony/routing": "^6.4|^7.3|^8.0", + "symfony/security-core": "^6.4|^7.3|^8.0", + "symfony/security-http": "^6.4|^7.3|^8.0" + }, + "require-dev": { + "league/oauth2-facebook": "^1.1|^2.0", + "symfony/phpunit-bridge": "^7.3", + "symfony/yaml": "^6.4|^7.3|^8.0" + }, + "suggest": { + "symfony/security-guard": "For integration with Symfony's Guard Security layer" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "KnpU\\OAuth2ClientBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ryan Weaver", + "email": "ryan@symfonycasts.com" + } + ], + "description": "Integration with league/oauth2-client to provide services", + "homepage": "https://symfonycasts.com", + "keywords": [ + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", + "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.20.1" + }, + "time": "2025-12-04T15:46:43+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", + "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", + "shasum": "" + }, + "require": { + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.58", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.15.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2025-11-01T09:38:14+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-17T11:30:53+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "php": "^7.1 || >=8.0.0 <8.6.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" + }, + "time": "2025-11-25T22:17:17+00:00" + }, + { + "name": "lexik/jwt-authentication-bundle", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", + "reference": "60df75dc70ee6f597929cb2f0812adda591dfa4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/60df75dc70ee6f597929cb2f0812adda591dfa4b", + "reference": "60df75dc70ee6f597929cb2f0812adda591dfa4b", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "lcobucci/jwt": "^5.0", + "php": ">=8.2", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.4|^3.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "api-platform/core": "^3.0|^4.0", + "rector/rector": "^1.2", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "suggest": { + "gesdinet/jwt-refresh-token-bundle": "Implements a refresh token system over Json Web Tokens in Symfony", + "spomky-labs/lexik-jose-bridge": "Provides a JWT Token encoder with encryption support" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Lexik\\Bundle\\JWTAuthenticationBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Barthe", + "email": "j.barthe@lexik.fr", + "homepage": "https://github.com/jeremyb" + }, + { + "name": "Nicolas Cabot", + "email": "n.cabot@lexik.fr", + "homepage": "https://github.com/slashfan" + }, + { + "name": "Cedric Girard", + "email": "c.girard@lexik.fr", + "homepage": "https://github.com/cedric-g" + }, + { + "name": "Dev Lexik", + "email": "dev@lexik.fr", + "homepage": "https://github.com/lexik" + }, + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com", + "homepage": "https://github.com/chalasr" + }, + { + "name": "Lexik Community", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle/graphs/contributors" + } + ], + "description": "This bundle provides JWT authentication for your Symfony REST API", + "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle", + "keywords": [ + "Authentication", + "JWS", + "api", + "bundle", + "jwt", + "rest", + "symfony" + ], + "support": { + "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", + "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v3.2.0" + }, + "funding": [ + { + "url": "https://github.com/chalasr", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/lexik/jwt-authentication-bundle", + "type": "tidelift" + } + ], + "time": "2025-12-20T17:47:00+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/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+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": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "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/2.0" + }, + "time": "2023-04-04T09:54:51+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": "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": "rteeom/isoflags", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/mainstreamer/isoflags.git", + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.4|8.*" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^10.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Rteeom\\FlagsGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rteeom", + "email": "mainstreamer@outlook.com" + } + ], + "description": "library for easy emoji flags generation from iso country codes", + "support": { + "issues": "https://github.com/mainstreamer/isoflags/issues", + "source": "https://github.com/mainstreamer/isoflags/tree/1.2.0" + }, + "time": "2024-10-23T19:44:49+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v6.2.10", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/monolog-bridge": "^4.0|^5.0|^6.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "support": { + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" + }, + "abandoned": "Symfony", + "time": "2023-02-24T14:57:12+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "eb3272ed2daed13ed24816e862d73f73d995972a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/eb3272ed2daed13ed24816e862d73f73d995972a", + "reference": "eb3272ed2daed13ed24816e862d73f73d995972a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "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 extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-01T16:41:59+00:00" + }, + { + "name": "symfony/clock", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-11T21:24:34+00:00" + }, + { + "name": "symfony/config", + "version": "v6.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/15947c18ef3ddb0b2f4ec936b9e90e2520979f62", + "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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 you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v6.4.28" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-01T19:52:02+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/1b2813049506b39eb3d7e64aff033fd5ca26c97e", + "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e", + "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.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-05T13:47:41+00:00" + }, + { + "name": "symfony/contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/contracts.git", + "reference": "97a588e965e92e3f197085531cbe440d0fcf48c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/contracts/zipball/97a588e965e92e3f197085531cbe440d0fcf48c3", + "reference": "97a588e965e92e3f197085531cbe440d0fcf48c3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0", + "psr/container": "^1.1|^2.0", + "psr/event-dispatcher": "^1.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "replace": { + "symfony/cache-contracts": "self.version", + "symfony/deprecation-contracts": "self.version", + "symfony/event-dispatcher-contracts": "self.version", + "symfony/http-client-contracts": "self.version", + "symfony/service-contracts": "self.version", + "symfony/translation-contracts": "self.version" + }, + "require-dev": { + "symfony/polyfill-intl-idn": "^1.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "Deprecation/function.php" + ], + "psr-4": { + "Symfony\\Contracts\\": "" + }, + "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": "A set of abstractions extracted out of the Symfony components", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "dev", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T17:58:03+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5328f994cbb0855ba25c3a54f4a31a279511640f", + "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4.20|^7.2.5" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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 you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-07T09:29:59+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c14bb5a9125c411e73354954940e06b6e7fcc344", + "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "^1.2|^2", + "doctrine/persistence": "^2.5|^3.1|^4", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "doctrine/lexer": "<1.1", + "doctrine/orm": "<2.15", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<6.2", + "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.3", + "symfony/http-kernel": "<6.2", + "symfony/lock": "<6.3", + "symfony/messenger": "<5.4", + "symfony/property-info": "<5.4", + "symfony/security-bundle": "<5.4", + "symfony/security-core": "<6.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "doctrine/collections": "^1.0|^2.0", + "doctrine/data-fixtures": "^1.1|^2", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.15|^3", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.2|^7.0", + "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4.38|^6.4.6|^7.0.6", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/lock": "^6.3|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/proxy-manager-bridge": "^6.4", + "symfony/security-core": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "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 integration for Doctrine with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-26T15:07:38+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "924edbc9631b75302def0258ed1697948b17baf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", + "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/process": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-14T17:33:48+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/41bedcaec5b72640b0ec2096547b75fda72ead6c", + "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T09:57:09+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b0cf3162020603587363f0551cd3be43958611ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", + "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "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|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "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.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-13T09:41:44+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "01906f3b379833b347de9abc8ddc326593e9122b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/01906f3b379833b347de9abc8ddc326593e9122b", + "reference": "01906f3b379833b347de9abc8ddc326593e9122b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "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 engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-09T10:02:06+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, + "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.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-26T14:43:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.27", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a1b6aa435d2fba50793b994a839c32b6064f063b", + "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "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/v6.4.27" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-15T18:32:00+00:00" + }, + { + "name": "symfony/flex", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/9cd384775973eabbf6e8b05784dda279fc67c28d", + "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1", + "php": ">=8.1" + }, + "conflict": { + "composer/semver": "<1.7.2", + "symfony/dotenv": "<5.4" + }, + "require-dev": { + "composer/composer": "^2.1", + "symfony/dotenv": "^6.4|^7.4|^8.0", + "symfony/filesystem": "^6.4|^7.4|^8.0", + "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", + "symfony/process": "^6.4|^7.4|^8.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v2.10.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-16T09:38:19+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "3c212ec5cac588da8357f5c061194363a4e91010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3c212ec5cac588da8357f5c061194363a4e91010", + "reference": "3c212ec5cac588da8357f5c061194363a4e91010", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4.12|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.1|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^6.4|^7.0" + }, + "conflict": { + "doctrine/annotations": "<1.13.1", + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<5.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.3", + "symfony/console": "<5.4|>=7.0", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<6.3", + "symfony/lock": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<6.3", + "symfony/mime": "<6.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4", + "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<5.4", + "symfony/security-csrf": "<5.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<5.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "doctrine/annotations": "^1.13.1|^2", + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/console": "^5.4.9|^6.0.9|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/html-sanitizer": "^6.1|^7.0", + "symfony/http-client": "^6.3|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/mailer": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.3|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^5.4|^6.0|^7.0", + "symfony/semaphore": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^5.4|^6.0|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.10|^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "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 a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-29T11:31:32+00:00" + }, + { + "name": "symfony/http-client", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/a67de2002d72f76ce7c57f830c4df503febc8d77", + "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.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|^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|^7.0", + "symfony/http-kernel": "^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" + }, + "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", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-04T16:42:50+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0384c62b79d96e9b22d77bc1272c9e83342ba3a6", + "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-01T20:07:31+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ceac681e74e824bbf90468eb231d40988d6d18a5", + "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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 a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-07T15:49:34+00:00" + }, + { + "name": "symfony/intl", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", + "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides access to the localization data of the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-24T13:57:00+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v6.4.24", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557", + "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/security-core": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v6.4.24" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:14:14+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.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": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/property-access", + "version": "v6.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "fedc771326d4978a7d3167fa009a509b06a2e168" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/fedc771326d4978a7d3167fa009a509b06a2e168", + "reference": "fedc771326d4978a7d3167fa009a509b06a2e168", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/cache": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v6.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-12T15:42:57+00:00" + }, + { + "name": "symfony/property-info", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/13243e748cb77b3d2300c0bffa21c2d325dd6e98", + "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/cache": "<5.4", + "symfony/dependency-injection": "<5.4|>=6.0,<6.4", + "symfony/serializer": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-29T16:02:37+00:00" + }, + { + "name": "symfony/proxy-manager-bridge", + "version": "v6.4.28", + "source": { + "type": "git", + "url": "https://github.com/symfony/proxy-manager-bridge.git", + "reference": "9ecac7f98ad685d474394dbd06dab29bab4e18a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/9ecac7f98ad685d474394dbd06dab29bab4e18a6", + "reference": "9ecac7f98ad685d474394dbd06dab29bab4e18a6", + "shasum": "" + }, + "require": { + "friendsofphp/proxy-manager-lts": "^1.0.2", + "php": ">=8.1", + "symfony/dependency-injection": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/config": "^6.1|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\ProxyManager\\": "" + }, + "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 integration for ProxyManager with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.28" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-02T18:11:54+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/ea50a13c2711eebcbb66b38ef6382e62e3262859", + "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-22T09:51:35+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "508e67e68156cf3cb2b982504191b2ce34daa921" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/508e67e68156cf3cb2b982504191b2ce34daa921", + "reference": "508e67e68156cf3cb2b982504191b2ce34daa921", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.1", + "symfony/clock": "^6.3|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.2", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.2|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/security-http": "^6.3.6|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/console": "<5.4", + "symfony/framework-bundle": "<6.4", + "symfony/http-client": "<5.4", + "symfony/ldap": "<5.4", + "symfony/serializer": "<6.4", + "symfony/twig-bundle": "<5.4", + "symfony/validator": "<6.4" + }, + "require-dev": { + "symfony/asset": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/twig-bridge": "^5.4|^6.0|^7.0", + "symfony/twig-bundle": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1", + "web-token/jwt-signature-algorithm-eddsa": "^3.1", + "web-token/jwt-signature-algorithm-hmac": "^3.1", + "web-token/jwt-signature-algorithm-none": "^3.1", + "web-token/jwt-signature-algorithm-rsa": "^3.1" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "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 a tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-04T18:05:02+00:00" + }, + { + "name": "symfony/security-core", + "version": "v6.4.27", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/673018434b38e504eb04ca3c6d7e2e7c86735bfb", + "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/event-dispatcher": "<5.4", + "symfony/http-foundation": "<5.4", + "symfony/ldap": "<5.4", + "symfony/security-guard": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<5.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.1|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/ldap": "^5.4|^6.0|^7.0", + "symfony/string": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/validator": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "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": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v6.4.27" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-23T19:49:35+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v6.4.24", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9a1efc8c10b86bcedc9233affd10c716b54ca1b7", + "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/security-core": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<5.4" + }, + "require-dev": { + "symfony/http-foundation": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "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": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v6.4.24" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:14:14+00:00" + }, + { + "name": "symfony/security-http", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/5705ae14ed77b38ac99990959d8c6dbcba86e513", + "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.2|^7.0", + "symfony/http-kernel": "^6.3|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/clock": "<6.3", + "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/http-client-contracts": "<3.0", + "symfony/security-bundle": "<5.4", + "symfony/security-csrf": "<5.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.3|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^3.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/security-csrf": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "web-token/jwt-checker": "^3.1", + "web-token/jwt-signature-algorithm-ecdsa": "^3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "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": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T13:33:48+00:00" + }, + { + "name": "symfony/serializer", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "d7976be554af097c788d7df25e10dd99facbfe65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/d7976be554af097c788d7df25e10dd99facbfe65", + "reference": "d7976be554af097c788d7df25e10dd99facbfe65", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<5.4", + "symfony/property-access": "<5.4", + "symfony/property-info": "<5.4.24|>=6,<6.2.11", + "symfony/uid": "<5.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/form": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.26|^6.3|^7.0", + "symfony/property-info": "^5.4.24|^6.2.11|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T13:46:18+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.24", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-10T08:14:14+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "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.5" + }, + "require-dev": { + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.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.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-21T18:03:05+00:00" + }, + { + "name": "symfony/validator", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/572dcc789ddf53174c61551aa5a3ec58d6a48b9b", + "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php83": "^1.27", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.13", + "doctrine/lexer": "<1.1", + "symfony/dependency-injection": "<5.4", + "symfony/expression-language": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/intl": "<5.4", + "symfony/property-info": "<5.4", + "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.13|^2", + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "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 to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v6.4.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-05T09:41:49+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a", + "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "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.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-25T15:37:27+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T09:57:09+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.30", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "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.30" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-02T11:50:18+00:00" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v2.6.5", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", + "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", + "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", + "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.5" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-09-03T19:41:28+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": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "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.2" + }, + "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-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "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.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+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": "doctrine/data-fixtures", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^3.1 || ^4.0", + "php": "^8.1", + "psr/log": "^1.1 || ^2 || ^3" + }, + "conflict": { + "doctrine/dbal": "<3.5 || >=5", + "doctrine/orm": "<2.14 || >=4", + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "doctrine/dbal": "^3.5 || ^4", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", + "doctrine/orm": "^2.14 || ^3", + "ext-sqlite3": "*", + "fig/log-test": "^1", + "phpstan/phpstan": "2.1.31", + "phpunit/phpunit": "10.5.45 || 12.4.0", + "symfony/cache": "^6.4 || ^7", + "symfony/var-exporter": "^6.4 || ^7" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "database" + ], + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/2.2.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%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2025-10-17T20:06:20+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.7.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "4c3dfcc819ba2725a574f4286aa3f6459f582d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/4c3dfcc819ba2725a574f4286aa3f6459f582d5b", + "reference": "4c3dfcc819ba2725a574f4286aa3f6459f582d5b", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.5 || ^2.0", + "doctrine/doctrine-bundle": "^2.2", + "doctrine/orm": "^2.14.0 || ^3.0", + "doctrine/persistence": "^2.4 || ^3.0 || ^4", + "php": "^7.4 || ^8.0", + "psr/log": "^1 || ^2 || ^3", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.48 || ^6.4.16 || ^7.1.9", + "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + }, + "conflict": { + "doctrine/dbal": "< 3" + }, + "require-dev": { + "doctrine/coding-standard": "14.0.0", + "phpstan/phpstan": "2.1.32", + "phpunit/phpunit": "^9.6.13 || 11.4.14", + "symfony/phpunit-bridge": "7.3.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "https://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.7.3" + }, + "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%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2025-12-03T15:47:21+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.3", + "source": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "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.3" + }, + "time": "2024-04-30T00:40:11+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "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.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+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.5", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "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.5" + }, + "time": "2025-12-06T11:45:25+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.6.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", + "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", + "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|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "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.6.5" + }, + "time": "2025-11-27T19:50:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "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.12.0" + }, + "time": "2025-11-21T15:09:14+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "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/2.3.0" + }, + "time": "2025-08-30T15:50:23+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.31", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "945d0b7f346a084ce5549e95289962972c4272e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", + "reference": "945d0b7f346a084ce5549e95289962972c4272e5", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "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.9", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", + "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.31" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-12-06T07:45:52+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.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "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.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-08-10T06:51:50+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.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "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.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:03:27+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "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.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2025-08-10T07:10:35+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.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", + "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.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-10T06:57: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": "symfony/phpunit-bridge", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] + }, + "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 utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "keywords": [ + "testing" + ], + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-12T08:37:02+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\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.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "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.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+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-1.x": "1.x-dev", + "dev-2.x": "2.x-dev", + "dev-3.x": "3.x-dev", + "dev-master": "4.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.12.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" + }, + "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.12.1" + }, + "time": "2025-10-29T15:56:20+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" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^8.4", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/app/config/bundles.php b/app/config/bundles.php index e05aa3f..a38b926 100644 --- a/app/config/bundles.php +++ b/app/config/bundles.php @@ -6,7 +6,6 @@ Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], - Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true], diff --git a/app/config/packages/doctrine.yaml b/app/config/packages/doctrine.yaml index fac0386..895dd7a 100644 --- a/app/config/packages/doctrine.yaml +++ b/app/config/packages/doctrine.yaml @@ -9,7 +9,7 @@ doctrine: mappings: App: is_bundle: false - type: annotation + type: attribute dir: '%kernel.project_dir%/src/Flags/Entity' prefix: 'App\Flags\Entity' alias: App \ No newline at end of file diff --git a/app/config/packages/lexik_jwt_authentication.yaml b/app/config/packages/lexik_jwt_authentication.yaml index 70d25d5..efdae4a 100644 --- a/app/config/packages/lexik_jwt_authentication.yaml +++ b/app/config/packages/lexik_jwt_authentication.yaml @@ -3,5 +3,5 @@ lexik_jwt_authentication: public_key: '%env(resolve:JWT_PUBLIC_KEY)%' pass_phrase: '%env(JWT_PASSPHRASE)%' token_ttl: '%env(JWT_TOKEN_TTL)%' - user_identity_field: sub + user_id_claim: sub # TODO - add public key from oauth server to reuse their accesstokens! diff --git a/app/config/packages/nelmio_cors.yaml b/app/config/packages/nelmio_cors.yaml deleted file mode 100644 index 5450d51..0000000 --- a/app/config/packages/nelmio_cors.yaml +++ /dev/null @@ -1,22 +0,0 @@ -nelmio_cors: - defaults: - origin_regex: true - allow_origin: ['*'] -# allow_origin: ['%env(CORS_ALLOW_ORIGIN)%'] - allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'] -# allow_headers: ['Content-Type', 'Authorization'] - allow_headers: ['*'] - expose_headers: ['Link'] - max_age: 3600 - forced_allow_origin_value: '*' - paths: - '^/': - origin_regex: true - allow_origin: ['*'] -# allow_origin: ['%env(CORS_ALLOW_ORIGIN)%'] - allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'] - # allow_headers: ['Content-Type', 'Authorization'] - allow_headers: ['*'] - expose_headers: ['Link'] - max_age: 3600 - forced_allow_origin_value: '*' diff --git a/app/public/index.php b/app/public/index.php index dd87b7a..b5a467b 100644 --- a/app/public/index.php +++ b/app/public/index.php @@ -16,7 +16,10 @@ } if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { - Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); + Request::setTrustedProxies( + explode(',', $trustedProxies), + Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO + ); } if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) { diff --git a/app/src/Flags/Controller/SecurityController.php b/app/src/Flags/Controller/SecurityController.php index 6546667..74dfeeb 100644 --- a/app/src/Flags/Controller/SecurityController.php +++ b/app/src/Flags/Controller/SecurityController.php @@ -23,6 +23,22 @@ public function login(ClientRegistry $clientRegistry) ->redirect(['openid', 'profile', 'email'], []); } + #[Route('/debug/headers', name: 'debug_headers')] + public function debugHeaders(Request $request): JsonResponse + { + return new JsonResponse([ + 'scheme' => $request->getScheme(), + 'isSecure' => $request->isSecure(), + 'host' => $request->getHost(), + 'clientIp' => $request->getClientIp(), + 'X-Forwarded-Proto' => $request->headers->get('X-Forwarded-Proto'), + 'X-Forwarded-For' => $request->headers->get('X-Forwarded-For'), + 'X-Forwarded-Host' => $request->headers->get('X-Forwarded-Host'), + 'trustedProxies' => Request::getTrustedProxies(), + 'server_HTTPS' => $_SERVER['HTTPS'] ?? 'not set', + ]); + } + #[Route('/oauth/check', name: 'oauth_check')] public function check() { diff --git a/app/src/Flags/Entity/Answer.php b/app/src/Flags/Entity/Answer.php index 90f05ba..3e8743a 100644 --- a/app/src/Flags/Entity/Answer.php +++ b/app/src/Flags/Entity/Answer.php @@ -3,52 +3,33 @@ namespace App\Flags\Entity; use Doctrine\ORM\Mapping as ORM; -use Doctrine\ORM\Mapping\ManyToOne; -use phpDocumentor\Reflection\Types\Integer; use Symfony\Component\Serializer\Annotation\Ignore; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\AnswerRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\AnswerRepository")] class Answer { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] protected int $id; - - /** - * @ORM\Column(type="integer") - */ + + #[ORM\Column(type: "integer")] protected int $timer; - - /** - * @ORM\Column(type="string", length=255) - */ + + #[ORM\Column(type: "string", length: 255)] protected string $flagCode; - - /** - * @ORM\Column(type="string", length=255) - */ + + #[ORM\Column(type: "string", length: 255)] protected string $answerOptions; - - /** - * @ORM\Column(type="boolean") - */ + + #[ORM\Column(type: "boolean")] protected bool $correct; - - /** - * @ORM\Column(type="datetime") - */ + + #[ORM\Column(type: "datetime")] protected \DateTime $date; - - /** - * Many features have one product. This is the owning side. - * @ManyToOne(targetEntity="User", inversedBy="answers") - * @Ignore - */ + + #[ORM\ManyToOne(targetEntity: "User", inversedBy: "answers")] + #[Ignore] protected ?User $user; /** @@ -58,7 +39,7 @@ public function getTimer(): int { return $this->timer; } - + /** * @param int $timer */ @@ -66,7 +47,7 @@ public function setTimer(int $timer): void { $this->timer = $timer; } - + /** * @return string */ @@ -74,7 +55,7 @@ public function getFlagCode(): string { return $this->flagCode; } - + /** * @param string $flagCode */ @@ -82,7 +63,7 @@ public function setFlagCode(string $flagCode): void { $this->flagCode = $flagCode; } - + /** * @return array */ @@ -90,7 +71,7 @@ public function getAnswerOptions(): string { return $this->answerOptions; } - + /** * @param array $answerOptions */ @@ -98,7 +79,7 @@ public function setAnswerOptions(array $answerOptions): void { $this->answerOptions = json_encode($answerOptions); } - + /** * @return bool */ @@ -106,7 +87,7 @@ public function isCorrect(): bool { return $this->correct; } - + /** * @param bool $correct */ @@ -114,7 +95,7 @@ public function setCorrect(bool $correct): void { $this->correct = $correct; } - + /** * @return \DateTime */ @@ -122,7 +103,7 @@ public function getDate(): \DateTime { return $this->date; } - + /** * @param \DateTime $date */ @@ -130,7 +111,7 @@ public function setDate(\DateTime $date): void { $this->date = $date; } - + /** * @return string */ @@ -138,7 +119,7 @@ public function getId(): string { return $this->id; } - + public function fromArray(array $array): self { $item = new static; @@ -147,10 +128,10 @@ public function fromArray(array $array): self $item->setTimer($array['time']); $item->setCorrect($array['correct']); $item->setDate((new \DateTime())->setTimestamp(round($array['answerDateTime']/1000))); - + return $item; } - + /** * @return User|null */ @@ -158,7 +139,7 @@ public function getUser(): ?User { return $this->user; } - + /** * @param User|null $user */ diff --git a/app/src/Flags/Entity/Capital.php b/app/src/Flags/Entity/Capital.php index 8ba83b7..c5869a0 100644 --- a/app/src/Flags/Entity/Capital.php +++ b/app/src/Flags/Entity/Capital.php @@ -4,36 +4,24 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\CapitalRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\CapitalRepository")] class Capital { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] private int $id; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $code; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $name; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $region; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $country; public function __construct(string $name, string $country, string $code, string $region) diff --git a/app/src/Flags/Entity/CapitalsStat.php b/app/src/Flags/Entity/CapitalsStat.php index f97f400..b5ef490 100644 --- a/app/src/Flags/Entity/CapitalsStat.php +++ b/app/src/Flags/Entity/CapitalsStat.php @@ -6,41 +6,27 @@ use Doctrine\ORM\Mapping as ORM; use DateTime; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\CapitalsStatRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\CapitalsStatRepository")] class CapitalsStat { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] protected int $id; - /** - * @ORM\Column(type="integer", length=255) - */ + #[ORM\Column(type: "integer", length: 255)] protected int $sessionTimer; - /** - * @ORM\Column(type="integer", length=255) - */ + #[ORM\Column(type: "integer", length: 255)] protected int $score; - /** - * @ORM\ManyToOne(targetEntity="App\Flags\Entity\User") - */ + #[ORM\ManyToOne(targetEntity: "App\Flags\Entity\User")] protected readonly User $user; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] protected string $gameType; - /** - * @ORM\Column(type="datetime") - */ + #[ORM\Column(type: "datetime")] protected readonly DateTime $created; public function __construct( diff --git a/app/src/Flags/Entity/Flag.php b/app/src/Flags/Entity/Flag.php index 820d1d2..03ad4a8 100644 --- a/app/src/Flags/Entity/Flag.php +++ b/app/src/Flags/Entity/Flag.php @@ -4,31 +4,21 @@ use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\FlagRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\FlagRepository")] class Flag { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] private int $id; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $code; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $shows = 0; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $correctGuesses = 0; @@ -72,7 +62,7 @@ public function getCorrectGuesses(): int { return $this->correctGuesses; } - + public function incrementCorrectAnswersCounter(): void { diff --git a/app/src/Flags/Entity/Game.php b/app/src/Flags/Entity/Game.php index 0cb656c..b33473d 100644 --- a/app/src/Flags/Entity/Game.php +++ b/app/src/Flags/Entity/Game.php @@ -5,31 +5,21 @@ use App\Flags\Entity\Enum\GameType; use Doctrine\ORM\Mapping as ORM; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\GameRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\GameRepository")] class Game { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] private int $id; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $type; - /** - * @ORM\ManyToOne(targetEntity="App\Flags\Entity\User") - */ + #[ORM\ManyToOne(targetEntity: "App\Flags\Entity\User")] private readonly User $user; - /** - * @ORM\Column(type="json") - */ + #[ORM\Column(type: "json")] private array $questions = []; public function __construct( diff --git a/app/src/Flags/Entity/Score.php b/app/src/Flags/Entity/Score.php index af0def5..0a70d46 100644 --- a/app/src/Flags/Entity/Score.php +++ b/app/src/Flags/Entity/Score.php @@ -6,39 +6,29 @@ use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\ScoreRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\ScoreRepository")] class Score { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] protected int $id; - - /** - * @ORM\Column(type="integer", length=255) - */ + + #[ORM\Column(type: "integer", length: 255)] protected int $sessionTimer; - - /** - * @ORM\Column(type="integer", length=255) - * @Assert\Type("integer") - */ + + #[ORM\Column(type: "integer", length: 255)] + #[Assert\Type("integer")] protected int $score; - - /** - * @ORM\Column(type="datetime") - */ + + #[ORM\Column(type: "datetime")] protected \DateTime $date; - + public function __construct() { $this->date = new \DateTime(); } - + /** * @return int|mixed */ @@ -46,7 +36,7 @@ public function getSessionTimer(): int { return $this->sessionTimer; } - + /** * @param int|mixed $sessionTimer */ @@ -54,7 +44,7 @@ public function setSessionTimer($sessionTimer): void { $this->sessionTimer = $sessionTimer; } - + /** * @return int|mixed */ @@ -62,7 +52,7 @@ public function getScore() { return $this->score; } - + /** * @param int|mixed $score */ @@ -70,13 +60,13 @@ public function setScore($score): void { $this->score = $score; } - + public function fromDTO(ScoreDTO $dto): self { $score = new static(); $score->setSessionTimer($dto->sessionTimer); $score->setScore($dto->score); - + return $score; } } diff --git a/app/src/Flags/Entity/User.php b/app/src/Flags/Entity/User.php index e59ffc7..3f621f8 100644 --- a/app/src/Flags/Entity/User.php +++ b/app/src/Flags/Entity/User.php @@ -6,75 +6,48 @@ use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Security\Core\User\UserInterface; -use Doctrine\ORM\Mapping\OneToMany; use Symfony\Component\Serializer\Annotation\Ignore; -/** - * @ORM\Entity(repositoryClass="App\Flags\Repository\UserRepository") - */ +#[ORM\Entity(repositoryClass: "App\Flags\Repository\UserRepository")] class User implements UserInterface { - /** - * @ORM\Id() - * @ORM\GeneratedValue() - * @ORM\Column(type="integer") - */ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: "integer")] private int $id; - /** - * @ORM\Column(type="string", length=255) - */ + #[ORM\Column(type: "string", length: 255)] private string $telegramId; - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ + #[ORM\Column(type: "string", length: 255, nullable: true)] private ?string $firstName; - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ + #[ORM\Column(type: "string", length: 255, nullable: true)] private ?string $lastName; - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ + #[ORM\Column(type: "string", length: 255, nullable: true)] private ?string $telegramUsername; - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ + #[ORM\Column(type: "string", length: 255, nullable: true)] private ?string $telegramPhotoUrl; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $highScore = 0; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $gamesTotal = 0; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $bestTime = 0; - /** - * @ORM\Column(type="integer") - */ + #[ORM\Column(type: "integer")] private int $timeTotal = 0; - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ + #[ORM\Column(type: "string", length: 255, nullable: true)] private ?string $sub = null; // OAuth2 subject identifier - /** - * @OneToMany(targetEntity="Answer", mappedBy="user", cascade={"persist"}) - * @Ignore - */ + #[ORM\OneToMany(targetEntity: "Answer", mappedBy: "user", cascade: ["persist"])] + #[Ignore] private ?Collection $answers; public function __construct() diff --git a/k8s-deployment/DEPLOYMENT-GUIDE.md b/k8s-deployment/DEPLOYMENT-GUIDE.md deleted file mode 100644 index 5fc1d67..0000000 --- a/k8s-deployment/DEPLOYMENT-GUIDE.md +++ /dev/null @@ -1,347 +0,0 @@ -# Flags App Deployment Quick Reference - -## File Structure -``` -flags-app/ -├── k8s/ -│ ├── 01-namespace-storage.yaml # Namespace + PV/PVC -│ ├── 02-mysql.yaml # MySQL deployment -│ ├── 03-backend-api.yaml # PHP + Caddy backend -│ └── 04-frontend.yaml # React frontend -├── deploy-flags.sh # Automated deployment -├── docker-compose.local.yaml # Local development -├── flags-api-php.Dockerfile # Updated with public key copy -└── flags-frontend-caddy.Dockerfile # React static server -``` - -## Pre-Deployment Checklist - -### 1. Copy Public Key from HQAUTH -```bash -# Manual method -cp /path/to/hqauth/config/jwt/public.pem /path/to/flags-api/config/jwt/public.pem - -# Or let the build script handle it -``` - -### 2. Update Secrets -Edit these files before deploying: - -**k8s/02-mysql.yaml:** -```yaml -stringData: - root-password: "CHANGE_ME_ROOT_PASSWORD" - database: "flags_db" - username: "flags_user" - password: "CHANGE_ME_USER_PASSWORD" -``` - -**k8s/03-backend-api.yaml:** -```yaml -stringData: - app-secret: "CHANGE_ME_APP_SECRET_32_CHARS_MIN" - database-url: "mysql://flags_user:CHANGE_ME_USER_PASSWORD@mysql:3306/flags_db?serverVersion=8.0&charset=utf8mb4" - oauth-client-id: "your-hqauth-client-id" - oauth-client-secret: "your-hqauth-client-secret" -``` - -### 3. Adjust NodePorts -Edit NodePort values in services (must be 30000-32767): -- Backend HTTP: 30080 → your choice -- Backend HTTPS: 30443 → your choice -- Frontend HTTP: 30081 → your choice -- Frontend HTTPS: 30444 → your choice - -## Deployment Commands - -### Option A: Automated Script -```bash -./deploy-flags.sh -``` - -### Option B: Manual Step-by-Step - -```bash -# 1. Create namespace and storage -kubectl apply -f k8s/01-namespace-storage.yaml - -# 2. Deploy MySQL -kubectl apply -f k8s/02-mysql.yaml - -# Wait for MySQL to be ready -kubectl wait --for=condition=ready pod -l app=mysql -n flags --timeout=120s - -# 3. Deploy backend API -kubectl apply -f k8s/03-backend-api.yaml - -# 4. Deploy frontend -kubectl apply -f k8s/04-frontend.yaml - -# 5. Check status -kubectl get all -n flags -``` - -## Building and Pushing Images - -### Backend API (PHP) -```bash -cd /path/to/flags-api - -# Copy public key first -cp ../hqauth/config/jwt/public.pem config/jwt/public.pem - -# Build PHP image -docker build \ - -f .docker/php-fpm/Dockerfile \ - -t ghcr.io/mainstreamer/flags-api-php:latest \ - --target production \ - . - -# Build Caddy image -docker build \ - -f .docker/caddy/Dockerfile \ - -t ghcr.io/mainstreamer/flags-api-caddy:latest \ - . - -# Push to registry -docker push ghcr.io/mainstreamer/flags-api-php:latest -docker push ghcr.io/mainstreamer/flags-api-caddy:latest -``` - -### Frontend -```bash -cd /path/to/flags-frontend - -# Build React app -npm run build - -# Build Caddy image with React build -docker build \ - -f Dockerfile.caddy \ - -t ghcr.io/mainstreamer/flags-frontend-caddy:latest \ - . - -# Push to registry -docker push ghcr.io/mainstreamer/flags-frontend-caddy:latest -``` - -## Database Initialization - -```bash -# Get PHP pod name -POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') - -# Run migrations -kubectl exec -n flags $POD -- bin/console doctrine:migrations:migrate --no-interaction - -# Verify -kubectl exec -n flags $POD -- bin/console doctrine:migrations:status - -# Load fixtures (if needed) -kubectl exec -n flags $POD -- bin/console doctrine:fixtures:load --no-interaction - -# Check database -kubectl exec -n flags $POD -- bin/console doctrine:query:sql "SELECT COUNT(*) FROM users" -``` - -## WireGuard Configuration - -After deployment, expose NodePorts via WireGuard: - -```bash -# Get NodePort values -kubectl get svc -n flags - -# Example output: -# flags-api-service NodePort 10.x.x.x 80:30080/TCP,443:30443/TCP -# flags-frontend-service NodePort 10.x.x.x 80:30081/TCP,443:30444/TCP -``` - -Configure WireGuard to forward: -- `api.flags.izeebot.top:443` → `k8s-node:30443` -- `flags.izeebot.top:443` → `k8s-node:30444` - -## Debugging Commands - -### Check Pod Status -```bash -kubectl get pods -n flags -kubectl describe pod -n flags -``` - -### View Logs -```bash -# Backend API -kubectl logs -n flags -l component=php --tail=100 -f -kubectl logs -n flags -l component=caddy --tail=100 -f - -# Frontend -kubectl logs -n flags -l app=flags-frontend --tail=100 -f - -# MySQL -kubectl logs -n flags -l app=mysql --tail=100 -f -``` - -### Exec Into Containers -```bash -# PHP container -POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') -kubectl exec -it -n flags $POD -- sh - -# Inside container: -bin/console debug:router -bin/console debug:config -env | grep DATABASE -``` - -### Test Connectivity -```bash -# Test MySQL from PHP pod -kubectl exec -n flags $POD -- bin/console doctrine:query:sql "SELECT 1" - -# Test API endpoints -kubectl run curl --image=curlimages/curl -i --tty --rm -- sh -curl http://flags-api-service.flags.svc.cluster.local -curl http://flags-frontend-service.flags.svc.cluster.local -``` - -### Check Services and Endpoints -```bash -kubectl get svc -n flags -kubectl get endpoints -n flags -kubectl describe svc flags-api-service -n flags -``` - -## Updating Deployments - -### Update Backend API -```bash -# Rebuild and push image -docker build -t ghcr.io/mainstreamer/flags-api-php:v1.0.1 . -docker push ghcr.io/mainstreamer/flags-api-php:v1.0.1 - -# Update deployment -kubectl set image deployment/flags-api-php -n flags \ - php-fpm=ghcr.io/mainstreamer/flags-api-php:v1.0.1 - -# Or force pull latest -kubectl rollout restart deployment/flags-api-php -n flags -``` - -### Update Frontend -```bash -# Rebuild and push -npm run build -docker build -t ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 . -docker push ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 - -# Update -kubectl set image deployment/flags-frontend -n flags \ - caddy=ghcr.io/mainstreamer/flags-frontend-caddy:v1.0.1 -``` - -### Update Secrets -```bash -# Edit directly -kubectl edit secret flags-api-secret -n flags -kubectl edit secret mysql-secret -n flags - -# Or apply from file -kubectl apply -f k8s/03-backend-api.yaml -``` - -## Local Development - -```bash -# Start local environment (mirrors K8s) -docker-compose -f docker-compose.local.yaml up -d - -# Run migrations locally -docker exec flags-api-php-local bin/console doctrine:migrations:migrate - -# Access services -# Backend API: http://localhost:8080 -# Frontend: http://localhost:3000 -# MySQL: localhost:3306 -# Redis: localhost:6379 -``` - -## Clean Up - -```bash -# Delete everything -kubectl delete namespace flags - -# Or delete individually -kubectl delete -f k8s/04-frontend.yaml -kubectl delete -f k8s/03-backend-api.yaml -kubectl delete -f k8s/02-mysql.yaml -kubectl delete -f k8s/01-namespace-storage.yaml - -# Clean up PV (manual) -sudo rm -rf /mnt/k8s-data/flags-mysql -``` - -## OAuth Integration Testing - -```bash -# Test OAuth discovery from K8s -POD=$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}') - -kubectl exec -n flags $POD -- curl https://auth.izeebot.top/.well-known/openid-configuration - -# Check OAuth routes -kubectl exec -n flags $POD -- bin/console debug:router | grep auth - -# Test OAuth login flow (from outside) -curl -v http://:30080/auth/login -``` - -## Common Issues - -### Issue: Pods not starting -```bash -kubectl describe pod -n flags -# Check: image pull errors, resource limits, secrets missing -``` - -### Issue: Database connection failed -```bash -# Check MySQL is ready -kubectl logs -n flags -l app=mysql - -# Test from PHP pod -kubectl exec -n flags $POD -- ping mysql -kubectl exec -n flags $POD -- nc -zv mysql 3306 -``` - -### Issue: Public key not found -```bash -# Verify key is in image -kubectl exec -n flags $POD -- ls -la config/jwt/ -kubectl exec -n flags $POD -- cat config/jwt/public.pem -``` - -### Issue: CORS errors -```bash -# Check CORS config in ConfigMap -kubectl get configmap flags-api-config -n flags -o yaml - -# Update and restart -kubectl edit configmap flags-api-config -n flags -kubectl rollout restart deployment/flags-api-caddy -n flags -``` - -## Monitoring - -```bash -# Watch all resources -watch kubectl get all -n flags - -# Resource usage -kubectl top pods -n flags -kubectl top nodes - -# Events -kubectl get events -n flags --sort-by='.lastTimestamp' -``` diff --git a/k8s-deployment/deploy-flags.sh b/k8s-deployment/deploy-flags.sh deleted file mode 100644 index 0680cb1..0000000 --- a/k8s-deployment/deploy-flags.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash -# Flags App Deployment Script - -set -e - -echo "=========================================" -echo "Flags App Kubernetes Deployment" -echo "=========================================" - -# Colors -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -# Configuration -NAMESPACE="flags" -HQAUTH_PUBLIC_KEY_PATH="../hqauth/config/jwt/public.pem" -FLAGS_API_PATH="../flags-api" -FLAGS_FRONTEND_PATH="../flags-frontend" - -# Step 1: Check prerequisites -echo -e "\n${YELLOW}Step 1: Checking prerequisites...${NC}" - -if ! command -v kubectl &> /dev/null; then - echo -e "${RED}kubectl not found. Please install kubectl first.${NC}" - exit 1 -fi - -if ! command -v docker &> /dev/null; then - echo -e "${RED}docker not found. Please install docker first.${NC}" - exit 1 -fi - -echo -e "${GREEN}✓ Prerequisites OK${NC}" - -# Step 2: Build and push images -echo -e "\n${YELLOW}Step 2: Building and pushing Docker images...${NC}" - -read -p "Build and push images? (y/n) " -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - - # Build backend API - echo -e "\n${YELLOW}Building flags-api-php...${NC}" - cd "$FLAGS_API_PATH" - - # Copy public key from HQAUTH - if [ -f "$HQAUTH_PUBLIC_KEY_PATH" ]; then - mkdir -p config/jwt - cp "$HQAUTH_PUBLIC_KEY_PATH" config/jwt/public.pem - echo -e "${GREEN}✓ Copied public key from HQAUTH${NC}" - else - echo -e "${RED}Warning: Public key not found at $HQAUTH_PUBLIC_KEY_PATH${NC}" - echo "Make sure to manually copy it to config/jwt/public.pem" - read -p "Continue anyway? (y/n) " -n 1 -r - echo - [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 - fi - - docker build -f .docker/php-fpm/Dockerfile -t ghcr.io/mainstreamer/flags-api-php:latest --target production . - docker push ghcr.io/mainstreamer/flags-api-php:latest - echo -e "${GREEN}✓ Pushed flags-api-php${NC}" - - # Build backend Caddy - echo -e "\n${YELLOW}Building flags-api-caddy...${NC}" - docker build -f .docker/caddy/Dockerfile -t ghcr.io/mainstreamer/flags-api-caddy:latest . - docker push ghcr.io/mainstreamer/flags-api-caddy:latest - echo -e "${GREEN}✓ Pushed flags-api-caddy${NC}" - - # Build frontend - echo -e "\n${YELLOW}Building flags-frontend...${NC}" - cd "$FLAGS_FRONTEND_PATH" - - # Build React app - npm run build - echo -e "${GREEN}✓ Built React app${NC}" - - # Build and push frontend Caddy - docker build -f Dockerfile.caddy -t ghcr.io/mainstreamer/flags-frontend-caddy:latest . - docker push ghcr.io/mainstreamer/flags-frontend-caddy:latest - echo -e "${GREEN}✓ Pushed flags-frontend-caddy${NC}" -fi - -# Step 3: Apply Kubernetes manifests -echo -e "\n${YELLOW}Step 3: Applying Kubernetes manifests...${NC}" - -read -p "Apply K8s manifests? (y/n) " -n 1 -r -echo -if [[ $REPLY =~ ^[Yy]$ ]]; then - - # Apply in order - kubectl apply -f k8s/01-namespace-storage.yaml - echo -e "${GREEN}✓ Created namespace and storage${NC}" - - sleep 2 - - kubectl apply -f k8s/02-mysql.yaml - echo -e "${GREEN}✓ Deployed MySQL${NC}" - - # Wait for MySQL to be ready - echo "Waiting for MySQL to be ready..." - kubectl wait --for=condition=ready pod -l app=mysql -n "$NAMESPACE" --timeout=120s - - kubectl apply -f k8s/03-backend-api.yaml - echo -e "${GREEN}✓ Deployed backend API${NC}" - - kubectl apply -f k8s/04-frontend.yaml - echo -e "${GREEN}✓ Deployed frontend${NC}" - - echo -e "\n${GREEN}✓ All manifests applied${NC}" -fi - -# Step 4: Display status -echo -e "\n${YELLOW}Step 4: Checking deployment status...${NC}" -kubectl get all -n "$NAMESPACE" - -echo -e "\n${YELLOW}NodePort services:${NC}" -kubectl get svc -n "$NAMESPACE" -o wide - -# Step 5: Instructions -echo -e "\n${GREEN}=========================================${NC}" -echo -e "${GREEN}Deployment Complete!${NC}" -echo -e "${GREEN}=========================================${NC}" - -echo -e "\n${YELLOW}Next steps:${NC}" -echo "1. Update your secrets:" -echo " kubectl edit secret mysql-secret -n flags" -echo " kubectl edit secret flags-api-secret -n flags" -echo "" -echo "2. Initialize database (run ONCE):" -echo " POD=\$(kubectl get pod -n flags -l component=php -o jsonpath='{.items[0].metadata.name}')" -echo " kubectl exec -n flags \$POD -- bin/console doctrine:migrations:migrate --no-interaction" -echo "" -echo "3. Configure WireGuard to expose NodePorts:" -BACKEND_HTTP=$(kubectl get svc flags-api-service -n flags -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') -BACKEND_HTTPS=$(kubectl get svc flags-api-service -n flags -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') -FRONTEND_HTTP=$(kubectl get svc flags-frontend-service -n flags -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') -FRONTEND_HTTPS=$(kubectl get svc flags-frontend-service -n flags -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') - -echo " Backend API: NodePort HTTP=$BACKEND_HTTP HTTPS=$BACKEND_HTTPS" -echo " Frontend: NodePort HTTP=$FRONTEND_HTTP HTTPS=$FRONTEND_HTTPS" -echo "" -echo "4. Test endpoints:" -echo " curl http://:$BACKEND_HTTP" -echo " curl http://:$FRONTEND_HTTP" -echo "" -echo "5. Check logs:" -echo " kubectl logs -n flags -l app=flags-api --tail=100 -f" -echo " kubectl logs -n flags -l app=flags-frontend --tail=100 -f" - -echo -e "\n${GREEN}Done!${NC}" diff --git a/k8s-deployment/flags-api-php.Dockerfile b/k8s-deployment/flags-api-php.Dockerfile deleted file mode 100644 index 2fbabe7..0000000 --- a/k8s-deployment/flags-api-php.Dockerfile +++ /dev/null @@ -1,148 +0,0 @@ -# ========================================== -# Base stage - shared foundation -# ========================================== -FROM php:8.4-fpm-alpine AS base - -# Copy the PHP extension installer (uses pre-built binaries when available) -COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ - -# Install all extensions in one command - MUCH faster -RUN install-php-extensions \ - pdo_mysql \ - intl \ - opcache \ - gd \ - xml \ - mbstring \ - zip \ - redis - -# Install Composer -COPY --from=composer:2 /usr/bin/composer /usr/bin/composer - -WORKDIR /var/www/html - -# ========================================== -# Development stage -# ========================================== -FROM base AS development - -ARG USER_ID=1000 -ARG GROUP_ID=1000 - -RUN apk add --no-cache git curl wget vim bash - -RUN { \ - echo 'memory_limit = 256M'; \ - echo 'upload_max_filesize = 2M'; \ - echo 'post_max_size = 8M'; \ - echo 'max_execution_time = 30'; \ - echo 'date.timezone = UTC'; \ - echo 'opcache.enable = 1'; \ - echo 'opcache.enable_cli = 1'; \ - echo 'opcache.validate_timestamps = 1'; \ - echo 'opcache.revalidate_freq = 0'; \ - echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ - echo 'display_errors = On'; \ - echo 'error_reporting = E_ALL'; \ - echo 'log_errors = On'; \ -} > /usr/local/etc/php/conf.d/custom.ini - -RUN deluser www-data 2>/dev/null || true && \ - addgroup -g ${GROUP_ID} www-data && \ - adduser -u ${USER_ID} -G www-data -s /bin/sh -D www-data && \ - chown -R www-data:www-data /var/www - -USER www-data - -RUN wget https://get.symfony.com/cli/installer -O - | bash || true && \ - if [ -f ~/.symfony5/bin/symfony ]; then \ - mkdir -p ~/bin && mv ~/.symfony5/bin/symfony ~/bin/symfony; \ - fi - -ENV PATH="/home/www-data/bin:${PATH}" - -EXPOSE 9000 -CMD ["php-fpm"] - -# ========================================== -# Builder stage -# ========================================== -FROM base AS builder - -RUN apk add --no-cache git - -RUN { \ - echo 'memory_limit = 256M'; \ - echo 'opcache.enable = 1'; \ - echo 'opcache.enable_cli = 0'; \ - echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ - echo 'display_errors = Off'; \ - echo 'log_errors = On'; \ -} > /usr/local/etc/php/conf.d/custom.ini - -# Copy composer files for layer caching -COPY --chown=www-data:www-data ./composer.json ./composer.lock* ./symfony.lock* ./ - -# USE BUILDKIT CACHE for Composer - HUGE speedup -RUN --mount=type=cache,target=/tmp/composer \ - COMPOSER_CACHE_DIR=/tmp/composer \ - composer install \ - --no-dev \ - --no-scripts \ - --no-interaction \ - --prefer-dist \ - --optimize-autoloader \ - --classmap-authoritative - -# Copy application code -COPY --chown=www-data:www-data . . - -# === COPY PUBLIC KEY FROM HQAUTH PROJECT === -# This assumes you're building with a build context that includes the HQAUTH public key -# Example: docker build --build-arg HQAUTH_PUBLIC_KEY="$(cat /path/to/hqauth/config/jwt/public.pem)" . -# OR mount it during build if on same machine -# For now, copy from a known location - adjust path as needed -ARG OAUTH_PUBLIC_KEY_PATH=../hqauth/config/jwt/public.pem -COPY ${OAUTH_PUBLIC_KEY_PATH} ./config/jwt/public.pem - -RUN composer dump-autoload --optimize --classmap-authoritative - -# Skip cache warmup - do it at runtime instead (saves build time) -RUN chown -R www-data:www-data var/ - -# ========================================== -# Production stage -# ========================================== -FROM base AS production - -RUN { \ - echo 'memory_limit = 256M'; \ - echo 'opcache.enable = 1'; \ - echo 'opcache.memory_consumption = 256'; \ - echo 'opcache.validate_timestamps = 0'; \ - echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ - echo 'display_errors = Off'; \ - echo 'log_errors = On'; \ -} > /usr/local/etc/php/conf.d/custom.ini - -# Copy from builder -COPY --from=builder --chown=www-data:www-data /var/www/html ./ - -# Remove dev files -RUN rm -rf tests/ .git/ .github/ .env.local .env.*.local \ - docker-compose.yml Dockerfile Makefile *.md phpunit.xml* \ - /usr/local/bin/composer \ - && mkdir -p var/cache var/log \ - && bin/console cache:clear --env=prod --no-warmup \ - && php bin/console cache:warmup --env=prod \ - && chown -R www-data:www-data var/ - -ENV APP_ENV=prod APP_DEBUG=0 - -USER www-data -EXPOSE 9000 -CMD ["php-fpm"] diff --git a/k8s-deployment/flags-frontend-caddy.Dockerfile b/k8s-deployment/flags-frontend-caddy.Dockerfile deleted file mode 100644 index 24e52ec..0000000 --- a/k8s-deployment/flags-frontend-caddy.Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -# ========================================== -# Frontend Caddy - Serves React Static Files -# ========================================== -FROM caddy:2-alpine - -# Copy the built React app -COPY build/ /usr/share/caddy/ - -# Create Caddyfile for serving React SPA -RUN echo 'flags.izeebot.top {' > /etc/caddy/Caddyfile && \ - echo ' root * /usr/share/caddy' >> /etc/caddy/Caddyfile && \ - echo ' encode gzip' >> /etc/caddy/Caddyfile && \ - echo ' file_server' >> /etc/caddy/Caddyfile && \ - echo ' try_files {path} /index.html' >> /etc/caddy/Caddyfile && \ - echo ' header {' >> /etc/caddy/Caddyfile && \ - echo ' # Security headers' >> /etc/caddy/Caddyfile && \ - echo ' X-Content-Type-Options "nosniff"' >> /etc/caddy/Caddyfile && \ - echo ' X-Frame-Options "DENY"' >> /etc/caddy/Caddyfile && \ - echo ' Referrer-Policy "strict-origin-when-cross-origin"' >> /etc/caddy/Caddyfile && \ - echo ' }' >> /etc/caddy/Caddyfile && \ - echo '}' >> /etc/caddy/Caddyfile - -EXPOSE 80 -EXPOSE 443 - -CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] From 66fb4c7927f4cf478875e8804b73d22c4728ffa3 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Tue, 23 Dec 2025 18:43:45 +0000 Subject: [PATCH 16/25] k8s setup 1-st working version --- .docker/caddy/Caddyfile.prod | 55 +++++++++++++++++++ .docker/php-fpm/Dockerfile | 4 +- app/config/packages/framework.yaml | 4 ++ .../Flags/Security/HqAuthAuthenticator.php | 11 +++- k8s/configmap.yaml | 2 + k8s/cors-middleware.yaml | 32 +++++++++++ k8s/deploy.sh | 4 ++ k8s/ingress.yaml | 7 +-- 8 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 .docker/caddy/Caddyfile.prod create mode 100644 k8s/cors-middleware.yaml diff --git a/.docker/caddy/Caddyfile.prod b/.docker/caddy/Caddyfile.prod new file mode 100644 index 0000000..dd5f762 --- /dev/null +++ b/.docker/caddy/Caddyfile.prod @@ -0,0 +1,55 @@ +{ + servers { + trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 + } +} + +:80 { + # 1. Health check (stays separate) + handle /health { + respond "OK" 200 + } + + # 2. Wrap everything else in a route + route { + # Force CORS headers on ALL responses (GET, POST, etc.) + header { + Access-Control-Allow-Origin "https://flags.izeebot.top" + Access-Control-Allow-Credentials "true" + Access-Control-Expose-Headers "Authorization" + Vary Origin + } + + # Handle Preflight separately + @options method OPTIONS + handle @options { + header Access-Control-Allow-Origin "https://flags.izeebot.top" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Credentials "true" + header Access-Control-Max-Age "1728000" + header Access-Control-Allow-Headers "Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, X-API-KEY" + respond 204 + } + + # 3. Security & Compression + encode gzip zstd + header { + X-Content-Type-Options "nosniff" + X-Frame-Options "SAMEORIGIN" + Referrer-Policy "strict-origin-when-cross-origin" + } + + # 4. Proxy to Symfony + reverse_proxy php:59000 { + transport fastcgi { + root /var/www/html/public + env SCRIPT_FILENAME /var/www/html/public/index.php + } + } + } + + log { + output stdout + format json + } +} diff --git a/.docker/php-fpm/Dockerfile b/.docker/php-fpm/Dockerfile index a2b35ba..0d5d9ae 100644 --- a/.docker/php-fpm/Dockerfile +++ b/.docker/php-fpm/Dockerfile @@ -8,7 +8,7 @@ COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr # Install all extensions in one command - MUCH faster RUN install-php-extensions \ - pdo_pgsql \ + pdo_mysql \ intl \ opcache \ gd \ @@ -130,7 +130,7 @@ RUN { \ echo 'opcache.memory_consumption = 256'; \ echo 'opcache.validate_timestamps = 0'; \ echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'session.save_path = "tcp://redis.flaux.svc.cluster.local:6379"'; \ echo 'display_errors = Off'; \ echo 'log_errors = On'; \ } > /usr/local/etc/php/conf.d/custom.ini diff --git a/app/config/packages/framework.yaml b/app/config/packages/framework.yaml index 6089f4b..b679507 100644 --- a/app/config/packages/framework.yaml +++ b/app/config/packages/framework.yaml @@ -10,6 +10,10 @@ framework: cookie_secure: auto cookie_samesite: lax + # Trust proxy headers (k8s, Caddy, ngrok) + trusted_proxies: '127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16' + trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-port', 'x-forwarded-proto'] + #esi: true #fragments: true php_errors: diff --git a/app/src/Flags/Security/HqAuthAuthenticator.php b/app/src/Flags/Security/HqAuthAuthenticator.php index 8a821b8..7f39c69 100644 --- a/app/src/Flags/Security/HqAuthAuthenticator.php +++ b/app/src/Flags/Security/HqAuthAuthenticator.php @@ -182,7 +182,16 @@ public function onAuthenticationSuccess(Request $request, TokenInterface $token, public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { - return new RedirectResponse($this->router->generate('app_login')); + // DEBUG: Log the actual error + error_log('OAuth authentication failed: ' . $exception->getMessage()); + error_log('Previous exception: ' . ($exception->getPrevious() ? $exception->getPrevious()->getMessage() : 'none')); + + // Temporarily return error instead of redirect loop + return new JsonResponse([ + 'error' => 'authentication_failed', + 'message' => $exception->getMessage(), + 'previous' => $exception->getPrevious() ? $exception->getPrevious()->getMessage() : null, + ], 401); } // private function loadOrCreateUser($userInfo) diff --git a/k8s/configmap.yaml b/k8s/configmap.yaml index a0ba63c..d00984e 100644 --- a/k8s/configmap.yaml +++ b/k8s/configmap.yaml @@ -21,3 +21,5 @@ data: # PHP-FPM service discovery PHP_FPM_HOST: "php" PHP_FPM_PORT: "59000" + # Trust all private network ranges (Traefik -> Caddy -> PHP) + TRUSTED_PROXIES: "127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" diff --git a/k8s/cors-middleware.yaml b/k8s/cors-middleware.yaml new file mode 100644 index 0000000..35ac1e4 --- /dev/null +++ b/k8s/cors-middleware.yaml @@ -0,0 +1,32 @@ +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: cors-headers + namespace: flags-api +spec: + headers: + accessControlAllowMethods: + - "GET" + - "POST" + - "PUT" + - "DELETE" + - "PATCH" + - "OPTIONS" + accessControlAllowHeaders: + - "Authorization" + - "Content-Type" + - "Accept" + - "Origin" + - "User-Agent" + - "DNT" + - "Cache-Control" + - "X-Mx-ReqToken" + - "Keep-Alive" + - "X-Requested-With" + - "If-Modified-Since" + accessControlAllowOriginList: + - "https://flags.izeebot.top" + accessControlAllowCredentials: true + accessControlExposeHeaders: + - "Authorization" + accessControlMaxAge: 1728000 diff --git a/k8s/deploy.sh b/k8s/deploy.sh index 46456c5..84944f2 100755 --- a/k8s/deploy.sh +++ b/k8s/deploy.sh @@ -69,6 +69,10 @@ kubectl apply -f caddy-deployment.yaml echo "Applying services..." kubectl apply -f services.yaml +# Apply CORS middleware (required for Traefik) +echo "Applying CORS middleware..." +kubectl apply -f cors-middleware.yaml + # Apply ingress (optional) echo "Applying ingress..." kubectl apply -f ingress.yaml diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml index 6ffbcf3..0040659 100644 --- a/k8s/ingress.yaml +++ b/k8s/ingress.yaml @@ -7,10 +7,7 @@ metadata: app.kubernetes.io/name: flags-api app.kubernetes.io/part-of: flags-quiz annotations: - # Uncomment for nginx ingress controller - # kubernetes.io/ingress.class: nginx - # nginx.ingress.kubernetes.io/ssl-redirect: "true" - + traefik.ingress.kubernetes.io/router.middlewares: flags-api-cors-headers@kubernetescrd # Uncomment for cert-manager TLS # cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: @@ -20,7 +17,7 @@ spec: # - api.flags.example.com # secretName: flags-api-tls rules: - - host: api.flags.example.com # Change to your domain + - host: api.flags.izeebot.top # Change to your domain http: paths: - path: / From 2683d6a70bde3e0f7e10b005cb1ce0199b996044 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Tue, 23 Dec 2025 21:49:35 +0000 Subject: [PATCH 17/25] basic refactoring of GameController + psalm config + migration update + requests.http --- .docker/caddy/Caddyfile.prod.original | 55 - .docker/mysql57/Dockerfile | 11 - .docker/mysql57/my.cnf | 5 - .docker/php-fpm.old/Dockerfile | 13 - .docker/php-fpm.old/Dockerfile-base | 58 - .docker/php-fpm.old/build.md | 3 - .docker/php-fpm.old/php.ini | 4 - app/.env.staging | 39 - app/composer.json | 2 +- app/composer.lock | 1640 ++- app/composer.lock.old | 9366 ----------------- app/config/jwt/pair/private.pem | 30 - app/config/jwt/pair/public.pem | 9 - app/config/packages/secrity.yaml | 19 +- app/config/services.yaml | 10 + app/docker-compose-prod.yml | 39 - app/docker-compose-staging.yml | 48 - app/docker-compose.override.yml | 6 +- app/docker-compose.yml | 13 - app/http-requests/flags-correct.http | 4 + app/http-requests/flags-scores.http | 6 + app/http-requests/http-client.env.json | 4 +- app/makefile | 17 +- app/migrations/Version20200322114725.php | 4 +- app/migrations/Version20210103221647.php | 4 +- app/migrations/Version20210109193151.php | 4 +- app/migrations/Version20210109213855.php | 4 +- app/migrations/Version20210109232957.php | 4 +- app/migrations/Version20210109233702.php | 4 +- app/migrations/Version20210110000325.php | 4 +- .../EventListener/JsonExceptionListener.php | 45 + .../JwtAuthenticationFailureListener.php | 46 + app/src/Flags/Controller/GameController.php | 70 +- app/test | 1 - 34 files changed, 1478 insertions(+), 10113 deletions(-) delete mode 100644 .docker/caddy/Caddyfile.prod.original delete mode 100644 .docker/mysql57/Dockerfile delete mode 100644 .docker/mysql57/my.cnf delete mode 100644 .docker/php-fpm.old/Dockerfile delete mode 100644 .docker/php-fpm.old/Dockerfile-base delete mode 100644 .docker/php-fpm.old/build.md delete mode 100644 .docker/php-fpm.old/php.ini delete mode 100644 app/.env.staging delete mode 100644 app/composer.lock.old delete mode 100644 app/config/jwt/pair/private.pem delete mode 100644 app/config/jwt/pair/public.pem delete mode 100644 app/docker-compose-prod.yml delete mode 100644 app/docker-compose-staging.yml create mode 100644 app/http-requests/flags-correct.http create mode 100644 app/http-requests/flags-scores.http create mode 100644 app/src/EventListener/JsonExceptionListener.php create mode 100644 app/src/EventListener/JwtAuthenticationFailureListener.php delete mode 100644 app/test diff --git a/.docker/caddy/Caddyfile.prod.original b/.docker/caddy/Caddyfile.prod.original deleted file mode 100644 index ee5d823..0000000 --- a/.docker/caddy/Caddyfile.prod.original +++ /dev/null @@ -1,55 +0,0 @@ -{ - # Trust proxies from internal/VPN networks - servers { - trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 - } -} - -:80 { - # Health check (handle locally before proxy) - @health path /health - handle @health { - respond "OK" 200 - } - - # CORS preflight - @options method OPTIONS - handle @options { - header Access-Control-Allow-Origin "https://flags.izeebot.top" - header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" - header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since" - header Access-Control-Allow-Credentials "true" - header Access-Control-Expose-Headers "Authorization" - header Access-Control-Max-Age "1728000" - respond 204 - } - - # CORS headers for all responses - header Access-Control-Allow-Origin "https://flags.izeebot.top" - header Access-Control-Allow-Credentials "true" - header Access-Control-Expose-Headers "Authorization" - - # Compression - encode gzip zstd - - # Security headers - header X-Content-Type-Options "nosniff" - header X-Frame-Options "SAMEORIGIN" - header Referrer-Policy "strict-origin-when-cross-origin" - - # Proxy everything to PHP-FPM (Symfony front controller) - reverse_proxy php:59000 { - transport fastcgi { - root /var/www/html/public - env SCRIPT_FILENAME /var/www/html/public/index.php - env HTTPS {http.request.header.X-Forwarded-Proto} - env SERVER_PORT {http.request.header.X-Forwarded-Port} - } - } - - # Logging - log { - output stdout - format json - } -} diff --git a/.docker/mysql57/Dockerfile b/.docker/mysql57/Dockerfile deleted file mode 100644 index 4f62d4d..0000000 --- a/.docker/mysql57/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM mysql:5.7.20 - -RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone - -RUN chown -R mysql:root /var/lib/mysql/ - -ADD .docker/mysql57/my.cnf /etc/mysql/conf.d/my.cnf - -CMD ["mysqld"] - -EXPOSE 3306 \ No newline at end of file diff --git a/.docker/mysql57/my.cnf b/.docker/mysql57/my.cnf deleted file mode 100644 index 3df2eab..0000000 --- a/.docker/mysql57/my.cnf +++ /dev/null @@ -1,5 +0,0 @@ -[mysql] - -[mysqld] -sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" -character-set-server=utf8 diff --git a/.docker/php-fpm.old/Dockerfile b/.docker/php-fpm.old/Dockerfile deleted file mode 100644 index 215a2e5..0000000 --- a/.docker/php-fpm.old/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM swiftcode/flags:php-fpm-latest - -ARG KEY - -RUN echo "$KEY" | base64 -d > /home/www-data/.ssh/id_rsa -RUN chmod 0600 /home/www-data/.ssh/id_rsa -RUN chown -R www-data:www-data /home/www-data/.ssh -USER www-data -WORKDIR /var/www/webapp -RUN export GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no" && git clone git@github.com:mainstreamer/flags-api.git . -RUN cp .env.prod .env -RUN composer install --no-ansi --no-dev --no-interaction --no-plugins --no-progress --no-scripts --optimize-autoloader --classmap-authoritative -RUN rm /home/www-data/.ssh/id_rsa diff --git a/.docker/php-fpm.old/Dockerfile-base b/.docker/php-fpm.old/Dockerfile-base deleted file mode 100644 index 154d2a4..0000000 --- a/.docker/php-fpm.old/Dockerfile-base +++ /dev/null @@ -1,58 +0,0 @@ -FROM php:8.2.1-fpm-alpine3.17 - -RUN echo http://nl.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories; \ - echo http://dl-2.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories; \ - echo http://dl-3.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories; \ - echo http://dl-4.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories; \ - echo http://dl-5.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories - -RUN apk add --update \ - acl \ - sudo \ - bash \ - shadow \ - postgresql-dev \ - mc \ - openssl \ - mysql-client \ - libpng-dev \ - grep \ - git \ - tcpdump \ - libzip-dev \ - openrc \ - openssh - -RUN docker-php-ext-configure pcntl --enable-pcntl - -RUN docker-php-ext-install pdo pdo_mysql pdo_pgsql \ - calendar \ - zip \ - intl \ - sodium - -RUN apk add --no-cache $PHPIZE_DEPS \ - && apk del --purge autoconf g++ make \ - && apk add --no-cache --update rabbitmq-c-dev \ - && apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS \ - && pecl install -o -f amqp \ - && docker-php-ext-enable amqp \ - && apk del .phpize-deps - -RUN apk add --no-cache pcre-dev $PHPIZE_DEPS \ - && pecl install redis \ - && docker-php-ext-enable redis.so - -RUN rm -rf /var/cache/apk/* && rm -rf /tmp/* -COPY .docker/php-fpm/php.ini /usr/local/etc/php/php.ini -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer -RUN groupmod -g 1000 www-data -RUN usermod -u 1000 www-data -RUN mkdir -p /var/www/webapp -RUN chown -R 1000:1000 /var/www/webapp -RUN mkdir -p /home/www-data/.ssh \ - && chmod 0700 /home/www-data/.ssh -RUN chown -R www-data:www-data /home/www-data -RUN useradd -g root www-data & groups - -EXPOSE 9000 \ No newline at end of file diff --git a/.docker/php-fpm.old/build.md b/.docker/php-fpm.old/build.md deleted file mode 100644 index b372746..0000000 --- a/.docker/php-fpm.old/build.md +++ /dev/null @@ -1,3 +0,0 @@ -docker build -f .docker/php-fpm/Dockerfile-base -t swiftcode/flags:php-fpm-1.2 -t swiftcode/flags:php-fpm-latest . -docker push swiftcode/flags:php-fpm-1.2 -docker push swiftcode/flags:php-fpm-latest diff --git a/.docker/php-fpm.old/php.ini b/.docker/php-fpm.old/php.ini deleted file mode 100644 index 222d4c5..0000000 --- a/.docker/php-fpm.old/php.ini +++ /dev/null @@ -1,4 +0,0 @@ -memory_limit=-1 -max_execution_time=0 -upload_max_filesize=20M -post_max_size=20M \ No newline at end of file diff --git a/app/.env.staging b/app/.env.staging deleted file mode 100644 index 892eca6..0000000 --- a/app/.env.staging +++ /dev/null @@ -1,39 +0,0 @@ -# In all environments, the following files are loaded if they exist, -# the latter taking precedence over the former: -# -# * .env contains default values for the environment variables needed by the app -# * .env.local uncommitted file with local overrides -# * .env.$APP_ENV committed environment-specific defaults -# * .env.$APP_ENV.local uncommitted environment-specific overrides -# -# Real environment variables win over .env files. -# -# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. -# -# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). -# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration - -GITH_KEY= -IMAGE=swiftcode/flags -PROJECT_NAME=flags-api -GIT_URL=git@github.com:mainstreamer/flags-api.git -BRANCH='feat/secrets' -GIT_REMOTE_URL=git@github.com:mainstreamer/docker-config.git -CODE_PATH=code -APP_ENV=staging -APP_SECRET=2b7d3cdbcb5e5a8117488547044f9e7b -CORS_ALLOW_ORIGIN=* -# Trust proxies for HTTPS detection (Traefik/Caddy -> PHP) -TRUSTED_PROXIES=127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - -###> doctrine/doctrine-bundle ### -# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url -# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" -# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" -# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -###> lexik/jwt-authentication-bundle ### -JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem -JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem -JWT_PASSPHRASE=c6be11833f7971fab179b813c964d616 -JWT_TOKEN_TTL=3600000 -###< lexik/jwt-authentication-bundle ### diff --git a/app/composer.json b/app/composer.json index 3888a8d..a2031cb 100644 --- a/app/composer.json +++ b/app/composer.json @@ -84,6 +84,6 @@ "phpunit/phpunit": "^9.6", "symfony/contracts": "*", "symfony/phpunit-bridge": "^6.3", - "vimeo/psalm": "^4.4" + "vimeo/psalm": "^6.0" } } diff --git a/app/composer.lock b/app/composer.lock index 8f134bb..16296f3 100644 --- a/app/composer.lock +++ b/app/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": "3bcf407ff3e1e76f57b26bcd7f14c3ea", + "content-hash": "64e04b77266413641c5848f0dcb538dd", "packages": [ { "name": "composer/package-versions-deprecated", @@ -6132,38 +6132,36 @@ "packages-dev": [ { "name": "amphp/amp", - "version": "v2.6.5", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207" + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", - "reference": "d7dda98dae26e56f3f6fcfbf1c1f819c9a993207", + "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "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" + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23.1" }, "type": "library", "autoload": { "files": [ - "lib/functions.php", - "lib/Internal/functions.php" + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" ], "psr-4": { - "Amp\\": "lib" + "Amp\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6171,10 +6169,6 @@ "MIT" ], "authors": [ - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" @@ -6186,6 +6180,10 @@ { "name": "Niklas Keller", "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], "description": "A non-blocking concurrency framework for PHP applications.", @@ -6202,9 +6200,8 @@ "promise" ], "support": { - "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.5" + "source": "https://github.com/amphp/amp/tree/v3.1.1" }, "funding": [ { @@ -6212,41 +6209,694 @@ "type": "github" } ], - "time": "2025-09-03T19:41:28+00:00" + "time": "2025-08-27T21:42:00+00:00" }, { "name": "amphp/byte-stream", - "version": "v1.8.2", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/parser": "^1.1", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2.3" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "src" + } + }, + "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/v2.1.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-03-16T17:10:27+00:00" + }, + { + "name": "amphp/cache", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/cache.git", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A fiber-aware cache API based on Amp and Revolt.", + "homepage": "https://amphp.org/cache", + "support": { + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v2.0.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:38:06+00:00" + }, + { + "name": "amphp/dns", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/dns.git", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/process": "^2", + "daverandom/libdns": "^2.0.2", + "ext-filter": "*", + "ext-json": "*", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + } + ], + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", + "keywords": [ + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" + ], + "support": { + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-01-19T15:43:40+00:00" + }, + { + "name": "amphp/parallel", + "version": "v2.3.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/parallel.git", + "reference": "296b521137a54d3a02425b464e5aee4c93db2c60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60", + "reference": "296b521137a54d3a02425b464e5aee4c93db2c60", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/pipeline": "^1", + "amphp/process": "^2", + "amphp/serialization": "^1", + "amphp/socket": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" + }, + "type": "library", + "autoload": { + "files": [ + "src/Context/functions.php", + "src/Context/Internal/functions.php", + "src/Ipc/functions.php", + "src/Worker/functions.php" + ], + "psr-4": { + "Amp\\Parallel\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Parallel processing component for Amp.", + "homepage": "https://github.com/amphp/parallel", + "keywords": [ + "async", + "asynchronous", + "concurrent", + "multi-processing", + "multi-threading" + ], + "support": { + "issues": "https://github.com/amphp/parallel/issues", + "source": "https://github.com/amphp/parallel/tree/v2.3.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-11-15T06:23:42+00:00" + }, + { + "name": "amphp/parser", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Parser\\": "src" + } + }, + "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 generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", + "keywords": [ + "async", + "non-blocking", + "parser", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" + }, + { + "name": "amphp/pipeline", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/pipeline.git", + "reference": "7b52598c2e9105ebcddf247fc523161581930367" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", + "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Pipeline\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" + ], + "support": { + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-03-16T16:33:53+00:00" + }, + { + "name": "amphp/process", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/process.git", + "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Process\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A fiber-aware process manager based on Amp and Revolt.", + "homepage": "https://amphp.org/process", + "support": { + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v2.0.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:13:44+00:00" + }, + { + "name": "amphp/serialization", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Serialization\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/master" + }, + "time": "2020-03-25T21:39:07+00:00" + }, + { + "name": "amphp/socket", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/socket.git", + "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", + "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/dns": "^2", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri": "^6.5 | ^7", + "league/uri-interfaces": "^2.3 | ^7", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "amphp/process": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php", + "src/SocketAddress/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", + "homepage": "https://github.com/amphp/socket", + "keywords": [ + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" + ], + "support": { + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-21T14:33:03+00:00" + }, + { + "name": "amphp/sync", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", - "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", "shasum": "" }, "require": { - "amphp/amp": "^2", - "php": ">=7.1" + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "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" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" }, "type": "library", "autoload": { "files": [ - "lib/functions.php" + "src/functions.php" ], "psr-4": { - "Amp\\ByteStream\\": "lib" + "Amp\\Sync\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -6261,21 +6911,24 @@ { "name": "Niklas Keller", "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "https://amphp.org/byte-stream", + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", "keywords": [ - "amp", - "amphp", "async", - "io", - "non-blocking", - "stream" + "asynchronous", + "mutex", + "semaphore", + "synchronization" ], "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" }, "funding": [ { @@ -6283,7 +6936,7 @@ "type": "github" } ], - "time": "2024-04-13T18:00:56+00:00" + "time": "2024-08-03T19:31:26+00:00" }, { "name": "composer/pcre", @@ -6507,6 +7160,102 @@ ], "time": "2024-05-06T16:37:16+00:00" }, + { + "name": "danog/advanced-json-rpc", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/danog/php-advanced-json-rpc.git", + "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/aadb1c4068a88c3d0530cfe324b067920661efcb", + "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb", + "shasum": "" + }, + "require": { + "netresearch/jsonmapper": "^5", + "php": ">=8.1", + "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" + }, + "replace": { + "felixfbecker/php-advanced-json-rpc": "^3" + }, + "require-dev": { + "phpunit/phpunit": "^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdvancedJsonRpc\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Felix Becker", + "email": "felix.b@outlook.com" + }, + { + "name": "Daniil Gentili", + "email": "daniil@daniil.it" + } + ], + "description": "A more advanced JSONRPC implementation", + "support": { + "issues": "https://github.com/danog/php-advanced-json-rpc/issues", + "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.2" + }, + "time": "2025-02-14T10:55:15+00:00" + }, + { + "name": "daverandom/libdns", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "Required for IDN support" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "LibDNS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "DNS protocol implementation written in pure PHP", + "keywords": [ + "dns" + ], + "support": { + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + }, + "time": "2024-04-12T12:12:48+00:00" + }, { "name": "dnoegel/php-xdg-base-dir", "version": "v0.1.1", @@ -6715,31 +7464,36 @@ "time": "2025-12-03T15:47:21+00:00" }, { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "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" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "psr-4": { - "AdvancedJsonRpc\\": "lib/" + "LanguageServerProtocol\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -6752,34 +7506,101 @@ "email": "felix.b@outlook.com" } ], - "description": "A more advanced JSONRPC implementation", + "description": "PHP classes for the Language Server Protocol", + "keywords": [ + "language", + "microsoft", + "php", + "server" + ], "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2021-06-11T22:34:44+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.3", + "name": "fidry/cpu-core-counter", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { - "php": ">=7.1" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "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.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, + { + "name": "kelunik/certificate", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" }, "type": "library", "extra": { @@ -6789,31 +7610,215 @@ }, "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" + "Kelunik\\Certificate\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "PHP classes for the Language Server Protocol", + "description": "Access certificate details and transform between different formats.", "keywords": [ - "language", - "microsoft", - "php", - "server" + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" + ], + "support": { + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + }, + "time": "2023-02-03T21:26:53+00:00" + }, + { + "name": "league/uri", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.7", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-12-07T16:02:06+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0" }, - "time": "2024-04-30T00:40:11+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-12-07T16:03:21+00:00" }, { "name": "myclabs/deep-copy", @@ -6877,16 +7882,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.5.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", + "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", "shasum": "" }, "require": { @@ -6922,36 +7927,43 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0" }, - "time": "2024-09-08T10:13:13+00:00" + "time": "2024-09-08T10:20:00+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.5", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", - "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" @@ -6973,62 +7985,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.5" - }, - "time": "2025-12-06T11:45:25+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" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2019-03-29T20:06:56+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -7203,16 +8162,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.5", + "version": "5.6.6", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761" + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/90614c73d3800e187615e2dd236ad0e2a01bf761", - "reference": "90614c73d3800e187615e2dd236ad0e2a01bf761", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", "shasum": "" }, "require": { @@ -7222,7 +8181,7 @@ "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.7", "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" + "webmozart/assert": "^1.9.1 || ^2" }, "require-dev": { "mockery/mockery": "~1.3.5 || ~1.6.0", @@ -7261,9 +8220,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.5" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" }, - "time": "2025-11-27T19:50:05+00:00" + "time": "2025-12-22T21:13:58+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -7800,6 +8759,78 @@ ], "time": "2025-12-06T07:45:52+00:00" }, + { + "name": "revolt/event-loop", + "version": "v1.0.8", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Revolt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], + "support": { + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" + }, + "time": "2025-08-27T21:33:23+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.2", @@ -8812,51 +9843,38 @@ "time": "2020-09-28T06:39:44+00:00" }, { - "name": "symfony/phpunit-bridge", - "version": "v6.4.26", + "name": "spatie/array-to-xml", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f" + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/406aa80401bf960e7a173a3ccf268ae82b6bc93f", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", "shasum": "" }, "require": { - "php": ">=7.1.3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "ext-dom": "*", + "php": "^8.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/polyfill-php81": "^1.27" + "mockery/mockery": "^1.2", + "pestphp/pest": "^1.21", + "spatie/pest-plugin-snapshots": "^1.1" }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", + "type": "library", "extra": { - "thanks": { - "url": "https://github.com/sebastianbergmann/phpunit", - "name": "phpunit/phpunit" + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/", - "/bin/" - ] + "Spatie\\ArrayToXml\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -8864,64 +9882,67 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://freek.dev", + "role": "Developer" } ], - "description": "Provides utilities for PHPUnit, especially user deprecation notices management", - "homepage": "https://symfony.com", + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", "keywords": [ - "testing" + "array", + "convert", + "xml" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.26" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://spatie.be/open-source/support-us", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/spatie", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-09-12T08:37:02+00:00" + "time": "2025-12-15T09:00:41+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "name": "symfony/phpunit-bridge", + "version": "v6.4.26", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1.3" }, - "type": "library", + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" } }, "autoload": { @@ -8929,10 +9950,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Bridge\\PhpUnit\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8940,10 +9962,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -8953,16 +9971,13 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "testing" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.26" }, "funding": [ { @@ -8982,7 +9997,7 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2025-09-12T08:37:02+00:00" }, { "name": "theseer/tokenizer", @@ -9036,24 +10051,26 @@ }, { "name": "vimeo/psalm", - "version": "4.30.0", + "version": "6.14.3", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" + "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", - "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a", + "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a", "shasum": "" }, "require": { - "amphp/amp": "^2.4.2", - "amphp/byte-stream": "^1.5", - "composer/package-versions-deprecated": "^1.8.0", + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/parallel": "^2.3", + "composer-runtime-api": "^2", "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^2.0 || ^3.0", + "danog/advanced-json-rpc": "^3.1", "dnoegel/php-xdg-base-dir": "^0.1.1", "ext-ctype": "*", "ext-dom": "*", @@ -9062,35 +10079,37 @@ "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" + "felixfbecker/language-server-protocol": "^1.5.3", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^5.0", + "nikic/php-parser": "^5.0.0", + "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", + "symfony/polyfill-php84": "^1.31.0" }, "provide": { "psalm/psalm": "self.version" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "brianium/paratest": "^4.0||^6.0", + "amphp/phpunit-util": "^3", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "danog/class-finder": "^0.4.8", + "dg/bypass-finals": "^1.5", "ext-curl": "*", + "mockery/mockery": "^1.5", + "nunomaduro/mock-final-classes": "^1.1", "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" + "phpstan/phpdoc-parser": "^1.6", + "phpunit/phpunit": "^9.6", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.19", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.6", + "symfony/process": "^6.0 || ^7.0 || ^8.0" }, "suggest": { "ext-curl": "In order to send data to shepherd", @@ -9101,22 +10120,22 @@ "psalm-language-server", "psalm-plugin", "psalm-refactor", + "psalm-review", "psalter" ], - "type": "library", + "type": "project", "extra": { "branch-alias": { "dev-1.x": "1.x-dev", "dev-2.x": "2.x-dev", "dev-3.x": "3.x-dev", - "dev-master": "4.x-dev" + "dev-4.x": "4.x-dev", + "dev-5.x": "5.x-dev", + "dev-6.x": "6.x-dev", + "dev-master": "7.x-dev" } }, "autoload": { - "files": [ - "src/functions.php", - "src/spl_object_id.php" - ], "psr-4": { "Psalm\\": "src/Psalm/" } @@ -9128,39 +10147,45 @@ "authors": [ { "name": "Matthew Brown" + }, + { + "name": "Daniil Gentili", + "email": "daniil@daniil.it" } ], "description": "A static analysis tool for finding errors in PHP applications", "keywords": [ "code", "inspection", - "php" + "php", + "static analysis" ], "support": { + "docs": "https://psalm.dev/docs", "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.30.0" + "source": "https://github.com/vimeo/psalm" }, - "time": "2022-11-06T20:37:08+00:00" + "time": "2025-12-23T15:36:48+00:00" }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54", + "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -9170,7 +10195,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -9186,6 +10211,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -9196,60 +10225,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" - }, - "time": "2025-10-29T15:56:20+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" + "source": "https://github.com/webmozarts/assert/tree/2.0.0" }, - "abandoned": "symfony/filesystem", - "time": "2015-12-17T08:42:14+00:00" + "time": "2025-12-16T21:36:00+00:00" } ], "aliases": [], diff --git a/app/composer.lock.old b/app/composer.lock.old deleted file mode 100644 index c348df4..0000000 --- a/app/composer.lock.old +++ /dev/null @@ -1,9366 +0,0 @@ -{ - "_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": "d0aa5bfc24d05eed328cac457b1e8f4a", - "packages": [ - { - "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": "doctrine/annotations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "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.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "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.1" - }, - "time": "2023-02-02T22:02:53+00:00" - }, - { - "name": "doctrine/cache", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", - "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/2.2.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%2Fcache", - "type": "tidelift" - } - ], - "time": "2022-05-20T20:07:39+00:00" - }, - { - "name": "doctrine/collections", - "version": "2.1.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "72328a11443a0de79967104ad36ba7b30bded134" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/72328a11443a0de79967104ad36ba7b30bded134", - "reference": "72328a11443a0de79967104ad36ba7b30bded134", - "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": "^9.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.1.4" - }, - "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": "2023-10-03T09:22:33+00:00" - }, - { - "name": "doctrine/common", - "version": "3.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", - "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0 || ^3.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0 || ^10.0", - "doctrine/collections": "^1", - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^6.1", - "vimeo/psalm": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.4.3" - }, - "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%2Fcommon", - "type": "tidelift" - } - ], - "time": "2022-10-09T11:47:59+00:00" - }, - { - "name": "doctrine/dbal", - "version": "3.7.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", - "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/deprecations": "^0.5.3|^1", - "doctrine/event-manager": "^1|^2", - "php": "^7.4 || ^8.0", - "psr/cache": "^1|^2|^3", - "psr/log": "^1|^2|^3" - }, - "require-dev": { - "doctrine/coding-standard": "12.0.0", - "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.42", - "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.13", - "psalm/plugin-phpunit": "0.18.4", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^5.4|^6.0", - "symfony/console": "^4.4|^5.4|^6.0", - "vimeo/psalm": "4.30.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "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" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.7.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%2Fdbal", - "type": "tidelift" - } - ], - "time": "2023-11-19T08:06:58+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "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.2" - }, - "time": "2023-09-27T20:04:15+00:00" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "2.11.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "4089f1424b724786c062aea50aae5f773449b94b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/4089f1424b724786c062aea50aae5f773449b94b", - "reference": "4089f1424b724786c062aea50aae5f773449b94b", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/persistence": "^2.2 || ^3", - "doctrine/sql-formatter": "^1.0.1", - "php": "^7.4 || ^8.0", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" - }, - "conflict": { - "doctrine/annotations": ">=3.0", - "doctrine/orm": "<2.14 || >=4.0", - "twig/twig": "<1.34 || >=2.0 <2.4" - }, - "require-dev": { - "doctrine/annotations": "^1 || ^2", - "doctrine/coding-standard": "^12", - "doctrine/deprecations": "^1.0", - "doctrine/orm": "^2.14 || ^3.0", - "friendsofphp/proxy-manager-lts": "^1.0", - "phpunit/phpunit": "^9.5.26 || ^10.0", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^4", - "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^6.1 || ^7.0", - "symfony/property-info": "^5.4 || ^6.0 || ^7.0", - "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/string": "^5.4 || ^6.0 || ^7.0", - "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", - "symfony/validator": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0", - "twig/twig": "^1.34 || ^2.12 || ^3.0", - "vimeo/psalm": "^4.30" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "ext-pdo": "*", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org/" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.11.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%2Fdoctrine-bundle", - "type": "tidelift" - } - ], - "time": "2023-11-15T20:01:50+00:00" - }, - { - "name": "doctrine/doctrine-migrations-bundle", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1dd42906a5fb9c5960723e2ebb45c68006493835", - "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835", - "shasum": "" - }, - "require": { - "doctrine/doctrine-bundle": "^2.4", - "doctrine/migrations": "^3.2", - "php": "^7.2|^8.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3 ", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^8.5|^9.5", - "psalm/plugin-phpunit": "^0.18.4", - "psalm/plugin-symfony": "^3 || ^5", - "symfony/phpunit-bridge": "^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6 || ^7", - "vimeo/psalm": "^4.30 || ^5.15" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DoctrineMigrationsBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "dbal", - "migrations", - "schema" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.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%2Fdoctrine-migrations-bundle", - "type": "tidelift" - } - ], - "time": "2023-11-13T19:44:41+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", - "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.28" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/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%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2022-10-12T20:59:15+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.0.8", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", - "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", - "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.8" - }, - "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": "2023-06-16T13:40:37+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": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" - }, - "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/2.1.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%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-12-14T08:49:07+00:00" - }, - { - "name": "doctrine/migrations", - "version": "3.7.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/migrations.git", - "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/47af29eef49f29ebee545947e8b2a4b3be318c8a", - "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/dbal": "^3.5.1 || ^4", - "doctrine/deprecations": "^0.5.3 || ^1", - "doctrine/event-manager": "^1.2 || ^2.0", - "php": "^8.1", - "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", - "symfony/var-exporter": "^6.2 || ^7.0" - }, - "conflict": { - "doctrine/orm": "<2.12 || >=4" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3", - "doctrine/sql-formatter": "^1.0", - "ext-pdo_sqlite": "*", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.4", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^10.3", - "symfony/cache": "^5.4 || ^6.0 || ^7.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" - }, - "suggest": { - "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", - "symfony/yaml": "Allows the use of yaml for migration configuration files." - }, - "bin": [ - "bin/doctrine-migrations" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Michael Simonson", - "email": "contact@mikesimonson.com" - } - ], - "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", - "homepage": "https://www.doctrine-project.org/projects/migrations.html", - "keywords": [ - "database", - "dbal", - "migrations" - ], - "support": { - "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.7.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%2Fmigrations", - "type": "tidelift" - } - ], - "time": "2023-12-05T11:35:05+00:00" - }, - { - "name": "doctrine/orm", - "version": "2.17.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/393679a4795e49b0b3ac317dce84d0f8888f2b77", - "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2", - "doctrine/cache": "^1.12.1 || ^2.1.1", - "doctrine/collections": "^1.5 || ^2.1", - "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.13.1 || ^3.2", - "doctrine/deprecations": "^0.5.3 || ^1", - "doctrine/event-manager": "^1.2 || ^2", - "doctrine/inflector": "^1.4 || ^2.0", - "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^2", - "doctrine/persistence": "^2.4 || ^3", - "ext-ctype": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", - "symfony/polyfill-php72": "^1.23", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.13 || >= 3.0" - }, - "require-dev": { - "doctrine/annotations": "^1.13 || ^2", - "doctrine/coding-standard": "^9.0.2 || ^12.0", - "phpbench/phpbench": "^0.16.10 || ^1.0", - "phpstan/phpstan": "~1.4.10 || 1.10.35", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", - "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.7.2", - "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", - "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", - "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", - "vimeo/psalm": "4.30.0 || 5.16.0" - }, - "suggest": { - "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" - } - }, - "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": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "https://www.doctrine-project.org/projects/orm.html", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.17.2" - }, - "time": "2023-12-20T21:47:52+00:00" - }, - { - "name": "doctrine/persistence", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "63fee8c33bef740db6730eb2a750cd3da6495603" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/63fee8c33bef740db6730eb2a750cd3da6495603", - "reference": "63fee8c33bef740db6730eb2a750cd3da6495603", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "^1 || ^2", - "php": "^7.2 || ^8.0", - "psr/cache": "^1.0 || ^2.0 || ^3.0" - }, - "conflict": { - "doctrine/common": "<2.10" - }, - "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^11", - "doctrine/common": "^3.0", - "phpstan/phpstan": "1.9.4", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6.0", - "vimeo/psalm": "4.30.0 || 5.3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Persistence\\": "src/Persistence" - } - }, - "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" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://www.doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/3.2.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%2Fpersistence", - "type": "tidelift" - } - ], - "time": "2023-05-17T18:32:04+00:00" - }, - { - "name": "doctrine/sql-formatter", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", - "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" - }, - "bin": [ - "bin/sql-formatter" - ], - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\SqlFormatter\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "https://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/doctrine/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "support": { - "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" - }, - "time": "2022-05-23T21:33:49+00:00" - }, - { - "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.16", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", - "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", - "shasum": "" - }, - "require": { - "laminas/laminas-code": "~3.4.1|^4.0", - "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" - }, - "conflict": { - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "replace": { - "ocramius/proxy-manager": "^2.1" - }, - "require-dev": { - "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" - }, - "type": "library", - "extra": { - "thanks": { - "name": "ocramius/proxy-manager", - "url": "https://github.com/Ocramius/ProxyManager" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - } - ], - "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", - "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2023-05-24T07:17:17+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.10.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^2.3", - "guzzlehttp/psr7": "^2.8", - "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.10.0" - }, - "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": "2025-08-23T22:36:01+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" - }, - "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.3.0" - }, - "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": "2025-08-22T14:34:08+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", - "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.44 || ^9.6.25" - }, - "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.8.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": "2025-08-23T21:21:41+00:00" - }, - { - "name": "knpuniversity/oauth2-client-bundle", - "version": "v2.20.1", - "source": { - "type": "git", - "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", - "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/d59e4dc61484e777b6f19df2efcf8b1bcc03828a", - "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a", - "shasum": "" - }, - "require": { - "league/oauth2-client": "^2.0", - "php": ">=8.1", - "symfony/dependency-injection": "^6.4|^7.3|^8.0", - "symfony/framework-bundle": "^6.4|^7.3|^8.0", - "symfony/http-foundation": "^6.4|^7.3|^8.0", - "symfony/routing": "^6.4|^7.3|^8.0", - "symfony/security-core": "^6.4|^7.3|^8.0", - "symfony/security-http": "^6.4|^7.3|^8.0" - }, - "require-dev": { - "league/oauth2-facebook": "^1.1|^2.0", - "symfony/phpunit-bridge": "^7.3", - "symfony/yaml": "^6.4|^7.3|^8.0" - }, - "suggest": { - "symfony/security-guard": "For integration with Symfony's Guard Security layer" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "KnpU\\OAuth2ClientBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ryan Weaver", - "email": "ryan@symfonycasts.com" - } - ], - "description": "Integration with league/oauth2-client to provide services", - "homepage": "https://symfonycasts.com", - "keywords": [ - "oauth", - "oauth2" - ], - "support": { - "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", - "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.20.1" - }, - "time": "2025-12-04T15:46:43+00:00" - }, - { - "name": "laminas/laminas-code", - "version": "4.13.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", - "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", - "shasum": "" - }, - "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0.1", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.5.0", - "laminas/laminas-stdlib": "^3.17.0", - "phpunit/phpunit": "^10.3.3", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.15.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", - "keywords": [ - "code", - "laminas", - "laminasframework" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2023-10-18T10:00:55+00:00" - }, - { - "name": "lcobucci/clock", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/lcobucci/clock.git", - "reference": "6f28b826ea01306b07980cb8320ab30b966cd715" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lcobucci/clock/zipball/6f28b826ea01306b07980cb8320ab30b966cd715", - "reference": "6f28b826ea01306b07980cb8320ab30b966cd715", - "shasum": "" - }, - "require": { - "php": "~8.2.0 || ~8.3.0", - "psr/clock": "^1.0" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "require-dev": { - "infection/infection": "^0.27", - "lcobucci/coding-standard": "^11.0.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.25", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.13", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^10.2.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Lcobucci\\Clock\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com" - } - ], - "description": "Yet another clock abstraction", - "support": { - "issues": "https://github.com/lcobucci/clock/issues", - "source": "https://github.com/lcobucci/clock/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2023-11-17T17:00:27+00:00" - }, - { - "name": "lcobucci/jwt", - "version": "5.2.0", - "source": { - "type": "git", - "url": "https://github.com/lcobucci/jwt.git", - "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/0ba88aed12c04bd2ed9924f500673f32b67a6211", - "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-sodium": "*", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "psr/clock": "^1.0" - }, - "require-dev": { - "infection/infection": "^0.27.0", - "lcobucci/clock": "^3.0", - "lcobucci/coding-standard": "^11.0", - "phpbench/phpbench": "^1.2.9", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.10.7", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.10", - "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^10.2.6" - }, - "suggest": { - "lcobucci/clock": ">= 3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Luís Cobucci", - "email": "lcobucci@gmail.com", - "role": "Developer" - } - ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", - "keywords": [ - "JWS", - "jwt" - ], - "support": { - "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.2.0" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2023-11-20T21:17:42+00:00" - }, - { - "name": "league/oauth2-client", - "version": "2.9.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", - "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "php": "^7.1 || >=8.0.0 <8.6.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.5", - "php-parallel-lint/php-parallel-lint": "^1.4", - "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", - "squizlabs/php_codesniffer": "^3.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\OAuth2\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Bilbie", - "email": "hello@alexbilbie.com", - "homepage": "http://www.alexbilbie.com", - "role": "Developer" - }, - { - "name": "Woody Gilk", - "homepage": "https://github.com/shadowhand", - "role": "Contributor" - } - ], - "description": "OAuth 2.0 Client Library", - "keywords": [ - "Authentication", - "SSO", - "authorization", - "identity", - "idp", - "oauth", - "oauth2", - "single sign on" - ], - "support": { - "issues": "https://github.com/thephpleague/oauth2-client/issues", - "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" - }, - "time": "2025-11-25T22:17:17+00:00" - }, - { - "name": "lexik/jwt-authentication-bundle", - "version": "v2.20.3", - "source": { - "type": "git", - "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", - "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/a196d68d07dd5486a523cc3415620badbb5d25c2", - "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "lcobucci/clock": "^1.2|^2.0|^3.0", - "lcobucci/jwt": "^3.4|^4.1|^5.0", - "namshi/jose": "^7.2", - "php": ">=7.1", - "symfony/config": "^4.4|^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0", - "symfony/deprecation-contracts": "^2.4|^3.0", - "symfony/event-dispatcher": "^4.4|^5.4|^6.0|^7.0", - "symfony/http-foundation": "^4.4|^5.4|^6.0|^7.0", - "symfony/http-kernel": "^4.4|^5.4|^6.0|^7.0", - "symfony/property-access": "^4.4|^5.4|^6.0|^7.0", - "symfony/security-bundle": "^4.4|^5.4|^6.0|^7.0", - "symfony/translation-contracts": "^1.0|^2.0|^3.0" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^4.4|^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^4.4|^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^4.4|^5.4|^6.0|^7.0", - "symfony/phpunit-bridge": "^4.4|^5.4|^6.0|^7.0", - "symfony/security-guard": "^4.4|^5.4|^6.0|^7.0", - "symfony/var-dumper": "^4.4|^5.4|^6.0|^7.0", - "symfony/yaml": "^4.4|^5.4|^6.0|^7.0" - }, - "suggest": { - "gesdinet/jwt-refresh-token-bundle": "Implements a refresh token system over Json Web Tokens in Symfony", - "spomky-labs/lexik-jose-bridge": "Provides a JWT Token encoder with encryption support" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Lexik\\Bundle\\JWTAuthenticationBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Barthe", - "email": "j.barthe@lexik.fr", - "homepage": "https://github.com/jeremyb" - }, - { - "name": "Nicolas Cabot", - "email": "n.cabot@lexik.fr", - "homepage": "https://github.com/slashfan" - }, - { - "name": "Cedric Girard", - "email": "c.girard@lexik.fr", - "homepage": "https://github.com/cedric-g" - }, - { - "name": "Dev Lexik", - "email": "dev@lexik.fr", - "homepage": "https://github.com/lexik" - }, - { - "name": "Robin Chalas", - "email": "robin.chalas@gmail.com", - "homepage": "https://github.com/chalasr" - }, - { - "name": "Lexik Community", - "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle/graphs/contributors" - } - ], - "description": "This bundle provides JWT authentication for your Symfony REST API", - "homepage": "https://github.com/lexik/LexikJWTAuthenticationBundle", - "keywords": [ - "Authentication", - "JWS", - "api", - "bundle", - "jwt", - "rest", - "symfony" - ], - "support": { - "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", - "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v2.20.3" - }, - "funding": [ - { - "url": "https://github.com/chalasr", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/lexik/jwt-authentication-bundle", - "type": "tidelift" - } - ], - "time": "2023-12-14T15:58:11+00:00" - }, - { - "name": "namshi/jose", - "version": "7.2.3", - "source": { - "type": "git", - "url": "https://github.com/namshi/jose.git", - "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/namshi/jose/zipball/89a24d7eb3040e285dd5925fcad992378b82bcff", - "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff", - "shasum": "" - }, - "require": { - "ext-date": "*", - "ext-hash": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-spl": "*", - "php": ">=5.5", - "symfony/polyfill-php56": "^1.0" - }, - "require-dev": { - "phpseclib/phpseclib": "^2.0", - "phpunit/phpunit": "^4.5|^5.0", - "satooshi/php-coveralls": "^1.0" - }, - "suggest": { - "ext-openssl": "Allows to use OpenSSL as crypto engine.", - "phpseclib/phpseclib": "Allows to use Phpseclib as crypto engine, use version ^2.0." - }, - "type": "library", - "autoload": { - "psr-4": { - "Namshi\\JOSE\\": "src/Namshi/JOSE/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Nadalin", - "email": "alessandro.nadalin@gmail.com" - }, - { - "name": "Alessandro Cinelli (cirpo)", - "email": "alessandro.cinelli@gmail.com" - } - ], - "description": "JSON Object Signing and Encryption library for PHP.", - "keywords": [ - "JSON Web Signature", - "JSON Web Token", - "JWS", - "json", - "jwt", - "token" - ], - "support": { - "issues": "https://github.com/namshi/jose/issues", - "source": "https://github.com/namshi/jose/tree/master" - }, - "time": "2016-12-05T07:27:31+00:00" - }, - { - "name": "nelmio/cors-bundle", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "78fcdb91f76b080a1008133def9c7f613833933d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/78fcdb91f76b080a1008133def9c7f613833933d", - "reference": "78fcdb91f76b080a1008133def9c7f613833933d", - "shasum": "" - }, - "require": { - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.6", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Nelmio\\CorsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nelmio", - "homepage": "http://nelm.io" - }, - { - "name": "Symfony Community", - "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" - } - ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", - "keywords": [ - "api", - "cors", - "crossdomain" - ], - "support": { - "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" - }, - "time": "2023-11-30T16:41:19+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/clock", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+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": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.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": "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/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/log", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "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.0" - }, - "time": "2021-07-14T16:46:02+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": "rteeom/isoflags", - "version": "1.1.6", - "source": { - "type": "git", - "url": "https://github.com/mainstreamer/isoflags.git", - "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/fba4ac13a942808a0cbc7c6b19fdf9700ab33492", - "reference": "fba4ac13a942808a0cbc7c6b19fdf9700ab33492", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^7.4|8.*" - }, - "require-dev": { - "ext-json": "*", - "phpunit/phpunit": "^10.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Rteeom\\FlagsGenerator\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rteeom", - "email": "mainstreamer@outlook.com" - } - ], - "description": "library for easy emoji flags generation from iso country codes", - "support": { - "issues": "https://github.com/mainstreamer/isoflags/issues", - "source": "https://github.com/mainstreamer/isoflags/tree/1.1.6" - }, - "time": "2024-01-03T15:35:58+00:00" - }, - { - "name": "sensio/framework-extra-bundle", - "version": "v6.2.10", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0|^2.0", - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1", - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.5", - "symfony/browser-kit": "^4.4|^5.0|^6.0", - "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/monolog-bridge": "^4.0|^5.0|^6.0", - "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", - "symfony/security-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "6.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" - }, - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "support": { - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" - }, - "abandoned": "Symfony", - "time": "2023-02-24T14:57:12+00:00" - }, - { - "name": "symfony/cache", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/14a75869bbb41cb35bc5d9d322473928c6f3f978", - "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^2.0|^3.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6|^7.0" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" - }, - "provide": { - "psr/cache-implementation": "2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0", - "symfony/cache-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "classmap": [ - "Traits/ValueWrapper.php" - ], - "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 extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.2" - }, - "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-12-29T15:34:34+00:00" - }, - { - "name": "symfony/clock", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "0639710e65f73cc504167958ea29be6de5c7177a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/0639710e65f73cc504167958ea29be6de5c7177a", - "reference": "0639710e65f73cc504167958ea29be6de5c7177a", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/now.php" - ], - "psr-4": { - "Symfony\\Component\\Clock\\": "" - }, - "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": "Decouples applications from the system clock", - "homepage": "https://symfony.com", - "keywords": [ - "clock", - "psr20", - "time" - ], - "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.2" - }, - "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-12-27T00:32:33+00:00" - }, - { - "name": "symfony/config", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "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 you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v6.4.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": "2023-11-09T08:28:32+00:00" - }, - { - "name": "symfony/console", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", - "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.2" - }, - "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-12-10T16:15:48+00:00" - }, - { - "name": "symfony/contracts", - "version": "v3.4.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/contracts.git", - "reference": "db06a3f3c52adeb7a1e84745cece0a9c474f518a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/db06a3f3c52adeb7a1e84745cece0a9c474f518a", - "reference": "db06a3f3c52adeb7a1e84745cece0a9c474f518a", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/cache": "^3.0", - "psr/container": "^2.0", - "psr/event-dispatcher": "^1.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "replace": { - "symfony/cache-contracts": "self.version", - "symfony/deprecation-contracts": "self.version", - "symfony/event-dispatcher-contracts": "self.version", - "symfony/http-client-contracts": "self.version", - "symfony/service-contracts": "self.version", - "symfony/translation-contracts": "self.version" - }, - "require-dev": { - "symfony/polyfill-intl-idn": "^1.10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - } - }, - "autoload": { - "files": [ - "Deprecation/function.php" - ], - "psr-4": { - "Symfony\\Contracts\\": "" - }, - "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": "A set of abstractions extracted out of the Symfony components", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "dev", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/contracts/tree/v3.4.1" - }, - "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-12-26T14:02:43+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.2.10|^7.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "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 you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.2" - }, - "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-12-28T19:16:56+00:00" - }, - { - "name": "symfony/doctrine-bridge", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "da33f27c1dd9946afecfd1585b867551df71bf53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/da33f27c1dd9946afecfd1585b867551df71bf53", - "reference": "da33f27c1dd9946afecfd1585b867551df71bf53", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^3.1", - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.15", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.21|>=6,<6.2.7", - "symfony/http-foundation": "<6.3", - "symfony/http-kernel": "<6.2", - "symfony/lock": "<6.3", - "symfony/messenger": "<5.4", - "symfony/property-info": "<5.4", - "symfony/security-bundle": "<5.4", - "symfony/security-core": "<6.4", - "symfony/validator": "<6.4" - }, - "require-dev": { - "doctrine/collections": "^1.0|^2.0", - "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^2.13.1|^3|^4", - "doctrine/orm": "^2.15|^3", - "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", - "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.21|^6.2.7|^7.0", - "symfony/http-kernel": "^6.3|^7.0", - "symfony/lock": "^6.3|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/proxy-manager-bridge": "^6.4", - "symfony/security-core": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "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 integration for Doctrine with various Symfony components", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.2" - }, - "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-12-27T00:32:33+00:00" - }, - { - "name": "symfony/dotenv", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "835f8d2d1022934ac038519de40b88158798c96f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/835f8d2d1022934ac038519de40b88158798c96f", - "reference": "835f8d2d1022934ac038519de40b88158798c96f", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "conflict": { - "symfony/console": "<5.4", - "symfony/process": "<5.4" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "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": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.2" - }, - "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-12-28T19:16:56+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/deprecation-contracts": "<2.5", - "symfony/http-kernel": "<6.4" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" - }, - "bin": [ - "Resources/bin/patch-type-declarations" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "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 to manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.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": "2023-10-18T09:43:34+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/event-dispatcher-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/service-contracts": "<2.5" - }, - "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|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" - }, - "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.4.2" - }, - "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-12-27T22:16:42+00:00" - }, - { - "name": "symfony/expression-language", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "7d63ccd5331d4164961776eced5524e891e30ad3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/7d63ccd5331d4164961776eced5524e891e30ad3", - "reference": "7d63ccd5331d4164961776eced5524e891e30ad3", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "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 engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.2" - }, - "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-12-10T16:15:48+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "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.4.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": "2023-07-26T17:27:13+00:00" - }, - { - "name": "symfony/finder", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/filesystem": "^6.0|^7.0" - }, - "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/v6.4.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": "2023-10-31T17:30:12+00:00" - }, - { - "name": "symfony/flex", - "version": "v2.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/flex.git", - "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", - "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.1", - "php": ">=8.0" - }, - "require-dev": { - "composer/composer": "^2.1", - "symfony/dotenv": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Symfony\\Flex\\Flex" - }, - "autoload": { - "psr-4": { - "Symfony\\Flex\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" - } - ], - "description": "Composer plugin for Symfony", - "support": { - "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.4.3" - }, - "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-01-02T11:08:32+00:00" - }, - { - "name": "symfony/framework-bundle", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c26a221e0462027d1f9d4a802ed63f8ab07a43d0", - "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "ext-xml": "*", - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.1|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^6.4|^7.0" - }, - "conflict": { - "doctrine/annotations": "<1.13.1", - "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.4", - "symfony/asset-mapper": "<6.4", - "symfony/clock": "<6.3", - "symfony/console": "<5.4|>=7.0", - "symfony/dom-crawler": "<6.4", - "symfony/dotenv": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<6.3", - "symfony/lock": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<6.3", - "symfony/mime": "<6.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4", - "symfony/scheduler": "<6.4", - "symfony/security-core": "<5.4", - "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.4", - "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.4", - "symfony/twig-bridge": "<5.4", - "symfony/twig-bundle": "<5.4", - "symfony/validator": "<6.4", - "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" - }, - "require-dev": { - "doctrine/annotations": "^1.13.1|^2", - "doctrine/persistence": "^1.3|^2|^3", - "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "seld/jsonlint": "^1.10", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-client": "^6.3|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.3|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^5.4|^6.0|^7.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/scheduler": "^6.4|^7.0", - "symfony/security-bundle": "^5.4|^6.0|^7.0", - "symfony/semaphore": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "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 a tight integration between Symfony components and the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.2" - }, - "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-12-29T15:34:34+00:00" - }, - { - "name": "symfony/http-client", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "fc0944665bd932cf32a7b8a1d009466afc16528f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/fc0944665bd932cf32a7b8a1d009466afc16528f", - "reference": "fc0944665bd932cf32a7b8a1d009466afc16528f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "^3", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.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|^7.0", - "symfony/http-kernel": "^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" - }, - "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", - "keywords": [ - "http" - ], - "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.2" - }, - "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-12-02T12:49:56+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" - }, - "conflict": { - "symfony/cache": "<6.3" - }, - "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "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": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" - }, - "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-12-27T22:16:42+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/13e8387320b5942d0dc408440c888e2d526efef4", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", - "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", - "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", - "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "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 a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.2" - }, - "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-12-30T15:31:44+00:00" - }, - { - "name": "symfony/intl", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/intl.git", - "reference": "4f45148f7eb984ef12b1f7e123205ab904828839" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/4f45148f7eb984ef12b1f7e123205ab904828839", - "reference": "4f45148f7eb984ef12b1f7e123205ab904828839", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Intl\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Eriksen Costa", - "email": "eriksen.costa@infranology.com.br" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides access to the localization data of the ICU library", - "homepage": "https://symfony.com", - "keywords": [ - "i18n", - "icu", - "internationalization", - "intl", - "l10n", - "localization" - ], - "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.2" - }, - "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-12-26T18:38:00+00:00" - }, - { - "name": "symfony/password-hasher", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/password-hasher.git", - "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/e001f752338a49d644ee0523fd7891aabaccb7e2", - "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "conflict": { - "symfony/security-core": "<5.4" - }, - "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PasswordHasher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Robin Chalas", - "email": "robin.chalas@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides password hashing utilities", - "homepage": "https://symfony.com", - "keywords": [ - "hashing", - "password" - ], - "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.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": "2023-11-06T11:00:25+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "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.28.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": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "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.28.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": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "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.28.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": "2023-07-28T09:04:16+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "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.28.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": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-php83", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "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.28.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": "2023-08-16T06:22:46+00:00" - }, - { - "name": "symfony/property-access", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "75f6990ae8e8040dd587162f3f1863f755957129" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/75f6990ae8e8040dd587162f3f1863f755957129", - "reference": "75f6990ae8e8040dd587162f3f1863f755957129", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/property-info": "^5.4|^6.0|^7.0" - }, - "require-dev": { - "symfony/cache": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyAccess\\": "" - }, - "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 functions to read and write from/to an object or array using a simple string notation", - "homepage": "https://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property-path", - "reflection" - ], - "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.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": "2023-09-25T12:52:38+00:00" - }, - { - "name": "symfony/property-info", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-info.git", - "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/288be71bae2ebc88676f5d3a03d23f70b278fcc1", - "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/string": "^5.4|^6.0|^7.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/dependency-injection": "<5.4", - "symfony/serializer": "<6.4" - }, - "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyInfo\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "dunglas@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Extracts information about PHP class' properties using metadata of popular sources", - "homepage": "https://symfony.com", - "keywords": [ - "doctrine", - "phpdoc", - "property", - "symfony", - "type", - "validator" - ], - "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.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": "2023-11-25T16:57:46+00:00" - }, - { - "name": "symfony/proxy-manager-bridge", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/801c4590eacf0dc40d73135dbe79ad71effd6d04", - "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04", - "shasum": "" - }, - "require": { - "friendsofphp/proxy-manager-lts": "^1.0.2", - "php": ">=8.1", - "symfony/dependency-injection": "^6.3|^7.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/config": "^6.1|^7.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\ProxyManager\\": "" - }, - "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 integration for ProxyManager with various Symfony components", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.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": "2023-11-01T12:07:38+00:00" - }, - { - "name": "symfony/routing", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/98eab13a07fddc85766f1756129c69f207ffbc21", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" - }, - "require-dev": { - "doctrine/annotations": "^1.12|^2", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.2" - }, - "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-12-29T15:34:34+00:00" - }, - { - "name": "symfony/security-bundle", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-bundle.git", - "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/97d4fb6dbee700937738036ec54b0fcb0641d7d6", - "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6", - "shasum": "" - }, - "require": { - "composer-runtime-api": ">=2.1", - "ext-xml": "*", - "php": ">=8.1", - "symfony/clock": "^6.3|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/password-hasher": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^6.3.6|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/console": "<5.4", - "symfony/framework-bundle": "<6.4", - "symfony/http-client": "<5.4", - "symfony/ldap": "<5.4", - "symfony/serializer": "<6.4", - "symfony/twig-bundle": "<5.4", - "symfony/validator": "<6.4" - }, - "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1", - "web-token/jwt-signature-algorithm-eddsa": "^3.1", - "web-token/jwt-signature-algorithm-hmac": "^3.1", - "web-token/jwt-signature-algorithm-none": "^3.1", - "web-token/jwt-signature-algorithm-rsa": "^3.1" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\SecurityBundle\\": "" - }, - "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 a tight integration of the Security component into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.2" - }, - "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-12-24T09:11:31+00:00" - }, - { - "name": "symfony/security-core", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "9e24a7199744d944c03fc1448276dc57f6237a33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/9e24a7199744d944c03fc1448276dc57f6237a33", - "reference": "9e24a7199744d944c03fc1448276dc57f6237a33", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/ldap": "<5.4", - "symfony/security-guard": "<5.4", - "symfony/validator": "<5.4" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "psr/container": "^1.1|^2.0", - "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Core\\": "" - }, - "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": "Symfony Security Component - Core Library", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.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": "2023-11-06T17:20:05+00:00" - }, - { - "name": "symfony/security-csrf", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-csrf.git", - "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/b28413496ebfce2f98afbb990ad0ce0ba3586638", - "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/http-foundation": "<5.4" - }, - "require-dev": { - "symfony/http-foundation": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Csrf\\": "" - }, - "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": "Symfony Security Component - CSRF Library", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.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": "2023-08-25T16:27:31+00:00" - }, - { - "name": "symfony/security-http", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-http.git", - "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/1b49ad8e9f2c3ceec011d67ac09e774e4107416b", - "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.3|^7.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/clock": "<6.3", - "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", - "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<5.4", - "symfony/security-csrf": "<5.4" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.3|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Http\\": "" - }, - "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": "Symfony Security Component - HTTP Integration", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.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": "2023-11-24T21:18:21+00:00" - }, - { - "name": "symfony/serializer", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/serializer.git", - "reference": "f87ea9d7bfd4cf2f7b72be554607e6c96e6664af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f87ea9d7bfd4cf2f7b72be554607e6c96e6664af", - "reference": "f87ea9d7bfd4cf2f7b72be554607e6c96e6664af", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "doctrine/annotations": "<1.12", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/dependency-injection": "<5.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4.24|>=6,<6.2.11", - "symfony/uid": "<5.4", - "symfony/validator": "<6.4", - "symfony/yaml": "<5.4" - }, - "require-dev": { - "doctrine/annotations": "^1.12|^2", - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", - "seld/jsonlint": "^1.10", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4.24|^6.2.11|^7.0", - "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Serializer\\": "" - }, - "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": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.2" - }, - "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-12-29T15:34:34+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/service-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "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 a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.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": "2023-02-16T10:14:28+00:00" - }, - { - "name": "symfony/string", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "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.5" - }, - "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.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.4.2" - }, - "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-12-10T16:15:48+00:00" - }, - { - "name": "symfony/validator", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/validator.git", - "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", - "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php83": "^1.27", - "symfony/translation-contracts": "^2.5|^3" - }, - "conflict": { - "doctrine/annotations": "<1.13", - "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<5.4", - "symfony/expression-language": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/intl": "<5.4", - "symfony/property-info": "<5.4", - "symfony/translation": "<5.4", - "symfony/yaml": "<5.4" - }, - "require-dev": { - "doctrine/annotations": "^1.13|^2", - "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Validator\\": "" - }, - "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 to validate values", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.2" - }, - "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-12-29T16:34:12+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", - "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.2" - }, - "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-12-28T19:16:56+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" - }, - "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-12-27T08:18:35+00:00" - }, - { - "name": "symfony/yaml", - "version": "v6.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", - "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.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": "2023-11-06T11:00:25+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "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", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "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.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v1.8.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", - "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", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "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": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], - "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, - { - "name": "composer/pcre", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "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.1.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": "2023-10-11T07:11:09+00:00" - }, - { - "name": "composer/semver", - "version": "3.4.0", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", - "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "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.0" - }, - "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": "2023-08-31T09:50:34+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "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", - "symfony/phpunit-bridge": "^6.0" - }, - "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": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.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": "2022-02-25T21:32:43+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": "doctrine/data-fixtures", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", - "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3 || ^1.0", - "doctrine/persistence": "^2.0|^3.0", - "php": "^7.4 || ^8.0" - }, - "conflict": { - "doctrine/dbal": "<3.5 || >=5", - "doctrine/orm": "<2.14 || >=4", - "doctrine/phpcr-odm": "<1.3.0" - }, - "require-dev": { - "doctrine/annotations": "^1.12 || ^2", - "doctrine/coding-standard": "^12", - "doctrine/dbal": "^3.5 || ^4", - "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", - "doctrine/orm": "^2.14 || ^3", - "ext-sqlite3": "*", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.6.13 || ^10.4.2", - "symfony/cache": "^5.4 || ^6.3 || ^7", - "symfony/var-exporter": "^5.4 || ^6.3 || ^7", - "vimeo/psalm": "^5.9" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", - "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", - "doctrine/orm": "For loading ORM fixtures", - "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\DataFixtures\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Data Fixtures for all Doctrine Object Managers", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "database" - ], - "support": { - "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.7.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%2Fdata-fixtures", - "type": "tidelift" - } - ], - "time": "2023-11-24T11:18:31+00:00" - }, - { - "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.5.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/c808a0c85c38c8ee265cc8405b456c1d2b38567d", - "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d", - "shasum": "" - }, - "require": { - "doctrine/data-fixtures": "^1.3", - "doctrine/doctrine-bundle": "^2.2", - "doctrine/orm": "^2.14.0 || ^3.0", - "doctrine/persistence": "^2.4|^3.0", - "php": "^7.4 || ^8.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/doctrine-bridge": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" - }, - "conflict": { - "doctrine/dbal": "< 3" - }, - "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10.39", - "phpunit/phpunit": "^9.6.13", - "symfony/phpunit-bridge": "^6.3.6", - "vimeo/psalm": "^5.15" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\FixturesBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Doctrine Project", - "homepage": "https://www.doctrine-project.org" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DoctrineFixturesBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "Fixture", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.5.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%2Fdoctrine-fixtures-bundle", - "type": "tidelift" - } - ], - "time": "2023-11-19T12:48:54+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": "myclabs/deep-copy", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "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", - "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.11.1" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2023-03-08T13:26:56+00:00" - }, - { - "name": "netresearch/jsonmapper", - "version": "v4.2.0", - "source": { - "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.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.2.0" - }, - "time": "2023-04-09T17:37:40+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.18.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "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.18.0" - }, - "time": "2023-12-10T21:03:43+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.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "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.3" - }, - "time": "2021-07-20T11:28:43+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.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "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": "account@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.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.7.3", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^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.7.3" - }, - "time": "2023-08-12T11:01:26+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.24.5", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", - "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.24.5" - }, - "time": "2023-12-16T09:33:33+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.30", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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-master": "9.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": "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.30" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-22T06:47:57+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.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1 || ^2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "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.15" - }, - "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": "2023-12-01T16:55:19+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "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.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+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.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "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.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-05-07T05:35:17+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.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "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.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-09-14T06:03:37+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", - "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.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-02T09:26:13+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.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "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" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+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": "symfony/phpunit-bridge", - "version": "v6.4.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "bd0455b7888e4adac29cf175d819c51f88fed942" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bd0455b7888e4adac29cf175d819c51f88fed942", - "reference": "bd0455b7888e4adac29cf175d819c51f88fed942", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/polyfill-php81": "^1.27" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" - }, - "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 utilities for PHPUnit, especially user deprecation notices management", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.2" - }, - "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-12-19T09:12:31+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "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.2" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2023-11-20T00:12:19+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" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^8.2", - "ext-ctype": "*", - "ext-iconv": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/app/config/jwt/pair/private.pem b/app/config/jwt/pair/private.pem deleted file mode 100644 index 0dec58d..0000000 --- a/app/config/jwt/pair/private.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIDG1wPypQrFICAggA -MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECBiCAI6o2J9IBIIEyGAWj/h8U/io -OO9PYr7eq2Sbq1WGFl2doSikrpvRNTF96YRPJqlXYwXIWZ065Rb8ezBY6f055SIJ -Gx4qUKBxlMCTwHw6SgfKFiJR57H73fgemk1U54bLibn8rc6mPAYJIZooopyLOtzi -Gw2gNyvFcYFI4SlRTYbC5EnZbB0V3zUzBwmSKfEth5sjygCst3m2HtsjT4bw8Omt -UOnOmaSgWwVm78AbSzKmJ8/8GfZ+gLZl+LKeAdlK8PKM2NurK3em+Mn2pddjmSIY -HoUbfzhwEEy3gryRYaewjZLATFUVFB3jeNSadJbrApM2G3KD1KiBiGmq4rJVudbZ -NWdZCkE+vOyYfho6fRGaCBJl8Kvb3LAAhO4LGy3VKxlLOHJVQohe6+XLhRFyawLe -Aaznrm8FJOUldcKlXuWcNVP4xSGXrU6meQezdkje5Pur1UjuM/2maUClzyGQ4FCz -BjwDhN23fTGfrKRa9GPUvsLc7tfU+OgEVSjgoiIKH8sh5e2VMAFW+4O6sB8EfLPz -WTBOfTV7ehwMxQa5yx5Bt3VHo7E0rezUv9zMwPqL4sF1uykDBdCNBJCrDeZJbLSO -4F6E52DmHBfFHFn88s9Bmf2xRSFnb/BCdikxa9vO/GCMBwgyFYnLKBMjfBCy1z7c -NcHayZiqeFL03fC1FvBvaNf+bwYwBSVOEvz4Iqe9qLdErVVg3Ght1U8ypYk/3BbZ -8/+nYqeb8oFM4/YssOnd8NjsUoshinkYJdRUYm3KN5HbvulExmeTgJz37g6mi3Xx -b5DPW8fCWi16Grjn6DI56LzfpImOzhMNGUosib1NEDdOh1mW9U5dg1K3XisRrw1t -2aDAMvyMyb2SP6M238jPFaLSLoEvdR/P9Cfcn9JCTNiRWr9BZP1duwGzLPG7bxbs -RVlmpa13a+DYwvKcDGQjShQ7laQ+mr+pOCKwu1LOoiX9UBZRxIBDEXKwGtFo6DrI -lAo9ONNtaIIaTd2o1jYukW4teGfkYJ1PlMk7LCg6M0Y2bN5W/K4qnq6IjQ8Mq5zC -EaKGupBAkZ65Gc65EezfzrUm7tBnq/LmVPR9T8IusYElihVWlPGPpzPyjk/wbufW -J5iGmAk9IV593Y07pHfYwQ4pxjC3XTX9YGyB405L6AfDIlnu8AK7U+ep9JuJiAUY -p7tlpwUdmGSG9RWbfC71lVH+mEc3Lzt8BeA5gJRzMBw4VR6p0mDW9fpIKJhL144y -zOGfc+7WxX1PFd054jam1rKpffbJ9fTWgYXELBvjCiu274fize2lnMc8hb7oz8u4 -D5QnYuR7HqtptTPOuvGRMZH+qDSVnOJmoErY21eogAWrnY3Z/7r+6DyAKllrULx2 -Sn1GJBO5mqfmgLcTl9xw4rqgxgh2FuMVgPpcdxYxtOqWdLPIJxj/5/vfP0x37eb8 -I481rwa7Md+a6QYcTi4dcJrnjeNFOXJ0zbvDm4BXn43vTUFbZkasOruIq9+rIOx7 -QtVpd7dhy0O9gUpWDO142JsDLjM3WYJVrjnpT+02+T7RkS85ABj0StV9oxNyMeL8 -mbDhrJ3JTp38gX3Av01VakYs0J1T9pclImzTg+mPfeRXeIvWz89dCl3j52ggK5Ya -/+lKnbSqxndOqJSI+a8Mdg== ------END ENCRYPTED PRIVATE KEY----- diff --git a/app/config/jwt/pair/public.pem b/app/config/jwt/pair/public.pem deleted file mode 100644 index 27d9f70..0000000 --- a/app/config/jwt/pair/public.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Z5nsvdlCe48OFUUhG4L -JBEbltcyGY5z8rhrkchwEbX3O1aZwNzAwvZRu8iwZY0R12KXGjbneduXX0dpzS2b -cz5AOT1YffiNwO02g2lP5G/oal1k6H+dfExKUysvWZTjG6Z6bUgo6i+Ig2wx089F -X5syOxmke/KLW9IZoGIEoYLqGlInAxqXd9/aByFWowSd3p1OKRx5FzgrrwAQ7sGY -Ehmqu3ChdYh+0FAVdzfjZep2EtJDJjDebzBZ2Yc0VC94hAMZfdo5i5kwLHGSyQTN -si0FLCmKjqzZKP+4FH4AyYfSRvoMgyr+j1PjWMQAayoe/dE65ko3LQKq2V6E7JVj -owIDAQAB ------END PUBLIC KEY----- diff --git a/app/config/packages/secrity.yaml b/app/config/packages/secrity.yaml index d9b7abf..12be4a4 100644 --- a/app/config/packages/secrity.yaml +++ b/app/config/packages/secrity.yaml @@ -37,6 +37,19 @@ security: provider: database_provider jwt: ~ + # Game endpoints protected by JWT + flags: + pattern: ^/flags + stateless: true + provider: database_provider + jwt: ~ + + capitals: + pattern: ^/capitals + stateless: true + provider: database_provider + jwt: ~ + # Main firewall for web pages main: lazy: true @@ -46,11 +59,11 @@ security: access_control: # Allow OPTIONS requests for all API paths without a token - - { path: ^/api, methods: [OPTIONS], roles: PUBLIC_ACCESS } - { path: ^/login, roles: PUBLIC_ACCESS } - { path: ^/oauth/check, roles: PUBLIC_ACCESS } - { path: ^/api/public, roles: PUBLIC_ACCESS } - - { path: ^/api, roles: ROLE_USER } - { path: ^/capitals/test$, roles: PUBLIC_ACCESS } - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } - - { path: ^/capitals, roles: ROLE_USER } \ No newline at end of file + - { path: ^/api, methods: [OPTIONS], roles: PUBLIC_ACCESS } + - { path: ^/api, roles: ROLE_USER } + - { path: ^/capitals, roles: ROLE_USER } diff --git a/app/config/services.yaml b/app/config/services.yaml index e34dfdf..15baa05 100644 --- a/app/config/services.yaml +++ b/app/config/services.yaml @@ -34,5 +34,15 @@ services: resource: '../src/DataFixtures/*' App\EventListener\NgrokHeaderListener: + tags: + - { name: kernel.event_subscriber } + + App\EventListener\JsonExceptionListener: + arguments: + $environment: '%kernel.environment%' + tags: + - { name: kernel.event_subscriber } + + App\EventListener\JwtAuthenticationFailureListener: tags: - { name: kernel.event_subscriber } \ No newline at end of file diff --git a/app/docker-compose-prod.yml b/app/docker-compose-prod.yml deleted file mode 100644 index 82f70a8..0000000 --- a/app/docker-compose-prod.yml +++ /dev/null @@ -1,39 +0,0 @@ -services: - php: - environment: - VERSION_HASH: "${GITHUB_SHA:-none}" - SYMFONY_DECRYPTION_SECRET: "${SYMFONY_DECRYPTION_SECRET}" - APP_ENV : "prod" - extends: - file: docker-compose.yml - service: php - image: ${IMAGE}:php-latest - build: - dockerfile: .docker/php-fpm/Dockerfile - networks: - - backend-flags - nginx: - extends: - file: docker-compose.yml - service: nginx - image: ${IMAGE}:nginx-latest - container_name: "nginx-${PROJECT_NAME}" - ports: - - "8080:80" - - "4443:443" - networks: - - backend-flags - db: - extends: - file: docker-compose.yml - service: db - image: ${IMAGE}:db-latest - ports: - - "33060:3306" - networks: - - backend-flags -networks: - backend-flags: - external: true -volumes: - db-data-flags: ~ diff --git a/app/docker-compose-staging.yml b/app/docker-compose-staging.yml deleted file mode 100644 index 29dbb86..0000000 --- a/app/docker-compose-staging.yml +++ /dev/null @@ -1,48 +0,0 @@ -services: - php: - container_name: "php-staging-${PROJECT_NAME}" - build: - args: - KEY: ${GITH_KEY} - context: . - dockerfile: .docker/php-fpm/Dockerfile - depends_on: - - nginx - environment: - VERSION_HASH: "${GITHUB_SHA:-none}" - SYMFONY_DECRYPTION_SECRET: "${SYMFONY_DECRYPTION_SECRET}" - networks: - - backend-flags-staging - nginx: - container_name: "nginx-staging-${PROJECT_NAME}" - build: - context: . - dockerfile: .docker/nginx/Dockerfile - restart: always - ports: - - "8080:80" - - "4443:443" - networks: - - backend-flags-staging - db: - build: - context: . - dockerfile: .docker/mysql/Dockerfile - container_name: "db-staging-${PROJECT_NAME}" - environment: - MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE: "flags_staging" - MYSQL_USER: "${MYSQL_USER}" - MYSQL_PASSWORD: "${MYSQL_PASSWORD}" - volumes: - - db-data-flags-staging:/var/lib/mysql - restart: always - ports: - - "33061:3306" - networks: - - backend-flags-staging -networks: - backend-flags-staging: - external: true -volumes: - db-data-flags-staging: ~ diff --git a/app/docker-compose.override.yml b/app/docker-compose.override.yml index 714fbc6..5d2ed68 100644 --- a/app/docker-compose.override.yml +++ b/app/docker-compose.override.yml @@ -2,13 +2,11 @@ services: php: build: args: - KEY: ${GITH_KEY} USER_ID: 1000 GROUP_ID: 1000 target: development volumes: - - .:/var/www/webapp:rw,cached - + - .:/var/www/html:rw,cached db: ports: - "3306:3306" @@ -17,7 +15,7 @@ services: - "8000:80" - "4430:443" volumes: - - ./:/var/www/webapp:cached + - ./:/var/www/html:cached - caddy_data:/data - caddy_config:/config - caddy_logs:/var/log/caddy diff --git a/app/docker-compose.yml b/app/docker-compose.yml index 7057388..41136c4 100644 --- a/app/docker-compose.yml +++ b/app/docker-compose.yml @@ -7,8 +7,6 @@ services: target: production environment: SYMFONY_DECRYPTION_SECRET: "${SYMFONY_DECRYPTION_SECRET}" -# depends_on: -# - caddy networks: - backend-flags caddy: @@ -17,21 +15,10 @@ services: context: .. dockerfile: .docker/caddy/Dockerfile.prod restart: always -# ports: -# - "80:80" -# - "443:443" networks: - backend-flags depends_on: - php -# nginx: -# container_name: "nginx-php-flags-api" -# build: -# context: . -# dockerfile: ../.docker/nginx/Dockerfile -# restart: always -# networks: -# - backend-flags db: build: context: .. diff --git a/app/http-requests/flags-correct.http b/app/http-requests/flags-correct.http new file mode 100644 index 0000000..a6b5633 --- /dev/null +++ b/app/http-requests/flags-correct.http @@ -0,0 +1,4 @@ +### Submit correct flag answer +POST {{url}}/api/flags/correct/ua +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/flags-scores.http b/app/http-requests/flags-scores.http new file mode 100644 index 0000000..de0bfdc --- /dev/null +++ b/app/http-requests/flags-scores.http @@ -0,0 +1,6 @@ +### Submit game score +POST {{url}}/flags/scores +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +{"score":0,"sessionTimer":45,"answers":[]} diff --git a/app/http-requests/http-client.env.json b/app/http-requests/http-client.env.json index 8f4bdb8..647828a 100644 --- a/app/http-requests/http-client.env.json +++ b/app/http-requests/http-client.env.json @@ -3,6 +3,8 @@ "auth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiIxM2EwMmU2NDg3NzYzNjcyODI2MzQwZWQ4NDA0NGMxMzMwY2E4MDgxYWYzNGEwYjJiYmE5MjgyNzI2M2RlYjU0MDY2Njk5MDJmZDU2NzQxNyIsImlhdCI6MTc2NTA1ODcwMS4xNjYyODksIm5iZiI6MTc2NTA1ODcwMS4xNjYyOTEsImV4cCI6MTc2NTA2MjMwMS4xNjI2Miwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.aBzIJkh_Ri4wjCcQBHg9hucg5JkiZ7T-P22WBN0xcTvQbxbsjyrkyrW2vUR_wgpfvHPNVouA8QB-ndEVqU3LuTI7YNmMwMORLc33rdnrbU_nxgKPY_UEWGHWy85H_SWJyKiMewde48MS-fjXObKKnMMQI1YkpuzP6u6XcxrKYBinsVB-9XAHW5ct_r59gpZPMgKoHlZm2KaLAl3VHSVznov7yfsYBOWFZHepyoxRS1WqbDb5agJANN70tXAi5SPftff9EewzyULe5vxTpblkoAO1aYl7rMqWharWnwqRukGqKdAp1Jc2Vg1qxa0AINCjIFjM1HG8XKTue_MECiou_w", "redirect_url": "https://3bd5404da6bd.ngrok-free.app/oauth/check", "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA", - "t1" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJkNzE1OTc5YmE0YjNiZDJkODIzZjYzYWYyY2Q5N2M2OWU0YzI0OWRlOWMxN2I3Njc0MTQ3NTA0YWZhZGU2YjFlOTA1NmIyMWRkMzA3YWI4OSIsImlhdCI6MTc2NTEyMzEzMi4zNTc0MTMsIm5iZiI6MTc2NTEyMzEzMi4zNTc0MTcsImV4cCI6MTc2NTEyNjczMi4zNTAzMiwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.IeX6GCpHqZG5kJ1JoVxFE8gy7v1NOz6vpPPF7GqlJsKL4kaW8-KfsmElfZEk3XVVOvCEeZv01sO7fM5-sr9mhLPKfhHpPf9Sr0Roq80klKJFW3YJ2RSEfPHWnz3PAbSOB6wM00FkXNqixsW4hUVj_q7aIJ4KNy_WA-_A-K17J2n6WodsNvJzIE94G499fKfXfMJJiuxeZntdTzaPT8_p9MR0ORaXGc-8GmpxR-iS_uHftGT4fBSxGY4eiAIPtwZ9SBeluZL7OqKbfyFN5kAJW_iT4H7hRQUxZSrXc_g2il2Kc2zlGRBb5t6yogrSNauzs9VAEZ6zW2i52L_WpVTOqw" + "t1" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJkNzE1OTc5YmE0YjNiZDJkODIzZjYzYWYyY2Q5N2M2OWU0YzI0OWRlOWMxN2I3Njc0MTQ3NTA0YWZhZGU2YjFlOTA1NmIyMWRkMzA3YWI4OSIsImlhdCI6MTc2NTEyMzEzMi4zNTc0MTMsIm5iZiI6MTc2NTEyMzEzMi4zNTc0MTcsImV4cCI6MTc2NTEyNjczMi4zNTAzMiwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.IeX6GCpHqZG5kJ1JoVxFE8gy7v1NOz6vpPPF7GqlJsKL4kaW8-KfsmElfZEk3XVVOvCEeZv01sO7fM5-sr9mhLPKfhHpPf9Sr0Roq80klKJFW3YJ2RSEfPHWnz3PAbSOB6wM00FkXNqixsW4hUVj_q7aIJ4KNy_WA-_A-K17J2n6WodsNvJzIE94G499fKfXfMJJiuxeZntdTzaPT8_p9MR0ORaXGc-8GmpxR-iS_uHftGT4fBSxGY4eiAIPtwZ9SBeluZL7OqKbfyFN5kAJW_iT4H7hRQUxZSrXc_g2il2Kc2zlGRBb5t6yogrSNauzs9VAEZ6zW2i52L_WpVTOqw", + "url" : "http://localhost:8000", + "0xNTK_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI4MDIwOTIzZDFlZjc0NWI4M2NlM2IxZWZhZTVhNTQ1MDU5ZWI4N2E4ZGU1MjkwODFmNWQ1NDVmNzA5NTQ3ZTkwN2Q2YjI3ZjY3YTNlYzIxNCIsImlhdCI6MTc2NjUyMjU0NS43NTI0MTgsIm5iZiI6MTc2NjUyMjU0NS43NTI0MTksImV4cCI6MTc2NjUyNjE0NS43NDU2OCwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.lf_qHd5wsN5FTt0CLaeUfo_qEPEDKvnqWTPGsKWBOUSk6JYtN8gKlmVDxPBKapDhZXfWBt0SRR_IAlEek8Vxvo_qUFL_3j8pkxtc3sXz8qjEWhQvJDKqTPHQSXQIHgfO8aDh5_dCdYjRBKSNs7nxkfoSBwGDfHNQoDebDNvqC3NHeUjc0Apv7TP67lR67-V-kheaMssl0uJQiJkK_GDT2qJmx1o2UEXHYmxBG3mEY-ZI8xflGdqP22hZ28KXkJpKXCnMvi0A-wR-rsM6Sv_-OHxmJk-1WyJ59YIedfeiuSjPM8XqHV3826NBdxpjYwjEEszkANZh3DAVvUIORzt6Uw" } } \ No newline at end of file diff --git a/app/makefile b/app/makefile index 683e1b5..cf879b9 100644 --- a/app/makefile +++ b/app/makefile @@ -1,18 +1,25 @@ include .env +default: welcome init: build-containers run-containers composer import-db run-api run: run-containers run-api +db: + @docker compose exec php bin/console d:d:c --if-not-exists + @docker compose exec php bin/console d:m:m -n build: @docker compose build -run-containers: +up: @docker compose up -d -run-api: - @symfony server:start +down: + @docker compose down +rebuild: down build up import-db: @bin/console d:d:i flags.sql composer: @docker compose exec php composer install -deploy: - @./vendor/bin/dep deploy production +psalm: + @docker compose exec php vendor/bin/psalm --no-cache +cache: + @docker compose exec php bin/console c:c welcome: @echo hi test: diff --git a/app/migrations/Version20200322114725.php b/app/migrations/Version20200322114725.php index f500679..45bca18 100644 --- a/app/migrations/Version20200322114725.php +++ b/app/migrations/Version20200322114725.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, telegram_id VARCHAR(255) NOT NULL, first_name VARCHAR(255) DEFAULT NULL, last_name VARCHAR(255) DEFAULT NULL, telegram_username VARCHAR(255) DEFAULT NULL, telegram_photo_url VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); } @@ -28,7 +28,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('DROP TABLE user'); } diff --git a/app/migrations/Version20210103221647.php b/app/migrations/Version20210103221647.php index a1a3a57..2b606ab 100644 --- a/app/migrations/Version20210103221647.php +++ b/app/migrations/Version20210103221647.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user ADD high_score INT NOT NULL'); } @@ -28,7 +28,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user DROP high_score'); } diff --git a/app/migrations/Version20210109193151.php b/app/migrations/Version20210109193151.php index 82e1975..579e8f4 100644 --- a/app/migrations/Version20210109193151.php +++ b/app/migrations/Version20210109193151.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user ADD games_total INT NOT NULL, ADD best_time INT NOT NULL'); } @@ -28,7 +28,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user DROP games_total, DROP best_time'); } diff --git a/app/migrations/Version20210109213855.php b/app/migrations/Version20210109213855.php index 7d5e321..9c3a8d5 100644 --- a/app/migrations/Version20210109213855.php +++ b/app/migrations/Version20210109213855.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('CREATE TABLE score (id INT AUTO_INCREMENT NOT NULL, session_timer VARCHAR(255) NOT NULL, score VARCHAR(255) NOT NULL, date DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); $this->addSql('ALTER TABLE user ADD time_total INT NOT NULL'); @@ -29,7 +29,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('DROP TABLE score'); $this->addSql('ALTER TABLE user DROP time_total'); diff --git a/app/migrations/Version20210109232957.php b/app/migrations/Version20210109232957.php index 5a9300b..a7aa024 100644 --- a/app/migrations/Version20210109232957.php +++ b/app/migrations/Version20210109232957.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('CREATE TABLE answer (id INT AUTO_INCREMENT NOT NULL, timer INT NOT NULL, flag_code VARCHAR(255) NOT NULL, answer_options VARCHAR(255) NOT NULL, correct TINYINT(1) NOT NULL, date DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); } @@ -28,7 +28,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('DROP TABLE answer'); } diff --git a/app/migrations/Version20210109233702.php b/app/migrations/Version20210109233702.php index 29a462c..3ef99d2 100644 --- a/app/migrations/Version20210109233702.php +++ b/app/migrations/Version20210109233702.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user ADD answer_id INT DEFAULT NULL'); $this->addSql('ALTER TABLE user ADD CONSTRAINT FK_8D93D649AA334807 FOREIGN KEY (answer_id) REFERENCES answer (id)'); @@ -30,7 +30,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user DROP FOREIGN KEY FK_8D93D649AA334807'); $this->addSql('DROP INDEX IDX_8D93D649AA334807 ON user'); diff --git a/app/migrations/Version20210110000325.php b/app/migrations/Version20210110000325.php index 39e1103..8c41a60 100644 --- a/app/migrations/Version20210110000325.php +++ b/app/migrations/Version20210110000325.php @@ -20,7 +20,7 @@ public function getDescription() : string public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE user DROP FOREIGN KEY FK_8D93D649AA334807'); $this->addSql('DROP INDEX IDX_8D93D649AA334807 ON user'); @@ -33,7 +33,7 @@ public function up(Schema $schema) : void public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf(!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\AbstractMySQLPlatform, 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE answer DROP FOREIGN KEY FK_DADD4A25A76ED395'); $this->addSql('DROP INDEX IDX_DADD4A25A76ED395 ON answer'); diff --git a/app/src/EventListener/JsonExceptionListener.php b/app/src/EventListener/JsonExceptionListener.php new file mode 100644 index 0000000..02dfd3b --- /dev/null +++ b/app/src/EventListener/JsonExceptionListener.php @@ -0,0 +1,45 @@ + ['onKernelException', 0], + ]; + } + + public function onKernelException(ExceptionEvent $event): void + { + $exception = $event->getThrowable(); + + $statusCode = $exception instanceof HttpExceptionInterface + ? $exception->getStatusCode() + : 500; + + $data = [ + 'error' => true, + 'message' => $exception->getMessage(), + 'code' => $statusCode, + ]; + + if ($this->environment === 'dev') { + $data['trace'] = $exception->getTraceAsString(); + } + + $response = new JsonResponse($data, $statusCode); + $event->setResponse($response); + } +} diff --git a/app/src/EventListener/JwtAuthenticationFailureListener.php b/app/src/EventListener/JwtAuthenticationFailureListener.php new file mode 100644 index 0000000..06f3d8a --- /dev/null +++ b/app/src/EventListener/JwtAuthenticationFailureListener.php @@ -0,0 +1,46 @@ + 'onJwtInvalid', + 'lexik_jwt_authentication.on_jwt_not_found' => 'onJwtNotFound', + 'lexik_jwt_authentication.on_jwt_expired' => 'onJwtExpired', + ]; + } + + public function onJwtInvalid(JWTInvalidEvent $event): void + { + $exception = $event->getException(); + $this->logger->error('JWT Invalid: ' . $exception->getMessage(), [ + 'previous' => $exception->getPrevious()?->getMessage(), + ]); + } + + public function onJwtNotFound(JWTNotFoundEvent $event): void + { + $exception = $event->getException(); + $this->logger->warning('JWT Not Found: ' . $exception->getMessage()); + } + + public function onJwtExpired(JWTExpiredEvent $event): void + { + $exception = $event->getException(); + $this->logger->warning('JWT Expired: ' . $exception->getMessage()); + } +} diff --git a/app/src/Flags/Controller/GameController.php b/app/src/Flags/Controller/GameController.php index 2bedb9a..74bbf68 100644 --- a/app/src/Flags/Controller/GameController.php +++ b/app/src/Flags/Controller/GameController.php @@ -11,26 +11,18 @@ use App\Flags\Repository\UserRepository; use Doctrine\ORM\EntityManagerInterface; use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface; -//use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTManager; -use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface; use Rteeom\FlagsGenerator\FlagsGenerator; -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity; -use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\DependencyInjection\Attribute\Autowire; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver; use Symfony\Component\Intl\Countries; use Symfony\Component\Routing\Annotation\Route; -use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface; use Symfony\Component\Security\Http\Attribute\CurrentUser; -use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; -use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Bridge\Doctrine\Attribute\MapEntity; +#[Route('/api/flags')] class GameController extends AbstractController { protected FlagsGenerator $flagsGenerator; @@ -65,7 +57,6 @@ public function getQuestion(): JsonResponse return $this->json([ 'APP_ENV' => getenv('APP_ENV'), - 'xaxa' => 'lalka', 'version' => getenv('VERSION_HASH'), 'flags' => $flags, // questionText @@ -75,11 +66,11 @@ public function getQuestion(): JsonResponse ]); } - /** - * @Entity("flag", expr="repository.findOneByCode(flags)") - */ - #[Route('/flags/correct/{flags}', name: 'submit_correct', methods: ['POST'])] - public function correct(Flag $flag, EntityManagerInterface $entityManager): Response + #[Route('/correct/{flag}', name: 'submit_correct', methods: ['POST'])] + public function correct( + #[MapEntity(mapping: ['flag' => 'code'])] Flag $flag, + EntityManagerInterface $entityManager, + ): Response { $flag->incrementCorrectAnswersCounter(); $entityManager->flush(); @@ -136,7 +127,6 @@ public function authAction(Request $request, JWTEncoderInterface $encoder): Resp return new JsonResponse(['token' => $token]); } - /** @Security("is_granted('ROLE_USER')") */ #[Route('/api/protected', name: 'get_profile', methods: ['GET', 'OPTIONS'])] public function getProfile(): Response { @@ -149,8 +139,7 @@ public function getHighScores(UserRepository $repository): Response return $this->json($repository->getHighScores()); } - /** @Security("is_granted('ROLE_USER')") */ - #[Route('/flags/scores', name: 'submit_game_results', methods: ['POST'])] + #[Route('/scores', name: 'submit_game_results', methods: ['POST'])] public function postScore(Request $request, EntityManagerInterface $entityManager, #[CurrentUser] $user): Response { $requestArray = json_decode($request->getContent(), true); @@ -179,35 +168,8 @@ public function getEmoji(string $flag): Response return new Response($flag); } - - #[Route('/token', name: 'test_token', methods: ['GET'])] - public function getToken( - JWTEncoderInterface $encoder, - UserRepository $repository, - TokenStorageInterface $storage, - JWTTokenManagerInterface $JWTManager, - #[Autowire(service: 'lexik_jwt_authentication.handler.authentication_success')] - AuthenticationSuccessHandlerInterface $handler - ): Response { -// $user = $repository->getAnyUser(); - $user = $repository->findOneBySub('1'); -// $token = $encoder -// ->encode([ -// 'username' => $user->getTelegramId(), -// 'exp' => time() + 36000 -// ]); - - $token = $JWTManager->create($user); -// $handler = $this->container->get('lexik_jwt_authentication.handler.authentication_success'); - $handler->handleAuthenticationSuccess($user, $token); - -// $storage->setToken($user->getTelegramId(), $token); - - return $this->json(['token' => $token]); - } - /** @Security("is_granted('ROLE_USER')") */ - #[Route('/api/incorrect', name: 'incorrect', methods: ['GET', 'OPTIONS'])] + #[Route('/incorrect', name: 'incorrect', methods: ['GET', 'OPTIONS'])] public function getStat(#[CurrentUser] $user, AnswerRepository $repository): Response { $correctResults = $repository->findCorrectGuesses($user->getId()); @@ -239,8 +201,7 @@ public function getStat(#[CurrentUser] $user, AnswerRepository $repository): Res return $this->json($result); } - /** @Security("is_granted('ROLE_USER')") */ - #[Route('/api/correct', name: 'correct', methods: ['GET', 'OPTIONS'])] + #[Route('/correct', name: 'correct', methods: ['GET', 'OPTIONS'])] public function getRight(#[CurrentUser] $user, AnswerRepository $repository): Response { $correctResults = $repository->findCorrectGuesses($user->getId()); @@ -270,15 +231,4 @@ public function getRight(#[CurrentUser] $user, AnswerRepository $repository): Re return $this->json($result); } - - #[Route('/test-header', name: 'test_header')] - public function testHeader(): Response - { - return new JsonResponse([ - 'message' => 'If you see this without ngrok warning, headers work!', - 'headers' => [ - 'ngrok-skip' => 'true' - ] - ]); - } } diff --git a/app/test b/app/test deleted file mode 100644 index 8b13789..0000000 --- a/app/test +++ /dev/null @@ -1 +0,0 @@ - From 9de5dbde65c741ffe1875bfdb81cd0063e201bd2 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Tue, 23 Dec 2025 22:34:29 +0000 Subject: [PATCH 18/25] upgrade: removed framework extra bundle --- .docker/caddy/Caddyfile | 2 +- .docker/caddy/Dockerfile | 2 +- .docker/php-fpm/Dockerfile | 9 +- app/composer.json | 1 - app/composer.lock | 82 +--- app/config/bundles.php | 1 - app/http-requests/flags-correct.http | 2 +- app/http-requests/http-client.env.json | 2 +- .../Flags/Application/PostParamConverter.php | 386 ------------------ app/src/Flags/Controller/GameController.php | 2 +- app/symfony.lock | 12 - 11 files changed, 12 insertions(+), 489 deletions(-) delete mode 100644 app/src/Flags/Application/PostParamConverter.php diff --git a/.docker/caddy/Caddyfile b/.docker/caddy/Caddyfile index e29581b..9704d1a 100644 --- a/.docker/caddy/Caddyfile +++ b/.docker/caddy/Caddyfile @@ -6,7 +6,7 @@ :80 { # Root directory - root * /var/www/webapp/public + root * /var/www/html/public # PHP-FPM configuration php_fastcgi php:9000 { diff --git a/.docker/caddy/Dockerfile b/.docker/caddy/Dockerfile index dae5188..5c16ed9 100644 --- a/.docker/caddy/Dockerfile +++ b/.docker/caddy/Dockerfile @@ -14,7 +14,7 @@ RUN deluser www-data 2>/dev/null || true && \ # Copy Caddyfile COPY .docker/caddy/Caddyfile /etc/caddy/Caddyfile -COPY ../../app /var/www/webapp +COPY ../../app /var/www/html # Create log directory RUN mkdir -p /var/log/caddy && \ diff --git a/.docker/php-fpm/Dockerfile b/.docker/php-fpm/Dockerfile index 0d5d9ae..de9ec67 100644 --- a/.docker/php-fpm/Dockerfile +++ b/.docker/php-fpm/Dockerfile @@ -29,6 +29,7 @@ FROM base AS development ARG USER_ID=1000 ARG GROUP_ID=1000 +WORKDIR /var/www/html RUN apk add --no-cache git curl wget vim bash @@ -42,8 +43,8 @@ RUN { \ echo 'opcache.enable_cli = 1'; \ echo 'opcache.validate_timestamps = 1'; \ echo 'opcache.revalidate_freq = 0'; \ - echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'session.save_handler = files'; \ + echo 'session.save_path = "/tmp"'; \ echo 'display_errors = On'; \ echo 'error_reporting = E_ALL'; \ echo 'log_errors = On'; \ @@ -83,8 +84,8 @@ RUN { \ echo 'memory_limit = 256M'; \ echo 'opcache.enable = 1'; \ echo 'opcache.enable_cli = 0'; \ - echo 'session.save_handler = redis'; \ - echo 'session.save_path = "tcp://redis:6379"'; \ + echo 'session.save_handler = files'; \ + echo 'session.save_path = "/tmp"'; \ echo 'display_errors = Off'; \ echo 'log_errors = On'; \ } > /usr/local/etc/php/conf.d/custom.ini diff --git a/app/composer.json b/app/composer.json index a2031cb..a7df102 100644 --- a/app/composer.json +++ b/app/composer.json @@ -16,7 +16,6 @@ "nelmio/cors-bundle": "^2.3", "phpactor/language-server": "^6.1", "rteeom/isoflags": "^1.1", - "sensio/framework-extra-bundle": "*", "symfony/console": "*", "symfony/dotenv": "*", "symfony/expression-language": "*", diff --git a/app/composer.lock b/app/composer.lock index 16296f3..cbaac13 100644 --- a/app/composer.lock +++ b/app/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": "64e04b77266413641c5848f0dcb538dd", + "content-hash": "ab4d280b3e93d89e73c82afab8cdfa88", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2552,84 +2552,6 @@ }, "time": "2024-10-23T19:44:49+00:00" }, - { - "name": "sensio/framework-extra-bundle", - "version": "v6.2.10", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", - "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0|^2.0", - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/framework-bundle": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/doctrine-cache-bundle": "<1.3.1", - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.10|^3.0", - "doctrine/doctrine-bundle": "^1.11|^2.0", - "doctrine/orm": "^2.5", - "symfony/browser-kit": "^4.4|^5.0|^6.0", - "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/monolog-bridge": "^4.0|^5.0|^6.0", - "symfony/monolog-bundle": "^3.2", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", - "symfony/security-bundle": "^4.4|^5.0|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^1.34|^2.4|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "6.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" - }, - "exclude-from-classmap": [ - "/tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle provides a way to configure your controllers with annotations", - "keywords": [ - "annotations", - "controllers" - ], - "support": { - "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" - }, - "abandoned": "Symfony", - "time": "2023-02-24T14:57:12+00:00" - }, { "name": "symfony/cache", "version": "v6.4.30", @@ -10241,5 +10163,5 @@ "ext-iconv": "*" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/app/config/bundles.php b/app/config/bundles.php index a38b926..8367e24 100644 --- a/app/config/bundles.php +++ b/app/config/bundles.php @@ -3,7 +3,6 @@ return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], diff --git a/app/http-requests/flags-correct.http b/app/http-requests/flags-correct.http index a6b5633..d6dc203 100644 --- a/app/http-requests/flags-correct.http +++ b/app/http-requests/flags-correct.http @@ -1,4 +1,4 @@ ### Submit correct flag answer -POST {{url}}/api/flags/correct/ua +POST {{url}}/api/flags/correct/au Authorization: Bearer {{0xNTK_token}} Content-Type: application/json diff --git a/app/http-requests/http-client.env.json b/app/http-requests/http-client.env.json index 647828a..d86d48c 100644 --- a/app/http-requests/http-client.env.json +++ b/app/http-requests/http-client.env.json @@ -5,6 +5,6 @@ "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA", "t1" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJkNzE1OTc5YmE0YjNiZDJkODIzZjYzYWYyY2Q5N2M2OWU0YzI0OWRlOWMxN2I3Njc0MTQ3NTA0YWZhZGU2YjFlOTA1NmIyMWRkMzA3YWI4OSIsImlhdCI6MTc2NTEyMzEzMi4zNTc0MTMsIm5iZiI6MTc2NTEyMzEzMi4zNTc0MTcsImV4cCI6MTc2NTEyNjczMi4zNTAzMiwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.IeX6GCpHqZG5kJ1JoVxFE8gy7v1NOz6vpPPF7GqlJsKL4kaW8-KfsmElfZEk3XVVOvCEeZv01sO7fM5-sr9mhLPKfhHpPf9Sr0Roq80klKJFW3YJ2RSEfPHWnz3PAbSOB6wM00FkXNqixsW4hUVj_q7aIJ4KNy_WA-_A-K17J2n6WodsNvJzIE94G499fKfXfMJJiuxeZntdTzaPT8_p9MR0ORaXGc-8GmpxR-iS_uHftGT4fBSxGY4eiAIPtwZ9SBeluZL7OqKbfyFN5kAJW_iT4H7hRQUxZSrXc_g2il2Kc2zlGRBb5t6yogrSNauzs9VAEZ6zW2i52L_WpVTOqw", "url" : "http://localhost:8000", - "0xNTK_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI4MDIwOTIzZDFlZjc0NWI4M2NlM2IxZWZhZTVhNTQ1MDU5ZWI4N2E4ZGU1MjkwODFmNWQ1NDVmNzA5NTQ3ZTkwN2Q2YjI3ZjY3YTNlYzIxNCIsImlhdCI6MTc2NjUyMjU0NS43NTI0MTgsIm5iZiI6MTc2NjUyMjU0NS43NTI0MTksImV4cCI6MTc2NjUyNjE0NS43NDU2OCwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.lf_qHd5wsN5FTt0CLaeUfo_qEPEDKvnqWTPGsKWBOUSk6JYtN8gKlmVDxPBKapDhZXfWBt0SRR_IAlEek8Vxvo_qUFL_3j8pkxtc3sXz8qjEWhQvJDKqTPHQSXQIHgfO8aDh5_dCdYjRBKSNs7nxkfoSBwGDfHNQoDebDNvqC3NHeUjc0Apv7TP67lR67-V-kheaMssl0uJQiJkK_GDT2qJmx1o2UEXHYmxBG3mEY-ZI8xflGdqP22hZ28KXkJpKXCnMvi0A-wR-rsM6Sv_-OHxmJk-1WyJ59YIedfeiuSjPM8XqHV3826NBdxpjYwjEEszkANZh3DAVvUIORzt6Uw" + "0xNTK_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJjMTliNWZlNjE5N2VmNTUwMTkyNTE4YjgxZDFjNTMxNDBhZWIwMWNlZjMwMzQ5NWJlNDM1ZmNjNjNjN2ZmYTc3YjViMGZiMDFjZTU0YzMzNyIsImlhdCI6MTc2NjUyNzU1My4xNTU4NDMsIm5iZiI6MTc2NjUyNzU1My4xNTU4NDQsImV4cCI6MTc2NjUzMTE1My4xNDg5MzcsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.AjUVCt1iyi-cq6_O9rBuzm4DNDiOiuGPhPqvsNDtp-OREQqIF1LDGIQsI4uOSI75ixbVhWOmQavkodyr_5kL_7JmoRqKdMiSQ0HRmaLp96rckfyy2GX_5U41hu_Rpbh0HFYnoaGbdK7X3eJOAvKEgPm0e66tLI9jewYC4-stjJ6T0kmXKNsNAIqEwXOEf2eRatKrV9NUn8WerbhzCAH4JoNl1GXB_LwDdsgu9qREI_x0jfq3Apo1rmOyvN28dg7_sWc_ZDwqOsdcMtw1zcWBKLTK88DfvaeGmvXBloSvNUeUUU29T_bb6bvzyI9jt0vx62Jlz8TTh4taep4a4vGJ6Q" } } \ No newline at end of file diff --git a/app/src/Flags/Application/PostParamConverter.php b/app/src/Flags/Application/PostParamConverter.php deleted file mode 100644 index f6fec0a..0000000 --- a/app/src/Flags/Application/PostParamConverter.php +++ /dev/null @@ -1,386 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -//namespace Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter; - - - - /** - * DoctrineParamConverter. - * - * @author Fabien Potencier - */ -//class DoctrineParamConverter implements ParamConverterInterface -//{ - /** - * @var ManagerRegistry - */ - private $registry; - - /** - * @var ExpressionLanguage - */ - private $language; - - /** - * @var array - */ - private $defaultOptions; - private $s; - public function __construct( - ManagerRegistry $registry = null, - ExpressionLanguage $expressionLanguage = null, - SerializerInterface $s, - array $options = [] - ) { - $this->registry = $registry; - $this->language = $expressionLanguage; - - $defaultValues = [ - 'entity_manager' => null, - 'exclude' => [], - 'mapping' => [], - 'strip_null' => false, - 'expr' => null, - 'id' => null, - 'repository_method' => null, - 'map_method_signature' => false, - 'evict_cache' => false, - ]; - - $this->defaultOptions = array_merge($defaultValues, $options); - - $this->s = $s; - } - - /** - * {@inheritdoc} - * - * @throws \LogicException When unable to guess how to get a Doctrine instance from the request information - * @throws NotFoundHttpException When object not found - */ - public function apply(Request $request, ParamConverter $configuration) - { -// dd($configuration); - -// return true; -// dd($configuration); - $name = $configuration->getName(); - $class = $configuration->getClass(); - $options = $this->getOptions($configuration); - - if (null === $request->attributes->get($name, false)) { - $configuration->setIsOptional(true); - } -// - $errorMessage = null; -// if ($expr = $options['expr']) { -// $object = $this->findViaExpression($class, $request, $expr, $options, $configuration); -// -// if (null === $object) { -// $errorMessage = sprintf('The expression "%s" returned null', $expr); -// } -// -// // find by identifier? -// } elseif (false === $object = $this->find($class, $request, $options, $name)) { -// // find by criteria -// if (false === $object = $this->findOneBy($class, $request, $options)) { -// if ($configuration->isOptional()) { -// $object = null; -// } else { -// throw new \LogicException(sprintf('Unable to guess how to get a Doctrine instance from the request information for parameter "%s".', -// $name)); -// } -// } -// } - -// if (null === $object && false === $configuration->isOptional()) { -// $message = sprintf('%s object not found by the @%s annotation.', $class, -// $this->getAnnotationName($configuration)); -// if ($errorMessage) { -// $message .= ' ' . $errorMessage; -// } -// throw new NotFoundHttpException($message); -// } - - $object = $request->getContent(); - $o = $this->s->deserialize($object, $class, 'json'); -// dump($o); - -// $name = $configuration->getName(); - - $request->attributes->set($name, $o); - -// $request->attributes->set($name, $object); - - return true; - } - - private function find($class, Request $request, $options, $name) - { - if ($options['mapping'] || $options['exclude']) { - return false; - } - - $id = $this->getIdentifier($request, $options, $name); - - if (false === $id || null === $id) { - return false; - } - - if ($options['repository_method']) { - $method = $options['repository_method']; - } else { - $method = 'find'; - } - - $om = $this->getManager($options['entity_manager'], $class); - if ($options['evict_cache'] && $om instanceof EntityManagerInterface) { - $cacheProvider = $om->getCache(); - if ($cacheProvider && $cacheProvider->containsEntity($class, $id)) { - $cacheProvider->evictEntity($class, $id); - } - } - - try { - return $om->getRepository($class)->$method($id); - } catch (NoResultException $e) { - return; - } catch (ConversionException $e) { - return; - } - } - - private function getIdentifier(Request $request, $options, $name) - { - if (null !== $options['id']) { - if (!\is_array($options['id'])) { - $name = $options['id']; - } elseif (\is_array($options['id'])) { - $id = []; - foreach ($options['id'] as $field) { - if (false !== strstr($field, '%s')) { - // Convert "%s_uuid" to "foobar_uuid" - $field = sprintf($field, $name); - } - $id[$field] = $request->attributes->get($field); - } - - return $id; - } - } - - if ($request->attributes->has($name)) { - return $request->attributes->get($name); - } - - if ($request->attributes->has('id') && !$options['id']) { - return $request->attributes->get('id'); - } - - return false; - } - - private function findOneBy($class, Request $request, $options) - { - if (!$options['mapping']) { - $keys = $request->attributes->keys(); - $options['mapping'] = $keys ? array_combine($keys, $keys) : []; - } - - foreach ($options['exclude'] as $exclude) { - unset($options['mapping'][$exclude]); - } - - if (!$options['mapping']) { - return false; - } - - // if a specific id has been defined in the options and there is no corresponding attribute - // return false in order to avoid a fallback to the id which might be of another object - if ($options['id'] && null === $request->attributes->get($options['id'])) { - return false; - } - - $criteria = []; - $em = $this->getManager($options['entity_manager'], $class); - $metadata = $em->getClassMetadata($class); - - $mapMethodSignature = $options['repository_method'] - && $options['map_method_signature'] - && true === $options['map_method_signature']; - - foreach ($options['mapping'] as $attribute => $field) { - if ($metadata->hasField($field) - || ($metadata->hasAssociation($field) && $metadata->isSingleValuedAssociation($field)) - || $mapMethodSignature) { - $criteria[$field] = $request->attributes->get($attribute); - } - } - - if ($options['strip_null']) { - $criteria = array_filter($criteria, function ($value) { - return null !== $value; - }); - } - - if (!$criteria) { - return false; - } - - if ($options['repository_method']) { - $repositoryMethod = $options['repository_method']; - } else { - $repositoryMethod = 'findOneBy'; - } - - try { - if ($mapMethodSignature) { - return $this->findDataByMapMethodSignature($em, $class, $repositoryMethod, $criteria); - } - - return $em->getRepository($class)->$repositoryMethod($criteria); - } catch (NoResultException $e) { - return; - } catch (ConversionException $e) { - return; - } - } - - private function findDataByMapMethodSignature($em, $class, $repositoryMethod, $criteria) - { - $arguments = []; - $repository = $em->getRepository($class); - $ref = new \ReflectionMethod($repository, $repositoryMethod); - foreach ($ref->getParameters() as $parameter) { - if (\array_key_exists($parameter->name, $criteria)) { - $arguments[] = $criteria[$parameter->name]; - } elseif ($parameter->isDefaultValueAvailable()) { - $arguments[] = $parameter->getDefaultValue(); - } else { - throw new \InvalidArgumentException(sprintf('Repository method "%s::%s" requires that you provide a value for the "$%s" argument.', - \get_class($repository), $repositoryMethod, $parameter->name)); - } - } - - return $ref->invokeArgs($repository, $arguments); - } - - private function findViaExpression($class, Request $request, $expression, $options, ParamConverter $configuration) - { - if (null === $this->language) { - throw new \LogicException(sprintf('To use the @%s tag with the "expr" option, you need to install the ExpressionLanguage component.', - $this->getAnnotationName($configuration))); - } - - $repository = $this->getManager($options['entity_manager'], $class)->getRepository($class); - $variables = array_merge($request->attributes->all(), ['repository' => $repository]); - - try { - return $this->language->evaluate($expression, $variables); - } catch (NoResultException $e) { - return; - } catch (ConversionException $e) { - return; - } catch (SyntaxError $e) { - throw new \LogicException(sprintf('Error parsing expression -- %s -- (%s)', $expression, $e->getMessage()), - 0, $e); - } - } - - /** - * {@inheritdoc} - */ - public function supports(ParamConverter $configuration) - { -// dd($configuration); -// exit; - return $configuration->getClass() === Score::class; - // if there is no manager, this means that only Doctrine DBAL is configured - if (null === $this->registry || !\count($this->registry->getManagerNames())) { - return false; - } - - if (null === $configuration->getClass()) { - return false; - } - - $options = $this->getOptions($configuration, false); - - // Doctrine Entity? - $em = $this->getManager($options['entity_manager'], $configuration->getClass()); - if (null === $em) { - return false; - } - - return !$em->getMetadataFactory()->isTransient($configuration->getClass()); - } - - private function getOptions(ParamConverter $configuration, $strict = true) - { - $passedOptions = $configuration->getOptions(); - - if (isset($passedOptions['repository_method'])) { - @trigger_error('The repository_method option of @ParamConverter is deprecated and will be removed in 6.0. Use the expr option or @Entity.', - E_USER_DEPRECATED); - } - - if (isset($passedOptions['map_method_signature'])) { - @trigger_error('The map_method_signature option of @ParamConverter is deprecated and will be removed in 6.0. Use the expr option or @Entity.', - E_USER_DEPRECATED); - } - - $extraKeys = array_diff(array_keys($passedOptions), array_keys($this->defaultOptions)); - if ($extraKeys && $strict) { - throw new \InvalidArgumentException(sprintf('Invalid option(s) passed to @%s: %s', - $this->getAnnotationName($configuration), implode(', ', $extraKeys))); - } - - return array_replace($this->defaultOptions, $passedOptions); - } - - private function getManager($name, $class) - { - if (null === $name) { - return $this->registry->getManagerForClass($class); - } - - return $this->registry->getManager($name); - } - - private function getAnnotationName(ParamConverter $configuration) - { - $r = new \ReflectionClass($configuration); - - return $r->getShortName(); - } -//} - -} \ No newline at end of file diff --git a/app/src/Flags/Controller/GameController.php b/app/src/Flags/Controller/GameController.php index 74bbf68..7aff4cd 100644 --- a/app/src/Flags/Controller/GameController.php +++ b/app/src/Flags/Controller/GameController.php @@ -133,7 +133,7 @@ public function getProfile(): Response return $this->json($this->getUser()); } - #[Route('/flags/scores', name: 'get_high_scores', methods: ['GET'])] + #[Route('/scores', name: 'get_high_scores', methods: ['GET'])] public function getHighScores(UserRepository $repository): Response { return $this->json($repository->getHighScores()); diff --git a/app/symfony.lock b/app/symfony.lock index b812719..1b2242b 100644 --- a/app/symfony.lock +++ b/app/symfony.lock @@ -109,18 +109,6 @@ "tests/bootstrap.php" ] }, - "sensio/framework-extra-bundle": { - "version": "6.2", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "5.2", - "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" - }, - "files": [ - "config/packages/sensio_framework_extra.yaml" - ] - }, "symfony/console": { "version": "5.4", "recipe": { From 03aaab240ffaaeb39f2b8331a755b341faece544 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Thu, 25 Dec 2025 01:10:37 +0000 Subject: [PATCH 19/25] console commands to populate capitals and flags on prod, caddy config adjusted for multiple CORS origins, added http requests for capitals game --- .docker/caddy/Caddyfile.not-google | 68 ++++++ .docker/caddy/Caddyfile.prod | 91 ++++---- app/config/packages/secrity.yaml | 7 + app/http-requests/capitals-question.http | 21 ++ app/http-requests/capitals/answer.http | 19 ++ app/http-requests/capitals/game-over.http | 6 + app/http-requests/capitals/game-start.http | 24 +++ app/http-requests/capitals/high-scores.http | 19 ++ app/http-requests/capitals/question.http | 9 + .../capitals/telegram-login.http | 5 + app/http-requests/capitals/test.http | 9 + app/http-requests/flags-scores.http | 7 +- app/http-requests/http-client.env.json | 2 +- app/scripts/redeploy.sh | 9 + app/src/DataFixtures/CapitalsFixtures.php | 2 +- .../PopulateCapitalsCommand.php | 111 ++++++++++ .../ConsoleCommand/PopulateFlagsCommand.php | 134 ++++++++++++ .../ConsoleCommand/PopulateUsersCommand.php | 196 ++++++++++++++++++ app/src/Flags/Controller/GameController.php | 11 +- app/tests/Unit/Entity/GameTest.php | 2 +- app/tests/Unit/SmokeTest.php | 2 +- k8s/cors-middleware.yaml | 1 + 22 files changed, 703 insertions(+), 52 deletions(-) create mode 100644 .docker/caddy/Caddyfile.not-google create mode 100644 app/http-requests/capitals-question.http create mode 100644 app/http-requests/capitals/answer.http create mode 100644 app/http-requests/capitals/game-over.http create mode 100644 app/http-requests/capitals/game-start.http create mode 100644 app/http-requests/capitals/high-scores.http create mode 100644 app/http-requests/capitals/question.http create mode 100644 app/http-requests/capitals/telegram-login.http create mode 100644 app/http-requests/capitals/test.http create mode 100755 app/scripts/redeploy.sh create mode 100644 app/src/Flags/ConsoleCommand/PopulateCapitalsCommand.php create mode 100644 app/src/Flags/ConsoleCommand/PopulateFlagsCommand.php create mode 100644 app/src/Flags/ConsoleCommand/PopulateUsersCommand.php diff --git a/.docker/caddy/Caddyfile.not-google b/.docker/caddy/Caddyfile.not-google new file mode 100644 index 0000000..87e4535 --- /dev/null +++ b/.docker/caddy/Caddyfile.not-google @@ -0,0 +1,68 @@ +{ + servers { + trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 + } +} + +:80 { + # 1. Health check (stays separate) + handle /health { + respond "OK" 200 + } + + # 2. Wrap everything else in a route + route { + # Dynamic CORS for multiple origins (flags and capitals apps) + @flags_origin header Origin https://flags.izeebot.top + @capitals_origin header Origin https://capitals.izeebot.top + + # Set CORS headers based on origin + handle @flags_origin { + header Access-Control-Allow-Origin "https://flags.izeebot.top" + header Access-Control-Allow-Credentials "true" + header Access-Control-Expose-Headers "Authorization" + header Vary Origin + } + handle @capitals_origin { + header Access-Control-Allow-Origin "https://capitals.izeebot.top" + header Access-Control-Allow-Credentials "true" + header Access-Control-Expose-Headers "Authorization" + header Vary Origin + } + + # Handle Preflight separately + @options method OPTIONS + handle @options { + @options_flags header Origin https://flags.izeebot.top + @options_capitals header Origin https://capitals.izeebot.top + header @options_flags Access-Control-Allow-Origin "https://flags.izeebot.top" + header @options_capitals Access-Control-Allow-Origin "https://capitals.izeebot.top" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Credentials "true" + header Access-Control-Max-Age "1728000" + header Access-Control-Allow-Headers "Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, X-API-KEY" + respond 204 + } + + # 3. Security & Compression + encode gzip zstd + header { + X-Content-Type-Options "nosniff" + X-Frame-Options "SAMEORIGIN" + Referrer-Policy "strict-origin-when-cross-origin" + } + + # 4. Proxy to Symfony + reverse_proxy php:59000 { + transport fastcgi { + root /var/www/html/public + env SCRIPT_FILENAME /var/www/html/public/index.php + } + } + } + + log { + output stdout + format json + } +} diff --git a/.docker/caddy/Caddyfile.prod b/.docker/caddy/Caddyfile.prod index dd5f762..a6aaa80 100644 --- a/.docker/caddy/Caddyfile.prod +++ b/.docker/caddy/Caddyfile.prod @@ -1,55 +1,62 @@ { servers { - trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 - } + trusted_proxies static 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 + } } :80 { - # 1. Health check (stays separate) +# 1. Health check (stays separate) handle /health { - respond "OK" 200 - } + respond "OK" 200 + } - # 2. Wrap everything else in a route +# 2. Wrap everything else in a route route { - # Force CORS headers on ALL responses (GET, POST, etc.) - header { - Access-Control-Allow-Origin "https://flags.izeebot.top" - Access-Control-Allow-Credentials "true" - Access-Control-Expose-Headers "Authorization" - Vary Origin - } + # Match allowed origins using a Regex with backticks for safety + @allowed_origins header_regexp origin Origin `^https://(flags|capitals)\.izeebot\.top$` - # Handle Preflight separately - @options method OPTIONS - handle @options { - header Access-Control-Allow-Origin "https://flags.izeebot.top" - header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" - header Access-Control-Allow-Credentials "true" - header Access-Control-Max-Age "1728000" - header Access-Control-Allow-Headers "Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, X-API-KEY" - respond 204 - } + # Handle Preflight (OPTIONS) + @options { + method OPTIONS + header_regexp origin Origin `^https://(flags|capitals)\.izeebot\.top$` + } + handle @options { + header Access-Control-Allow-Origin "{header.Origin}" + header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE, PATCH" + header Access-Control-Allow-Credentials "true" + header Access-Control-Max-Age "1728000" + header Access-Control-Allow-Headers "Authorization, Content-Type, Accept, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, If-Modified-Since, X-API-KEY" + respond 204 + } - # 3. Security & Compression - encode gzip zstd - header { - X-Content-Type-Options "nosniff" - X-Frame-Options "SAMEORIGIN" - Referrer-Policy "strict-origin-when-cross-origin" - } + # Apply CORS headers for actual requests (GET, POST, etc.) + # {re.origin.0} refers to the first capture of the 'origin' regex above + header @allowed_origins { + Access-Control-Allow-Origin "{re.origin.0}" + Access-Control-Allow-Credentials "true" + Access-Control-Expose-Headers "Authorization" + Vary Origin + } - # 4. Proxy to Symfony - reverse_proxy php:59000 { - transport fastcgi { - root /var/www/html/public - env SCRIPT_FILENAME /var/www/html/public/index.php - } - } - } + # 3. Security & Compression + encode gzip zstd + header { + X-Content-Type-Options "nosniff" + X-Frame-Options "SAMEORIGIN" + Referrer-Policy "strict-origin-when-cross-origin" + } + + # 4. Proxy to Symfony + reverse_proxy php:59000 { + transport fastcgi { + root /var/www/html/public + env SCRIPT_FILENAME /var/www/html/public/index.php + } + } + } log { - output stdout - format json - } -} + output stdout + format json + } +} \ No newline at end of file diff --git a/app/config/packages/secrity.yaml b/app/config/packages/secrity.yaml index 12be4a4..fc335d7 100644 --- a/app/config/packages/secrity.yaml +++ b/app/config/packages/secrity.yaml @@ -30,6 +30,12 @@ security: custom_authenticators: - App\Flags\Security\HqAuthAuthenticator + # Public API endpoints (no auth required) + api_public: + pattern: ^/api/flags/scores$ + methods: [GET] + security: false + # API endpoints protected by JWT api: pattern: ^/api @@ -65,5 +71,6 @@ security: - { path: ^/capitals/test$, roles: PUBLIC_ACCESS } - { path: ^/capitals/high-scores, roles: PUBLIC_ACCESS } - { path: ^/api, methods: [OPTIONS], roles: PUBLIC_ACCESS } + - { path: ^/capitals, methods: [ OPTIONS ], roles: PUBLIC_ACCESS } - { path: ^/api, roles: ROLE_USER } - { path: ^/capitals, roles: ROLE_USER } diff --git a/app/http-requests/capitals-question.http b/app/http-requests/capitals-question.http new file mode 100644 index 0000000..214ef8e --- /dev/null +++ b/app/http-requests/capitals-question.http @@ -0,0 +1,21 @@ +### Submit game score +GET {{url}}/capitals +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Submit game score +GET {{url}}/capitals/test +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + + +### Submit game score +GET {{url}}/capitals/game-start/CAPITALS_EUROPE +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + + +### Submit game score +GET {{url}}/capitals/question/4 +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/capitals/answer.http b/app/http-requests/capitals/answer.http new file mode 100644 index 0000000..88bff8c --- /dev/null +++ b/app/http-requests/capitals/answer.http @@ -0,0 +1,19 @@ +### Submit answer for a game +# URL format: /capitals/answer/{gameId}/{countryCode}/{base64EncodedAnswer} +# Example: answering "Paris" for France (FR) in game 1 +# base64("Paris") = UGFyaXM= +GET {{url}}/capitals/answer/5/FR/UGFyaXM= +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Answer example: "Berlin" for Germany (DE) +# base64("Berlin") = QmVybGlu +GET {{url}}/capitals/answer/1/DE/QmVybGlu +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Answer example: "Madrid" for Spain (ES) +# base64("Madrid") = TWFkcmlk +GET {{url}}/capitals/answer/1/ES/TWFkcmlk +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/capitals/game-over.http b/app/http-requests/capitals/game-over.http new file mode 100644 index 0000000..cffd50e --- /dev/null +++ b/app/http-requests/capitals/game-over.http @@ -0,0 +1,6 @@ +### Submit game results +POST {{url}}/capitals/game-over +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +{"gameId": 5, "score": 10, "sessionTimer": 45} diff --git a/app/http-requests/capitals/game-start.http b/app/http-requests/capitals/game-start.http new file mode 100644 index 0000000..51df1dd --- /dev/null +++ b/app/http-requests/capitals/game-start.http @@ -0,0 +1,24 @@ +### Start Europe game +GET {{url}}/capitals/game-start/CAPITALS_EUROPE +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Start Asia game +GET {{url}}/capitals/game-start/CAPITALS_ASIA +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Start Africa game +GET {{url}}/capitals/game-start/CAPITALS_AFRICA +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Start Americas game +GET {{url}}/capitals/game-start/CAPITALS_AMERICAS +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Start Oceania game +GET {{url}}/capitals/game-start/CAPITALS_OCEANIA +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/capitals/high-scores.http b/app/http-requests/capitals/high-scores.http new file mode 100644 index 0000000..54c7fa2 --- /dev/null +++ b/app/http-requests/capitals/high-scores.http @@ -0,0 +1,19 @@ +### Get Europe high scores +GET {{url}}/capitals/high-scores/europe +Content-Type: application/json + +### Get Asia high scores +GET {{url}}/capitals/high-scores/asia +Content-Type: application/json + +### Get Africa high scores +GET {{url}}/capitals/high-scores/africa +Content-Type: application/json + +### Get Americas high scores +GET {{url}}/capitals/high-scores/americas +Content-Type: application/json + +### Get Oceania high scores +GET {{url}}/capitals/high-scores/oceania +Content-Type: application/json diff --git a/app/http-requests/capitals/question.http b/app/http-requests/capitals/question.http new file mode 100644 index 0000000..de49270 --- /dev/null +++ b/app/http-requests/capitals/question.http @@ -0,0 +1,9 @@ +### Get random question (no game context) +GET {{url}}/capitals +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Get question for specific game (replace {gameId} with actual game ID) +GET {{url}}/capitals/question/5 +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/capitals/telegram-login.http b/app/http-requests/capitals/telegram-login.http new file mode 100644 index 0000000..3c4c150 --- /dev/null +++ b/app/http-requests/capitals/telegram-login.http @@ -0,0 +1,5 @@ +### Telegram login +# Query params: id, first_name, last_name, username, photo_url, auth_date, hash +# The hash is calculated from the data using bot token +GET {{url}}/api/tg/login?id=123456789&first_name=John&last_name=Doe&username=johndoe&auth_date=1700000000&hash=abc123 +Content-Type: application/json diff --git a/app/http-requests/capitals/test.http b/app/http-requests/capitals/test.http new file mode 100644 index 0000000..e8c2436 --- /dev/null +++ b/app/http-requests/capitals/test.http @@ -0,0 +1,9 @@ +### Test endpoint 1 +GET {{url}}/capitals/test +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json + +### Test endpoint 2 +GET {{url}}/capitals/test2 +Authorization: Bearer {{0xNTK_token}} +Content-Type: application/json diff --git a/app/http-requests/flags-scores.http b/app/http-requests/flags-scores.http index de0bfdc..684f05a 100644 --- a/app/http-requests/flags-scores.http +++ b/app/http-requests/flags-scores.http @@ -1,6 +1,11 @@ ### Submit game score -POST {{url}}/flags/scores +POST {{url}}/api/flags/scores Authorization: Bearer {{0xNTK_token}} Content-Type: application/json {"score":0,"sessionTimer":45,"answers":[]} + + +### Submit game score +GET {{url}}/api/flags/scores +Content-Type: application/json \ No newline at end of file diff --git a/app/http-requests/http-client.env.json b/app/http-requests/http-client.env.json index d86d48c..126ed65 100644 --- a/app/http-requests/http-client.env.json +++ b/app/http-requests/http-client.env.json @@ -5,6 +5,6 @@ "oauth_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiI2N2VkOTk3NmZiMWUxZjFiNDEzOTBlNTEyMTYyOWFhMjEzYmJkNmVhN2ZiOGU2OWJmM2RlYTE3NmI3OWE5YWIwZTA3ZjI5OGQxYjFkYjljYSIsImlhdCI6MTc2NTA3NDc0MS43NzQ0MjIsIm5iZiI6MTc2NTA3NDc0MS43NzQ0MjMsImV4cCI6MTc2NTA3ODM0MS43Njc2MDYsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.R8ZoDkMrFlpW9TtPyEhjpypc_HX-0G1O2ZeXEAYZL_V8bQsyBCcsztZMlTlRh8pGhVAl59n2JIb3OVLu9asBxSfDjHLBKV2f2bMBTGV9PrIxPWcI8rR5D2uK61GbEHenIIijJYeivG3cKpir_tqGtGbrb-O5ytd5v0Bbc97QwZz9DRn75yupVRShEVhWRGQeAtbgYRaru0dZiAvHYq3suLcQF1IFfNFZyenn1FgMblMP0DubWeu2VSX4DZE0ulMlcoeRfQtKzb0ZPXF0VjmXh3fS7b01r39a01dTayo6hGEhZBsa5GuT_blAocQ0KBgtFkYxc-fQeSo6NUKoXT2jmA", "t1" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJkNzE1OTc5YmE0YjNiZDJkODIzZjYzYWYyY2Q5N2M2OWU0YzI0OWRlOWMxN2I3Njc0MTQ3NTA0YWZhZGU2YjFlOTA1NmIyMWRkMzA3YWI4OSIsImlhdCI6MTc2NTEyMzEzMi4zNTc0MTMsIm5iZiI6MTc2NTEyMzEzMi4zNTc0MTcsImV4cCI6MTc2NTEyNjczMi4zNTAzMiwic3ViIjoiMSIsInNjb3BlcyI6WyJvcGVuaWQiLCJwcm9maWxlIiwiZW1haWwiXX0.IeX6GCpHqZG5kJ1JoVxFE8gy7v1NOz6vpPPF7GqlJsKL4kaW8-KfsmElfZEk3XVVOvCEeZv01sO7fM5-sr9mhLPKfhHpPf9Sr0Roq80klKJFW3YJ2RSEfPHWnz3PAbSOB6wM00FkXNqixsW4hUVj_q7aIJ4KNy_WA-_A-K17J2n6WodsNvJzIE94G499fKfXfMJJiuxeZntdTzaPT8_p9MR0ORaXGc-8GmpxR-iS_uHftGT4fBSxGY4eiAIPtwZ9SBeluZL7OqKbfyFN5kAJW_iT4H7hRQUxZSrXc_g2il2Kc2zlGRBb5t6yogrSNauzs9VAEZ6zW2i52L_WpVTOqw", "url" : "http://localhost:8000", - "0xNTK_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJjMTliNWZlNjE5N2VmNTUwMTkyNTE4YjgxZDFjNTMxNDBhZWIwMWNlZjMwMzQ5NWJlNDM1ZmNjNjNjN2ZmYTc3YjViMGZiMDFjZTU0YzMzNyIsImlhdCI6MTc2NjUyNzU1My4xNTU4NDMsIm5iZiI6MTc2NjUyNzU1My4xNTU4NDQsImV4cCI6MTc2NjUzMTE1My4xNDg5MzcsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.AjUVCt1iyi-cq6_O9rBuzm4DNDiOiuGPhPqvsNDtp-OREQqIF1LDGIQsI4uOSI75ixbVhWOmQavkodyr_5kL_7JmoRqKdMiSQ0HRmaLp96rckfyy2GX_5U41hu_Rpbh0HFYnoaGbdK7X3eJOAvKEgPm0e66tLI9jewYC4-stjJ6T0kmXKNsNAIqEwXOEf2eRatKrV9NUn8WerbhzCAH4JoNl1GXB_LwDdsgu9qREI_x0jfq3Apo1rmOyvN28dg7_sWc_ZDwqOsdcMtw1zcWBKLTK88DfvaeGmvXBloSvNUeUUU29T_bb6bvzyI9jt0vx62Jlz8TTh4taep4a4vGJ6Q" + "0xNTK_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmbGFnc19hcHAiLCJqdGkiOiJhZjA3ZWU0YTJmNTUwOWYzNTYyNGU2NDJjNTVkYjA3MmEwNDBiMzc1YWRiNDU5NzJkODVlODQ4NWQxN2MxMTdjNGM5MjI0NGRlMmY1NjRiMCIsImlhdCI6MTc2NjYxMDM4NS4yNzYzNTcsIm5iZiI6MTc2NjYxMDM4NS4yNzYzNTksImV4cCI6MTc2NjYxMzk4NS4yNzE2MDEsInN1YiI6IjEiLCJzY29wZXMiOlsib3BlbmlkIiwicHJvZmlsZSIsImVtYWlsIl19.l1UVPo1YZqJV6c2TiW0DlWApKKrXEmLixjGYVZzUlSiia1owjYgmfFZwDkaXeYgggCf2IO-EX-kGwZniPpocSHdw0z9-nRNo2vqoNeF9T2ctTxQanDM2R_rQsOkEF8siNh7BrG_AICSu2QcWBD5Mn-JjzQ9qbAj1lDrxOFpJfwPh_CbIz2Z58rDSJAllnWvZo3Dj0YESwX7XyDyqBZEXgYGFN4PqQ9k-H3xTkn4orJrqm0gEHYRzpMzM6LyAXX55QUkMO5AYoksME67C3fUWtKM-n0Ancny6Osm_kIpR0t9hu9YByCLnUO3YXcEnTqJwFxa3rOmrPE26JToWsZri9w" } } \ No newline at end of file diff --git a/app/scripts/redeploy.sh b/app/scripts/redeploy.sh new file mode 100755 index 0000000..a944a35 --- /dev/null +++ b/app/scripts/redeploy.sh @@ -0,0 +1,9 @@ + set -e + + FOLDER=~/Projects/flags-api/app/scripts + + echo "Building image..." + "$FOLDER/build-tag-push.local" + + echo "Deploying to remote..." + ssh hq@florence-hq.local 'cd ~/Apps/Flags-quiz/k8s && ./redeploy.sh' diff --git a/app/src/DataFixtures/CapitalsFixtures.php b/app/src/DataFixtures/CapitalsFixtures.php index d58c57f..a992f66 100644 --- a/app/src/DataFixtures/CapitalsFixtures.php +++ b/app/src/DataFixtures/CapitalsFixtures.php @@ -8,7 +8,7 @@ class CapitalsFixtures extends Fixture { - private const COUNTRY_FILES = [ + private const array COUNTRY_FILES = [ 'capitals-africa.json', 'capitals-americas.json', 'capitals-asia.json', diff --git a/app/src/Flags/ConsoleCommand/PopulateCapitalsCommand.php b/app/src/Flags/ConsoleCommand/PopulateCapitalsCommand.php new file mode 100644 index 0000000..127aa78 --- /dev/null +++ b/app/src/Flags/ConsoleCommand/PopulateCapitalsCommand.php @@ -0,0 +1,111 @@ +addOption('purge', null, InputOption::VALUE_NONE, 'Purge existing capitals before populating') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + if ($input->getOption('purge')) { + $this->purgeExistingCapitals($io); + } + + $totalCount = 0; + + foreach (self::COUNTRY_FILES as $fileName) { + $count = $this->loadFileContent($fileName, $io); + $totalCount += $count; + } + + $io->success(sprintf('Successfully populated %d capitals.', $totalCount)); + + return Command::SUCCESS; + } + + private function purgeExistingCapitals(SymfonyStyle $io): void + { + $existingCount = $this->capitalRepository->count([]); + + if ($existingCount > 0) { + $this->entityManager->createQuery('DELETE FROM App\Flags\Entity\Capital')->execute(); + $io->warning(sprintf('Purged %d existing capitals.', $existingCount)); + } + } + + private function loadFileContent(string $fileName, SymfonyStyle $io): int + { + if (!file_exists($fileName)) { + $io->error(sprintf('File not found: %s', $fileName)); + return 0; + } + + $content = file_get_contents($fileName); + if ($content === false) { + $io->error(sprintf('Could not read file: %s', $fileName)); + return 0; + } + + $data = json_decode($content, true); + if (!isset($data['countries']) || !is_array($data['countries'])) { + $io->error(sprintf('Invalid JSON structure in: %s', $fileName)); + return 0; + } + + $count = 0; + foreach ($data['countries'] as $country) { + $capital = new Capital( + $country['capital'], + $country['name'], + $country['isoCode'], + $country['region'] + ); + $this->entityManager->persist($capital); + $count++; + } + + $this->entityManager->flush(); + $io->info(sprintf('Loaded %d capitals from %s', $count, $fileName)); + + return $count; + } +} diff --git a/app/src/Flags/ConsoleCommand/PopulateFlagsCommand.php b/app/src/Flags/ConsoleCommand/PopulateFlagsCommand.php new file mode 100644 index 0000000..5e45a57 --- /dev/null +++ b/app/src/Flags/ConsoleCommand/PopulateFlagsCommand.php @@ -0,0 +1,134 @@ +addOption('purge', null, InputOption::VALUE_NONE, 'Purge existing flags before populating') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + if ($input->getOption('purge')) { + $this->purgeExistingFlags($io); + } + + $codes = $this->collectAllCodes($io); + + if (empty($codes)) { + $io->error('No country codes found in JSON files.'); + return Command::FAILURE; + } + + $createdCount = 0; + $skippedCount = 0; + + foreach ($codes as $code) { + $existing = $this->flagRepository->findOneBy(['code' => $code]); + + if ($existing !== null) { + $skippedCount++; + continue; + } + + $flag = new Flag(); + $flag->setCode($code); + $this->entityManager->persist($flag); + $createdCount++; + } + + $this->entityManager->flush(); + + $io->success(sprintf( + 'Flags populated: %d created, %d skipped (already exist).', + $createdCount, + $skippedCount + )); + + return Command::SUCCESS; + } + + private function purgeExistingFlags(SymfonyStyle $io): void + { + $existingCount = $this->flagRepository->count([]); + + if ($existingCount > 0) { + $this->entityManager->createQuery('DELETE FROM App\Flags\Entity\Flag')->execute(); + $io->warning(sprintf('Purged %d existing flags.', $existingCount)); + } + } + + /** + * @return string[] + */ + private function collectAllCodes(SymfonyStyle $io): array + { + $codes = []; + + foreach (self::COUNTRY_FILES as $fileName) { + if (!file_exists($fileName)) { + $io->warning(sprintf('File not found: %s', $fileName)); + continue; + } + + $content = file_get_contents($fileName); + if ($content === false) { + $io->warning(sprintf('Could not read file: %s', $fileName)); + continue; + } + + $data = json_decode($content, true); + if (!isset($data['countries']) || !is_array($data['countries'])) { + $io->warning(sprintf('Invalid JSON structure in: %s', $fileName)); + continue; + } + + foreach ($data['countries'] as $country) { + if (isset($country['isoCode'])) { + $codes[] = strtolower($country['isoCode']); + } + } + + $io->info(sprintf('Read %d codes from %s', count($data['countries']), $fileName)); + } + + return array_unique($codes); + } +} diff --git a/app/src/Flags/ConsoleCommand/PopulateUsersCommand.php b/app/src/Flags/ConsoleCommand/PopulateUsersCommand.php new file mode 100644 index 0000000..df87b79 --- /dev/null +++ b/app/src/Flags/ConsoleCommand/PopulateUsersCommand.php @@ -0,0 +1,196 @@ +addArgument('telegramId', InputArgument::OPTIONAL, 'Telegram ID for single user creation', '0') + ->addOption('username', 'u', InputOption::VALUE_OPTIONAL, 'Telegram username') + ->addOption('first-name', 'f', InputOption::VALUE_OPTIONAL, 'First name') + ->addOption('last-name', 'l', InputOption::VALUE_OPTIONAL, 'Last name') + ->addOption('json', 'j', InputOption::VALUE_REQUIRED, 'Path to JSON file for batch creation') + ->addOption('skip-existing', null, InputOption::VALUE_NONE, 'Skip users that already exist (by telegramId)') + ->setHelp(<<<'HELP' +Create users individually or in batch from a JSON file. + +Single user: + bin/console app:populate:users 123456 -u johndoe -f John -l Doe + +Batch from JSON: + bin/console app:populate:users --json users.json --skip-existing + +JSON file format: + [ + {"telegramId": "123456", "telegramUsername": "johndoe", "firstName": "John", "lastName": "Doe"}, + {"telegramId": "789012", "firstName": "Jane"} + ] + + Or with wrapper: + {"users": [...]} + +Available fields: + telegramId (required), telegramUsername, firstName, lastName, telegramPhotoUrl, sub +HELP) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $jsonPath = $input->getOption('json'); + + if ($jsonPath !== null) { + return $this->createFromJson($jsonPath, $input->getOption('skip-existing'), $io); + } + + return $this->createSingleUser($input, $io); + } + + private function createSingleUser(InputInterface $input, SymfonyStyle $io): int + { + $telegramId = $input->getArgument('telegramId'); + + $existing = $this->userRepository->findOneBy(['telegramId' => $telegramId]); + if ($existing !== null) { + $io->error(sprintf('User with telegramId "%s" already exists (id: %d).', $telegramId, $existing->getId())); + return Command::FAILURE; + } + + $user = $this->buildUser([ + 'telegramId' => $telegramId, + 'telegramUsername' => $input->getOption('username'), + 'firstName' => $input->getOption('first-name'), + 'lastName' => $input->getOption('last-name'), + ]); + + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $io->success(sprintf('Created user: telegramId=%s, id=%d', $telegramId, $user->getId())); + + return Command::SUCCESS; + } + + private function createFromJson(string $jsonPath, bool $skipExisting, SymfonyStyle $io): int + { + if (!file_exists($jsonPath)) { + $io->error(sprintf('JSON file not found: %s', $jsonPath)); + return Command::FAILURE; + } + + $content = file_get_contents($jsonPath); + if ($content === false) { + $io->error(sprintf('Could not read file: %s', $jsonPath)); + return Command::FAILURE; + } + + $data = json_decode($content, true); + if ($data === null) { + $io->error('Invalid JSON format.'); + return Command::FAILURE; + } + + // Support both {"users": [...]} and plain [...] + $users = $data['users'] ?? $data; + + if (!is_array($users)) { + $io->error('JSON must be an array of users or {"users": [...]}'); + return Command::FAILURE; + } + + $createdCount = 0; + $skippedCount = 0; + $errorCount = 0; + + foreach ($users as $index => $userData) { + if (!isset($userData['telegramId'])) { + $io->warning(sprintf('Entry %d missing telegramId, skipped.', $index)); + $errorCount++; + continue; + } + + $telegramId = (string) $userData['telegramId']; + $existing = $this->userRepository->findOneBy(['telegramId' => $telegramId]); + + if ($existing !== null) { + if ($skipExisting) { + $skippedCount++; + continue; + } + $io->warning(sprintf('User telegramId=%s already exists, skipped.', $telegramId)); + $skippedCount++; + continue; + } + + $user = $this->buildUser($userData); + $this->entityManager->persist($user); + $createdCount++; + } + + $this->entityManager->flush(); + + $io->success(sprintf( + 'Batch complete: %d created, %d skipped, %d errors.', + $createdCount, + $skippedCount, + $errorCount + )); + + return Command::SUCCESS; + } + + /** + * @param array $data + */ + private function buildUser(array $data): User + { + $user = new User(); + $user->setTelegramId((string) $data['telegramId']); + + if (!empty($data['telegramUsername'])) { + $user->setTelegramUsername($data['telegramUsername']); + } + if (!empty($data['firstName'])) { + $user->setFirstName($data['firstName']); + } + if (!empty($data['lastName'])) { + $user->setLastName($data['lastName']); + } + if (!empty($data['telegramPhotoUrl'])) { + $user->setTelegramPhotoUrl($data['telegramPhotoUrl']); + } + if (!empty($data['sub'])) { + $user->setSub($data['sub']); + } + + return $user; + } +} diff --git a/app/src/Flags/Controller/GameController.php b/app/src/Flags/Controller/GameController.php index 7aff4cd..8b2f5b2 100644 --- a/app/src/Flags/Controller/GameController.php +++ b/app/src/Flags/Controller/GameController.php @@ -19,6 +19,7 @@ use Symfony\Component\Intl\Countries; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Http\Attribute\CurrentUser; +use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Bridge\Doctrine\Attribute\MapEntity; @@ -127,12 +128,13 @@ public function authAction(Request $request, JWTEncoderInterface $encoder): Resp return new JsonResponse(['token' => $token]); } - #[Route('/api/protected', name: 'get_profile', methods: ['GET', 'OPTIONS'])] + #[Route('/protected', name: 'get_profile', methods: ['GET', 'OPTIONS'])] public function getProfile(): Response { return $this->json($this->getUser()); } + #[IsGranted('PUBLIC_ACCESS')] #[Route('/scores', name: 'get_high_scores', methods: ['GET'])] public function getHighScores(UserRepository $repository): Response { @@ -140,21 +142,20 @@ public function getHighScores(UserRepository $repository): Response } #[Route('/scores', name: 'submit_game_results', methods: ['POST'])] - public function postScore(Request $request, EntityManagerInterface $entityManager, #[CurrentUser] $user): Response + public function postScore(Request $request, EntityManagerInterface $entityManager, #[CurrentUser] User $user): Response { $requestArray = json_decode($request->getContent(), true); $scoreDTO = new ScoreDTO($requestArray); - $score = (new Score())->fromDTO($scoreDTO); + $score = new Score()->fromDTO($scoreDTO); $answers = []; if (isset($requestArray['answers'])) { foreach ($requestArray['answers'] as $answer) { - $item = (new Answer())->fromArray($answer); + $item = new Answer()->fromArray($answer); $answers[] = $item; } } - /** @var User $user */ $user->finalizeGame($score, $answers); $entityManager->flush(); diff --git a/app/tests/Unit/Entity/GameTest.php b/app/tests/Unit/Entity/GameTest.php index f37395c..5725e7c 100644 --- a/app/tests/Unit/Entity/GameTest.php +++ b/app/tests/Unit/Entity/GameTest.php @@ -1,6 +1,6 @@ Date: Thu, 25 Dec 2025 01:17:27 +0000 Subject: [PATCH 20/25] config: .gitignor --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0a132d7..760ae8c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .DS_Store .docker/certs/*.pem .docker/certs/*.srl -*.local \ No newline at end of file +*.local +.env.prod From 515411ab4537c6470f90c092f0b7b99a12230ebb Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 23 Oct 2024 23:05:20 +0100 Subject: [PATCH 21/25] feat: capitals console game # Conflicts: # app/composer.lock --- app/composer.lock | 4823 ++++++++++++++++----------------------------- 1 file changed, 1684 insertions(+), 3139 deletions(-) diff --git a/app/composer.lock b/app/composer.lock index cbaac13..35331d0 100644 --- a/app/composer.lock +++ b/app/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": "ab4d280b3e93d89e73c82afab8cdfa88", + "content-hash": "0c6f99db745c439aba06f4970de96864", "packages": [ { "name": "composer/package-versions-deprecated", @@ -81,16 +81,16 @@ }, { "name": "doctrine/annotations", - "version": "2.0.2", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", - "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", "shasum": "" }, "require": { @@ -102,10 +102,10 @@ "require-dev": { "doctrine/cache": "^2.0", "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.10.28", + "phpstan/phpstan": "^1.8.0", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6.4 || ^7", - "vimeo/psalm": "^4.30 || ^5.14" + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -151,36 +151,128 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.2" + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "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 Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" }, - "abandoned": true, - "time": "2024-09-05T10:17:24+00:00" + "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%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" }, { "name": "doctrine/collections", - "version": "2.4.0", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "9acfeea2e8666536edff3d77c531261c63680160" + "reference": "72328a11443a0de79967104ad36ba7b30bded134" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/9acfeea2e8666536edff3d77c531261c63680160", - "reference": "9acfeea2e8666536edff3d77c531261c63680160", + "url": "https://api.github.com/repos/doctrine/collections/zipball/72328a11443a0de79967104ad36ba7b30bded134", + "reference": "72328a11443a0de79967104ad36ba7b30bded134", "shasum": "" }, "require": { "doctrine/deprecations": "^1", - "php": "^8.1", - "symfony/polyfill-php84": "^1.30" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^14", + "doctrine/coding-standard": "^12", "ext-json": "*", - "phpstan/phpstan": "^2.1.30", - "phpstan/phpstan-phpunit": "^2.0.7", - "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.11" }, "type": "library", "autoload": { @@ -224,7 +316,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.4.0" + "source": "https://github.com/doctrine/collections/tree/2.1.4" }, "funding": [ { @@ -240,44 +332,142 @@ "type": "tidelift" } ], - "time": "2025-10-25T09:18:13+00:00" + "time": "2023-10-03T09:22:33+00:00" + }, + { + "name": "doctrine/common", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced", + "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced", + "shasum": "" + }, + "require": { + "doctrine/persistence": "^2.0 || ^3.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0 || ^10.0", + "doctrine/collections": "^1", + "phpstan/phpstan": "^1.4.1", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^6.1", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "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" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/3.4.3" + }, + "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%2Fcommon", + "type": "tidelift" + } + ], + "time": "2022-10-09T11:47:59+00:00" }, { "name": "doctrine/dbal", - "version": "4.4.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", - "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.1.5", - "php": "^8.2", + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "14.0.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.30", - "phpstan/phpstan-phpunit": "2.0.7", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "11.5.23", - "slevomat/coding-standard": "8.24.0", - "squizlabs/php_codesniffer": "4.0.0", - "symfony/cache": "^6.3.8|^7.0|^8.0", - "symfony/console": "^5.4|^6.3|^7.0|^8.0" + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.42", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.13", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^5.4|^6.0", + "symfony/console": "^4.4|^5.4|^6.0", + "vimeo/psalm": "4.30.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, + "bin": [ + "bin/doctrine-dbal" + ], "type": "library", "autoload": { "psr-4": { @@ -330,7 +520,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.4.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.2" }, "funding": [ { @@ -346,34 +536,33 @@ "type": "tidelift" } ], - "time": "2025-12-04T10:11:03+00:00" + "time": "2023-11-19T08:06:58+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", - "psr/log": "^1 || ^2 || ^3" + "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" @@ -381,7 +570,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "src" + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "notification-url": "https://packagist.org/downloads/", @@ -392,69 +581,67 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.18.2", + "version": "2.11.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546" + "reference": "4089f1424b724786c062aea50aae5f773449b94b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ff098b29b8b3c68307c8987dcaed7fd829c6546", - "reference": "0ff098b29b8b3c68307c8987dcaed7fd829c6546", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/4089f1424b724786c062aea50aae5f773449b94b", + "reference": "4089f1424b724786c062aea50aae5f773449b94b", "shasum": "" }, "require": { + "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^3.7.0 || ^4.0", - "doctrine/deprecations": "^1.0", - "doctrine/persistence": "^3.1 || ^4", + "doctrine/persistence": "^2.2 || ^3", "doctrine/sql-formatter": "^1.0.1", - "php": "^8.1", - "symfony/cache": "^6.4 || ^7.0", - "symfony/config": "^6.4 || ^7.0", - "symfony/console": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", - "symfony/framework-bundle": "^6.4 || ^7.0", - "symfony/service-contracts": "^2.5 || ^3" + "php": "^7.4 || ^8.0", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/config": "^5.4 || ^6.0 || ^7.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", + "symfony/deprecation-contracts": "^2.1 || ^3", + "symfony/doctrine-bridge": "^5.4.19 || ^6.0.7 || ^7.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.1 || ^2.0 || ^3" }, "conflict": { "doctrine/annotations": ">=3.0", - "doctrine/cache": "< 1.11", - "doctrine/orm": "<2.17 || >=4.0", - "symfony/var-exporter": "< 6.4.1 || 7.0.0", - "twig/twig": "<2.13 || >=3.0 <3.0.4" + "doctrine/orm": "<2.14 || >=4.0", + "twig/twig": "<1.34 || >=2.0 <2.4" }, "require-dev": { "doctrine/annotations": "^1 || ^2", - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^14", - "doctrine/orm": "^2.17 || ^3.1", + "doctrine/coding-standard": "^12", + "doctrine/deprecations": "^1.0", + "doctrine/orm": "^2.14 || ^3.0", "friendsofphp/proxy-manager-lts": "^1.0", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.53 || ^12.3.10", + "phpunit/phpunit": "^9.5.26 || ^10.0", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^4", "psr/log": "^1.1.4 || ^2.0 || ^3.0", - "symfony/doctrine-messenger": "^6.4 || ^7.0", - "symfony/expression-language": "^6.4 || ^7.0", - "symfony/messenger": "^6.4 || ^7.0", - "symfony/property-info": "^6.4 || ^7.0", - "symfony/security-bundle": "^6.4 || ^7.0", - "symfony/stopwatch": "^6.4 || ^7.0", - "symfony/string": "^6.4 || ^7.0", - "symfony/twig-bridge": "^6.4 || ^7.0", - "symfony/validator": "^6.4 || ^7.0", - "symfony/var-exporter": "^6.4.1 || ^7.0.1", - "symfony/web-profiler-bundle": "^6.4 || ^7.0", - "symfony/yaml": "^6.4 || ^7.0", - "twig/twig": "^2.14.7 || ^3.0.4" + "symfony/phpunit-bridge": "^6.1 || ^7.0", + "symfony/property-info": "^5.4 || ^6.0 || ^7.0", + "symfony/proxy-manager-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/security-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/string": "^5.4 || ^6.0 || ^7.0", + "symfony/twig-bridge": "^5.4 || ^6.0 || ^7.0", + "symfony/validator": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^5.4 || ^6.2 || ^7.0", + "symfony/web-profiler-bundle": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0", + "twig/twig": "^1.34 || ^2.12 || ^3.0", + "vimeo/psalm": "^4.30" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -464,7 +651,7 @@ "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "src" + "Doctrine\\Bundle\\DoctrineBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -499,7 +686,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.18.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.11.1" }, "funding": [ { @@ -515,47 +702,53 @@ "type": "tidelift" } ], - "time": "2025-12-20T21:35:32+00:00" + "time": "2023-11-15T20:01:50+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.7.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b" + "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1e380c6dd8ac8488217f39cff6b77e367f1a644b", - "reference": "1e380c6dd8ac8488217f39cff6b77e367f1a644b", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/1dd42906a5fb9c5960723e2ebb45c68006493835", + "reference": "1dd42906a5fb9c5960723e2ebb45c68006493835", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^2.4 || ^3.0", + "doctrine/doctrine-bundle": "^2.4", "doctrine/migrations": "^3.2", - "php": "^7.2 || ^8.0", + "php": "^7.2|^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "composer/semver": "^3.0", - "doctrine/coding-standard": "^12 || ^14", + "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "phpstan/phpstan": "^1.4 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1.1 || ^2", - "phpstan/phpstan-symfony": "^1.3 || ^2", - "phpunit/phpunit": "^8.5 || ^9.5", - "symfony/phpunit-bridge": "^6.3 || ^7 || ^8", - "symfony/var-exporter": "^5.4 || ^6 || ^7 || ^8" + "doctrine/persistence": "^2.0 || ^3 ", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^8.5|^9.5", + "psalm/plugin-phpunit": "^0.18.4", + "psalm/plugin-symfony": "^3 || ^5", + "symfony/phpunit-bridge": "^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6 || ^7", + "vimeo/psalm": "^4.30 || ^5.15" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "src" - } + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -584,7 +777,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.7.0" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.3.0" }, "funding": [ { @@ -600,20 +793,20 @@ "type": "tidelift" } ], - "time": "2025-11-15T19:02:59+00:00" + "time": "2023-11-13T19:44:41+00:00" }, { "name": "doctrine/event-manager", - "version": "2.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", - "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", "shasum": "" }, "require": { @@ -623,10 +816,10 @@ "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^10", "phpstan/phpstan": "^1.8.8", - "phpunit/phpunit": "^10.5", - "vimeo/psalm": "^5.24" + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" }, "type": "library", "autoload": { @@ -675,7 +868,7 @@ ], "support": { "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" }, "funding": [ { @@ -691,36 +884,37 @@ "type": "tidelift" } ], - "time": "2024-05-22T20:47:39+00:00" + "time": "2022-10-12T20:59:15+00:00" }, { "name": "doctrine/inflector", - "version": "2.1.0", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", - "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^12.0 || ^13.0", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-phpunit": "^1.4 || ^2.0", - "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", - "phpunit/phpunit": "^8.5 || ^12.2" + "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\\": "src" + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -765,7 +959,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.1.0" + "source": "https://github.com/doctrine/inflector/tree/2.0.8" }, "funding": [ { @@ -781,7 +975,7 @@ "type": "tidelift" } ], - "time": "2025-08-10T19:31:58+00:00" + "time": "2023-06-16T13:40:37+00:00" }, { "name": "doctrine/instantiator", @@ -855,27 +1049,28 @@ }, { "name": "doctrine/lexer", - "version": "3.0.1", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "php": "^8.1" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", "autoload": { @@ -912,7 +1107,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -928,52 +1123,51 @@ "type": "tidelift" } ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "doctrine/migrations", - "version": "3.9.5", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5" + "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b823afbc40f932dae8272574faee53f2755eac5", - "reference": "1b823afbc40f932dae8272574faee53f2755eac5", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/47af29eef49f29ebee545947e8b2a4b3be318c8a", + "reference": "47af29eef49f29ebee545947e8b2a4b3be318c8a", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/dbal": "^3.6 || ^4", + "doctrine/dbal": "^3.5.1 || ^4", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2.0", "php": "^8.1", "psr/log": "^1.1.3 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/var-exporter": "^6.2 || ^7.0 || ^8.0" + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0", + "symfony/var-exporter": "^6.2 || ^7.0" }, "conflict": { "doctrine/orm": "<2.12 || >=4" }, "require-dev": { - "doctrine/coding-standard": "^14", + "doctrine/coding-standard": "^12", "doctrine/orm": "^2.13 || ^3", - "doctrine/persistence": "^2 || ^3 || ^4", + "doctrine/persistence": "^2 || ^3", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", - "fig/log-test": "^1", - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-phpunit": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpstan/phpstan-symfony": "^2", - "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0", - "symfony/cache": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/process": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0" + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.4", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpunit": "^10.3", + "symfony/cache": "^5.4 || ^6.0 || ^7.0", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", @@ -985,7 +1179,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Migrations\\": "src" + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" } }, "notification-url": "https://packagist.org/downloads/", @@ -1015,7 +1209,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.5" + "source": "https://github.com/doctrine/migrations/tree/3.7.2" }, "funding": [ { @@ -1031,56 +1225,69 @@ "type": "tidelift" } ], - "time": "2025-11-20T11:15:36+00:00" + "time": "2023-12-05T11:35:05+00:00" }, { "name": "doctrine/orm", - "version": "3.6.0", + "version": "2.17.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f" + "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/d4e9276e79602b1eb4c4029c6c999b0d93478e2f", - "reference": "d4e9276e79602b1eb4c4029c6c999b0d93478e2f", + "url": "https://api.github.com/repos/doctrine/orm/zipball/393679a4795e49b0b3ac317dce84d0f8888f2b77", + "reference": "393679a4795e49b0b3ac317dce84d0f8888f2b77", "shasum": "" }, "require": { "composer-runtime-api": "^2", - "doctrine/collections": "^2.2", - "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/cache": "^1.12.1 || ^2.1.1", + "doctrine/collections": "^1.5 || ^2.1", + "doctrine/common": "^3.0.3", + "doctrine/dbal": "^2.13.1 || ^3.2", "doctrine/deprecations": "^0.5.3 || ^1", "doctrine/event-manager": "^1.2 || ^2", "doctrine/inflector": "^1.4 || ^2.0", "doctrine/instantiator": "^1.3 || ^2", - "doctrine/lexer": "^3", - "doctrine/persistence": "^3.3.1 || ^4", + "doctrine/lexer": "^2", + "doctrine/persistence": "^2.4 || ^3", "ext-ctype": "*", - "php": "^8.1", + "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3", - "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", - "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" + "symfony/console": "^4.2 || ^5.0 || ^6.0 || ^7.0", + "symfony/polyfill-php72": "^1.23", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.13 || >= 3.0" }, "require-dev": { - "doctrine/coding-standard": "^14.0", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "2.1.23", - "phpstan/phpstan-deprecation-rules": "^2", - "phpunit/phpunit": "^10.5.0 || ^11.5", + "doctrine/annotations": "^1.13 || ^2", + "doctrine/coding-standard": "^9.0.2 || ^12.0", + "phpbench/phpbench": "^0.16.10 || ^1.0", + "phpstan/phpstan": "~1.4.10 || 1.10.35", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psr/log": "^1 || ^2 || ^3", - "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" + "squizlabs/php_codesniffer": "3.7.2", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7.0", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6.2 || ^7.0", + "symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "vimeo/psalm": "4.30.0 || 5.16.0" }, "suggest": { "ext-dom": "Provides support for XSD validation for XML mapping files", - "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, + "bin": [ + "bin/doctrine" + ], "type": "library", "autoload": { "psr-4": { - "Doctrine\\ORM\\": "src" + "Doctrine\\ORM\\": "lib/Doctrine/ORM" } }, "notification-url": "https://packagist.org/downloads/", @@ -1117,37 +1324,42 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.6.0" + "source": "https://github.com/doctrine/orm/tree/2.17.2" }, - "time": "2025-12-19T20:36:14+00:00" + "time": "2023-12-20T21:47:52+00:00" }, { "name": "doctrine/persistence", - "version": "4.1.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", - "reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/63fee8c33bef740db6730eb2a750cd3da6495603", + "reference": "63fee8c33bef740db6730eb2a750cd3da6495603", "shasum": "" }, "require": { "doctrine/event-manager": "^1 || ^2", - "php": "^8.1", + "php": "^7.2 || ^8.0", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, + "conflict": { + "doctrine/common": "<2.10" + }, "require-dev": { - "doctrine/coding-standard": "^14", - "phpstan/phpstan": "2.1.30", - "phpstan/phpstan-phpunit": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.58 || ^12", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^11", + "doctrine/common": "^3.0", + "phpstan/phpstan": "1.9.4", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.0", + "vimeo/psalm": "4.30.0 || 5.3.0" }, "type": "library", "autoload": { @@ -1196,7 +1408,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.1.1" + "source": "https://github.com/doctrine/persistence/tree/3.2.0" }, "funding": [ { @@ -1212,30 +1424,27 @@ "type": "tidelift" } ], - "time": "2025-10-16T20:13:18+00:00" + "time": "2023-05-17T18:32:04+00:00" }, { "name": "doctrine/sql-formatter", - "version": "1.5.3", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", - "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/25a06c7bf4c6b8218f47928654252863ffc890a5", + "reference": "25a06c7bf4c6b8218f47928654252863ffc890a5", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^14", - "ergebnis/phpunit-slow-test-detector": "^2.20", - "phpstan/phpstan": "^2.1.31", - "phpunit/phpunit": "^10.5.58" + "bamarni/composer-bin-plugin": "^1.4" }, "bin": [ "bin/sql-formatter" @@ -1265,28 +1474,28 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.3" }, - "time": "2025-10-26T09:35:14+00:00" + "time": "2022-05-23T21:33:49+00:00" }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.19", + "version": "v1.0.16", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "c20299aa9f48a622052964a75c5a4cef017398b2" + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/c20299aa9f48a622052964a75c5a4cef017398b2", - "reference": "c20299aa9f48a622052964a75c5a4cef017398b2", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/ecadbdc9052e4ad08c60c8a02268712e50427f7c", + "reference": "ecadbdc9052e4ad08c60c8a02268712e50427f7c", "shasum": "" }, "require": { "laminas/laminas-code": "~3.4.1|^4.0", "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0|^8.0" + "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" }, "conflict": { "laminas/laminas-stdlib": "<3.2.1", @@ -1302,8 +1511,8 @@ "type": "library", "extra": { "thanks": { - "url": "https://github.com/Ocramius/ProxyManager", - "name": "ocramius/proxy-manager" + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" } }, "autoload": { @@ -1337,7 +1546,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.19" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.16" }, "funding": [ { @@ -1349,259 +1558,106 @@ "type": "tidelift" } ], - "time": "2025-10-28T10:28:17+00:00" + "time": "2023-05-24T07:17:17+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.10.0", + "name": "laminas/laminas-code", + "version": "4.13.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + "url": "https://github.com/laminas/laminas-code.git", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/7353d4099ad5388e84737dd16994316a04f48dbf", + "reference": "7353d4099ad5388e84737dd16994316a04f48dbf", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/promises": "^2.3", - "guzzlehttp/psr7": "^2.8", - "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" + "php": "~8.1.0 || ~8.2.0 || ~8.3.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" + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-stdlib": "^3.17.0", + "phpunit/phpunit": "^10.3.3", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.15.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" + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "Laminas\\Code\\": "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" - } + "BSD-3-Clause" ], - "description": "Guzzle is a PHP HTTP client library", + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "code", + "laminas", + "laminasframework" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.10.0" - }, - "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": "2025-08-23T22:36:01+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" - }, - "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.3.0" + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" }, "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" + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" } ], - "time": "2025-08-22T14:34:08+00:00" + "time": "2023-10-18T10:00:55+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.8.0", + "name": "lcobucci/clock", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "url": "https://github.com/lcobucci/clock.git", + "reference": "6f28b826ea01306b07980cb8320ab30b966cd715" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/6f28b826ea01306b07980cb8320ab30b966cd715", + "reference": "6f28b826ea01306b07980cb8320ab30b966cd715", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "php": "~8.2.0 || ~8.3.0", + "psr/clock": "^1.0" }, "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "psr/clock-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "infection/infection": "^0.27", + "lcobucci/coding-standard": "^11.0.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.25", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.13", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^10.2.3" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Lcobucci\\Clock\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1610,229 +1666,61 @@ ], "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" + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" } ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], + "description": "Yet another clock abstraction", "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.2.0" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", + "url": "https://github.com/lcobucci", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2025-08-23T21:21:41+00:00" - }, - { - "name": "knpuniversity/oauth2-client-bundle", - "version": "v2.20.1", - "source": { - "type": "git", - "url": "https://github.com/knpuniversity/oauth2-client-bundle.git", - "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/knpuniversity/oauth2-client-bundle/zipball/d59e4dc61484e777b6f19df2efcf8b1bcc03828a", - "reference": "d59e4dc61484e777b6f19df2efcf8b1bcc03828a", - "shasum": "" - }, - "require": { - "league/oauth2-client": "^2.0", - "php": ">=8.1", - "symfony/dependency-injection": "^6.4|^7.3|^8.0", - "symfony/framework-bundle": "^6.4|^7.3|^8.0", - "symfony/http-foundation": "^6.4|^7.3|^8.0", - "symfony/routing": "^6.4|^7.3|^8.0", - "symfony/security-core": "^6.4|^7.3|^8.0", - "symfony/security-http": "^6.4|^7.3|^8.0" - }, - "require-dev": { - "league/oauth2-facebook": "^1.1|^2.0", - "symfony/phpunit-bridge": "^7.3", - "symfony/yaml": "^6.4|^7.3|^8.0" - }, - "suggest": { - "symfony/security-guard": "For integration with Symfony's Guard Security layer" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "KnpU\\OAuth2ClientBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ryan Weaver", - "email": "ryan@symfonycasts.com" - } - ], - "description": "Integration with league/oauth2-client to provide services", - "homepage": "https://symfonycasts.com", - "keywords": [ - "oauth", - "oauth2" - ], - "support": { - "issues": "https://github.com/knpuniversity/oauth2-client-bundle/issues", - "source": "https://github.com/knpuniversity/oauth2-client-bundle/tree/v2.20.1" - }, - "time": "2025-12-04T15:46:43+00:00" - }, - { - "name": "laminas/laminas-code", - "version": "4.17.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", - "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", - "shasum": "" - }, - "require": { - "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0.1", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^3.0.0", - "laminas/laminas-stdlib": "^3.18.0", - "phpunit/phpunit": "^10.5.58", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.15.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", - "keywords": [ - "code", - "laminas", - "laminasframework" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" } ], - "time": "2025-11-01T09:38:14+00:00" + "time": "2023-11-17T17:00:27+00:00" }, { "name": "lcobucci/jwt", - "version": "5.6.0", + "version": "5.2.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", - "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/0ba88aed12c04bd2ed9924f500673f32b67a6211", + "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211", "shasum": "" }, "require": { "ext-openssl": "*", "ext-sodium": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.29", - "lcobucci/clock": "^3.2", + "infection/infection": "^0.27.0", + "lcobucci/clock": "^3.0", "lcobucci/coding-standard": "^11.0", - "phpbench/phpbench": "^1.2", + "phpbench/phpbench": "^1.2.9", "phpstan/extension-installer": "^1.2", "phpstan/phpstan": "^1.10.7", "phpstan/phpstan-deprecation-rules": "^1.1.3", "phpstan/phpstan-phpunit": "^1.3.10", "phpstan/phpstan-strict-rules": "^1.5.0", - "phpunit/phpunit": "^11.1" + "phpunit/phpunit": "^10.2.6" }, "suggest": { - "lcobucci/clock": ">= 3.2" + "lcobucci/clock": ">= 3.0" }, "type": "library", "autoload": { @@ -1858,7 +1746,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + "source": "https://github.com/lcobucci/jwt/tree/5.2.0" }, "funding": [ { @@ -1870,113 +1758,51 @@ "type": "patreon" } ], - "time": "2025-10-17T11:30:53+00:00" - }, - { - "name": "league/oauth2-client", - "version": "2.9.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", - "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "php": "^7.1 || >=8.0.0 <8.6.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.5", - "php-parallel-lint/php-parallel-lint": "^1.4", - "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", - "squizlabs/php_codesniffer": "^3.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\OAuth2\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Bilbie", - "email": "hello@alexbilbie.com", - "homepage": "http://www.alexbilbie.com", - "role": "Developer" - }, - { - "name": "Woody Gilk", - "homepage": "https://github.com/shadowhand", - "role": "Contributor" - } - ], - "description": "OAuth 2.0 Client Library", - "keywords": [ - "Authentication", - "SSO", - "authorization", - "identity", - "idp", - "oauth", - "oauth2", - "single sign on" - ], - "support": { - "issues": "https://github.com/thephpleague/oauth2-client/issues", - "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" - }, - "time": "2025-11-25T22:17:17+00:00" + "time": "2023-11-20T21:17:42+00:00" }, { "name": "lexik/jwt-authentication-bundle", - "version": "v3.2.0", + "version": "v2.20.3", "source": { "type": "git", "url": "https://github.com/lexik/LexikJWTAuthenticationBundle.git", - "reference": "60df75dc70ee6f597929cb2f0812adda591dfa4b" + "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/60df75dc70ee6f597929cb2f0812adda591dfa4b", - "reference": "60df75dc70ee6f597929cb2f0812adda591dfa4b", + "url": "https://api.github.com/repos/lexik/LexikJWTAuthenticationBundle/zipball/a196d68d07dd5486a523cc3415620badbb5d25c2", + "reference": "a196d68d07dd5486a523cc3415620badbb5d25c2", "shasum": "" }, "require": { "ext-openssl": "*", - "lcobucci/jwt": "^5.0", - "php": ">=8.2", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "lcobucci/clock": "^1.2|^2.0|^3.0", + "lcobucci/jwt": "^3.4|^4.1|^5.0", + "namshi/jose": "^7.2", + "php": ">=7.1", + "symfony/config": "^4.4|^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^4.4|^5.4|^6.0|^7.0", "symfony/deprecation-contracts": "^2.4|^3.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/property-access": "^6.4|^7.0|^8.0", - "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-foundation": "^4.4|^5.4|^6.0|^7.0", + "symfony/http-kernel": "^4.4|^5.4|^6.0|^7.0", + "symfony/property-access": "^4.4|^5.4|^6.0|^7.0", + "symfony/security-bundle": "^4.4|^5.4|^6.0|^7.0", "symfony/translation-contracts": "^1.0|^2.0|^3.0" }, + "conflict": { + "symfony/console": "<4.4" + }, "require-dev": { - "api-platform/core": "^3.0|^4.0", - "rector/rector": "^1.2", - "symfony/browser-kit": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dom-crawler": "^6.4|^7.0|^8.0", - "symfony/filesystem": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", - "symfony/phpunit-bridge": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^4.4|^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^4.4|^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^4.4|^5.4|^6.0|^7.0", + "symfony/security-guard": "^4.4|^5.4|^6.0|^7.0", + "symfony/var-dumper": "^4.4|^5.4|^6.0|^7.0", + "symfony/yaml": "^4.4|^5.4|^6.0|^7.0" }, "suggest": { "gesdinet/jwt-refresh-token-bundle": "Implements a refresh token system over Json Web Tokens in Symfony", @@ -2039,7 +1865,7 @@ ], "support": { "issues": "https://github.com/lexik/LexikJWTAuthenticationBundle/issues", - "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v3.2.0" + "source": "https://github.com/lexik/LexikJWTAuthenticationBundle/tree/v2.20.3" }, "funding": [ { @@ -2051,34 +1877,44 @@ "type": "tidelift" } ], - "time": "2025-12-20T17:47:00+00:00" + "time": "2023-12-14T15:58:11+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "namshi/jose", + "version": "7.2.3", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/namshi/jose.git", + "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/namshi/jose/zipball/89a24d7eb3040e285dd5925fcad992378b82bcff", + "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff", "shasum": "" }, "require": { - "php": ">=8.0.0" + "ext-date": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-spl": "*", + "php": ">=5.5", + "symfony/polyfill-php56": "^1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "phpseclib/phpseclib": "^2.0", + "phpunit/phpunit": "^4.5|^5.0", + "satooshi/php-coveralls": "^1.0" + }, + "suggest": { + "ext-openssl": "Allows to use OpenSSL as crypto engine.", + "phpseclib/phpseclib": "Allows to use Phpseclib as crypto engine, use version ^2.0." }, + "type": "library", "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Namshi\\JOSE\\": "src/Namshi/JOSE/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2087,96 +1923,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Alessandro Nadalin", + "email": "alessandro.nadalin@gmail.com" + }, + { + "name": "Alessandro Cinelli (cirpo)", + "email": "alessandro.cinelli@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "JSON Object Signing and Encryption library for PHP.", "keywords": [ - "cache", - "psr", - "psr-6" + "JSON Web Signature", + "JSON Web Token", + "JWS", + "json", + "jwt", + "token" ], "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" + "issues": "https://github.com/namshi/jose/issues", + "source": "https://github.com/namshi/jose/tree/master" }, - "time": "2021-02-03T23:26:27+00:00" + "time": "2016-12-05T07:27:31+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "nelmio/cors-bundle", + "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/nelmio/NelmioCorsBundle.git", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/78fcdb91f76b080a1008133def9c7f613833933d", + "reference": "78fcdb91f76b080a1008133def9c7f613833933d", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+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": "" + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" }, - "require": { - "php": ">=7.4.0" + "require-dev": { + "mockery/mockery": "^1.3.6", + "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" }, - "type": "library", + "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" - } + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2184,41 +1988,42 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "api", + "cors", + "crossdomain" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2023-11-30T16:41:19+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -2228,7 +2033,7 @@ }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2238,48 +2043,41 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Standard interfaces for event handling.", + "description": "Common interface for caching libraries", "keywords": [ - "events", + "cache", "psr", - "psr-14" + "psr-6" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "psr/http-client", - "version": "1.0.3", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" + "php": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "Psr\\Http\\Client\\": "src/" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2292,46 +2090,47 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "http", - "http-client", + "clock", + "now", "psr", - "psr-18" + "psr-20", + "time" ], "support": { - "source": "https://github.com/php-fig/http-client" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2023-09-23T14:17:50+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "psr/http-factory", - "version": "1.1.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2344,48 +2143,47 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "source": "https://github.com/php-fig/http-factory" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2024-04-15T12:06:14+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "psr/http-message", - "version": "2.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2395,36 +2193,33 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Standard interfaces for event handling.", "keywords": [ - "http", - "http-message", + "events", "psr", - "psr-7", - "request", - "response" + "psr-14" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2023-04-04T09:54:51+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/log", - "version": "3.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { @@ -2459,36 +2254,37 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "rteeom/isoflags", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" + "url": "https://github.com/mainstreamer/isoflags.git", + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", + "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f", "shasum": "" }, "require": { - "php": ">=5.6" + "ext-mbstring": "*", + "php": "^7.4|8.*" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" + "ext-json": "*", + "phpunit/phpunit": "^10.4" }, "type": "library", "autoload": { - "files": [ - "src/getallheaders.php" - ] + "psr-4": { + "Rteeom\\FlagsGenerator\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2496,44 +2292,73 @@ ], "authors": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "name": "Rteeom", + "email": "mainstreamer@outlook.com" } ], - "description": "A polyfill for getallheaders.", + "description": "library for easy emoji flags generation from iso country codes", "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "issues": "https://github.com/mainstreamer/isoflags/issues", + "source": "https://github.com/mainstreamer/isoflags/tree/1.2.0" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2024-10-23T19:44:49+00:00" }, { - "name": "rteeom/isoflags", - "version": "1.2.0", + "name": "sensio/framework-extra-bundle", + "version": "v6.2.10", "source": { "type": "git", - "url": "https://github.com/mainstreamer/isoflags.git", - "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f" + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mainstreamer/isoflags/zipball/ec3a4cc808a86cb001cbbc19651ffd514f76684f", - "reference": "ec3a4cc808a86cb001cbbc19651ffd514f76684f", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/2f886f4b31f23c76496901acaedfedb6936ba61f", + "reference": "2f886f4b31f23c76496901acaedfedb6936ba61f", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": "^7.4|8.*" + "doctrine/annotations": "^1.0|^2.0", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/framework-bundle": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1", + "doctrine/persistence": "<1.3" }, "require-dev": { - "ext-json": "*", - "phpunit/phpunit": "^10.4" + "doctrine/dbal": "^2.10|^3.0", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "symfony/browser-kit": "^4.4|^5.0|^6.0", + "symfony/doctrine-bridge": "^4.4|^5.0|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/monolog-bridge": "^4.0|^5.0|^6.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bundle": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "6.1.x-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "Rteeom\\FlagsGenerator\\": "src/" - } + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2541,29 +2366,33 @@ ], "authors": [ { - "name": "Rteeom", - "email": "mainstreamer@outlook.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], - "description": "library for easy emoji flags generation from iso country codes", + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], "support": { - "issues": "https://github.com/mainstreamer/isoflags/issues", - "source": "https://github.com/mainstreamer/isoflags/tree/1.2.0" + "source": "https://github.com/sensiolabs/SensioFrameworkExtraBundle/tree/v6.2.10" }, - "time": "2024-10-23T19:44:49+00:00" + "abandoned": "Symfony", + "time": "2023-02-24T14:57:12+00:00" }, { "name": "symfony/cache", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "eb3272ed2daed13ed24816e862d73f73d995972a" + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/eb3272ed2daed13ed24816e862d73f73d995972a", - "reference": "eb3272ed2daed13ed24816e862d73f73d995972a", + "url": "https://api.github.com/repos/symfony/cache/zipball/14a75869bbb41cb35bc5d9d322473928c6f3f978", + "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978", "shasum": "" }, "require": { @@ -2630,7 +2459,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.30" + "source": "https://github.com/symfony/cache/tree/v6.4.2" }, "funding": [ { @@ -2641,29 +2470,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-01T16:41:59+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/clock", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68" + "reference": "0639710e65f73cc504167958ea29be6de5c7177a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/fb2df4bc9e3037c4765ba7fd29e00167001a9b68", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "url": "https://api.github.com/repos/symfony/clock/zipball/0639710e65f73cc504167958ea29be6de5c7177a", + "reference": "0639710e65f73cc504167958ea29be6de5c7177a", "shasum": "" }, "require": { @@ -2708,7 +2533,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.30" + "source": "https://github.com/symfony/clock/tree/v6.4.2" }, "funding": [ { @@ -2719,29 +2544,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-11T21:24:34+00:00" + "time": "2023-12-27T00:32:33+00:00" }, { "name": "symfony/config", - "version": "v6.4.28", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62" + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/15947c18ef3ddb0b2f4ec936b9e90e2520979f62", - "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62", + "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", + "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", "shasum": "" }, "require": { @@ -2787,7 +2608,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.28" + "source": "https://github.com/symfony/config/tree/v6.4.0" }, "funding": [ { @@ -2798,29 +2619,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-01T19:52:02+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "symfony/console", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e" + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1b2813049506b39eb3d7e64aff033fd5ca26c97e", - "reference": "1b2813049506b39eb3d7e64aff033fd5ca26c97e", + "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", + "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", "shasum": "" }, "require": { @@ -2885,7 +2702,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.30" + "source": "https://github.com/symfony/console/tree/v6.4.2" }, "funding": [ { @@ -2896,35 +2713,31 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-05T13:47:41+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/contracts", - "version": "v3.6.1", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/contracts.git", - "reference": "97a588e965e92e3f197085531cbe440d0fcf48c3" + "reference": "db06a3f3c52adeb7a1e84745cece0a9c474f518a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/97a588e965e92e3f197085531cbe440d0fcf48c3", - "reference": "97a588e965e92e3f197085531cbe440d0fcf48c3", + "url": "https://api.github.com/repos/symfony/contracts/zipball/db06a3f3c52adeb7a1e84745cece0a9c474f518a", + "reference": "db06a3f3c52adeb7a1e84745cece0a9c474f518a", "shasum": "" }, "require": { "php": ">=8.1", "psr/cache": "^3.0", - "psr/container": "^1.1|^2.0", + "psr/container": "^2.0", "psr/event-dispatcher": "^1.0" }, "conflict": { @@ -2944,7 +2757,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.4-dev" } }, "autoload": { @@ -2984,7 +2797,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/contracts/tree/v3.6.1" + "source": "https://github.com/symfony/contracts/tree/v3.4.1" }, "funding": [ { @@ -2995,29 +2808,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-15T17:58:03+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f" + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5328f994cbb0855ba25c3a54f4a31a279511640f", - "reference": "5328f994cbb0855ba25c3a54f4a31a279511640f", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", + "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", "shasum": "" }, "require": { @@ -3025,7 +2834,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/var-exporter": "^6.2.10|^7.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -3069,7 +2878,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.30" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.2" }, "funding": [ { @@ -3080,34 +2889,30 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-07T09:29:59+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.26", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344" + "reference": "da33f27c1dd9946afecfd1585b867551df71bf53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c14bb5a9125c411e73354954940e06b6e7fcc344", - "reference": "c14bb5a9125c411e73354954940e06b6e7fcc344", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/da33f27c1dd9946afecfd1585b867551df71bf53", + "reference": "da33f27c1dd9946afecfd1585b867551df71bf53", "shasum": "" }, "require": { "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2.5|^3.1|^4", + "doctrine/persistence": "^3.1", "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", @@ -3120,7 +2925,7 @@ "doctrine/orm": "<2.15", "symfony/cache": "<5.4", "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", + "symfony/form": "<5.4.21|>=6,<6.2.7", "symfony/http-foundation": "<6.3", "symfony/http-kernel": "<6.2", "symfony/lock": "<6.3", @@ -3132,7 +2937,7 @@ }, "require-dev": { "doctrine/collections": "^1.0|^2.0", - "doctrine/data-fixtures": "^1.1|^2", + "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.13.1|^3|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", @@ -3141,7 +2946,7 @@ "symfony/dependency-injection": "^6.2|^7.0", "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.38|^6.4.6|^7.0.6", + "symfony/form": "^5.4.21|^6.2.7|^7.0", "symfony/http-kernel": "^6.3|^7.0", "symfony/lock": "^6.3|^7.0", "symfony/messenger": "^5.4|^6.0|^7.0", @@ -3181,7 +2986,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.26" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.2" }, "funding": [ { @@ -3192,29 +2997,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-09-26T15:07:38+00:00" + "time": "2023-12-27T00:32:33+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "924edbc9631b75302def0258ed1697948b17baf6" + "reference": "835f8d2d1022934ac038519de40b88158798c96f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", - "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/835f8d2d1022934ac038519de40b88158798c96f", + "reference": "835f8d2d1022934ac038519de40b88158798c96f", "shasum": "" }, "require": { @@ -3259,7 +3060,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + "source": "https://github.com/symfony/dotenv/tree/v6.4.2" }, "funding": [ { @@ -3270,29 +3071,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-14T17:33:48+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.26", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c" + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/41bedcaec5b72640b0ec2096547b75fda72ead6c", - "reference": "41bedcaec5b72640b0ec2096547b75fda72ead6c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", "shasum": "" }, "require": { @@ -3338,7 +3135,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.26" + "source": "https://github.com/symfony/error-handler/tree/v6.4.0" }, "funding": [ { @@ -3349,29 +3146,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.25", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b0cf3162020603587363f0551cd3be43958611ff" + "reference": "e95216850555cd55e71b857eb9d6c2674124603a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b0cf3162020603587363f0551cd3be43958611ff", - "reference": "b0cf3162020603587363f0551cd3be43958611ff", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", + "reference": "e95216850555cd55e71b857eb9d6c2674124603a", "shasum": "" }, "require": { @@ -3422,7 +3215,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.4.25" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.2" }, "funding": [ { @@ -3433,29 +3226,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-08-13T09:41:44+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/expression-language", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "01906f3b379833b347de9abc8ddc326593e9122b" + "reference": "7d63ccd5331d4164961776eced5524e891e30ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/01906f3b379833b347de9abc8ddc326593e9122b", - "reference": "01906f3b379833b347de9abc8ddc326593e9122b", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/7d63ccd5331d4164961776eced5524e891e30ad3", + "reference": "7d63ccd5331d4164961776eced5524e891e30ad3", "shasum": "" }, "require": { @@ -3490,7 +3279,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.30" + "source": "https://github.com/symfony/expression-language/tree/v6.4.2" }, "funding": [ { @@ -3501,29 +3290,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-09T10:02:06+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.30", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", "shasum": "" }, "require": { @@ -3531,9 +3316,6 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, - "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" - }, "type": "library", "autoload": { "psr-4": { @@ -3560,7 +3342,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v6.4.0" }, "funding": [ { @@ -3571,29 +3353,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2023-07-26T17:27:13+00:00" }, { "name": "symfony/finder", - "version": "v6.4.27", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b6aa435d2fba50793b994a839c32b6064f063b", - "reference": "a1b6aa435d2fba50793b994a839c32b6064f063b", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { @@ -3628,7 +3406,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.27" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -3639,45 +3417,37 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-10-15T18:32:00+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/flex", - "version": "v2.10.0", + "version": "v2.4.3", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d" + "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/9cd384775973eabbf6e8b05784dda279fc67c28d", - "reference": "9cd384775973eabbf6e8b05784dda279fc67c28d", + "url": "https://api.github.com/repos/symfony/flex/zipball/6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", + "reference": "6b44ac75c7f07f48159ec36c2d21ef8cf48a21b1", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", - "php": ">=8.1" - }, - "conflict": { - "composer/semver": "<1.7.2", - "symfony/dotenv": "<5.4" + "php": ">=8.0" }, "require-dev": { "composer/composer": "^2.1", - "symfony/dotenv": "^6.4|^7.4|^8.0", - "symfony/filesystem": "^6.4|^7.4|^8.0", - "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", - "symfony/process": "^6.4|^7.4|^8.0" + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0" }, "type": "composer-plugin", "extra": { @@ -3701,7 +3471,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.10.0" + "source": "https://github.com/symfony/flex/tree/v2.4.3" }, "funding": [ { @@ -3712,29 +3482,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-16T09:38:19+00:00" + "time": "2024-01-02T11:08:32+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "3c212ec5cac588da8357f5c061194363a4e91010" + "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3c212ec5cac588da8357f5c061194363a4e91010", - "reference": "3c212ec5cac588da8357f5c061194363a4e91010", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c26a221e0462027d1f9d4a802ed63f8ab07a43d0", + "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0", "shasum": "" }, "require": { @@ -3743,7 +3509,7 @@ "php": ">=8.1", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.12|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.1|^7.0", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", @@ -3773,8 +3539,7 @@ "symfony/mime": "<6.4", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", - "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", - "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/scheduler": "<6.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", "symfony/serializer": "<6.4", @@ -3813,7 +3578,7 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/scheduler": "^6.4|^7.0", "symfony/security-bundle": "^5.4|^6.0|^7.0", "symfony/semaphore": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4|^7.0", @@ -3826,7 +3591,7 @@ "symfony/web-link": "^5.4|^6.0|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0.4" + "twig/twig": "^2.10|^3.0" }, "type": "symfony-bundle", "autoload": { @@ -3854,7 +3619,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.30" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.2" }, "funding": [ { @@ -3865,37 +3630,32 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-29T11:31:32+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77" + "reference": "fc0944665bd932cf32a7b8a1d009466afc16528f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/a67de2002d72f76ce7c57f830c4df503febc8d77", - "reference": "a67de2002d72f76ce7c57f830c4df503febc8d77", + "url": "https://api.github.com/repos/symfony/http-client/zipball/fc0944665bd932cf32a7b8a1d009466afc16528f", + "reference": "fc0944665bd932cf32a7b8a1d009466afc16528f", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", - "symfony/polyfill-php83": "^1.29", + "symfony/http-client-contracts": "^3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -3913,7 +3673,7 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4|^2.0", + "guzzlehttp/promises": "^1.4", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -3952,7 +3712,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.30" + "source": "https://github.com/symfony/http-client/tree/v6.4.2" }, "funding": [ { @@ -3963,29 +3723,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-04T16:42:50+00:00" + "time": "2023-12-02T12:49:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6" + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0384c62b79d96e9b22d77bc1272c9e83342ba3a6", - "reference": "0384c62b79d96e9b22d77bc1272c9e83342ba3a6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", + "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", "shasum": "" }, "require": { @@ -3995,12 +3751,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + "symfony/cache": "<6.3" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", + "symfony/cache": "^6.3|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", @@ -4033,7 +3789,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.30" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" }, "funding": [ { @@ -4044,29 +3800,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-01T20:07:31+00:00" + "time": "2023-12-27T22:16:42+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5" + "reference": "13e8387320b5942d0dc408440c888e2d526efef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ceac681e74e824bbf90468eb231d40988d6d18a5", - "reference": "ceac681e74e824bbf90468eb231d40988d6d18a5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/13e8387320b5942d0dc408440c888e2d526efef4", + "reference": "13e8387320b5942d0dc408440c888e2d526efef4", "shasum": "" }, "require": { @@ -4115,13 +3867,12 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4.5|^6.0.5|^7.0", "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/serializer": "^6.3|^7.0", "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0|^7.0", "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, @@ -4151,7 +3902,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.30" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.2" }, "funding": [ { @@ -4162,29 +3913,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-07T15:49:34+00:00" + "time": "2023-12-30T15:31:44+00:00" }, { "name": "symfony/intl", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85" + "reference": "4f45148f7eb984ef12b1f7e123205ab904828839" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", - "reference": "5f40c7141be52f7ee86c4a42dce2845e6fbe3c85", + "url": "https://api.github.com/repos/symfony/intl/zipball/4f45148f7eb984ef12b1f7e123205ab904828839", + "reference": "4f45148f7eb984ef12b1f7e123205ab904828839", "shasum": "" }, "require": { @@ -4201,8 +3948,7 @@ "Symfony\\Component\\Intl\\": "" }, "exclude-from-classmap": [ - "/Tests/", - "/Resources/data/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4238,7 +3984,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.30" + "source": "https://github.com/symfony/intl/tree/v6.4.2" }, "funding": [ { @@ -4249,29 +3995,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-24T13:57:00+00:00" + "time": "2023-12-26T18:38:00+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.24", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557" + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557", - "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/e001f752338a49d644ee0523fd7891aabaccb7e2", + "reference": "e001f752338a49d644ee0523fd7891aabaccb7e2", "shasum": "" }, "require": { @@ -4314,7 +4056,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.24" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.0" }, "funding": [ { @@ -4325,42 +4067,41 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2023-11-06T11:00:25+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4396,7 +4137,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -4407,42 +4148,41 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4481,7 +4221,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -4492,34 +4232,29 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { - "ext-iconv": "*", - "php": ">=7.2" + "php": ">=7.1" }, "provide": { "ext-mbstring": "*" @@ -4529,9 +4264,12 @@ }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4566,7 +4304,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -4577,39 +4315,38 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "symfony/polyfill-php80", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4617,7 +4354,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -4628,6 +4365,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -4637,7 +4378,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4646,7 +4387,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -4657,39 +4398,39 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { - "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "name": "symfony/polyfill-php83", + "version": "v1.28.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4697,7 +4438,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -4717,7 +4458,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4726,7 +4467,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -4737,29 +4478,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.25", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "fedc771326d4978a7d3167fa009a509b06a2e168" + "reference": "75f6990ae8e8040dd587162f3f1863f755957129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/fedc771326d4978a7d3167fa009a509b06a2e168", - "reference": "fedc771326d4978a7d3167fa009a509b06a2e168", + "url": "https://api.github.com/repos/symfony/property-access/zipball/75f6990ae8e8040dd587162f3f1863f755957129", + "reference": "75f6990ae8e8040dd587162f3f1863f755957129", "shasum": "" }, "require": { @@ -4807,7 +4544,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.25" + "source": "https://github.com/symfony/property-access/tree/v6.4.0" }, "funding": [ { @@ -4818,29 +4555,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-08-12T15:42:57+00:00" + "time": "2023-09-25T12:52:38+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.30", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98" + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/13243e748cb77b3d2300c0bffa21c2d325dd6e98", - "reference": "13243e748cb77b3d2300c0bffa21c2d325dd6e98", + "url": "https://api.github.com/repos/symfony/property-info/zipball/288be71bae2ebc88676f5d3a03d23f70b278fcc1", + "reference": "288be71bae2ebc88676f5d3a03d23f70b278fcc1", "shasum": "" }, "require": { @@ -4848,20 +4581,17 @@ "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { - "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4|>=6.0,<6.4", - "symfony/serializer": "<5.4" + "symfony/dependency-injection": "<5.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "phpdocumentor/reflection-docblock": "^5.2", - "phpstan/phpdoc-parser": "^1.0|^2.0", + "phpstan/phpdoc-parser": "^1.0", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^5.4|^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -4897,7 +4627,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.30" + "source": "https://github.com/symfony/property-info/tree/v6.4.0" }, "funding": [ { @@ -4908,29 +4638,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-29T16:02:37+00:00" + "time": "2023-11-25T16:57:46+00:00" }, { "name": "symfony/proxy-manager-bridge", - "version": "v6.4.28", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "9ecac7f98ad685d474394dbd06dab29bab4e18a6" + "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/9ecac7f98ad685d474394dbd06dab29bab4e18a6", - "reference": "9ecac7f98ad685d474394dbd06dab29bab4e18a6", + "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/801c4590eacf0dc40d73135dbe79ad71effd6d04", + "reference": "801c4590eacf0dc40d73135dbe79ad71effd6d04", "shasum": "" }, "require": { @@ -4968,7 +4694,7 @@ "description": "Provides integration for ProxyManager with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.28" + "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.0" }, "funding": [ { @@ -4979,29 +4705,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-02T18:11:54+00:00" + "time": "2023-11-01T12:07:38+00:00" }, { "name": "symfony/routing", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859" + "reference": "98eab13a07fddc85766f1756129c69f207ffbc21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ea50a13c2711eebcbb66b38ef6382e62e3262859", - "reference": "ea50a13c2711eebcbb66b38ef6382e62e3262859", + "url": "https://api.github.com/repos/symfony/routing/zipball/98eab13a07fddc85766f1756129c69f207ffbc21", + "reference": "98eab13a07fddc85766f1756129c69f207ffbc21", "shasum": "" }, "require": { @@ -5055,7 +4777,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.30" + "source": "https://github.com/symfony/routing/tree/v6.4.2" }, "funding": [ { @@ -5066,29 +4788,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-22T09:51:35+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "508e67e68156cf3cb2b982504191b2ce34daa921" + "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/508e67e68156cf3cb2b982504191b2ce34daa921", - "reference": "508e67e68156cf3cb2b982504191b2ce34daa921", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/97d4fb6dbee700937738036ec54b0fcb0641d7d6", + "reference": "97d4fb6dbee700937738036ec54b0fcb0641d7d6", "shasum": "" }, "require": { @@ -5097,7 +4815,7 @@ "php": ">=8.1", "symfony/clock": "^6.3|^7.0", "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.11|^7.1.4", + "symfony/dependency-injection": "^6.2|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", "symfony/http-foundation": "^6.2|^7.0", @@ -5171,7 +4889,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.30" + "source": "https://github.com/symfony/security-bundle/tree/v6.4.2" }, "funding": [ { @@ -5182,29 +4900,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-12-04T18:05:02+00:00" + "time": "2023-12-24T09:11:31+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.27", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb" + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/673018434b38e504eb04ca3c6d7e2e7c86735bfb", - "reference": "673018434b38e504eb04ca3c6d7e2e7c86735bfb", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9e24a7199744d944c03fc1448276dc57f6237a33", + "reference": "9e24a7199744d944c03fc1448276dc57f6237a33", "shasum": "" }, "require": { @@ -5219,7 +4933,6 @@ "symfony/http-foundation": "<5.4", "symfony/ldap": "<5.4", "symfony/security-guard": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", "symfony/validator": "<5.4" }, "require-dev": { @@ -5232,7 +4945,7 @@ "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/ldap": "^5.4|^6.0|^7.0", "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/translation": "^5.4|^6.0|^7.0", "symfony/validator": "^6.4|^7.0" }, "type": "library", @@ -5261,7 +4974,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.27" + "source": "https://github.com/symfony/security-core/tree/v6.4.0" }, "funding": [ { @@ -5272,29 +4985,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-10-23T19:49:35+00:00" + "time": "2023-11-06T17:20:05+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.24", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7" + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9a1efc8c10b86bcedc9233affd10c716b54ca1b7", - "reference": "9a1efc8c10b86bcedc9233affd10c716b54ca1b7", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/b28413496ebfce2f98afbb990ad0ce0ba3586638", + "reference": "b28413496ebfce2f98afbb990ad0ce0ba3586638", "shasum": "" }, "require": { @@ -5333,7 +5042,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.24" + "source": "https://github.com/symfony/security-csrf/tree/v6.4.0" }, "funding": [ { @@ -5344,29 +5053,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2023-08-25T16:27:31+00:00" }, { "name": "symfony/security-http", - "version": "v6.4.30", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513" + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/5705ae14ed77b38ac99990959d8c6dbcba86e513", - "reference": "5705ae14ed77b38ac99990959d8c6dbcba86e513", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1b49ad8e9f2c3ceec011d67ac09e774e4107416b", + "reference": "1b49ad8e9f2c3ceec011d67ac09e774e4107416b", "shasum": "" }, "require": { @@ -5425,7 +5130,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.30" + "source": "https://github.com/symfony/security-http/tree/v6.4.0" }, "funding": [ { @@ -5436,29 +5141,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-12T13:33:48+00:00" + "time": "2023-11-24T21:18:21+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d7976be554af097c788d7df25e10dd99facbfe65" + "reference": "f87ea9d7bfd4cf2f7b72be554607e6c96e6664af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d7976be554af097c788d7df25e10dd99facbfe65", - "reference": "d7976be554af097c788d7df25e10dd99facbfe65", + "url": "https://api.github.com/repos/symfony/serializer/zipball/f87ea9d7bfd4cf2f7b72be554607e6c96e6664af", + "reference": "f87ea9d7bfd4cf2f7b72be554607e6c96e6664af", "shasum": "" }, "require": { @@ -5492,7 +5193,7 @@ "symfony/http-kernel": "^5.4|^6.0|^7.0", "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.26|^6.3|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4.24|^6.2.11|^7.0", "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0|^7.0", @@ -5527,7 +5228,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v6.4.30" + "source": "https://github.com/symfony/serializer/tree/v6.4.2" }, "funding": [ { @@ -5538,29 +5239,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-12T13:46:18+00:00" + "time": "2023-12-29T15:34:34+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", + "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", "shasum": "" }, "require": { @@ -5593,7 +5290,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" }, "funding": [ { @@ -5604,29 +5301,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2023-02-16T10:14:28+00:00" }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", "shasum": "" }, "require": { @@ -5640,6 +5333,7 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", "symfony/http-client": "^5.4|^6.0|^7.0", "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -5682,7 +5376,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v6.4.2" }, "funding": [ { @@ -5693,29 +5387,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2023-12-10T16:15:48+00:00" }, { "name": "symfony/validator", - "version": "v6.4.30", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b" + "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/572dcc789ddf53174c61551aa5a3ec58d6a48b9b", - "reference": "572dcc789ddf53174c61551aa5a3ec58d6a48b9b", + "url": "https://api.github.com/repos/symfony/validator/zipball/15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", + "reference": "15fe2c6ed815b06b6b8636d8ba3ef9807ee1a75c", "shasum": "" }, "require": { @@ -5734,7 +5424,7 @@ "symfony/http-kernel": "<5.4", "symfony/intl": "<5.4", "symfony/property-info": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", + "symfony/translation": "<5.4", "symfony/yaml": "<5.4" }, "require-dev": { @@ -5753,7 +5443,7 @@ "symfony/mime": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", + "symfony/translation": "^5.4|^6.0|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", @@ -5761,91 +5451,6 @@ "psr-4": { "Symfony\\Component\\Validator\\": "" }, - "exclude-from-classmap": [ - "/Tests/", - "/Resources/bin/" - ] - }, - "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 to validate values", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.30" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-12-05T09:41:49+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v6.4.26", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfae1497a2f1eaad78dbc0590311c599c7178d4a", - "reference": "cfae1497a2f1eaad78dbc0590311c599c7178d4a", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<5.4" - }, - "require-dev": { - "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/" ] @@ -5856,623 +5461,80 @@ ], "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.26" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-09-25T15:37:27+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v6.4.26", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-09-11T09:57:09+00:00" - }, - { - "name": "symfony/yaml", - "version": "v6.4.30", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "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.30" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-12-02T11:50:18+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/Future/functions.php", - "src/Internal/functions.php" - ], - "psr-4": { - "Amp\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "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": { - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-08-27T21:42:00+00:00" - }, - { - "name": "amphp/byte-stream", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/parser": "^1.1", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2.3" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.22.1" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php", - "src/Internal/functions.php" - ], - "psr-4": { - "Amp\\ByteStream\\": "src" - } - }, - "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/v2.1.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-03-16T17:10:27+00:00" - }, - { - "name": "amphp/cache", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/cache.git", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", - "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/serialization": "^1", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Amp\\Cache\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - } - ], - "description": "A fiber-aware cache API based on Amp and Revolt.", - "homepage": "https://amphp.org/cache", - "support": { - "issues": "https://github.com/amphp/cache/issues", - "source": "https://github.com/amphp/cache/tree/v2.0.1" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-04-19T03:38:06+00:00" - }, - { - "name": "amphp/dns", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/process": "^2", - "daverandom/libdns": "^2.0.2", - "ext-filter": "*", - "ext-json": "*", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Wright", - "email": "addr@daverandom.com" - }, - { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - } - ], - "description": "Async DNS resolution for Amp.", - "homepage": "https://github.com/amphp/dns", - "keywords": [ - "amp", - "amphp", - "async", - "client", - "dns", - "resolve" - ], - "support": { - "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-01-19T15:43:40+00:00" - }, - { - "name": "amphp/parallel", - "version": "v2.3.3", - "source": { - "type": "git", - "url": "https://github.com/amphp/parallel.git", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/parallel/zipball/296b521137a54d3a02425b464e5aee4c93db2c60", - "reference": "296b521137a54d3a02425b464e5aee4c93db2c60", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/cache": "^2", - "amphp/parser": "^1", - "amphp/pipeline": "^1", - "amphp/process": "^2", - "amphp/serialization": "^1", - "amphp/socket": "^2", - "amphp/sync": "^2", - "php": ">=8.1", - "revolt/event-loop": "^1" - }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" - }, - "type": "library", - "autoload": { - "files": [ - "src/Context/functions.php", - "src/Context/Internal/functions.php", - "src/Ipc/functions.php", - "src/Worker/functions.php" - ], - "psr-4": { - "Amp\\Parallel\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Parallel processing component for Amp.", - "homepage": "https://github.com/amphp/parallel", - "keywords": [ - "async", - "asynchronous", - "concurrent", - "multi-processing", - "multi-threading" - ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/amphp/parallel/issues", - "source": "https://github.com/amphp/parallel/tree/v2.3.3" + "source": "https://github.com/symfony/validator/tree/v6.4.2" }, "funding": [ { - "url": "https://github.com/amphp", + "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": "2025-11-15T06:23:42+00:00" + "time": "2023-12-29T16:34:12+00:00" }, { - "name": "amphp/parser", - "version": "v1.1.1", + "name": "symfony/var-dumper", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "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": { - "Amp\\Parser\\": "src" - } + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6480,64 +5542,68 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", "keywords": [ - "async", - "non-blocking", - "parser", - "stream" + "debug", + "dump" ], "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" }, "funding": [ { - "url": "https://github.com/amphp", + "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-03-21T19:16:53+00:00" + "time": "2023-12-28T19:16:56+00:00" }, { - "name": "amphp/pipeline", - "version": "v1.2.3", + "name": "symfony/var-exporter", + "version": "v6.4.2", "source": { "type": "git", - "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", "shasum": "" }, "require": { - "amphp/amp": "^3", "php": ">=8.1", - "revolt/event-loop": "^1" + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Amp\\Pipeline\\": "src" - } + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6545,71 +5611,81 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Asynchronous iterators and operators.", - "homepage": "https://amphp.org/pipeline", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", "keywords": [ - "amp", - "amphp", - "async", - "io", - "iterator", - "non-blocking" + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" ], "support": { - "issues": "https://github.com/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" }, "funding": [ { - "url": "https://github.com/amphp", + "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": "2025-03-16T16:33:53+00:00" + "time": "2023-12-27T08:18:35+00:00" }, { - "name": "amphp/process", - "version": "v2.0.3", + "name": "symfony/yaml", + "version": "v6.4.0", "source": { "type": "git", - "url": "https://github.com/amphp/process.git", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + "url": "https://github.com/symfony/yaml.git", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", - "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", + "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/sync": "^2", "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "symfony/console": "^5.4|^6.0|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Process\\": "src" - } + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6617,44 +5693,49 @@ ], "authors": [ { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.com" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A fiber-aware process manager based on Amp and Revolt.", - "homepage": "https://amphp.org/process", + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v2.0.3" + "source": "https://github.com/symfony/yaml/tree/v6.4.0" }, "funding": [ { - "url": "https://github.com/amphp", + "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-19T03:13:44+00:00" - }, + "time": "2023-11-06T11:00:25+00:00" + } + ], + "packages-dev": [ { - "name": "amphp/serialization", - "version": "v1.0.0", + "name": "amphp/amp", + "version": "v2.6.2", "source": { "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "url": "https://github.com/amphp/amp.git", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", "shasum": "" }, "require": { @@ -6662,86 +5743,26 @@ }, "require-dev": { "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "amphp/phpunit-util": "^1", + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^7 | ^8 | ^9", + "psalm/phar": "^3.11@dev", + "react/promise": "^2" }, "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Serialization\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" } - ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", - "keywords": [ - "async", - "asynchronous", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" - }, - "time": "2020-03-25T21:39:07+00:00" - }, - { - "name": "amphp/socket", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/amphp/socket.git", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", - "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", - "shasum": "" - }, - "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/dns": "^2", - "ext-openssl": "*", - "kelunik/certificate": "^1.1", - "league/uri": "^6.5 | ^7", - "league/uri-interfaces": "^2.3 | ^7", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" }, - "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "amphp/process": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.20" - }, - "type": "library", "autoload": { "files": [ - "src/functions.php", - "src/Internal/functions.php", - "src/SocketAddress/functions.php" + "lib/functions.php", + "lib/Internal/functions.php" ], "psr-4": { - "Amp\\Socket\\": "src" + "Amp\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -6751,31 +5772,38 @@ "authors": [ { "name": "Daniel Lowrey", - "email": "rdlowrey@gmail.com" + "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": "Non-blocking socket connection / server implementations based on Amp and Revolt.", - "homepage": "https://github.com/amphp/socket", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "amp", "async", - "encryption", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", "non-blocking", - "sockets", - "tcp", - "tls" + "promise" ], "support": { - "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.3.1" + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v2.6.2" }, "funding": [ { @@ -6783,42 +5811,46 @@ "type": "github" } ], - "time": "2024-04-21T14:33:03+00:00" + "time": "2022-02-20T17:52:18+00:00" }, { - "name": "amphp/sync", - "version": "v2.3.0", + "name": "amphp/byte-stream", + "version": "v1.8.1", "source": { "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", + "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "amphp/amp": "^2", + "php": ">=7.1" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23" + "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", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "files": [ - "src/functions.php" + "lib/functions.php" ], "psr-4": { - "Amp\\Sync\\": "src" + "Amp\\ByteStream\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", @@ -6833,24 +5865,22 @@ { "name": "Niklas Keller", "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" } ], - "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", - "homepage": "https://github.com/amphp/sync", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "http://amphp.org/byte-stream", "keywords": [ + "amp", + "amphp", "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" + "io", + "non-blocking", + "stream" ], "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v2.3.0" + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" }, "funding": [ { @@ -6858,40 +5888,32 @@ "type": "github" } ], - "time": "2024-08-03T19:31:26+00:00" + "time": "2021-03-30T17:13:30+00:00" }, { "name": "composer/pcre", - "version": "3.3.2", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<1.11.10" - }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" }, "type": "library", "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, "branch-alias": { "dev-main": "3.x-dev" } @@ -6921,7 +5943,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "source": "https://github.com/composer/pcre/tree/3.1.1" }, "funding": [ { @@ -6937,28 +5959,28 @@ "type": "tidelift" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2023-10-11T07:11:09+00:00" }, { "name": "composer/semver", - "version": "3.4.4", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { @@ -7002,7 +6024,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.4" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -7012,22 +6034,26 @@ { "url": "https://github.com/composer", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "time": "2025-08-20T19:15:30+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/xdebug-handler", - "version": "3.0.5", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "reference": "ced299686f41dce890debac69273b47ffe98a40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", "shasum": "" }, "require": { @@ -7038,7 +6064,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "symfony/phpunit-bridge": "^6.0" }, "type": "library", "autoload": { @@ -7062,9 +6088,9 @@ "performance" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", + "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" }, "funding": [ { @@ -7080,103 +6106,7 @@ "type": "tidelift" } ], - "time": "2024-05-06T16:37:16+00:00" - }, - { - "name": "danog/advanced-json-rpc", - "version": "v3.2.2", - "source": { - "type": "git", - "url": "https://github.com/danog/php-advanced-json-rpc.git", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/danog/php-advanced-json-rpc/zipball/aadb1c4068a88c3d0530cfe324b067920661efcb", - "reference": "aadb1c4068a88c3d0530cfe324b067920661efcb", - "shasum": "" - }, - "require": { - "netresearch/jsonmapper": "^5", - "php": ">=8.1", - "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0" - }, - "replace": { - "felixfbecker/php-advanced-json-rpc": "^3" - }, - "require-dev": { - "phpunit/phpunit": "^9" - }, - "type": "library", - "autoload": { - "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - }, - { - "name": "Daniil Gentili", - "email": "daniil@daniil.it" - } - ], - "description": "A more advanced JSONRPC implementation", - "support": { - "issues": "https://github.com/danog/php-advanced-json-rpc/issues", - "source": "https://github.com/danog/php-advanced-json-rpc/tree/v3.2.2" - }, - "time": "2025-02-14T10:55:15+00:00" - }, - { - "name": "daverandom/libdns", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/DaveRandom/LibDNS.git", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "Required for IDN support" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "LibDNS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "DNS protocol implementation written in pure PHP", - "keywords": [ - "dns" - ], - "support": { - "issues": "https://github.com/DaveRandom/LibDNS/issues", - "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" - }, - "time": "2024-04-12T12:12:48+00:00" + "time": "2022-02-25T21:32:43+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -7217,22 +6147,22 @@ }, { "name": "doctrine/data-fixtures", - "version": "2.2.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", - "reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", + "reference": "bbcb74f2ac6dbe81a14b3c3687d7623490a0448f", "shasum": "" }, "require": { - "doctrine/persistence": "^3.1 || ^4.0", - "php": "^8.1", - "psr/log": "^1.1 || ^2 || ^3" + "doctrine/deprecations": "^0.5.3 || ^1.0", + "doctrine/persistence": "^2.0|^3.0", + "php": "^7.4 || ^8.0" }, "conflict": { "doctrine/dbal": "<3.5 || >=5", @@ -7240,16 +6170,17 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^14", + "doctrine/annotations": "^1.12 || ^2", + "doctrine/coding-standard": "^12", "doctrine/dbal": "^3.5 || ^4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.14 || ^3", "ext-sqlite3": "*", - "fig/log-test": "^1", - "phpstan/phpstan": "2.1.31", - "phpunit/phpunit": "10.5.45 || 12.4.0", - "symfony/cache": "^6.4 || ^7", - "symfony/var-exporter": "^6.4 || ^7" + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6.13 || ^10.4.2", + "symfony/cache": "^5.4 || ^6.3 || ^7", + "symfony/var-exporter": "^5.4 || ^6.3 || ^7", + "vimeo/psalm": "^5.9" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -7280,7 +6211,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.2.0" + "source": "https://github.com/doctrine/data-fixtures/tree/1.7.0" }, "funding": [ { @@ -7296,49 +6227,49 @@ "type": "tidelift" } ], - "time": "2025-10-17T20:06:20+00:00" + "time": "2023-11-24T11:18:31+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.7.3", + "version": "3.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "4c3dfcc819ba2725a574f4286aa3f6459f582d5b" + "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/4c3dfcc819ba2725a574f4286aa3f6459f582d5b", - "reference": "4c3dfcc819ba2725a574f4286aa3f6459f582d5b", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/c808a0c85c38c8ee265cc8405b456c1d2b38567d", + "reference": "c808a0c85c38c8ee265cc8405b456c1d2b38567d", "shasum": "" }, "require": { - "doctrine/data-fixtures": "^1.5 || ^2.0", + "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^2.2", "doctrine/orm": "^2.14.0 || ^3.0", - "doctrine/persistence": "^2.4 || ^3.0 || ^4", + "doctrine/persistence": "^2.4|^3.0", "php": "^7.4 || ^8.0", - "psr/log": "^1 || ^2 || ^3", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", - "symfony/doctrine-bridge": "^5.4.48 || ^6.4.16 || ^7.1.9", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/doctrine-bridge": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0" }, "conflict": { "doctrine/dbal": "< 3" }, "require-dev": { - "doctrine/coding-standard": "14.0.0", - "phpstan/phpstan": "2.1.32", - "phpunit/phpunit": "^9.6.13 || 11.4.14", - "symfony/phpunit-bridge": "7.3.4" + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10.39", + "phpunit/phpunit": "^9.6.13", + "symfony/phpunit-bridge": "^6.3.6", + "vimeo/psalm": "^5.15" }, "type": "symfony-bundle", "autoload": { "psr-4": { - "Doctrine\\Bundle\\FixturesBundle\\": "src" + "Doctrine\\Bundle\\FixturesBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7367,7 +6298,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.7.3" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.5.1" }, "funding": [ { @@ -7383,39 +6314,34 @@ "type": "tidelift" } ], - "time": "2025-12-03T15:47:21+00:00" + "time": "2023-11-19T12:48:54+00:00" }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.3", + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", "shasum": "" }, "require": { - "php": ">=7.1" + "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": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "phpunit/phpunit": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" + "AdvancedJsonRpc\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7428,101 +6354,34 @@ "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.3" - }, - "time": "2024-04-30T00:40:11+00:00" - }, - { - "name": "fidry/cpu-core-counter", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", - "reference": "db9508f7b1474469d9d3c53b86f817e344732678", - "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": "^2.0", - "phpstan/phpstan-deprecation-rules": "^2.0.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" - }, - "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" - ], + "description": "A more advanced JSONRPC implementation", "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", + "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2025-08-14T07:29:31+00:00" + "time": "2021-06-11T22:34:44+00:00" }, { - "name": "kelunik/certificate", - "version": "v1.1.3", + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.2", "source": { "type": "git", - "url": "https://github.com/kelunik/certificate.git", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", - "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", + "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", "shasum": "" }, "require": { - "ext-openssl": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" }, "type": "library", "extra": { @@ -7532,228 +6391,44 @@ }, "autoload": { "psr-4": { - "Kelunik\\Certificate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Access certificate details and transform between different formats.", - "keywords": [ - "DER", - "certificate", - "certificates", - "openssl", - "pem", - "x509" - ], - "support": { - "issues": "https://github.com/kelunik/certificate/issues", - "source": "https://github.com/kelunik/certificate/tree/v1.1.3" - }, - "time": "2023-02-03T21:26:53+00:00" - }, - { - "name": "league/uri", - "version": "7.7.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri.git", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807", - "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807", - "shasum": "" - }, - "require": { - "league/uri-interfaces": "^7.7", - "php": "^8.1", - "psr/http-factory": "^1" - }, - "conflict": { - "league/uri-schemes": "^1.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-dom": "to convert the URI into an HTML anchor tag", - "ext-fileinfo": "to create Data URI from file contennts", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "ext-uri": "to use the PHP native URI class", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP", - "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "URI manipulation library", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "URN", - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc2141", - "rfc3986", - "rfc3987", - "rfc6570", - "rfc8141", - "uri", - "uri-template", - "url", - "ws" - ], - "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.7.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2025-12-07T16:02:06+00:00" - }, - { - "name": "league/uri-interfaces", - "version": "7.7.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c", - "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^8.1", - "psr/http-message": "^1.1 || ^2.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "" + "LanguageServerProtocol\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "ISC" ], "authors": [ { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", - "homepage": "https://uri.thephpleague.com", + "description": "PHP classes for the Language Server Protocol", "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "url", - "ws" + "language", + "microsoft", + "php", + "server" ], "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0" + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2025-12-07T16:03:21+00:00" + "time": "2022-03-02T22:36:06+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.4", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -7761,12 +6436,11 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" + "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", @@ -7792,7 +6466,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -7800,20 +6474,20 @@ "type": "tidelift" } ], - "time": "2025-08-01T08:46:24+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "netresearch/jsonmapper", - "version": "v5.0.0", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c" + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", - "reference": "8c64d8d444a5d764c641ebe97e0e3bc72b25bf6c", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", "shasum": "" }, "require": { @@ -7824,7 +6498,7 @@ "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", "squizlabs/php_codesniffer": "~3.5" }, "type": "library", @@ -7849,33 +6523,31 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v5.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" }, - "time": "2024-09-08T10:20:00+00:00" + "time": "2023-04-09T17:37:40+00:00" }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.4" + "php": ">=7.0" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" @@ -7883,7 +6555,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "4.9-dev" } }, "autoload": { @@ -7907,27 +6579,79 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + }, + "time": "2023-12-10T21:03:43+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": "2025-12-06T11:56:16+00:00" + "time": "2019-03-29T20:06:56+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.4", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { "ext-dom": "*", - "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -7968,15 +6692,9 @@ "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" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", @@ -8084,35 +6802,28 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.6", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", - "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.4 || ^8.0", + "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1 || ^2" + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -8136,35 +6847,35 @@ }, { "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "email": "account@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.6.6" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" }, - "time": "2025-12-22T21:13:58+00:00" + "time": "2021-10-19T17:43:47+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.12.0", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", - "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { "ext-tokenizer": "*", @@ -8200,36 +6911,36 @@ "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.12.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2025-11-21T15:09:14+00:00" + "time": "2023-08-12T11:01:26+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", + "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", @@ -8247,41 +6958,41 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.32", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", + "nikic/php-parser": "^4.18 || ^5.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" + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8290,7 +7001,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "9.2.x-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -8319,7 +7030,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" }, "funding": [ { @@ -8327,7 +7038,7 @@ "type": "github" } ], - "time": "2024-08-22T04:23:01+00:00" + "time": "2023-12-22T06:47:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -8572,45 +7283,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.31", + "version": "9.6.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5" + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", - "reference": "945d0b7f346a084ce5549e95289962972c4272e5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", + "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0 || ^2", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.32", - "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-code-coverage": "^9.2.28", + "phpunit/php-file-iterator": "^3.0.5", "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.9", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.8", - "sebastian/global-state": "^5.0.8", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, "suggest": { @@ -8655,7 +7366,7 @@ "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.31" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" }, "funding": [ { @@ -8666,105 +7377,25 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2025-12-06T07:45:52+00:00" - }, - { - "name": "revolt/event-loop", - "version": "v1.0.8", - "source": { - "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Revolt\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Rock-solid event loop for concurrent PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" - ], - "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" - }, - "time": "2025-08-27T21:33:23+00:00" + "time": "2023-12-01T16:55:19+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.2", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { @@ -8799,7 +7430,7 @@ "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" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, "funding": [ { @@ -8807,7 +7438,7 @@ "type": "github" } ], - "time": "2024-03-02T06:27:43+00:00" + "time": "2020-09-28T06:08:49+00:00" }, { "name": "sebastian/code-unit", @@ -8922,16 +7553,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.9", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", - "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -8984,27 +7615,15 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" } ], - "time": "2025-08-10T06:51:50+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -9065,16 +7684,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -9119,7 +7738,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -9127,7 +7746,7 @@ "type": "github" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -9194,16 +7813,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.8", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", - "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -9259,40 +7878,28 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" } ], - "time": "2025-09-24T06:03:27+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.8", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -9335,27 +7942,15 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", - "type": "tidelift" } ], - "time": "2025-08-10T07:10:35+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -9528,16 +8123,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.6", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", - "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { @@ -9579,40 +8174,28 @@ "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.6" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" } ], - "time": "2025-08-10T06:57:39+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "3.0.4", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { @@ -9624,7 +8207,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -9645,7 +8228,8 @@ "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" + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { @@ -9653,7 +8237,7 @@ "type": "github" } ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", @@ -9764,86 +8348,18 @@ ], "time": "2020-09-28T06:39:44+00:00" }, - { - "name": "spatie/array-to-xml", - "version": "3.4.4", - "source": { - "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", - "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": "^8.0" - }, - "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Spatie\\ArrayToXml\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" - } - ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", - "keywords": [ - "array", - "convert", - "xml" - ], - "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-12-15T09:00:41+00:00" - }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.26", + "version": "v6.4.2", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f" + "reference": "bd0455b7888e4adac29cf175d819c51f88fed942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/406aa80401bf960e7a173a3ccf268ae82b6bc93f", - "reference": "406aa80401bf960e7a173a3ccf268ae82b6bc93f", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bd0455b7888e4adac29cf175d819c51f88fed942", + "reference": "bd0455b7888e4adac29cf175d819c51f88fed942", "shasum": "" }, "require": { @@ -9863,8 +8379,8 @@ "type": "symfony-bridge", "extra": { "thanks": { - "url": "https://github.com/sebastianbergmann/phpunit", - "name": "phpunit/phpunit" + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { @@ -9875,8 +8391,7 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/", - "/bin/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -9895,11 +8410,8 @@ ], "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", - "keywords": [ - "testing" - ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.26" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.2" }, "funding": [ { @@ -9910,29 +8422,25 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-09-12T08:37:02+00:00" + "time": "2023-12-19T09:12:31+00:00" }, { "name": "theseer/tokenizer", - "version": "1.3.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -9961,7 +8469,7 @@ "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.3.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -9969,30 +8477,28 @@ "type": "github" } ], - "time": "2025-11-17T20:03:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "vimeo/psalm", - "version": "6.14.3", + "version": "4.30.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a" + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0b040a91f280f071c1abcb1b77ce3822058725a", - "reference": "d0b040a91f280f071c1abcb1b77ce3822058725a", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "amphp/parallel": "^2.3", - "composer-runtime-api": "^2", + "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": "^2.0 || ^3.0", - "danog/advanced-json-rpc": "^3.1", + "composer/xdebug-handler": "^1.1 || ^2.0 || ^3.0", "dnoegel/php-xdg-base-dir": "^0.1.1", "ext-ctype": "*", "ext-dom": "*", @@ -10001,37 +8507,35 @@ "ext-mbstring": "*", "ext-simplexml": "*", "ext-tokenizer": "*", - "felixfbecker/language-server-protocol": "^1.5.3", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", - "netresearch/jsonmapper": "^5.0", - "nikic/php-parser": "^5.0.0", - "php": "~8.1.31 || ~8.2.27 || ~8.3.16 || ~8.4.3 || ~8.5.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0", - "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^6.0 || ^7.0 || ^8.0", - "symfony/filesystem": "~6.3.12 || ~6.4.3 || ^7.0.3 || ^8.0", - "symfony/polyfill-php84": "^1.31.0" + "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": { - "amphp/phpunit-util": "^3", - "bamarni/composer-bin-plugin": "^1.4", - "brianium/paratest": "^6.9", - "danog/class-finder": "^0.4.8", - "dg/bypass-finals": "^1.5", + "bamarni/composer-bin-plugin": "^1.2", + "brianium/paratest": "^4.0||^6.0", "ext-curl": "*", - "mockery/mockery": "^1.5", - "nunomaduro/mock-final-classes": "^1.1", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpdoc-parser": "^1.6", - "phpunit/phpunit": "^9.6", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.19", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.6", - "symfony/process": "^6.0 || ^7.0 || ^8.0" + "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", @@ -10042,22 +8546,22 @@ "psalm-language-server", "psalm-plugin", "psalm-refactor", - "psalm-review", "psalter" ], - "type": "project", + "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev", - "dev-2.x": "2.x-dev", + "dev-master": "4.x-dev", "dev-3.x": "3.x-dev", - "dev-4.x": "4.x-dev", - "dev-5.x": "5.x-dev", - "dev-6.x": "6.x-dev", - "dev-master": "7.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/" } @@ -10069,55 +8573,49 @@ "authors": [ { "name": "Matthew Brown" - }, - { - "name": "Daniil Gentili", - "email": "daniil@daniil.it" } ], "description": "A static analysis tool for finding errors in PHP applications", "keywords": [ "code", "inspection", - "php", - "static analysis" + "php" ], "support": { - "docs": "https://psalm.dev/docs", "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm" + "source": "https://github.com/vimeo/psalm/tree/4.30.0" }, - "time": "2025-12-23T15:36:48+00:00" + "time": "2022-11-06T20:37:08+00:00" }, { "name": "webmozart/assert", - "version": "2.0.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54" + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/1b34b004e35a164bc5bb6ebd33c844b2d8069a54", - "reference": "1b34b004e35a164bc5bb6ebd33c844b2d8069a54", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { "ext-ctype": "*", - "ext-date": "*", - "ext-filter": "*", - "php": "^8.2" + "php": "^7.2 || ^8.0" }, - "suggest": { - "ext-intl": "", - "ext-simplexml": "", - "ext-spl": "" + "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-feature/2-0": "2.0-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -10133,10 +8631,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -10147,21 +8641,72 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.0.0" + "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" }, - "time": "2025-12-16T21:36:00+00:00" + "abandoned": "symfony/filesystem", + "time": "2015-12-17T08:42:14+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.4", + "php": "^8.2", "ext-ctype": "*", "ext-iconv": "*" }, - "platform-dev": {}, - "plugin-api-version": "2.9.0" + "platform-dev": [], + "plugin-api-version": "2.6.0" } From 6d40464dc4600ddf218ef994a8dc58c784741a89 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 3 Nov 2024 20:09:22 +0000 Subject: [PATCH 22/25] feat: console game --- app/composer.json | 7 +- app/composer.lock | 1737 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 1521 insertions(+), 223 deletions(-) diff --git a/app/composer.json b/app/composer.json index a7df102..fe4c75f 100644 --- a/app/composer.json +++ b/app/composer.json @@ -2,7 +2,7 @@ "type": "project", "license": "proprietary", "require": { - "php": "^8.4", + "php": "^8.2", "ext-ctype": "*", "ext-iconv": "*", "composer/package-versions-deprecated": "*", @@ -10,12 +10,11 @@ "doctrine/doctrine-bundle": "*", "doctrine/doctrine-migrations-bundle": "*", "doctrine/orm": "*", - "knpuniversity/oauth2-client-bundle": "^2.20", - "league/oauth2-client": "^2.9", "lexik/jwt-authentication-bundle": "*", "nelmio/cors-bundle": "^2.3", "phpactor/language-server": "^6.1", "rteeom/isoflags": "^1.1", + "sensio/framework-extra-bundle": "*", "symfony/console": "*", "symfony/dotenv": "*", "symfony/expression-language": "*", @@ -83,6 +82,6 @@ "phpunit/phpunit": "^9.6", "symfony/contracts": "*", "symfony/phpunit-bridge": "^6.3", - "vimeo/psalm": "^6.0" + "vimeo/psalm": "^4.4" } } diff --git a/app/composer.lock b/app/composer.lock index 35331d0..3b6ed4b 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,44 +4,920 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0c6f99db745c439aba06f4970de96864", + "content-hash": "5f7a3875d3d62313d9c8b8b41bd62006", "packages": [ + { + "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": "amphp/cache", + "version": "v1.5.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/cache.git", + "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/cache/zipball/fe78cfae2fb8c92735629b8cd1893029c73c9b63", + "reference": "fe78cfae2fb8c92735629b8cd1893029c73c9b63", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/serialization": "^1", + "amphp/sync": "^1.2", + "php": ">=7.1" + }, + "conflict": { + "amphp/file": "<0.2 || >=3" + }, + "require-dev": { + "amphp/file": "^1 || ^2", + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.1", + "phpunit/phpunit": "^6 | ^7 | ^8 | ^9", + "vimeo/psalm": "^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Cache\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A promise-aware caching API for Amp.", + "homepage": "https://github.com/amphp/cache", + "support": { + "irc": "irc://irc.freenode.org/amphp", + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v1.5.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:35:02+00:00" + }, + { + "name": "amphp/dns", + "version": "v1.2.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/dns.git", + "reference": "852292532294d7972c729a96b49756d781f7c59d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/dns/zipball/852292532294d7972c729a96b49756d781f7c59d", + "reference": "852292532294d7972c729a96b49756d781f7c59d", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.1", + "amphp/cache": "^1.2", + "amphp/parser": "^1", + "amphp/windows-registry": "^0.3", + "daverandom/libdns": "^2.0.1", + "ext-filter": "*", + "ext-json": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + } + ], + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", + "keywords": [ + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" + ], + "support": { + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v1.2.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2020-07-21T19:04:57+00:00" + }, + { + "name": "amphp/parser", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Parser\\": "src" + } + }, + "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 generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", + "keywords": [ + "async", + "non-blocking", + "parser", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" + }, + { + "name": "amphp/process", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/amphp/process.git", + "reference": "1949d85b6d71af2818ff68144304a98495628f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/process/zipball/1949d85b6d71af2818ff68144304a98495628f19", + "reference": "1949d85b6d71af2818ff68144304a98495628f19", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.4", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6" + }, + "type": "library", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Amp\\Process\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Asynchronous process manager.", + "homepage": "https://github.com/amphp/process", + "support": { + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v1.1.7" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:00:28+00:00" + }, + { + "name": "amphp/serialization", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Serialization\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/master" + }, + "time": "2020-03-25T21:39:07+00:00" + }, + { + "name": "amphp/socket", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/socket.git", + "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/socket/zipball/b00528bd75548b7ae06a502358bb3ff8b106f5ab", + "reference": "b00528bd75548b7ae06a502358bb3ff8b106f5ab", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.6", + "amphp/dns": "^1 || ^0.9", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri-parser": "^1.4", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1", + "phpunit/phpunit": "^6 || ^7 || ^8", + "vimeo/psalm": "^3.9@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Async socket connection / server tools for Amp.", + "homepage": "https://github.com/amphp/socket", + "keywords": [ + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" + ], + "support": { + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v1.2.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T18:12:22+00:00" + }, + { + "name": "amphp/sync", + "version": "v1.4.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/sync.git", + "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/sync/zipball/85ab06764f4f36d63b1356b466df6111cf4b89cf", + "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf", + "shasum": "" + }, + "require": { + "amphp/amp": "^2.2", + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "amphp/phpunit-util": "^1.1", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/ConcurrentIterator/functions.php" + ], + "psr-4": { + "Amp\\Sync\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Mutex, Semaphore, and other synchronization tools for Amp.", + "homepage": "https://github.com/amphp/sync", + "keywords": [ + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" + ], + "support": { + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v1.4.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2021-10-25T18:29:10+00:00" + }, + { + "name": "amphp/windows-registry", + "version": "v0.3.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/windows-registry.git", + "reference": "0f56438b9197e224325e88f305346f0221df1f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/windows-registry/zipball/0f56438b9197e224325e88f305346f0221df1f71", + "reference": "0f56438b9197e224325e88f305346f0221df1f71", + "shasum": "" + }, + "require": { + "amphp/amp": "^2", + "amphp/byte-stream": "^1.4", + "amphp/process": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\WindowsRegistry\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Windows Registry Reader.", + "support": { + "issues": "https://github.com/amphp/windows-registry/issues", + "source": "https://github.com/amphp/windows-registry/tree/master" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2020-07-10T16:13:29+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+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" + "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": "dantleech/argument-resolver", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://gitlab.com/dantleech/argument-resolver.git", + "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/dantleech%2Fargument-resolver/repository/archive.zip?sha=e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", + "reference": "e34fabf7d6e53e5194f745ad069c4a87cc4b34cc", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.10.1", + "phpunit/phpunit": "^7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "DTL\\ArgumentResolver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Leech", + "email": "daniel@dantleech.com" + } + ], + "description": "Resolve method arguments from an associative array", + "support": { + "issues": "https://gitlab.com/api/v4/projects/7322320/issues" + }, + "time": "2020-04-09T09:32:31+00:00" + }, + { + "name": "dantleech/invoke", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/dantleech/invoke.git", + "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/dantleech/invoke/zipball/9b002d746d2c1b86cfa63a47bb5909cee58ef50c", + "reference": "9b002d746d2c1b86cfa63a47bb5909cee58ef50c", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" + "php": "^7.2||^8.0" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" + "friendsofphp/php-cs-fixer": "^2.13", + "phpbench/phpbench": "^1.0", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^8.0" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "PackageVersions\\Installer", "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.2-dev" } }, "autoload": { "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "DTL\\Invoke\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -50,34 +926,60 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "daniel leech", + "email": "daniel@dantleech.com" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "Emulate named parameters", "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/dantleech/invoke/issues", + "source": "https://github.com/dantleech/invoke/tree/2.0.0" }, - "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": "2021-05-01T17:22:58+00:00" + }, + { + "name": "daverandom/libdns", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "Required for IDN support" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "LibDNS\\": "src/" } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2022-01-17T14:14:24+00:00" + "description": "DNS protocol implementation written in pure PHP", + "keywords": [ + "dns" + ], + "support": { + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + }, + "time": "2024-04-12T12:12:48+00:00" }, { "name": "doctrine/annotations", @@ -1560,6 +2462,64 @@ ], "time": "2023-05-24T07:17:17+00:00" }, + { + "name": "kelunik/certificate", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Kelunik\\Certificate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Access certificate details and transform between different formats.", + "keywords": [ + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" + ], + "support": { + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + }, + "time": "2023-02-03T21:26:53+00:00" + }, { "name": "laminas/laminas-code", "version": "4.13.0", @@ -1760,6 +2720,76 @@ ], "time": "2023-11-20T21:17:42+00:00" }, + { + "name": "league/uri-parser", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-parser.git", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-parser/zipball/671548427e4c932352d9b9279fdfa345bf63fa00", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-intl": "Allow parsing RFC3987 compliant hosts", + "league/uri-schemes": "Allow validating and normalizing URI parsing results" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "League\\Uri\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "userland URI parser RFC 3986 compliant", + "homepage": "https://github.com/thephpleague/uri-parser", + "keywords": [ + "parse_url", + "parser", + "rfc3986", + "rfc3987", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/thephpleague/uri-parser/issues", + "source": "https://github.com/thephpleague/uri-parser/tree/master" + }, + "abandoned": "league/uri-interfaces", + "time": "2018-11-22T07:55:51+00:00" + }, { "name": "lexik/jwt-authentication-bundle", "version": "v2.20.3", @@ -1971,16 +3001,143 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Nelmio\\CorsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nelmio", + "homepage": "http://nelm.io" + }, + { + "name": "Symfony Community", + "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + } + ], + "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", + "keywords": [ + "api", + "cors", + "crossdomain" + ], + "support": { + "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + }, + "time": "2023-11-30T16:41:19+00:00" + }, + { + "name": "phpactor/language-server", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/phpactor/language-server.git", + "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpactor/language-server/zipball/18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", + "reference": "18c6336fd3ede98bfe460e051a0a9d6f2456bdc4", + "shasum": "" + }, + "require": { + "amphp/socket": "^1.1", + "dantleech/argument-resolver": "^1.1", + "dantleech/invoke": "^2.0", + "php": "^8.0", + "phpactor/language-server-protocol": "^3.17", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0", + "ramsey/uuid": "^4.0", + "thecodingmachine/safe": "^1.1" + }, + "require-dev": { + "amphp/phpunit-util": "^1.3", + "ergebnis/composer-normalize": "^2.0", + "friendsofphp/php-cs-fixer": "^3.0", + "jangregor/phpstan-prophecy": "^1.0", + "phpactor/phly-event-dispatcher": "~2.0.0", + "phpactor/test-utils": "~1.1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.0", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Phpactor\\LanguageServer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Leech", + "email": "daniel@dantleech.com" + } + ], + "description": "Generic Language Server Platform", + "support": { + "issues": "https://github.com/phpactor/language-server/issues", + "source": "https://github.com/phpactor/language-server/tree/6.1.4" + }, + "time": "2024-03-02T11:34:28+00:00" + }, + { + "name": "phpactor/language-server-protocol", + "version": "3.17.3", + "source": { + "type": "git", + "url": "https://github.com/phpactor/language-server-protocol.git", + "reference": "065fc70b6a26a8d78e034f7db92c8872367356df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpactor/language-server-protocol/zipball/065fc70b6a26a8d78e034f7db92c8872367356df", + "reference": "065fc70b6a26a8d78e034f7db92c8872367356df", + "shasum": "" + }, + "require": { + "dantleech/invoke": "^2.0", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.0", + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "~0.12.0", + "phpunit/phpunit": "^9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.3.x-dev" } }, "autoload": { "psr-4": { - "Nelmio\\CorsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Phpactor\\LanguageServerProtocol\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1988,25 +3145,16 @@ ], "authors": [ { - "name": "Nelmio", - "homepage": "http://nelm.io" - }, - { - "name": "Symfony Community", - "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors" + "name": "Daniel Leech", + "email": "daniel@dantleech.com" } ], - "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony application", - "keywords": [ - "api", - "cors", - "crossdomain" - ], + "description": "Langauge Server Protocol for PHP (transpiled)", "support": { - "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.4.0" + "issues": "https://github.com/phpactor/language-server-protocol/issues", + "source": "https://github.com/phpactor/language-server-protocol/tree/3.17.3" }, - "time": "2023-11-30T16:41:19+00:00" + "time": "2023-03-11T13:19:45+00:00" }, { "name": "psr/cache", @@ -2210,30 +3358,30 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "php": ">=8.0.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "src" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2254,9 +3402,190 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, - "time": "2021-07-14T16:46:02+00:00" + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" }, { "name": "rteeom/isoflags", @@ -4324,26 +5653,23 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -4387,7 +5713,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -4403,7 +5729,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", @@ -5721,175 +7047,148 @@ } ], "time": "2023-11-06T11:00:25+00:00" - } - ], - "packages-dev": [ - { - "name": "amphp/amp", - "version": "v2.6.2", - "source": { - "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "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", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" - }, - "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.2" - }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2022-02-20T17:52:18+00:00" }, { - "name": "amphp/byte-stream", - "version": "v1.8.1", + "name": "thecodingmachine/safe", + "version": "v1.3.3", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", "shasum": "" }, "require": { - "amphp/amp": "^2", - "php": ">=7.1" + "php": ">=7.2" }, "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" + "phpstan/phpstan": "^0.12", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^0.12" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "0.1-dev" } }, "autoload": { "files": [ - "lib/functions.php" + "deprecated/apc.php", + "deprecated/libevent.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "lib/special_cases.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/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/ingres-ii.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/msql.php", + "generated/mysql.php", + "generated/mysqli.php", + "generated/mysqlndMs.php", + "generated/mysqlndQc.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/password.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pdf.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/simplexml.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" ], "psr-4": { - "Amp\\ByteStream\\": "lib" + "Safe\\": [ + "lib/", + "deprecated/", + "generated/" + ] } }, "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": "http://amphp.org/byte-stream", - "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" - ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2021-03-30T17:13:30+00:00" - }, + "time": "2020-10-28T17:51:34+00:00" + } + ], + "packages-dev": [ { "name": "composer/pcre", "version": "3.1.1", @@ -8708,5 +10007,5 @@ "ext-iconv": "*" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.2.0" } From 2bfe4dc7400d38d229ebedbac29dfdca5a41c630 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Sun, 15 Jun 2025 23:55:34 +0100 Subject: [PATCH 23/25] fix: bug fixes, test fix, readme update, makefilie change --- Makefile | 2 +- app/readme.md | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 34dbb5e..69f4f01 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ fix: --: @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" sh: ## Shell access into php container - @docker compose exec -u 1000 php sh + @docker compose exec php sh dumper: @docker compose exec php vendor/bin/var-dump-server domain-upd: ## Set webhook url for bot, needs named argument e.g. domain-upd url=https://url.com diff --git a/app/readme.md b/app/readme.md index 60ad44d..a60ad4c 100644 --- a/app/readme.md +++ b/app/readme.md @@ -11,13 +11,6 @@ update bot's domain via Botfather and use one from ngrok run make update with argument url=https://... for webhook (not sure if this step does anything useful at all TODO check) -Caveats: -on Fedora you need to allow containers to access files (SELinux contexts) -``` -cd into project folder -chcon -Rt container_file_t . -``` - ### deploy (from dev env) To create a deployment you need to tag your images to be deployed: From a057582b4bbc2bca686eecaa788052ce0793627f Mon Sep 17 00:00:00 2001 From: "m::r" Date: Wed, 27 Aug 2025 21:05:41 +0100 Subject: [PATCH 24/25] WIP - to review this garbage I've just commited --- Makefile | 2 +- app/readme.md | 7 +++++++ docker-compose.override.yml | 13 +++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 docker-compose.override.yml diff --git a/Makefile b/Makefile index 69f4f01..34dbb5e 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ fix: --: @docker compose exec php sh -c "$(filter-out $@,$(MAKECMDGOALS) $(MAKEFLAGS))" sh: ## Shell access into php container - @docker compose exec php sh + @docker compose exec -u 1000 php sh dumper: @docker compose exec php vendor/bin/var-dump-server domain-upd: ## Set webhook url for bot, needs named argument e.g. domain-upd url=https://url.com diff --git a/app/readme.md b/app/readme.md index a60ad4c..60ad44d 100644 --- a/app/readme.md +++ b/app/readme.md @@ -11,6 +11,13 @@ update bot's domain via Botfather and use one from ngrok run make update with argument url=https://... for webhook (not sure if this step does anything useful at all TODO check) +Caveats: +on Fedora you need to allow containers to access files (SELinux contexts) +``` +cd into project folder +chcon -Rt container_file_t . +``` + ### deploy (from dev env) To create a deployment you need to tag your images to be deployed: diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..1b8e7e7 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,13 @@ +version: "3.6" +services: + php: + volumes: + - .:/var/www/webapp:rw,cached + user: "1000:1000" + db: + ports: + - "3306:3306" + nginx: + ports: + - "80:80" + - "443:443" From d020ff58d8df148f2f359a0887a056c22a24efb8 Mon Sep 17 00:00:00 2001 From: "m::r" Date: Fri, 26 Dec 2025 16:47:32 +0000 Subject: [PATCH 25/25] wtf --- .../src/Flags/ConsoleCommand}/GameCapitalsCommand.php | 0 .../Command => app/src/Flags/ConsoleCommand}/GameFlagsCommand.php | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {src/Command => app/src/Flags/ConsoleCommand}/GameCapitalsCommand.php (100%) rename {src/Command => app/src/Flags/ConsoleCommand}/GameFlagsCommand.php (100%) diff --git a/src/Command/GameCapitalsCommand.php b/app/src/Flags/ConsoleCommand/GameCapitalsCommand.php similarity index 100% rename from src/Command/GameCapitalsCommand.php rename to app/src/Flags/ConsoleCommand/GameCapitalsCommand.php diff --git a/src/Command/GameFlagsCommand.php b/app/src/Flags/ConsoleCommand/GameFlagsCommand.php similarity index 100% rename from src/Command/GameFlagsCommand.php rename to app/src/Flags/ConsoleCommand/GameFlagsCommand.php