From e4574490194f7d99e6e7cb72ca8241a64d0416b2 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 29 Aug 2022 09:57:46 +0200 Subject: [PATCH 001/210] Update dependencies --- composer.json | 4 +- composer.lock | 203 +++++++++++++++++--------------------------------- 2 files changed, 70 insertions(+), 137 deletions(-) diff --git a/composer.json b/composer.json index b508aae..48eaeb8 100644 --- a/composer.json +++ b/composer.json @@ -11,9 +11,9 @@ "ext-json": "*", "ext-zlib": "*", "composer-runtime-api": "^2", - "deployer/deployer": "dev-master#ff3c33c as v7.0.0", + "deployer/deployer": "dev-master#e374a8e as v7.0.0", "doctrine/annotations": "^1.6", - "hypernode/deploy-configuration": "v2.x-dev", + "hypernode/deploy-configuration": "^2.0", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 4b3994c..54b5f80 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ca2b95539380ce8daf860ee14d6ac431", + "content-hash": "2b182d7312c6d76fb71d34b9cc24f323", "packages": [ { "name": "deployer/deployer", @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "ff3c33c" + "reference": "e374a8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/ff3c33c", - "reference": "ff3c33c", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/e374a8e", + "reference": "e374a8e", "shasum": "" }, "require": { @@ -76,7 +76,7 @@ "type": "github" } ], - "time": "2022-08-04T06:42:59+00:00" + "time": "2022-08-28T16:50:55+00:00" }, { "name": "doctrine/annotations", @@ -332,16 +332,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "v2.x-dev", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "5d3540f51f7cd9a76b8c28f21e8aefe1243b16dd" + "reference": "dee95040dabe7e84cc888fb0960a7cdee4d562b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/5d3540f51f7cd9a76b8c28f21e8aefe1243b16dd", - "reference": "5d3540f51f7cd9a76b8c28f21e8aefe1243b16dd", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/dee95040dabe7e84cc888fb0960a7cdee4d562b9", + "reference": "dee95040dabe7e84cc888fb0960a7cdee4d562b9", "shasum": "" }, "require": { @@ -368,9 +368,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/v2" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/2.0.1" }, - "time": "2022-08-16T11:52:04+00:00" + "time": "2022-08-29T07:51:23+00:00" }, { "name": "justinrainbow/json-schema", @@ -1110,16 +1110,16 @@ }, { "name": "react/http", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "59961cc4a5b14481728f07c591546be18fa3a5c7" + "reference": "4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/59961cc4a5b14481728f07c591546be18fa3a5c7", - "reference": "59961cc4a5b14481728f07c591546be18fa3a5c7", + "url": "https://api.github.com/repos/reactphp/http/zipball/4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa", + "reference": "4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa", "shasum": "" }, "require": { @@ -1135,11 +1135,12 @@ "ringcentral/psr7": "^1.2" }, "require-dev": { - "clue/block-react": "^1.5", "clue/http-proxy-react": "^1.7", "clue/reactphp-ssh-proxy": "^1.3", "clue/socks-react": "^1.3", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { @@ -1189,7 +1190,7 @@ ], "support": { "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.6.0" + "source": "https://github.com/reactphp/http/tree/v1.7.0" }, "funding": [ { @@ -1201,7 +1202,7 @@ "type": "github" } ], - "time": "2022-02-03T13:17:37+00:00" + "time": "2022-08-23T12:31:28+00:00" }, { "name": "react/promise", @@ -1450,16 +1451,16 @@ }, { "name": "react/socket", - "version": "v1.11.0", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c" + "reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/f474156aaab4f09041144fa8b57c7d70aed32a1c", - "reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c", + "url": "https://api.github.com/repos/reactphp/socket/zipball/81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b", + "reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b", "shasum": "" }, "require": { @@ -1467,14 +1468,14 @@ "php": ">=5.3.0", "react/dns": "^1.8", "react/event-loop": "^1.2", - "react/promise": "^2.6.0 || ^1.2.1", - "react/promise-timer": "^1.8", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/promise-timer": "^1.9", "react/stream": "^1.2" }, "require-dev": { - "clue/block-react": "^1.5", "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/promise-stream": "^1.2" + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4" }, "type": "library", "autoload": { @@ -1518,7 +1519,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.11.0" + "source": "https://github.com/reactphp/socket/tree/v1.12.0" }, "funding": [ { @@ -1530,7 +1531,7 @@ "type": "github" } ], - "time": "2022-01-14T10:14:32+00:00" + "time": "2022-08-25T12:32:25+00:00" }, { "name": "react/stream", @@ -1677,16 +1678,16 @@ }, { "name": "symfony/console", - "version": "v5.4.11", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", - "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", + "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", "shasum": "" }, "require": { @@ -1756,7 +1757,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.11" + "source": "https://github.com/symfony/console/tree/v5.4.12" }, "funding": [ { @@ -1772,7 +1773,7 @@ "type": "tidelift" } ], - "time": "2022-07-22T10:42:43+00:00" + "time": "2022-08-17T13:18:05+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1906,16 +1907,16 @@ }, { "name": "symfony/http-client", - "version": "v5.4.11", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "5c5c37eb2a276d8d7d669dd76688aa1606ee78fb" + "reference": "6a057be154824487fd5e6b65ab83899e0c5ac550" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/5c5c37eb2a276d8d7d669dd76688aa1606ee78fb", - "reference": "5c5c37eb2a276d8d7d669dd76688aa1606ee78fb", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6a057be154824487fd5e6b65ab83899e0c5ac550", + "reference": "6a057be154824487fd5e6b65ab83899e0c5ac550", "shasum": "" }, "require": { @@ -1973,7 +1974,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.11" + "source": "https://github.com/symfony/http-client/tree/v5.4.12" }, "funding": [ { @@ -1989,7 +1990,7 @@ "type": "tidelift" } ], - "time": "2022-07-28T13:33:28+00:00" + "time": "2022-08-02T15:52:22+00:00" }, { "name": "symfony/http-client-contracts", @@ -2784,16 +2785,16 @@ }, { "name": "symfony/string", - "version": "v6.1.3", + "version": "v6.1.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b" + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f35241f45c30bcd9046af2bb200a7086f70e1d6b", - "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b", + "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", + "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", "shasum": "" }, "require": { @@ -2849,7 +2850,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.3" + "source": "https://github.com/symfony/string/tree/v6.1.4" }, "funding": [ { @@ -2865,20 +2866,20 @@ "type": "tidelift" } ], - "time": "2022-07-27T15:50:51+00:00" + "time": "2022-08-12T18:05:43+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.11", + "version": "v5.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "05d4ea560f3402c6c116afd99fdc66e60eda227e" + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/05d4ea560f3402c6c116afd99fdc66e60eda227e", - "reference": "05d4ea560f3402c6c116afd99fdc66e60eda227e", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", "shasum": "" }, "require": { @@ -2924,7 +2925,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.11" + "source": "https://github.com/symfony/yaml/tree/v5.4.12" }, "funding": [ { @@ -2940,7 +2941,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2022-08-02T15:52:22+00:00" }, { "name": "twig/twig", @@ -4296,73 +4297,6 @@ }, "time": "2022-06-24T08:34:50+00:00" }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "7.0.15", @@ -4662,16 +4596,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.28", + "version": "8.5.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8f2d1c9c7b30382459c871467853da1a6e44fbd4" + "reference": "e8c563c47a9a303662955518ca532b022b337f4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8f2d1c9c7b30382459c871467853da1a6e44fbd4", - "reference": "8f2d1c9c7b30382459c871467853da1a6e44fbd4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8c563c47a9a303662955518ca532b022b337f4d", + "reference": "e8c563c47a9a303662955518ca532b022b337f4d", "shasum": "" }, "require": { @@ -4686,7 +4620,6 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.2", - "phpspec/prophecy": "^1.10.3", "phpunit/php-code-coverage": "^7.0.12", "phpunit/php-file-iterator": "^2.0.4", "phpunit/php-text-template": "^1.2.1", @@ -4740,7 +4673,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.28" + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.29" }, "funding": [ { @@ -4752,7 +4685,7 @@ "type": "github" } ], - "time": "2022-07-29T09:20:50+00:00" + "time": "2022-08-22T13:59:39+00:00" }, { "name": "roave/security-advisories", @@ -4760,18 +4693,19 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "773292d413a97c357a0b49635afd5fdb1d4f314a" + "reference": "bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/773292d413a97c357a0b49635afd5fdb1d4f314a", - "reference": "773292d413a97c357a0b49635afd5fdb1d4f314a", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66", + "reference": "bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "admidio/admidio": "<4.1.9", "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<=2.2.1", "akaunting/akaunting": "<2.1.13", "alextselegidis/easyappointments": "<=1.4.3", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", @@ -4815,6 +4749,7 @@ "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", "codeigniter4/framework": "<4.1.9", + "codeigniter4/shield": "= 1.0.0-beta", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", "concrete5/concrete5": "<9", @@ -4951,7 +4886,6 @@ "laminas/laminas-http": "<2.14.2", "laravel/fortify": "<1.11.1", "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", - "laravel/laravel": "<=9.1.8", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "latte/latte": "<2.10.8", "lavalite/cms": "<=5.8", @@ -5039,7 +4973,7 @@ "pimcore/data-hub": "<1.2.4", "pimcore/pimcore": "<10.4.4", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": ">= 4.0.0-BETA5, < 4.4.2|<4.2.10", + "pocketmine/pocketmine-mp": "<4.7.2|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/blockwishlist": ">=2,<2.1.1", @@ -5267,7 +5201,7 @@ "type": "tidelift" } ], - "time": "2022-08-12T16:04:45+00:00" + "time": "2022-08-22T17:06:07+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6274,7 +6208,6 @@ "minimum-stability": "stable", "stability-flags": { "deployer/deployer": 20, - "hypernode/deploy-configuration": 20, "roave/security-advisories": 20 }, "prefer-stable": false, @@ -6285,5 +6218,5 @@ "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } From 5b7fb77e2be7027b6a874c927851773127b1ceb7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 12 Sep 2022 15:39:40 +0200 Subject: [PATCH 002/210] Request ephemeral Hypernode when necessary --- composer.json | 4 +- composer.lock | 1765 ++++++++++++++++++++++++---- src/DeployRunner.php | 62 + src/Exception/TimeoutException.php | 11 + 4 files changed, 1627 insertions(+), 215 deletions(-) create mode 100644 src/Exception/TimeoutException.php diff --git a/composer.json b/composer.json index 48eaeb8..284c6b5 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,9 @@ "composer-runtime-api": "^2", "deployer/deployer": "dev-master#e374a8e as v7.0.0", "doctrine/annotations": "^1.6", - "hypernode/deploy-configuration": "^2.0", + "guzzlehttp/guzzle": "^7.5", + "hypernode/api-client": "dev-master", + "hypernode/deploy-configuration": "dev-ephemeral_servers", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 54b5f80..343fdb1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,74 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2b182d7312c6d76fb71d34b9cc24f323", + "content-hash": "68a8c995edb3ae6b3d40dfa09a4d1639", "packages": [ + { + "name": "clue/stream-filter", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-21T13:15:14+00:00" + }, { "name": "deployer/deployer", "version": "dev-master", @@ -76,7 +142,7 @@ "type": "github" } ], - "time": "2022-08-28T16:50:55+00:00" + "time": "2022-09-12T10:53:42+00:00" }, { "name": "doctrine/annotations", @@ -331,81 +397,165 @@ "time": "2020-11-24T22:02:12+00:00" }, { - "name": "hypernode/deploy-configuration", - "version": "2.0.1", + "name": "guzzlehttp/guzzle", + "version": "7.5.0", "source": { "type": "git", - "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "dee95040dabe7e84cc888fb0960a7cdee4d562b9" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/dee95040dabe7e84cc888fb0960a7cdee4d562b9", - "reference": "dee95040dabe7e84cc888fb0960a7cdee4d562b9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", "shasum": "" }, "require": { - "deployer/deployer": "^7.0", - "psr/log": "^1.0" + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, - "conflict": { - "hipex/deploy-configuration": "*" + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "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 + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, "autoload": { "files": [ - "src/autoload.php", - "src/functions.php" + "src/functions_include.php" ], "psr-4": { - "Hypernode\\DeployConfiguration\\": "src/" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "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" ], - "description": "Hypernode deploy configuration files", "support": { - "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/2.0.1" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" }, - "time": "2022-08-29T07:51:23+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/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.2.12", + "name": "guzzlehttp/promises", + "version": "1.5.2", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "1.5-dev" } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -414,65 +564,95 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" }, { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" }, { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "Guzzle promises library", "keywords": [ - "json", - "schema" + "promise" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" }, - "time": "2022-04-13T08:02:27+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": "2022-08-28T14:55:35+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.2.0", + "name": "guzzlehttp/psr7", + "version": "2.4.1", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540" + "url": "https://github.com/guzzle/psr7.git", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540", - "reference": "09f0e9fb61829f628205b7c94906c28740ff9540", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", + "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "pestphp/pest": "^1.18", - "phpstan/phpstan": "^0.12.98", - "symfony/var-dumper": "^5.3" + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.4-dev" } }, "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -481,198 +661,959 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Nuno Maduro", - "email": "nuno@laravel.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": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "closure", - "laravel", - "serializable" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.1" }, - "time": "2022-05-16T17:09:47+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/psr7", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:45:39+00:00" }, { - "name": "php-di/invoker", - "version": "2.3.3", + "name": "hypernode/api-client", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + "url": "https://github.com/ByteInternet/hypernode-api-php.git", + "reference": "309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f", + "reference": "309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f", "shasum": "" }, "require": { - "php": ">=7.3", - "psr/container": "^1.0|^2.0" + "ext-curl": "*", + "ext-json": "*", + "nesbot/carbon": "^2.0", + "php-http/client-common": "^2.5", + "php-http/discovery": "^1.14", + "psr/http-client-implementation": "^1.0", + "symfony/polyfill-php80": "^1.0" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^7.4", + "nikic/php-parser": "^4.14", + "phpunit/phpunit": "^9.5" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { - "Invoker\\": "src/" + "Hypernode\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Generic and extensible callable invoker", - "homepage": "https://github.com/PHP-DI/Invoker", - "keywords": [ - "callable", - "dependency", - "dependency-injection", - "injection", - "invoke", - "invoker" - ], - "support": { - "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" - }, - "funding": [ + "authors": [ { - "url": "https://github.com/mnapoli", - "type": "github" + "name": "Hypernode" } ], - "time": "2021-12-13T09:22:56+00:00" + "description": "Hypernode API Client for PHP", + "support": { + "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/master" + }, + "time": "2022-09-12T13:18:22+00:00" }, { - "name": "php-di/php-di", - "version": "6.4.0", + "name": "hypernode/deploy-configuration", + "version": "dev-ephemeral_servers", "source": { "type": "git", - "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4" + "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", + "reference": "bbb62227a92205b9f31548442c27ee27321debe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/ae0f1b3b03d8b29dff81747063cbfd6276246cc4", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/bbb62227a92205b9f31548442c27ee27321debe5", + "reference": "bbb62227a92205b9f31548442c27ee27321debe5", + "shasum": "" + }, + "require": { + "deployer/deployer": "^7.0", + "psr/log": "^1.0" + }, + "conflict": { + "hipex/deploy-configuration": "*" + }, + "type": "library", + "autoload": { + "files": [ + "src/autoload.php", + "src/functions.php" + ], + "psr-4": { + "Hypernode\\DeployConfiguration\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "description": "Hypernode deploy configuration files", + "support": { + "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/ephemeral_servers" + }, + "time": "2022-09-12T10:17:41+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.12", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + }, + "time": "2022-04-13T08:02:27+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", + "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2022-09-08T13:45:54+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.62.1", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2022-09-02T07:48:13+00:00" + }, + { + "name": "php-di/invoker", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2021-12-13T09:22:56+00:00" + }, + { + "name": "php-di/php-di", + "version": "6.4.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/ae0f1b3b03d8b29dff81747063cbfd6276246cc4", "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4", "shasum": "" }, "require": { - "laravel/serializable-closure": "^1.0", - "php": ">=7.4.0", - "php-di/invoker": "^2.0", - "php-di/phpdoc-reader": "^2.0.1", - "psr/container": "^1.0" + "laravel/serializable-closure": "^1.0", + "php": ">=7.4.0", + "php-di/invoker": "^2.0", + "php-di/phpdoc-reader": "^2.0.1", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "doctrine/annotations": "~1.10", + "friendsofphp/php-cs-fixer": "^2.4", + "mnapoli/phpunit-easymock": "^1.2", + "ocramius/proxy-manager": "^2.11.2", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", + "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~2.0)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/6.4.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2022-04-09T16:46:38+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "d135751167d57e27c74de674d6a30cef2dc8e054" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/d135751167d57e27c74de674d6a30cef2dc8e054", + "reference": "d135751167d57e27c74de674d6a30cef2dc8e054", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.5.0" + }, + "time": "2021-11-26T15:01:24+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.14.3", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/31d8ee46d0215108df16a8527c7438e96a4d7735", + "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.14.3" + }, + "time": "2022-07-11T14:04:40+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "f640739f80dfa1152533976e3c112477f69274eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", + "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.3.0" + }, + "time": "2022-02-21T09:52:22+00:00" + }, + { + "name": "php-http/message", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", + "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" }, "provide": { - "psr/container-implementation": "^1.0" + "php-http/message-factory-implementation": "1.0" }, "require-dev": { - "doctrine/annotations": "~1.10", - "friendsofphp/php-cs-fixer": "^2.4", - "mnapoli/phpunit-easymock": "^1.2", - "ocramius/proxy-manager": "^2.11.2", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^9.5" + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" }, "suggest": { - "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", - "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~2.0)" + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "files": [ - "src/functions.php" + "src/filters.php" ], "psr-4": { - "DI\\": "src/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "The dependency injection container for humans", - "homepage": "https://php-di.org/", + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ - "PSR-11", - "container", - "container-interop", - "dependency injection", - "di", - "ioc", - "psr11" + "http", + "message", + "psr-7" ], "support": { - "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/6.4.0" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.13.0" }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, + "time": "2022-02-11T13:41:14+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", - "type": "tidelift" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "time": "2022-04-09T16:46:38+00:00" + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" + }, + "time": "2015-12-19T14:08:53+00:00" }, { - "name": "php-di/phpdoc-reader", - "version": "2.2.1", + "name": "php-http/promise", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/PHP-DI/PhpDocReader.git", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^8.5|^9.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, "autoload": { "psr-4": { - "PhpDocReader\\": "src/PhpDocReader" + "Http\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", "keywords": [ - "phpdoc", - "reflection" + "promise" ], "support": { - "issues": "https://github.com/PHP-DI/PhpDocReader/issues", - "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" }, - "time": "2020-10-12T12:39:22+00:00" + "time": "2020-07-07T09:29:14+00:00" }, { "name": "psr/cache", @@ -728,22 +1669,128 @@ "version": "1.1.2", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "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/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.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": "http://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/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=7.0.0", + "psr/http-message": "^1.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -753,23 +1800,24 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "homepage": "http://www.php-fig.org/" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/http-factory/tree/master" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2019-04-30T12:38:16+00:00" }, { "name": "psr/http-message", @@ -874,6 +1922,50 @@ }, "time": "2021-05-03T11:20:27+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "react/cache", "version": "v1.1.1", @@ -952,16 +2044,16 @@ }, { "name": "react/dns", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb" + "reference": "a5427e7dfa47713e438016905605819d101f238c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb", - "reference": "6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb", + "url": "https://api.github.com/repos/reactphp/dns/zipball/a5427e7dfa47713e438016905605819d101f238c", + "reference": "a5427e7dfa47713e438016905605819d101f238c", "shasum": "" }, "require": { @@ -969,11 +2061,11 @@ "react/cache": "^1.0 || ^0.6 || ^0.5", "react/event-loop": "^1.2", "react/promise": "^3.0 || ^2.7 || ^1.2.1", - "react/promise-timer": "^1.8" + "react/promise-timer": "^1.9" }, "require-dev": { - "clue/block-react": "^1.2", - "phpunit/phpunit": "^9.3 || ^4.8.35" + "phpunit/phpunit": "^9.3 || ^4.8.35", + "react/async": "^4 || ^3 || ^2" }, "type": "library", "autoload": { @@ -1016,7 +2108,7 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.9.0" + "source": "https://github.com/reactphp/dns/tree/v1.10.0" }, "funding": [ { @@ -1028,7 +2120,7 @@ "type": "github" } ], - "time": "2021-12-20T08:46:54+00:00" + "time": "2022-09-08T12:22:46+00:00" }, { "name": "react/event-loop", @@ -1282,16 +2374,16 @@ }, { "name": "react/promise-stream", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise-stream.git", - "reference": "ef05517b99e4363beaa7993d4e2d6c50f1b22a09" + "reference": "e6d2805e09ad50c4896f65f5e8705fe4ee7731a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/ef05517b99e4363beaa7993d4e2d6c50f1b22a09", - "reference": "ef05517b99e4363beaa7993d4e2d6c50f1b22a09", + "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/e6d2805e09ad50c4896f65f5e8705fe4ee7731a3", + "reference": "e6d2805e09ad50c4896f65f5e8705fe4ee7731a3", "shasum": "" }, "require": { @@ -1300,10 +2392,7 @@ "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6" }, "require-dev": { - "clue/block-react": "^1.0", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", - "react/promise-timer": "^1.0" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { @@ -1352,7 +2441,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise-stream/issues", - "source": "https://github.com/reactphp/promise-stream/tree/v1.4.0" + "source": "https://github.com/reactphp/promise-stream/tree/v1.5.0" }, "funding": [ { @@ -1364,7 +2453,7 @@ "type": "github" } ], - "time": "2022-06-20T10:36:51+00:00" + "time": "2022-09-09T11:42:18+00:00" }, { "name": "react/promise-timer", @@ -2070,6 +3159,73 @@ ], "time": "2022-04-12T15:48:08+00:00" }, + { + "name": "symfony/options-resolver", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", + "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.1.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": "2022-02-25T11:15:52+00:00" + }, { "name": "symfony/polyfill-ctype", "version": "v1.26.0", @@ -2868,6 +4024,183 @@ ], "time": "2022-08-12T18:05:43+00:00" }, + { + "name": "symfony/translation", + "version": "v6.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "45d0f5bb8df7255651ca91c122fab604e776af03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/45d0f5bb8df7255651ca91c122fab604e776af03", + "reference": "45d0f5bb8df7255651ca91c122fab604e776af03", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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 internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.1.4" + }, + "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": "2022-08-02T16:17:38+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", + "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.1.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": "2022-06-27T17:24:16+00:00" + }, { "name": "symfony/yaml", "version": "v5.4.12", @@ -3860,16 +5193,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.15.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "shasum": "" }, "require": { @@ -3910,9 +5243,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" }, - "time": "2022-05-31T20:59:12+00:00" + "time": "2022-09-04T07:30:47+00:00" }, { "name": "openlss/lib-array2xml", @@ -4693,12 +6026,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66" + "reference": "6d260392fad173d6ee6e3a93c875d9327db1109b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66", - "reference": "bd4a45f60f097f0c44f77c6d72caa24ebc9b9f66", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6d260392fad173d6ee6e3a93c875d9327db1109b", + "reference": "6d260392fad173d6ee6e3a93c875d9327db1109b", "shasum": "" }, "conflict": { @@ -4834,8 +6167,9 @@ "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", "getgrav/grav": "<1.7.34", - "getkirby/cms": "<3.5.8", + "getkirby/cms": "<3.5.8.1|>=3.6,<3.6.6.1|>=3.7,<3.7.4", "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", "gilacms/gila": "<=1.11.4", "globalpayments/php-sdk": "<2", "google/protobuf": "<3.15", @@ -4928,6 +6262,7 @@ "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<=2.1.27.36", + "notrinos/notrinos-erp": "<=0.7", "noumo/easyii": "<=0.9", "nukeviet/nukeviet": "<4.5.2", "nystudio107/craft-seomatic": "<3.4.12", @@ -4980,7 +6315,7 @@ "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", "prestashop/prestashop": ">=1.6.0.10,<1.7.8.7", - "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/productcomments": "<5.0.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "prestashop/ps_linklist": "<3.1", @@ -5031,7 +6366,7 @@ "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.45|>=4,<4.1.1", - "snipe/snipe-it": "<=6.0.2|>= 6.0.0-RC-1, <= 6.0.0-RC-5", + "snipe/snipe-it": "<6.0.10|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spipu/html2pdf": "<5.2.4", @@ -5201,7 +6536,7 @@ "type": "tidelift" } ], - "time": "2022-08-22T17:06:07+00:00" + "time": "2022-08-31T22:04:18+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6040,16 +7375,16 @@ }, { "name": "vimeo/psalm", - "version": "4.26.0", + "version": "4.27.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac" + "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/6998fabb2bf528b65777bf9941920888d23c03ac", - "reference": "6998fabb2bf528b65777bf9941920888d23c03ac", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/faf106e717c37b8c81721845dba9de3d8deed8ff", + "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff", "shasum": "" }, "require": { @@ -6141,9 +7476,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.26.0" + "source": "https://github.com/vimeo/psalm/tree/4.27.0" }, - "time": "2022-07-31T13:10:26+00:00" + "time": "2022-08-31T13:47:09+00:00" }, { "name": "webmozart/path-util", @@ -6208,6 +7543,8 @@ "minimum-stability": "stable", "stability-flags": { "deployer/deployer": 20, + "hypernode/api-client": 20, + "hypernode/deploy-configuration": 20, "roave/security-advisories": 20 }, "prefer-stable": false, diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 2b736e1..3bb179c 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -5,11 +5,17 @@ use Deployer\Deployer; use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; +use Hypernode\Api\Exception\HypernodeApiClientException; +use Hypernode\Api\Exception\HypernodeApiServerException; +use Hypernode\Api\HypernodeClient; +use Hypernode\Api\HypernodeClientFactory; +use Hypernode\Api\Resource\Logbook\Flow; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; use Hypernode\Deploy\Deployer\Task\TaskFactory; +use Hypernode\Deploy\Exception\TimeoutException; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\ServerRoleConfigurableInterface; @@ -51,6 +57,8 @@ class DeployRunner */ private $recipeLoader; + private HypernodeClient $hypernodeClient; + public function __construct( TaskFactory $taskFactory, InputInterface $input, @@ -61,6 +69,7 @@ public function __construct( $this->input = $input; $this->log = $log; $this->recipeLoader = $recipeLoader; + $this->hypernodeClient = HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); } /** @@ -189,6 +198,8 @@ private function configureStages(Configuration $config): void private function configureStageServer(Stage $stage, Server $server, Configuration $config): void { + $this->maybeConfigureEphemeralServer($server); + $host = host($stage->getName() . ':' . $server->getHostname()); $host->setHostname($server->getHostname()); $host->setPort(22); @@ -242,6 +253,57 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio } } + private function maybeConfigureEphemeralServer(Server $server): void + { + $serverOptions = $server->getOptions(); + $isEphemeral = $serverOptions[Server::OPTION_HN_EPHEMERAL] ?? false; + $parentApp = $serverOptions[Server::OPTION_HN_PARENT_APP] ?? null; + if ($isEphemeral && $parentApp) { + $this->log->info(sprintf('Creating an ephemeral Hypernode based on %s.', $parentApp)); + $ephemeralApp = $this->hypernodeClient->ephemeralApp->create($parentApp); + $server->setHostname(sprintf("%s.hypernode.io", $ephemeralApp)); + $this->log->info(sprintf('Successfully requested ephemeral Hypernode, name is %s.', $ephemeralApp)); + $this->log->info('Waiting for ephemeral Hypernode to become available...'); + $this->waitForEphemeralApp($ephemeralApp); + $this->log->info('Ephemeral Hypernode has become available!'); + } + } + + /** + * Poll and wait for ephemeral app to become available. + * + * @throws HypernodeApiClientException + * @throws HypernodeApiServerException + * @throws TimeoutException + */ + private function waitForEphemeralApp(string $ephemeralApp, int $timeout = 900): void + { + $latest = microtime(true); + $timeElapsed = 0; + $resolved = false; + + while ($timeElapsed < $timeout && !$resolved) { + $now = microtime(true); + $timeElapsed += $now - $latest; + $latest = $now; + + $flows = $this->hypernodeClient->logbook->getList($ephemeralApp); + $remaining = array_filter($flows, fn (Flow $flow) => !$flow->isComplete()); + if ($flows && !$remaining) { + $resolved = true; + break; + } + + sleep(5); + } + + if (!$resolved) { + throw new TimeoutException( + sprintf('Timed out waiting for ephemeral Hypernode %s to become available', $ephemeralApp) + ); + } + } + /** * Initialize build stage */ diff --git a/src/Exception/TimeoutException.php b/src/Exception/TimeoutException.php new file mode 100644 index 0000000..d77a245 --- /dev/null +++ b/src/Exception/TimeoutException.php @@ -0,0 +1,11 @@ + Date: Tue, 13 Sep 2022 09:24:41 +0200 Subject: [PATCH 003/210] Add CI testsuite for ephemeral nodes --- .github/workflows/test.yaml | 29 +++-- ci/key.pub | 1 + ci/test/magento/deploy_ephemeral.php | 17 +++ ci/test/run-ephemeral.sh | 40 +++++++ ci/test/run-general.sh | 163 ++++++++++++++++++++++++++ runtests.sh | 164 +-------------------------- 6 files changed, 249 insertions(+), 165 deletions(-) create mode 100644 ci/key.pub create mode 100644 ci/test/magento/deploy_ephemeral.php create mode 100755 ci/test/run-ephemeral.sh create mode 100755 ci/test/run-general.sh diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index dc94864..590fad7 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,15 +7,30 @@ jobs: strategy: matrix: php_version: [7.4, 8.1] + testsuite: [general, ephemeral] runs-on: ubuntu-latest steps: - - name: Checkout hypernode-deploy - uses: actions/checkout@v3 - - name: Run test script - run: MAGENTO_REPO=./magento2 ./runtests.sh - shell: bash - env: - PHP_VERSION: ${{ matrix.php_version }} + - name: Checkout hypernode-deploy + uses: actions/checkout@v3 + - name: Run general testsuite + if: ${{ matrix.testsuite == 'general' }} + run: MAGENTO_REPO=./magento2 ./runtests.sh general + shell: bash + env: + PHP_VERSION: ${{ matrix.php_version }} + - name: Start SSH agent for ephemeral testsuite + if: ${{ matrix.testsuite == 'ephemeral' && matrix.php_version == '8.1' }} + uses: webfactory/ssh-agent@v0.5.4 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Run ephemeral testsuite + if: ${{ matrix.testsuite == 'ephemeral' && matrix.php_version == '8.1' }} + run: ./runtests.sh ephemeral + shell: bash + env: + PHP_VERSION: ${{ matrix.php_version }} + HYPERNODE_API_TOKEN: ${{ secrets.HYPERNODE_API_TOKEN }} + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} code_quality: strategy: matrix: diff --git a/ci/key.pub b/ci/key.pub new file mode 100644 index 0000000..5e0a32e --- /dev/null +++ b/ci/key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDqf5tGbhjIbRQJ40bTvw69z0kUHQEeDtGkX5DTzXJ1IPHcFpbq+nxc3f++45V8FA3fq31xTjCR3+TWy/AGCVmuntVwJVCEaC/U3X0YDscmzAA4LEOfmMHIGnrJdeTJS4+N6L5uIlZqyBIeJXyEEgFpcHm4i1HGm13DR/XG7lTaXSkRI9IVb0i3S0VdrRjtqkg4M3ZjgNfAwmoDE3dGNwIBH5EVy8t/YNj/RH0TNdhTDL3AGwne6h2bTWb5SNLHNXvu2Wc5aiJlvn2E2W7mcpnPxEkVs1AeDEaPHcLaGE2+Bt/I4ntyjOy9pFDcf28sPKj76S3Sq0Wwdb8rYmT+lerIPfjwj1VPXTU1dhvDJ1ffTufp3Sn67qi7NfBMYayYxLJWh9q84RHgYhog2SNXM+autsTU40GDZUtDtORRZ+Rg5i1cGxUCRT+Fpcx3aFCM/yTLvU80qZkmfgkQwKnGCCFygDsXPuFbyRXRz9MI1+lYGg17ufW5HSHrAw34Rw2yd8k= hypernode-deploy-ci diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php new file mode 100644 index 0000000..cda7fbe --- /dev/null +++ b/ci/test/magento/deploy_ephemeral.php @@ -0,0 +1,17 @@ +addStage('test', 'banaan.store'); +$productionStage->addEphemeralServer('hndeployintegr8'); + +return $configuration; diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh new file mode 100755 index 0000000..b601fdc --- /dev/null +++ b/ci/test/run-ephemeral.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -e +set -x + +# Handy aliases +HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" +DP="docker run -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY hndeploy" + +# Build Docker image +docker build \ + -f ci/build/Dockerfile \ + --build-arg NODE_VERSION=16 \ + --build-arg PHP_VERSION="${PHP_VERSION:-8.1}" \ + -t hndeploy \ + . + +# Copy application from remote to local +$HN /data/web/magento2/bin/magento app:config:dump scopes themes +echo "Waiting for SSH to be available on the Hypernode container" +mkdir /tmp/m2build +mkdir -p "$HOME/.ssh" +cp ci/test/magento/deploy_ephemeral.php /tmp/m2build/deploy.php +rsync -a -e "ssh -o StrictHostKeyChecking=no" app@hndeployintegr8.hypernode.io:magento2/ /tmp/m2build +rm /tmp/m2build/app/etc/env.php + +# Build application +$DP hypernode-deploy build -f /web/deploy.php --verbose + +# Prepare env +$HN mkdir -p /data/web/apps/banaan.store/shared/app/etc/ +$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan.store/shared/app/etc/env.php + +########################################## +# DEPLOY WITHOUT PLATFORM CONFIGURATIONS # +# This should pass, but not generate any # +# Nginx/Supervisor/etc configs # +########################################## +# SSH from deploy container to hypernode container +$DP hypernode-deploy deploy test -f /web/deploy.php -v diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh new file mode 100755 index 0000000..b699fdb --- /dev/null +++ b/ci/test/run-general.sh @@ -0,0 +1,163 @@ +#!/usr/bin/env bash + +set -e +set -x + +export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.1}" | sed 's/\.//') + +# Handy aliases +HN="docker-compose exec -T hypernode" +DP="docker-compose exec -T deploy" +DP1="docker-compose exec --workdir=/web1 -T deploy" +DP2="docker-compose exec --workdir=/web2 -T deploy" + +function install_magento() { + $HN mysql -e "DROP DATABASE IF EXISTS dummytag_preinstalled_magento" + $HN mysql -e "CREATE DATABASE dummytag_preinstalled_magento" + local pw=$($HN bash -c "grep password /data/web/.my.cnf | cut -d' ' -f3") + + # Strip carriage return of pw and saves it in a new variable + pw=$(echo $pw | tr -d '\r') + + $HN bash -c "/data/web/magento2/bin/magento setup:install \ + --base-url=http://banaan1.store \ + --db-host=mysqlmaster.dummytag.hypernode.io \ + --db-name=dummytag_preinstalled_magento --db-user=app \ + --db-password=$pw \ + --admin-firstname=admin --admin-lastname=admin \ + --admin-email=admin@admin.com --admin-user=admin \ + --admin-password=admin123 --language=en_US --currency=USD \ + --timezone=America/Chicago --elasticsearch-host=localhost" +} + +# Install docker-compose if it's not installed +if ! [ -x "$(command -v docker-compose)" ]; then + pip install docker-compose +fi + +# Clear up env +trap "docker-compose down -v" EXIT + +docker-compose up -d + +# Create working initial Magento install on the Hypernode container +$HN composer create-project --repository=https://mage-os.hypernode.com/mirror/ magento/project-community-edition /data/web/magento2 +echo "Waiting for MySQL to be available on the Hypernode container" +$HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" +install_magento + +# Copy env to the deploy container +$HN /data/web/magento2/bin/magento app:config:dump scopes themes +echo "Waiting for SSH to be available on the Hypernode container" +chmod 0600 ci/test/.ssh/id_rsa +chmod 0600 ci/test/.ssh/authorized_keys +$DP rsync -a app@hypernode:/data/web/magento2/ /web +$DP rsync -v -a /config/ /web +$DP rm /web/app/etc/env.php + +# Create second app +$DP cp -ra /web /web1 +$DP cp -ra /web /web2 + +# Build both apps +$DP1 hypernode-deploy build -v -f /web1/deploy1.php +$DP2 hypernode-deploy build -v -f /web2/deploy2.php + +# Prepare env +$HN mkdir -p /data/web/apps/banaan1.store/shared/app/etc/ +$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan1.store/shared/app/etc/env.php +$HN mkdir -p /data/web/apps/banaan2.store/shared/app/etc/ +$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan2.store/shared/app/etc/env.php +$HN chown -R app:app /data/web/apps + +########################################## +# DEPLOY WITHOUT PLATFORM CONFIGURATIONS # +# This should pass, but not generate any # +# Nginx/Supervisor/etc configs # +########################################## +# SSH from deploy container to hypernode container +$DP1 hypernode-deploy deploy production -f /web1/deploy1_without_platformconfig.php -v + +# Check if deployment made only one release for store1 +test $($HN ls /data/web/apps/banaan1.store/releases/ | wc -l) = 1 + +# Platform configs shouldn't be present yet +$HN test ! -d /data/web/nginx/banaan1.store +$HN test ! -d /data/web/supervisor/banaan1.store +$HN crontab -l -u app | grep "### BEGIN banaan1.store ###" && exit 1 +$HN test ! -d /data/web/varnish/banaan1.store + +################## +# DEPLOY STORE 2 # +################## +# Store 2 +$DP2 hypernode-deploy deploy production -f /web2/deploy2.php -v + +# Check if deployment made only one release for store2 +test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 +$HN ls -al /data/web/nginx/banaan2.store/ +$HN ls -al /data/web/apps/banaan2.store/current/ +$HN ls -al /data/web/apps/banaan2.store/current/nginx/ +$HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) +$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx + +################################## +# DEPLOY PLATFORM CONFIGURATIONS # +# Now we should get revisions of # +# all platform configs. # +################################## +$DP1 hypernode-deploy deploy production -v -f /web1/deploy1.php + +# Check if example location block was placed +$HN ls -al /data/web/nginx/banaan1.store/ +$HN ls -al /data/web/apps/banaan1.store/current/ +$HN ls -al /data/web/apps/banaan1.store/current/nginx/ +$HN test -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan1.store && exit 1) +$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/2/nginx + +$HN test -f /data/web/supervisor/banaan1.store/example.conf || ($HN ls -al /data/web/supervisor/ && exit 1) +$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/2/supervisor + +# Test this once we enable supervisor in the hypernode docker image +# $HN supervisorctl status | grep example | grep -v FATAL || ($HN supervisorctl status && exit 1) + +# Test if varnish dirs exists and vcl has been placed +$HN ls -al /data/web/varnish/banaan1.store/ +$HN ls -al /data/web/apps/banaan1.store/current/varnish/ + +$HN test -f /data/web/varnish/banaan1.store/varnish.vcl || ($HN ls -al /data/web/varnish/ && exit 1) +$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/2/varnish/varnish.vcl + +# Check the content of the crontab block +$HN crontab -l -u app | grep "### BEGIN banaan1.store ###" +$HN crontab -l -u app | grep "### END banaan1.store ###" +$HN crontab -l -u app | sed -n -e '/### BEGIN banaan1.store ###/,/### END banaan1.store ###/ p' | grep "banaan" + +###################################### +# REMOVE A NGINX LOCATION # +# Create a new release but make sure # +# that the file is removed in the # +# new release. # +###################################### +# Remove example location +$DP rm /web1/etc/nginx/server.example.conf + +# Deploy again +$DP1 hypernode-deploy deploy production -f /web1/deploy1.php + +# Check if another deployment was made +test $($HN ls /data/web/apps/banaan1.store/releases/ | wc -l) = 3 +$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/3/nginx +$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/3/supervisor +$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/3/varnish/varnish.vcl + +# Verify example location block is removed +$HN test ! -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx/banaan1.store && exit 1) + +# Check if the second application is still working as intended +test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 +$HN ls -al /data/web/nginx/banaan2.store/ +$HN ls -al /data/web/apps/banaan2.store/current/ +$HN ls -al /data/web/apps/banaan2.store/current/nginx/ +$HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) +$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx diff --git a/runtests.sh b/runtests.sh index b699fdb..ce7ff37 100755 --- a/runtests.sh +++ b/runtests.sh @@ -1,163 +1,11 @@ #!/usr/bin/env bash -set -e -set -x +ACTION=${1:-general} +RUNNER="ci/test/run-${ACTION}.sh" -export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.1}" | sed 's/\.//') - -# Handy aliases -HN="docker-compose exec -T hypernode" -DP="docker-compose exec -T deploy" -DP1="docker-compose exec --workdir=/web1 -T deploy" -DP2="docker-compose exec --workdir=/web2 -T deploy" - -function install_magento() { - $HN mysql -e "DROP DATABASE IF EXISTS dummytag_preinstalled_magento" - $HN mysql -e "CREATE DATABASE dummytag_preinstalled_magento" - local pw=$($HN bash -c "grep password /data/web/.my.cnf | cut -d' ' -f3") - - # Strip carriage return of pw and saves it in a new variable - pw=$(echo $pw | tr -d '\r') - - $HN bash -c "/data/web/magento2/bin/magento setup:install \ - --base-url=http://banaan1.store \ - --db-host=mysqlmaster.dummytag.hypernode.io \ - --db-name=dummytag_preinstalled_magento --db-user=app \ - --db-password=$pw \ - --admin-firstname=admin --admin-lastname=admin \ - --admin-email=admin@admin.com --admin-user=admin \ - --admin-password=admin123 --language=en_US --currency=USD \ - --timezone=America/Chicago --elasticsearch-host=localhost" -} - -# Install docker-compose if it's not installed -if ! [ -x "$(command -v docker-compose)" ]; then - pip install docker-compose +if [[ ! -f "${RUNNER}" ]]; then + echo "Testsuite runner ${RUNNER} does not exist!" + exit 1 fi -# Clear up env -trap "docker-compose down -v" EXIT - -docker-compose up -d - -# Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mage-os.hypernode.com/mirror/ magento/project-community-edition /data/web/magento2 -echo "Waiting for MySQL to be available on the Hypernode container" -$HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" -install_magento - -# Copy env to the deploy container -$HN /data/web/magento2/bin/magento app:config:dump scopes themes -echo "Waiting for SSH to be available on the Hypernode container" -chmod 0600 ci/test/.ssh/id_rsa -chmod 0600 ci/test/.ssh/authorized_keys -$DP rsync -a app@hypernode:/data/web/magento2/ /web -$DP rsync -v -a /config/ /web -$DP rm /web/app/etc/env.php - -# Create second app -$DP cp -ra /web /web1 -$DP cp -ra /web /web2 - -# Build both apps -$DP1 hypernode-deploy build -v -f /web1/deploy1.php -$DP2 hypernode-deploy build -v -f /web2/deploy2.php - -# Prepare env -$HN mkdir -p /data/web/apps/banaan1.store/shared/app/etc/ -$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan1.store/shared/app/etc/env.php -$HN mkdir -p /data/web/apps/banaan2.store/shared/app/etc/ -$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan2.store/shared/app/etc/env.php -$HN chown -R app:app /data/web/apps - -########################################## -# DEPLOY WITHOUT PLATFORM CONFIGURATIONS # -# This should pass, but not generate any # -# Nginx/Supervisor/etc configs # -########################################## -# SSH from deploy container to hypernode container -$DP1 hypernode-deploy deploy production -f /web1/deploy1_without_platformconfig.php -v - -# Check if deployment made only one release for store1 -test $($HN ls /data/web/apps/banaan1.store/releases/ | wc -l) = 1 - -# Platform configs shouldn't be present yet -$HN test ! -d /data/web/nginx/banaan1.store -$HN test ! -d /data/web/supervisor/banaan1.store -$HN crontab -l -u app | grep "### BEGIN banaan1.store ###" && exit 1 -$HN test ! -d /data/web/varnish/banaan1.store - -################## -# DEPLOY STORE 2 # -################## -# Store 2 -$DP2 hypernode-deploy deploy production -f /web2/deploy2.php -v - -# Check if deployment made only one release for store2 -test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 -$HN ls -al /data/web/nginx/banaan2.store/ -$HN ls -al /data/web/apps/banaan2.store/current/ -$HN ls -al /data/web/apps/banaan2.store/current/nginx/ -$HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx - -################################## -# DEPLOY PLATFORM CONFIGURATIONS # -# Now we should get revisions of # -# all platform configs. # -################################## -$DP1 hypernode-deploy deploy production -v -f /web1/deploy1.php - -# Check if example location block was placed -$HN ls -al /data/web/nginx/banaan1.store/ -$HN ls -al /data/web/apps/banaan1.store/current/ -$HN ls -al /data/web/apps/banaan1.store/current/nginx/ -$HN test -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan1.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/2/nginx - -$HN test -f /data/web/supervisor/banaan1.store/example.conf || ($HN ls -al /data/web/supervisor/ && exit 1) -$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/2/supervisor - -# Test this once we enable supervisor in the hypernode docker image -# $HN supervisorctl status | grep example | grep -v FATAL || ($HN supervisorctl status && exit 1) - -# Test if varnish dirs exists and vcl has been placed -$HN ls -al /data/web/varnish/banaan1.store/ -$HN ls -al /data/web/apps/banaan1.store/current/varnish/ - -$HN test -f /data/web/varnish/banaan1.store/varnish.vcl || ($HN ls -al /data/web/varnish/ && exit 1) -$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/2/varnish/varnish.vcl - -# Check the content of the crontab block -$HN crontab -l -u app | grep "### BEGIN banaan1.store ###" -$HN crontab -l -u app | grep "### END banaan1.store ###" -$HN crontab -l -u app | sed -n -e '/### BEGIN banaan1.store ###/,/### END banaan1.store ###/ p' | grep "banaan" - -###################################### -# REMOVE A NGINX LOCATION # -# Create a new release but make sure # -# that the file is removed in the # -# new release. # -###################################### -# Remove example location -$DP rm /web1/etc/nginx/server.example.conf - -# Deploy again -$DP1 hypernode-deploy deploy production -f /web1/deploy1.php - -# Check if another deployment was made -test $($HN ls /data/web/apps/banaan1.store/releases/ | wc -l) = 3 -$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/3/nginx -$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/3/supervisor -$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/3/varnish/varnish.vcl - -# Verify example location block is removed -$HN test ! -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx/banaan1.store && exit 1) - -# Check if the second application is still working as intended -test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 -$HN ls -al /data/web/nginx/banaan2.store/ -$HN ls -al /data/web/apps/banaan2.store/current/ -$HN ls -al /data/web/apps/banaan2.store/current/nginx/ -$HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx +$RUNNER From c96089e9e0b3d759171ee03df9dc2305c717a95a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 13 Sep 2022 11:24:23 +0200 Subject: [PATCH 004/210] Allow 404 when querying the ephemeral hypernode logbook --- src/DeployRunner.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 3bb179c..566e4fd 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -287,11 +287,19 @@ private function waitForEphemeralApp(string $ephemeralApp, int $timeout = 900): $timeElapsed += $now - $latest; $latest = $now; - $flows = $this->hypernodeClient->logbook->getList($ephemeralApp); - $remaining = array_filter($flows, fn (Flow $flow) => !$flow->isComplete()); - if ($flows && !$remaining) { - $resolved = true; - break; + try { + $flows = $this->hypernodeClient->logbook->getList($ephemeralApp); + $remaining = array_filter($flows, fn (Flow $flow) => !$flow->isComplete()); + if ($flows && !$remaining) { + $resolved = true; + break; + } + } catch (HypernodeApiClientException $e) { + // A 404 not found means there are no flows in the logbook yet, we should wait. + // Otherwise, there's an error, and it should be propagated. + if ($e->getCode() !== 404) { + throw $e; + } } sleep(5); From 4ee2f383d10416c298f336b3e15e56633a15c045 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 13 Sep 2022 14:14:17 +0200 Subject: [PATCH 005/210] Cleanup ephemeral hypernodes after running --- src/Command/Build.php | 2 +- src/Command/Deploy.php | 2 +- src/DeployRunner.php | 57 +++++++++++++++++++++++------------------- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/Command/Build.php b/src/Command/Build.php index 2251c19..f3dfb87 100644 --- a/src/Command/Build.php +++ b/src/Command/Build.php @@ -33,7 +33,7 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, 'build', 'build'); + $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD); return 0; } } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 767b49b..44b2edf 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -35,7 +35,7 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, $input->getArgument('stage'), 'deploy'); + $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); return 0; } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 566e4fd..03c59d9 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -37,27 +37,21 @@ class DeployRunner { - /** - * @var TaskFactory - */ - private $taskFactory; - - /** - * @var InputInterface - */ - private $input; + public const TASK_BUILD = 'build'; + public const TASK_DEPLOY = 'deploy'; - /** - * @var LoggerInterface - */ - private $log; + private TaskFactory $taskFactory; + private InputInterface $input; + private LoggerInterface $log; + private RecipeLoader $recipeLoader; + private HypernodeClient $hypernodeClient; /** - * @var RecipeLoader + * Registered ephemeral Hypernodes to stop/cancel after running. + * + * @var string[] */ - private $recipeLoader; - - private HypernodeClient $hypernodeClient; + private array $ephemeralHypernodesRegistered = []; public function __construct( TaskFactory $taskFactory, @@ -79,7 +73,7 @@ public function __construct( * * @return void */ - public function run(OutputInterface $output, string $stage, string $task = 'deploy') + public function run(OutputInterface $output, string $stage, string $task = self::TASK_DEPLOY) { $console = new Application(); $deployer = new Deployer($console); @@ -93,7 +87,7 @@ public function run(OutputInterface $output, string $stage, string $task = 'depl ); try { - $this->initializeDeployer($deployer); + $this->initializeDeployer($deployer, $task); } catch (InvalidConfigurationException $e) { $output->write($e->getMessage()); return; @@ -109,13 +103,13 @@ public function run(OutputInterface $output, string $stage, string $task = 'depl * @throws Throwable * @throws InvalidConfigurationException */ - private function initializeDeployer(Deployer $deployer): void + private function initializeDeployer(Deployer $deployer, string $task): void { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); $config = $this->getConfiguration($deployer); $config->setLogger($this->log); - $this->configureStages($config); + $this->configureStages($config, $task); foreach ($tasks as $task) { $task->configure($config); @@ -185,13 +179,17 @@ private function getConfiguration(Deployer $deployer): Configuration } } - private function configureStages(Configuration $config): void + private function configureStages(Configuration $config, string $task): void { - $this->initializeBuildStage($config); + if ($task === self::TASK_BUILD) { + $this->initializeBuildStage($config); + } - foreach ($config->getStages() as $stage) { - foreach ($stage->getServers() as $server) { - $this->configureStageServer($stage, $server, $config); + if ($task === self::TASK_DEPLOY) { + foreach ($config->getStages() as $stage) { + foreach ($stage->getServers() as $server) { + $this->configureStageServer($stage, $server, $config); + } } } } @@ -262,7 +260,9 @@ private function maybeConfigureEphemeralServer(Server $server): void $this->log->info(sprintf('Creating an ephemeral Hypernode based on %s.', $parentApp)); $ephemeralApp = $this->hypernodeClient->ephemeralApp->create($parentApp); $server->setHostname(sprintf("%s.hypernode.io", $ephemeralApp)); + $this->ephemeralHypernodesRegistered[] = $ephemeralApp; $this->log->info(sprintf('Successfully requested ephemeral Hypernode, name is %s.', $ephemeralApp)); + $this->log->info('Waiting for ephemeral Hypernode to become available...'); $this->waitForEphemeralApp($ephemeralApp); $this->log->info('Ephemeral Hypernode has become available!'); @@ -376,6 +376,11 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $executor->run($tasks, $hosts); } throw $exception; + } finally { + foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { + $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); + $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); + } } } From 7f35ed5333ad39ff5764347694207568fd631e45 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 13 Sep 2022 14:25:10 +0200 Subject: [PATCH 006/210] Add support for openssh private keys --- src/Deployer/Task/Common/PrepareSshTaskGlobal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php index 9d2e954..5f39d5d 100644 --- a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php +++ b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php @@ -70,7 +70,7 @@ private function configureKey(): void return; } - if (strpos($key, 'BEGIN RSA PRIVATE KEY') === false) { + if (!preg_match('/BEGIN (OPENSSH|RSA) PRIVATE KEY/', $key)) { runLocally('echo "$SSH_PRIVATE_KEY" | base64 -d > {{ssh_key_file}}'); } else { runLocally('echo "$SSH_PRIVATE_KEY" > {{ssh_key_file}}'); From b9c7ff5aa7c8103c0981de5e2184296db462bc4c Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 13 Sep 2022 14:28:04 +0200 Subject: [PATCH 007/210] Only cancel ephemeral hypernode on failure --- src/DeployRunner.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 03c59d9..8419281 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -352,6 +352,7 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $tasks = $deployer->scriptManager->getTasks($task); $executor = $deployer->master; + $failed = false; try { /** @@ -363,6 +364,7 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep } catch (Throwable $exception) { $deployer->output->writeln('[' . \get_class($exception) . '] ' . $exception->getMessage()); $deployer->output->writeln($exception->getTraceAsString()); + $failed = true; if ($exception instanceof GracefulShutdownException) { throw $exception; @@ -377,9 +379,11 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep } throw $exception; } finally { - foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { - $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); - $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); + if ($failed) { + foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { + $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); + $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); + } } } } From b913e28d0f0a19b07053f4a812f9aabb15c949f6 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 13 Sep 2022 14:38:17 +0200 Subject: [PATCH 008/210] Set working directory for ephemeral testsuite --- ci/test/run-ephemeral.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index b601fdc..3219e76 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY hndeploy" +DP="docker run -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" # Build Docker image docker build \ From ab11291556cee5c3af6e4108131e7c656b12019d Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 08:04:32 +0200 Subject: [PATCH 009/210] Change platform config paths The platform config directories will now reside in `{{release_path}}/.hypernode/{{config_directory}}` --- src/DeployRunner.php | 14 ++++++-------- src/Deployer/Task/Deploy/LinkTask.php | 2 +- .../PlatformConfiguration/NginxManageVHostTask.php | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 2b736e1..2f5a4c0 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -204,14 +204,12 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio return run('realpath ~/apps/{{domain}}'); }); $host->set('current_path', '{{deploy_path}}/current'); - $host->set('app_release_path', '{{release_path}}/app'); - $host->set('app_current_path', '{{current_path}}/app'); - $host->set('nginx_release_path', '{{release_path}}/nginx'); - $host->set('nginx_current_path', '{{current_path}}/nginx'); - $host->set('supervisor_release_path', '{{release_path}}/supervisor'); - $host->set('supervisor_current_path', '{{current_path}}/supervisor'); - $host->set('varnish_release_path', '{{release_path}}/varnish'); - $host->set('varnish_current_path', '{{current_path}}/varnish'); + $host->set('nginx_release_path', '{{release_path}}/.hypernode/nginx'); + $host->set('nginx_current_path', '{{current_path}}/.hypernode/nginx'); + $host->set('supervisor_release_path', '{{release_path}}/.hypernode/supervisor'); + $host->set('supervisor_current_path', '{{current_path}}/.hypernode/supervisor'); + $host->set('varnish_release_path', '{{release_path}}/.hypernode/varnish'); + $host->set('varnish_current_path', '{{current_path}}/.hypernode/varnish'); $host->set('configuration_stage', $stage); $host->set('writable_mode', 'chmod'); diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index acd6206..aadae07 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -31,7 +31,7 @@ public function configure(Configuration $config): void } } - run('ln -s {{app_current_path}}/{{public_folder}} /data/web/public'); + run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); })->select("roles=$role"); } } diff --git a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php index 33a766e..faf551e 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php @@ -30,7 +30,7 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { task('deploy:nginx:manage_vhost', function () { - run('hypernode-manage-vhosts {{domain}} --webroot {{app_current_path}}/{{public_folder}} --no'); + run('hypernode-manage-vhosts {{domain}} --webroot {{current_path}}/{{public_folder}} --no'); }); return null; From 35fc1ae5e795fb17ef3757e28ccf022bd7d27d4f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 08:06:49 +0200 Subject: [PATCH 010/210] Block hypernode-systemctl settings task --- .../Task/PlatformConfiguration/HypernodeSettingTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php b/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php index 97c745e..e9557e2 100644 --- a/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php +++ b/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php @@ -33,9 +33,9 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta Assert::isInstanceOf($config, HypernodeSettingConfiguration::class); $attribute = $config->getAttribute(); $value = $config->getValue(); - $taskName = "deploy:hypernode:setting:{$attribute}"; + $taskName = "deploy:hypernode:setting:$attribute"; $task = task($taskName, function () use ($attribute, $value) { - run("hypernode-systemctl settings {$attribute} {$value}"); + run("hypernode-systemctl settings $attribute $value --block"); }); after('deploy:setup', $taskName); return $task; From c3b64a521f607518665dcdabacef95b42f6dee23 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 08:16:59 +0200 Subject: [PATCH 011/210] Resolve waiting for ephemeral app only on relevant flows --- src/DeployRunner.php | 13 +++++++++++-- .../CreateEphemeralHypernodeFailedException.php | 11 +++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/Exception/CreateEphemeralHypernodeFailedException.php diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 8419281..0d692b7 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -12,6 +12,7 @@ use Hypernode\Api\Resource\Logbook\Flow; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Exception\CreateEphemeralHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; use Hypernode\Deploy\Deployer\Task\TaskFactory; @@ -275,6 +276,7 @@ private function maybeConfigureEphemeralServer(Server $server): void * @throws HypernodeApiClientException * @throws HypernodeApiServerException * @throws TimeoutException + * @throws CreateEphemeralHypernodeFailedException */ private function waitForEphemeralApp(string $ephemeralApp, int $timeout = 900): void { @@ -289,8 +291,15 @@ private function waitForEphemeralApp(string $ephemeralApp, int $timeout = 900): try { $flows = $this->hypernodeClient->logbook->getList($ephemeralApp); - $remaining = array_filter($flows, fn (Flow $flow) => !$flow->isComplete()); - if ($flows && !$remaining) { + $relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app'); + $failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted()); + $completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete()); + + if (count($failedFlows) === count($relevantFlows)) { + throw new CreateEphemeralHypernodeFailedException(); + } + + if ($relevantFlows && count($completedFlows) === count($relevantFlows)) { $resolved = true; break; } diff --git a/src/Exception/CreateEphemeralHypernodeFailedException.php b/src/Exception/CreateEphemeralHypernodeFailedException.php new file mode 100644 index 0000000..dd068b0 --- /dev/null +++ b/src/Exception/CreateEphemeralHypernodeFailedException.php @@ -0,0 +1,11 @@ + Date: Wed, 14 Sep 2022 08:43:30 +0200 Subject: [PATCH 012/210] Fix always exiting with code 0 --- src/Command/Build.php | 3 +- src/Command/ComposerAuth.php | 3 +- src/Command/Deploy.php | 3 +- src/Command/RunTask.php | 3 +- src/DeployRunner.php | 72 ++++++++++++++++++------------------ 5 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/Command/Build.php b/src/Command/Build.php index f3dfb87..f979b19 100644 --- a/src/Command/Build.php +++ b/src/Command/Build.php @@ -33,7 +33,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD); - return 0; + return $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD); } } diff --git a/src/Command/ComposerAuth.php b/src/Command/ComposerAuth.php index e1cc1dd..6b5ea07 100644 --- a/src/Command/ComposerAuth.php +++ b/src/Command/ComposerAuth.php @@ -34,7 +34,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, 'build', 'deploy:vendors:auth'); - return 0; + return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth'); } } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 44b2edf..366c70e 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -35,7 +35,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); - return 0; + return $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); } } diff --git a/src/Command/RunTask.php b/src/Command/RunTask.php index a25616f..e7e42d7 100644 --- a/src/Command/RunTask.php +++ b/src/Command/RunTask.php @@ -36,7 +36,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, $input->getArgument('stage'), $input->getArgument('task')); - return 0; + return $this->deployRunner->run($output, $input->getArgument('stage'), $input->getArgument('task')); } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 0d692b7..22c745b 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -72,9 +72,9 @@ public function __construct( * @throws Throwable * @throws Exception * - * @return void + * @return int */ - public function run(OutputInterface $output, string $stage, string $task = self::TASK_DEPLOY) + public function run(OutputInterface $output, string $stage, string $task = self::TASK_DEPLOY): int { $console = new Application(); $deployer = new Deployer($console); @@ -91,9 +91,10 @@ public function run(OutputInterface $output, string $stage, string $task = self: $this->initializeDeployer($deployer, $task); } catch (InvalidConfigurationException $e) { $output->write($e->getMessage()); - return; + return 1; } - $this->runStage($deployer, $stage, $task); + + return $this->runStage($deployer, $stage, $task); } /** @@ -265,7 +266,12 @@ private function maybeConfigureEphemeralServer(Server $server): void $this->log->info(sprintf('Successfully requested ephemeral Hypernode, name is %s.', $ephemeralApp)); $this->log->info('Waiting for ephemeral Hypernode to become available...'); - $this->waitForEphemeralApp($ephemeralApp); + try { + $this->waitForEphemeralApp($ephemeralApp); + } catch (CreateEphemeralHypernodeFailedException | TimeoutException $e) { + $this->hypernodeClient->ephemeralApp->cancel($ephemeralApp); + throw $e; + } $this->log->info('Ephemeral Hypernode has become available!'); } } @@ -352,7 +358,7 @@ private function initializeBuildStage(Configuration $config): void * @throws Throwable * @throws Exception */ - private function runStage(Deployer $deployer, string $stage, string $task = 'deploy'): void + private function runStage(Deployer $deployer, string $stage, string $task = 'deploy'): int { $hosts = $deployer->selector->select("stage=$stage"); if (empty($hosts)) { @@ -361,40 +367,36 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $tasks = $deployer->scriptManager->getTasks($task); $executor = $deployer->master; - $failed = false; - try { - /** - * Set the env variable to tell deployer to deploy the hosts sequentially instead of parallel. - * @see \Deployer\Executor\Master::runTask() - */ - putenv('DEPLOYER_LOCAL_WORKER=true'); - $executor->run($tasks, $hosts); - } catch (Throwable $exception) { - $deployer->output->writeln('[' . \get_class($exception) . '] ' . $exception->getMessage()); - $deployer->output->writeln($exception->getTraceAsString()); - $failed = true; + /** + * Set the env variable to tell deployer to deploy the hosts sequentially instead of parallel. + * @see \Deployer\Executor\Master::runTask() + */ + putenv('DEPLOYER_LOCAL_WORKER=true'); + $exitCode = $executor->run($tasks, $hosts); - if ($exception instanceof GracefulShutdownException) { - throw $exception; - } + if ($exitCode === 0) { + return 0; + } + + if ($exitCode === GracefulShutdownException::EXIT_CODE) { + return 1; + } - // Check if we have tasks to execute on failure - if ($deployer['fail']->has($task)) { - $taskName = $deployer['fail']->get($task); - $tasks = $deployer->scriptManager->getTasks($taskName); + // Check if we have tasks to execute on failure + if ($deployer['fail']->has($task)) { + $taskName = $deployer['fail']->get($task); + $tasks = $deployer->scriptManager->getTasks($taskName); - $executor->run($tasks, $hosts); - } - throw $exception; - } finally { - if ($failed) { - foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { - $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); - $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); - } - } + $executor->run($tasks, $hosts); + } + + foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { + $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); + $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); } + + return $exitCode; } private function tryGetConfiguration(): Configuration From 8374a6ab795c9413c8ffeaa6c0007d1196e1c628 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 08:50:35 +0200 Subject: [PATCH 013/210] Fix platform config path tests --- runtests.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/runtests.sh b/runtests.sh index b699fdb..b8d2ddc 100755 --- a/runtests.sh +++ b/runtests.sh @@ -97,9 +97,9 @@ $DP2 hypernode-deploy deploy production -f /web2/deploy2.php -v test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 $HN ls -al /data/web/nginx/banaan2.store/ $HN ls -al /data/web/apps/banaan2.store/current/ -$HN ls -al /data/web/apps/banaan2.store/current/nginx/ +$HN ls -al /data/web/apps/banaan2.store/current/.hypernode/nginx/ $HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx +$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/.hypernode/nginx ################################## # DEPLOY PLATFORM CONFIGURATIONS # @@ -111,22 +111,22 @@ $DP1 hypernode-deploy deploy production -v -f /web1/deploy1.php # Check if example location block was placed $HN ls -al /data/web/nginx/banaan1.store/ $HN ls -al /data/web/apps/banaan1.store/current/ -$HN ls -al /data/web/apps/banaan1.store/current/nginx/ +$HN ls -al /data/web/apps/banaan1.store/current/.hypernode/nginx/ $HN test -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan1.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/2/nginx +$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/2/.hypernode/nginx $HN test -f /data/web/supervisor/banaan1.store/example.conf || ($HN ls -al /data/web/supervisor/ && exit 1) -$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/2/supervisor +$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/2/.hypernode/supervisor # Test this once we enable supervisor in the hypernode docker image # $HN supervisorctl status | grep example | grep -v FATAL || ($HN supervisorctl status && exit 1) # Test if varnish dirs exists and vcl has been placed $HN ls -al /data/web/varnish/banaan1.store/ -$HN ls -al /data/web/apps/banaan1.store/current/varnish/ +$HN ls -al /data/web/apps/banaan1.store/current/.hypernode/varnish/ $HN test -f /data/web/varnish/banaan1.store/varnish.vcl || ($HN ls -al /data/web/varnish/ && exit 1) -$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/2/varnish/varnish.vcl +$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/2/.hypernode/varnish/varnish.vcl # Check the content of the crontab block $HN crontab -l -u app | grep "### BEGIN banaan1.store ###" @@ -147,9 +147,9 @@ $DP1 hypernode-deploy deploy production -f /web1/deploy1.php # Check if another deployment was made test $($HN ls /data/web/apps/banaan1.store/releases/ | wc -l) = 3 -$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/3/nginx -$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/3/supervisor -$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/3/varnish/varnish.vcl +$HN test $($HN readlink -f /data/web/nginx/banaan1.store) = /data/web/apps/banaan1.store/releases/3/.hypernode/nginx +$HN test $($HN readlink -f /data/web/supervisor/banaan1.store) = /data/web/apps/banaan1.store/releases/3/.hypernode/supervisor +$HN test $($HN readlink -f /data/web/varnish/banaan1.store/varnish.vcl) = /data/web/apps/banaan1.store/releases/3/.hypernode/varnish/varnish.vcl # Verify example location block is removed $HN test ! -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al /data/web/nginx/banaan1.store && exit 1) @@ -158,6 +158,6 @@ $HN test ! -f /data/web/nginx/banaan1.store/server.example.conf || ($HN ls -al / test $($HN ls /data/web/apps/banaan2.store/releases/ | wc -l) = 1 $HN ls -al /data/web/nginx/banaan2.store/ $HN ls -al /data/web/apps/banaan2.store/current/ -$HN ls -al /data/web/apps/banaan2.store/current/nginx/ +$HN ls -al /data/web/apps/banaan2.store/current/.hypernode/nginx/ $HN test -f /data/web/nginx/banaan2.store/server.example.conf || ($HN ls -al /data/web/nginx && $HN ls -al /data/web/nginx/banaan2.store && exit 1) -$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/nginx +$HN test $($HN readlink -f /data/web/nginx/banaan2.store) = /data/web/apps/banaan2.store/releases/1/.hypernode/nginx From 9ed9ad4802ea85485d208b3159652f9f00f95ee7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 09:22:13 +0200 Subject: [PATCH 014/210] Update hypernode/api-client --- composer.lock | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/composer.lock b/composer.lock index 343fdb1..fcecbf6 100644 --- a/composer.lock +++ b/composer.lock @@ -733,12 +733,12 @@ "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f" + "reference": "0a40102d119f5678447b6e0682d939fcb077a622" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f", - "reference": "309a671f5c9bd2bbc4fee8566daf5d8e48d1c01f", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/0a40102d119f5678447b6e0682d939fcb077a622", + "reference": "0a40102d119f5678447b6e0682d939fcb077a622", "shasum": "" }, "require": { @@ -777,7 +777,7 @@ "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", "source": "https://github.com/ByteInternet/hypernode-api-php/tree/master" }, - "time": "2022-09-12T13:18:22+00:00" + "time": "2022-09-14T07:21:34+00:00" }, { "name": "hypernode/deploy-configuration", @@ -6026,12 +6026,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "6d260392fad173d6ee6e3a93c875d9327db1109b" + "reference": "5cf4af16905d08d88c26fbcdf929a8f53e0780da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6d260392fad173d6ee6e3a93c875d9327db1109b", - "reference": "6d260392fad173d6ee6e3a93c875d9327db1109b", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5cf4af16905d08d88c26fbcdf929a8f53e0780da", + "reference": "5cf4af16905d08d88c26fbcdf929a8f53e0780da", "shasum": "" }, "conflict": { @@ -6434,11 +6434,12 @@ "tribalsystems/zenario": "<9.2.55826", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.14.11|>=3,<3.3.8", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.29|>=11,<11.5.11", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.57|>=8,<8.7.47|>=9,<9.5.35|>=10,<10.4.29|>=11,<11.5.11", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.57|>=8,<8.7.47|>=9,<9.5.35|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<1.0.7|>=2,<2.0.16", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", @@ -6536,7 +6537,7 @@ "type": "tidelift" } ], - "time": "2022-08-31T22:04:18+00:00" + "time": "2022-09-13T13:19:06+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6595,16 +6596,16 @@ }, { "name": "sebastian/comparator", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "reference": "c05dd1878ec74058a28a569c59fc5c53a8cc1c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c05dd1878ec74058a28a569c59fc5c53a8cc1c7a", + "reference": "c05dd1878ec74058a28a569c59fc5c53a8cc1c7a", "shasum": "" }, "require": { @@ -6657,7 +6658,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.4" }, "funding": [ { @@ -6665,7 +6666,7 @@ "type": "github" } ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2022-09-14T06:27:54+00:00" }, { "name": "sebastian/diff", @@ -6798,16 +6799,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.4", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", "shasum": "" }, "require": { @@ -6863,7 +6864,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" }, "funding": [ { @@ -6871,7 +6872,7 @@ "type": "github" } ], - "time": "2021-11-11T13:51:24+00:00" + "time": "2022-09-14T06:00:17+00:00" }, { "name": "sebastian/global-state", From b26a349a92147cf2f6ac7c22a995024e21e66c5a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 10:09:55 +0200 Subject: [PATCH 015/210] ci/ephemeral: remove obsolete env.php copy from source hypernode --- ci/test/run-ephemeral.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 3219e76..e61521e 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -17,7 +17,6 @@ docker build \ # Copy application from remote to local $HN /data/web/magento2/bin/magento app:config:dump scopes themes -echo "Waiting for SSH to be available on the Hypernode container" mkdir /tmp/m2build mkdir -p "$HOME/.ssh" cp ci/test/magento/deploy_ephemeral.php /tmp/m2build/deploy.php @@ -27,10 +26,6 @@ rm /tmp/m2build/app/etc/env.php # Build application $DP hypernode-deploy build -f /web/deploy.php --verbose -# Prepare env -$HN mkdir -p /data/web/apps/banaan.store/shared/app/etc/ -$HN cp /data/web/magento2/app/etc/env.php /data/web/apps/banaan.store/shared/app/etc/env.php - ########################################## # DEPLOY WITHOUT PLATFORM CONFIGURATIONS # # This should pass, but not generate any # From 82ec23f50157ede1e8b6356f95629ee198b4edcd Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 12:12:40 +0200 Subject: [PATCH 016/210] Add deployment reporting --- src/Command/Deploy.php | 13 ++- src/DeployRunner.php | 98 ++++++------------ src/Ephemeral/EphemeralHypernodeManager.php | 106 ++++++++++++++++++++ src/Report/Report.php | 81 +++++++++++++++ src/Report/ReportLoader.php | 22 ++++ src/Report/ReportWriter.php | 13 +++ 6 files changed, 263 insertions(+), 70 deletions(-) create mode 100644 src/Ephemeral/EphemeralHypernodeManager.php create mode 100644 src/Report/Report.php create mode 100644 src/Report/ReportLoader.php create mode 100644 src/Report/ReportWriter.php diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 366c70e..e816d47 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -3,6 +3,7 @@ namespace Hypernode\Deploy\Command; use Hypernode\Deploy\DeployRunner; +use Hypernode\Deploy\Report\ReportWriter; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -15,11 +16,13 @@ class Deploy extends Command * @var DeployRunner */ private $deployRunner; + private ReportWriter $reportWriter; - public function __construct(DeployRunner $deployRunner) + public function __construct(DeployRunner $deployRunner, ReportWriter $reportWriter) { parent::__construct(); $this->deployRunner = $deployRunner; + $this->reportWriter = $reportWriter; } protected function configure() @@ -35,6 +38,12 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); + $result = $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); + + if ($result === 0) { + $this->reportWriter->write($this->deployRunner->getDeploymentReport()); + } + + return $result; } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index bdbe7a4..f7e5363 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -5,13 +5,10 @@ use Deployer\Deployer; use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; -use Hypernode\Api\Exception\HypernodeApiClientException; -use Hypernode\Api\Exception\HypernodeApiServerException; -use Hypernode\Api\HypernodeClient; -use Hypernode\Api\HypernodeClientFactory; -use Hypernode\Api\Resource\Logbook\Flow; +use Deployer\Host\Host; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Ephemeral\EphemeralHypernodeManager; use Hypernode\Deploy\Exception\CreateEphemeralHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; @@ -45,7 +42,7 @@ class DeployRunner private InputInterface $input; private LoggerInterface $log; private RecipeLoader $recipeLoader; - private HypernodeClient $hypernodeClient; + private EphemeralHypernodeManager $ephemeralHypernodeManager; /** * Registered ephemeral Hypernodes to stop/cancel after running. @@ -54,17 +51,24 @@ class DeployRunner */ private array $ephemeralHypernodesRegistered = []; + private string $version; + private array $deployedHostnames = []; + private string $deployedStage = ''; + public function __construct( TaskFactory $taskFactory, InputInterface $input, LoggerInterface $log, - RecipeLoader $recipeLoader + RecipeLoader $recipeLoader, + EphemeralHypernodeManager $ephemeralHypernodeManager, + string $version ) { $this->taskFactory = $taskFactory; $this->input = $input; $this->log = $log; $this->recipeLoader = $recipeLoader; - $this->hypernodeClient = HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); + $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; + $this->version = $version; } /** @@ -258,70 +262,19 @@ private function maybeConfigureEphemeralServer(Server $server): void $parentApp = $serverOptions[Server::OPTION_HN_PARENT_APP] ?? null; if ($isEphemeral && $parentApp) { $this->log->info(sprintf('Creating an ephemeral Hypernode based on %s.', $parentApp)); - $ephemeralApp = $this->hypernodeClient->ephemeralApp->create($parentApp); + $ephemeralApp = $this->ephemeralHypernodeManager->createForHypernode($parentApp); $server->setHostname(sprintf("%s.hypernode.io", $ephemeralApp)); $this->ephemeralHypernodesRegistered[] = $ephemeralApp; $this->log->info(sprintf('Successfully requested ephemeral Hypernode, name is %s.', $ephemeralApp)); - $this->log->info('Waiting for ephemeral Hypernode to become available...'); try { - $this->waitForEphemeralApp($ephemeralApp); + $this->log->info('Waiting for ephemeral Hypernode to become available...'); + $this->ephemeralHypernodeManager->waitForAvailability($ephemeralApp); + $this->log->info('Ephemeral Hypernode has become available!'); } catch (CreateEphemeralHypernodeFailedException | TimeoutException $e) { - $this->hypernodeClient->ephemeralApp->cancel($ephemeralApp); + $this->ephemeralHypernodeManager->cancel($ephemeralApp); throw $e; } - $this->log->info('Ephemeral Hypernode has become available!'); - } - } - - /** - * Poll and wait for ephemeral app to become available. - * - * @throws HypernodeApiClientException - * @throws HypernodeApiServerException - * @throws TimeoutException - * @throws CreateEphemeralHypernodeFailedException - */ - private function waitForEphemeralApp(string $ephemeralApp, int $timeout = 900): void - { - $latest = microtime(true); - $timeElapsed = 0; - $resolved = false; - - while ($timeElapsed < $timeout && !$resolved) { - $now = microtime(true); - $timeElapsed += $now - $latest; - $latest = $now; - - try { - $flows = $this->hypernodeClient->logbook->getList($ephemeralApp); - $relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app'); - $failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted()); - $completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete()); - - if (count($failedFlows) === count($relevantFlows)) { - throw new CreateEphemeralHypernodeFailedException(); - } - - if ($relevantFlows && count($completedFlows) === count($relevantFlows)) { - $resolved = true; - break; - } - } catch (HypernodeApiClientException $e) { - // A 404 not found means there are no flows in the logbook yet, we should wait. - // Otherwise, there's an error, and it should be propagated. - if ($e->getCode() !== 404) { - throw $e; - } - } - - sleep(5); - } - - if (!$resolved) { - throw new TimeoutException( - sprintf('Timed out waiting for ephemeral Hypernode %s to become available', $ephemeralApp) - ); } } @@ -374,6 +327,8 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $exitCode = $executor->run($tasks, $hosts); if ($exitCode === 0) { + $this->deployedHostnames = array_map(fn (Host $host) => $host->getHostname(), $hosts); + $this->deployedStage = $stage; return 0; } @@ -389,10 +344,7 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $executor->run($tasks, $hosts); } - foreach ($this->ephemeralHypernodesRegistered as $ephemeralHypernode) { - $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); - $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); - } + $this->ephemeralHypernodeManager->cancel(...$this->ephemeralHypernodesRegistered); return $exitCode; } @@ -455,4 +407,14 @@ private function initializeAppAutoloader(): void require_once WORKING_DIR . '/vendor/autoload.php'; } } + + public function getDeploymentReport() + { + return new Report\Report( + $this->version, + $this->deployedStage, + $this->deployedHostnames, + $this->ephemeralHypernodesRegistered, + ); + } } diff --git a/src/Ephemeral/EphemeralHypernodeManager.php b/src/Ephemeral/EphemeralHypernodeManager.php new file mode 100644 index 0000000..2767d53 --- /dev/null +++ b/src/Ephemeral/EphemeralHypernodeManager.php @@ -0,0 +1,106 @@ +log = $log; + $this->hypernodeClient = HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); + } + + /** + * Create ephemeral Hypernode instance for given Hypernode. + * + * @param string $hypernode Name of the Hypernode + * @return string Name of the created ephemeral Hypernode + * @throws HypernodeApiClientException + * @throws HypernodeApiServerException + */ + public function createForHypernode(string $hypernode): string + { + return $this->hypernodeClient->ephemeralApp->create($hypernode); + } + + /** + * Wait for ephemeral Hypernode to become available. + * + * @param string $ephemeralHypernode Name of the ephemeral Hypernode + * @param int $timeout Maximum time to wait for availability + * @return void + * @throws CreateEphemeralHypernodeFailedException + * @throws HypernodeApiClientException + * @throws HypernodeApiServerException + * @throws TimeoutException + */ + public function waitForAvailability(string $ephemeralHypernode, int $timeout = 900): void + { + $latest = microtime(true); + $timeElapsed = 0; + $resolved = false; + + while ($timeElapsed < $timeout && !$resolved) { + $now = microtime(true); + $timeElapsed += $now - $latest; + $latest = $now; + + try { + $flows = $this->hypernodeClient->logbook->getList($ephemeralHypernode); + $relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app'); + $failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted()); + $completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete()); + + if (count($failedFlows) === count($relevantFlows)) { + throw new CreateEphemeralHypernodeFailedException(); + } + + if ($relevantFlows && count($completedFlows) === count($relevantFlows)) { + $resolved = true; + break; + } + } catch (HypernodeApiClientException $e) { + // A 404 not found means there are no flows in the logbook yet, we should wait. + // Otherwise, there's an error, and it should be propagated. + if ($e->getCode() !== 404) { + throw $e; + } + } + + sleep(5); + } + + if (!$resolved) { + throw new TimeoutException( + sprintf('Timed out waiting for ephemeral Hypernode %s to become available', $ephemeralHypernode) + ); + } + } + + /** + * Cancel one or multiple ephemeral Hypernodes. + * + * @param string ...$ephemeralHypernodes Name(s) of the ephemeral Hypernode(s) + * @throws HypernodeApiClientException + * @throws HypernodeApiServerException + */ + public function cancel(string ...$ephemeralHypernodes): void + { + foreach ($ephemeralHypernodes as $ephemeralHypernode) { + $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); + $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); + } + } +} diff --git a/src/Report/Report.php b/src/Report/Report.php new file mode 100644 index 0000000..7fb222b --- /dev/null +++ b/src/Report/Report.php @@ -0,0 +1,81 @@ +version = $version; + $this->stage = $stage; + $this->hostnames = $hostnames; + $this->ephemeralHypernodes = $ephemeralHypernodes; + } + + public function getVersion(): string + { + return $this->version; + } + + public function getStage(): string + { + return $this->stage; + } + + /** + * @return string[] + */ + public function getHostnames(): array + { + return $this->hostnames; + } + + /** + * @return string[] + */ + public function getEphemeralHypernodes(): array + { + return $this->ephemeralHypernodes; + } + + public function toArray(): array + { + return [ + 'version' => $this->version, + 'stage' => $this->stage, + 'hostnames' => $this->hostnames, + 'ephemeral_hypernodes' => $this->ephemeralHypernodes, + ]; + } + + public static function fromArray(array $data): Report + { + return new Report( + $data['version'], + $data['stage'], + $data['hostnames'], + $data['ephemeral_hypernodes'], + ); + } +} diff --git a/src/Report/ReportLoader.php b/src/Report/ReportLoader.php new file mode 100644 index 0000000..b4b6e26 --- /dev/null +++ b/src/Report/ReportLoader.php @@ -0,0 +1,22 @@ +toArray())); + } +} From 1743ad731b3c250d6d2728663ffd4872acd7f2d7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 12:13:10 +0200 Subject: [PATCH 017/210] Add Cleanup command for cancelling ephemeral Hypernodes --- src/Command/Cleanup.php | 43 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/Command/Cleanup.php diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php new file mode 100644 index 0000000..d71e9bf --- /dev/null +++ b/src/Command/Cleanup.php @@ -0,0 +1,43 @@ +reportLoader = $reportLoader; + $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; + } + + /** + * @throws Throwable + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $report = $this->reportLoader->loadReport(); + + if ($report === null) { + $output->writeln('No report found, skipping cleanup.'); + return 0; + } + + $this->ephemeralHypernodeManager->cancel(...$report->getEphemeralHypernodes()); + + return 0; + } +} From 38abf49bdad53c638a9ae9c00ea9113217d90b53 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 12:13:45 +0200 Subject: [PATCH 018/210] ci/ephemeral: test for deployment report --- ci/build/Dockerfile | 1 + ci/test/run-ephemeral.sh | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 77be092..518e671 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -37,6 +37,7 @@ RUN apt-get update && \ git \ patch \ bash \ + jq \ ca-certificates \ wget \ curl \ diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index e61521e..a3710e1 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" +DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" # Build Docker image docker build \ @@ -33,3 +33,11 @@ $DP hypernode-deploy build -f /web/deploy.php --verbose ########################################## # SSH from deploy container to hypernode container $DP hypernode-deploy deploy test -f /web/deploy.php -v + +# Run some tests + +$DP "ls -l" +$DP "test -f deployment-report.json" +$DP "cat deployment-report.json | jq" + +$DP hypernode-deploy cleanup From 5c4f7c721f919ea449a7a5ca959524066f26b2ef Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 13:14:58 +0200 Subject: [PATCH 019/210] Remove usage version DI variable for report version --- src/DeployRunner.php | 8 ++------ src/Report/Report.php | 17 +++++++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index f7e5363..fb1d68d 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -51,7 +51,6 @@ class DeployRunner */ private array $ephemeralHypernodesRegistered = []; - private string $version; private array $deployedHostnames = []; private string $deployedStage = ''; @@ -60,15 +59,13 @@ public function __construct( InputInterface $input, LoggerInterface $log, RecipeLoader $recipeLoader, - EphemeralHypernodeManager $ephemeralHypernodeManager, - string $version + EphemeralHypernodeManager $ephemeralHypernodeManager ) { $this->taskFactory = $taskFactory; $this->input = $input; $this->log = $log; $this->recipeLoader = $recipeLoader; $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; - $this->version = $version; } /** @@ -411,10 +408,9 @@ private function initializeAppAutoloader(): void public function getDeploymentReport() { return new Report\Report( - $this->version, $this->deployedStage, $this->deployedHostnames, - $this->ephemeralHypernodesRegistered, + $this->ephemeralHypernodesRegistered ); } } diff --git a/src/Report/Report.php b/src/Report/Report.php index 7fb222b..b79c838 100644 --- a/src/Report/Report.php +++ b/src/Report/Report.php @@ -7,8 +7,8 @@ class Report { public const REPORT_FILENAME = 'deployment-report.json'; + public const REPORT_VERSION = 'v1'; - private string $version; private string $stage; /** * @var string[] @@ -18,19 +18,24 @@ class Report * @var string[] */ private array $ephemeralHypernodes; + private string $version; /** - * @param string $version * @param string $stage * @param string[] $hostnames * @param string[] $ephemeralHypernodes + * @param string $version Version of the report file */ - public function __construct(string $version, string $stage, array $hostnames, array $ephemeralHypernodes) - { - $this->version = $version; + public function __construct( + string $stage, + array $hostnames, + array $ephemeralHypernodes, + string $version = self::REPORT_VERSION + ) { $this->stage = $stage; $this->hostnames = $hostnames; $this->ephemeralHypernodes = $ephemeralHypernodes; + $this->version = $version; } public function getVersion(): string @@ -72,10 +77,10 @@ public function toArray(): array public static function fromArray(array $data): Report { return new Report( - $data['version'], $data['stage'], $data['hostnames'], $data['ephemeral_hypernodes'], + $data['version'], ); } } From f6bd6021017752de786bf6657086c81da3bdded3 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 14:18:58 +0200 Subject: [PATCH 020/210] Add missing name and description for Cleanup command --- src/Command/Cleanup.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index d71e9bf..e9608d5 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -24,6 +24,15 @@ public function __construct(ReportLoader $reportLoader, EphemeralHypernodeManage $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; } + protected function configure() + { + parent::configure(); + $this->setName('cleanup'); + $this->setDescription( + 'Clean up any acquired resources during the deployment, like ephemeral Hypernodes.' + ); + } + /** * @throws Throwable */ From 7d82205634c53c5c35137684c1f32ee726a93789 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 14:44:45 +0200 Subject: [PATCH 021/210] ci/ephemeral: fix deployment report tests --- ci/test/run-ephemeral.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index a3710e1..b6926cd 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -36,8 +36,8 @@ $DP hypernode-deploy deploy test -f /web/deploy.php -v # Run some tests -$DP "ls -l" -$DP "test -f deployment-report.json" -$DP "cat deployment-report.json | jq" +$DP ls -l +$DP test -f deployment-report.json +$DP jq deployment-report.json $DP hypernode-deploy cleanup From 6ebb15bcb39f6591a21318ab61a79b2471569523 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 15:13:09 +0200 Subject: [PATCH 022/210] ci/ephemeral: verbose and output deployment-report.json --- ci/test/run-ephemeral.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index b6926cd..0778f48 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -24,7 +24,7 @@ rsync -a -e "ssh -o StrictHostKeyChecking=no" app@hndeployintegr8.hypernode.io:m rm /tmp/m2build/app/etc/env.php # Build application -$DP hypernode-deploy build -f /web/deploy.php --verbose +$DP hypernode-deploy build -f /web/deploy.php -vvv ########################################## # DEPLOY WITHOUT PLATFORM CONFIGURATIONS # @@ -32,12 +32,13 @@ $DP hypernode-deploy build -f /web/deploy.php --verbose # Nginx/Supervisor/etc configs # ########################################## # SSH from deploy container to hypernode container -$DP hypernode-deploy deploy test -f /web/deploy.php -v +$DP hypernode-deploy deploy test -f /web/deploy.php -vvv # Run some tests $DP ls -l $DP test -f deployment-report.json +$DP cat deployment-report.json $DP jq deployment-report.json -$DP hypernode-deploy cleanup +$DP hypernode-deploy cleanup -vvv From 088379929313dbbc54b988f1f315fab9a014be21 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 14 Sep 2022 15:30:46 +0200 Subject: [PATCH 023/210] ci/ephemeral: fix deployment report tests --- ci/test/run-ephemeral.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 0778f48..7a1b00f 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -38,7 +38,10 @@ $DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json -$DP cat deployment-report.json -$DP jq deployment-report.json +$DP jq . deployment-report.json +$DP jq .version deployment-report.json -r +$DP jq .stage deployment-report.json -r +$DP jq .hostnames[0] deployment-report.json -r +$DP jq .ephemeral_hypernodes[0] deployment-report.json -r $DP hypernode-deploy cleanup -vvv From 2aac9001f0d559c4ec0468c3646956e74a9f5b84 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Sep 2022 08:51:56 +0200 Subject: [PATCH 024/210] composer: set hypernode/deploy-configuration to v3.x-dev --- composer.json | 2 +- composer.lock | 56 +++++++++++++++++++++++++++------------------------ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/composer.json b/composer.json index 284c6b5..59e7c49 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "dev-master", - "hypernode/deploy-configuration": "dev-ephemeral_servers", + "hypernode/deploy-configuration": "v3.x-dev", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index fcecbf6..6f5c4b7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "68a8c995edb3ae6b3d40dfa09a4d1639", + "content-hash": "c2050586df39ec657cd256f09544ea60", "packages": [ { "name": "clue/stream-filter", @@ -781,16 +781,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "dev-ephemeral_servers", + "version": "v3.x-dev", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "bbb62227a92205b9f31548442c27ee27321debe5" + "reference": "39ba384b779da41e3f7c6e12056c6a2bdb9b62b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/bbb62227a92205b9f31548442c27ee27321debe5", - "reference": "bbb62227a92205b9f31548442c27ee27321debe5", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/39ba384b779da41e3f7c6e12056c6a2bdb9b62b4", + "reference": "39ba384b779da41e3f7c6e12056c6a2bdb9b62b4", "shasum": "" }, "require": { @@ -817,9 +817,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/ephemeral_servers" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/v3" }, - "time": "2022-09-12T10:17:41+00:00" + "time": "2022-09-16T13:49:04+00:00" }, { "name": "justinrainbow/json-schema", @@ -6026,12 +6026,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "5cf4af16905d08d88c26fbcdf929a8f53e0780da" + "reference": "264a5085afd6e127daba3f47751fa971d3c29c3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5cf4af16905d08d88c26fbcdf929a8f53e0780da", - "reference": "5cf4af16905d08d88c26fbcdf929a8f53e0780da", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/264a5085afd6e127daba3f47751fa971d3c29c3d", + "reference": "264a5085afd6e127daba3f47751fa971d3c29c3d", "shasum": "" }, "conflict": { @@ -6124,6 +6124,8 @@ "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", "ether/logs": "<3.0.4", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "= 3.0.0|<2.2.3", "ezsystems/demobundle": ">=5.4,<5.4.6.1", "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", @@ -6156,13 +6158,13 @@ "fooman/tcpdf": "<6.2.22", "forkcms/forkcms": "<5.11.1", "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<9.1", + "francoisjacquet/rosariosis": "<10.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<=0.10.22", + "froxlor/froxlor": "<0.10.38", "fuel/core": "<1.8.1", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", @@ -6306,7 +6308,7 @@ "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/data-hub": "<1.2.4", - "pimcore/pimcore": "<10.4.4", + "pimcore/pimcore": "<10.5.6", "pocketmine/bedrock-protocol": "<8.0.2", "pocketmine/pocketmine-mp": "<4.7.2|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", @@ -6327,6 +6329,8 @@ "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rankmath/seo-by-rank-math": "<=1.0.95", + "react/http": ">=0.7,<1.7", "remdex/livehelperchat": "<3.99", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", @@ -6341,7 +6345,7 @@ "shopware/core": "<=6.4.9", "shopware/platform": "<=6.4.9", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.7.13", + "shopware/shopware": "<=5.7.14", "shopware/storefront": "<=6.4.8.1", "shopxo/shopxo": "<2.2.6", "showdoc/showdoc": "<2.10.4", @@ -6365,8 +6369,8 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.45|>=4,<4.1.1", - "snipe/snipe-it": "<6.0.10|>= 6.0.0-RC-1, <= 6.0.0-RC-5", + "smarty/smarty": "<3.1.47|>=4,<4.2.1", + "snipe/snipe-it": "<6.0.11|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spipu/html2pdf": "<5.2.4", @@ -6428,7 +6432,7 @@ "thinkcmf/thinkcmf": "<=5.1.7", "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", - "topthink/framework": "<=6.0.12", + "topthink/framework": "<=6.0.13", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", "tribalsystems/zenario": "<9.2.55826", @@ -6436,7 +6440,7 @@ "twig/twig": "<1.38|>=2,<2.14.11|>=3,<3.3.8", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.57|>=8,<8.7.47|>=9,<9.5.35|>=10,<10.4.32|>=11,<11.5.16", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.58|>=8,<8.7.48|>=9,<9.5.37|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/html-sanitizer": ">=1,<1.0.7|>=2,<2.0.16", @@ -6445,7 +6449,7 @@ "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", - "unisharp/laravel-filemanager": "<=2.3", + "unisharp/laravel-filemanager": "<=2.5.1", "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "vanilla/safecurl": "<0.9.2", @@ -6537,7 +6541,7 @@ "type": "tidelift" } ], - "time": "2022-09-13T13:19:06+00:00" + "time": "2022-09-16T22:04:31+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6596,16 +6600,16 @@ }, { "name": "sebastian/comparator", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "c05dd1878ec74058a28a569c59fc5c53a8cc1c7a" + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c05dd1878ec74058a28a569c59fc5c53a8cc1c7a", - "reference": "c05dd1878ec74058a28a569c59fc5c53a8cc1c7a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", "shasum": "" }, "require": { @@ -6658,7 +6662,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" }, "funding": [ { @@ -6666,7 +6670,7 @@ "type": "github" } ], - "time": "2022-09-14T06:27:54+00:00" + "time": "2022-09-14T12:31:48+00:00" }, { "name": "sebastian/diff", From b1c4a056f3ef7d2443a3edb413fbb0d235ba9d36 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Sep 2022 08:58:37 +0200 Subject: [PATCH 025/210] DeployRunner: fix imports after configurable interface refactorings --- src/DeployRunner.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index fb1d68d..6314532 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -8,17 +8,17 @@ use Deployer\Host\Host; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\TaskFactory; use Hypernode\Deploy\Ephemeral\EphemeralHypernodeManager; use Hypernode\Deploy\Exception\CreateEphemeralHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; -use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; -use Hypernode\Deploy\Deployer\Task\TaskFactory; use Hypernode\Deploy\Exception\TimeoutException; +use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; +use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; -use Hypernode\DeployConfiguration\ServerRoleConfigurableInterface; use Hypernode\DeployConfiguration\Stage; -use Hypernode\DeployConfiguration\StageConfigurableInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArrayInput; From 3f7e33b3cd8b4d32a56f6802aeeb6c7aa4b5b960 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Sep 2022 09:00:43 +0200 Subject: [PATCH 026/210] TaskBuilder: fix imports after configurable interface refactorings --- src/Deployer/TaskBuilder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Deployer/TaskBuilder.php b/src/Deployer/TaskBuilder.php index 2b9b384..83cc2db 100644 --- a/src/Deployer/TaskBuilder.php +++ b/src/Deployer/TaskBuilder.php @@ -8,8 +8,8 @@ use Deployer\Task\Task; use Hypernode\DeployConfiguration\Command\Command; use Hypernode\DeployConfiguration\Command\DeployCommand; -use Hypernode\DeployConfiguration\ServerRoleConfigurableInterface; -use Hypernode\DeployConfiguration\StageConfigurableInterface; +use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; +use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\TaskConfigurationInterface; use function Deployer\parse; From f9461a89d57ac152fe4e168d846e24e323371d56 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Sep 2022 10:26:27 +0200 Subject: [PATCH 027/210] DeployRunner: return deployer exit code for runStage When Deployer tasks were failing, hypernode-deploy did not return a non-zero exit code --- src/Command/Build.php | 3 +-- src/Command/ComposerAuth.php | 3 +-- src/Command/Deploy.php | 3 +-- src/Command/RunTask.php | 3 +-- src/DeployRunner.php | 52 ++++++++++++++++++------------------ 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/Command/Build.php b/src/Command/Build.php index 2251c19..9466e43 100644 --- a/src/Command/Build.php +++ b/src/Command/Build.php @@ -33,7 +33,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, 'build', 'build'); - return 0; + return $this->deployRunner->run($output, 'build', 'build'); } } diff --git a/src/Command/ComposerAuth.php b/src/Command/ComposerAuth.php index e1cc1dd..6b5ea07 100644 --- a/src/Command/ComposerAuth.php +++ b/src/Command/ComposerAuth.php @@ -34,7 +34,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, 'build', 'deploy:vendors:auth'); - return 0; + return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth'); } } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 767b49b..3a4b957 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -35,7 +35,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, $input->getArgument('stage'), 'deploy'); - return 0; + return $this->deployRunner->run($output, $input->getArgument('stage'), 'deploy'); } } diff --git a/src/Command/RunTask.php b/src/Command/RunTask.php index a25616f..e7e42d7 100644 --- a/src/Command/RunTask.php +++ b/src/Command/RunTask.php @@ -36,7 +36,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $this->deployRunner->run($output, $input->getArgument('stage'), $input->getArgument('task')); - return 0; + return $this->deployRunner->run($output, $input->getArgument('stage'), $input->getArgument('task')); } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 2b736e1..de175f4 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -5,6 +5,7 @@ use Deployer\Deployer; use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; +use Deployer\Host\Host; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Exception\InvalidConfigurationException; @@ -67,10 +68,8 @@ public function __construct( * @throws GracefulShutdownException * @throws Throwable * @throws Exception - * - * @return void */ - public function run(OutputInterface $output, string $stage, string $task = 'deploy') + public function run(OutputInterface $output, string $stage, string $task = 'deploy'): int { $console = new Application(); $deployer = new Deployer($console); @@ -87,9 +86,10 @@ public function run(OutputInterface $output, string $stage, string $task = 'depl $this->initializeDeployer($deployer); } catch (InvalidConfigurationException $e) { $output->write($e->getMessage()); - return; + return 1; } - $this->runStage($deployer, $stage, $task); + + return $this->runStage($deployer, $stage, $task); } /** @@ -273,7 +273,7 @@ private function initializeBuildStage(Configuration $config): void * @throws Throwable * @throws Exception */ - private function runStage(Deployer $deployer, string $stage, string $task = 'deploy'): void + private function runStage(Deployer $deployer, string $stage, string $task = 'deploy'): int { $hosts = $deployer->selector->select("stage=$stage"); if (empty($hosts)) { @@ -283,30 +283,30 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $tasks = $deployer->scriptManager->getTasks($task); $executor = $deployer->master; - try { - /** - * Set the env variable to tell deployer to deploy the hosts sequentially instead of parallel. - * @see \Deployer\Executor\Master::runTask() - */ - putenv('DEPLOYER_LOCAL_WORKER=true'); - $executor->run($tasks, $hosts); - } catch (Throwable $exception) { - $deployer->output->writeln('[' . \get_class($exception) . '] ' . $exception->getMessage()); - $deployer->output->writeln($exception->getTraceAsString()); + /** + * Set the env variable to tell deployer to deploy the hosts sequentially instead of parallel. + * @see \Deployer\Executor\Master::runTask() + */ + putenv('DEPLOYER_LOCAL_WORKER=true'); + $exitCode = $executor->run($tasks, $hosts); - if ($exception instanceof GracefulShutdownException) { - throw $exception; - } + if ($exitCode === 0) { + return 0; + } - // Check if we have tasks to execute on failure - if ($deployer['fail']->has($task)) { - $taskName = $deployer['fail']->get($task); - $tasks = $deployer->scriptManager->getTasks($taskName); + if ($exitCode === GracefulShutdownException::EXIT_CODE) { + return 1; + } - $executor->run($tasks, $hosts); - } - throw $exception; + // Check if we have tasks to execute on failure + if ($deployer['fail']->has($task)) { + $taskName = $deployer['fail']->get($task); + $tasks = $deployer->scriptManager->getTasks($taskName); + + $executor->run($tasks, $hosts); } + + return $exitCode; } private function tryGetConfiguration(): Configuration From 5460cfb47c35057d5364f29763aad903f57916d1 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Sep 2022 12:56:12 +0200 Subject: [PATCH 028/210] ci: release `:latest` tag of Docker image --- ci/release_semantic_versions.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ci/release_semantic_versions.sh b/ci/release_semantic_versions.sh index 76d5d50..147f3b7 100755 --- a/ci/release_semantic_versions.sh +++ b/ci/release_semantic_versions.sh @@ -4,7 +4,7 @@ IMAGE=${IMAGE:-quay.io/hypernode/deploy} INPUT_VERSION=${INPUT_VERSION:-} TAG_SPECS="php${PHP_VERSION}-node${NODE_VERSION}" -if [ ! -n "${INPUT_VERSION}" ]; then +if [ -z "${INPUT_VERSION}" ]; then echo "No input version provided, stopping". exit 1 fi @@ -21,6 +21,7 @@ function tag_and_publish () { docker push "${TARGET_TAG}" } +LOCAL_IMAGE_TAG="$IMAGE:$INPUT_VERSION-$TAG_SPECS" if echo "${INPUT_VERSION}" | grep -F "."; then MAJOR_VERSION=$(echo "${INPUT_VERSION}" | cut -d. -f1) MINOR_VERSION=$(echo "${INPUT_VERSION}" | cut -d. -f2) @@ -31,13 +32,16 @@ if echo "${INPUT_VERSION}" | grep -F "."; then #PATCH_SUFFIX=$(echo "${PATCH_VERSION}" | cut -d- -f2-) PATCH_VERSION=$(echo "${PATCH_VERSION}" | cut -d- -f1) fi - tag_and_publish "$IMAGE:$INPUT_VERSION-$TAG_SPECS" "$IMAGE:$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION-$TAG_SPECS" + tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION-$TAG_SPECS" fi if [ -n "$MINOR_VERSION" ]; then - tag_and_publish "$IMAGE:$INPUT_VERSION-$TAG_SPECS" "$IMAGE:$MAJOR_VERSION.$MINOR_VERSION-$TAG_SPECS" + tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:$MAJOR_VERSION.$MINOR_VERSION-$TAG_SPECS" fi - tag_and_publish "$IMAGE:$INPUT_VERSION-$TAG_SPECS" "$IMAGE:$MAJOR_VERSION-$TAG_SPECS" + tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:$MAJOR_VERSION-$TAG_SPECS" fi +if [[ "${PHP_VERSION}" == "${LATEST_PHP_VERSION}" ]] && [[ "${NODE_VERSION}" == "${LATEST_NODE_VERSION}" ]]; then + tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:latest" +fi From 225af9233eeb3cbe1ff2408edd27f82f754f267a Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Mon, 19 Sep 2022 17:52:32 +0200 Subject: [PATCH 029/210] feat: allow for errors in initial window The API call to fetch playbooks tends to crap out in the beginning, so this initial window of allowing commits is to give it some room. --- src/Ephemeral/EphemeralHypernodeManager.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Ephemeral/EphemeralHypernodeManager.php b/src/Ephemeral/EphemeralHypernodeManager.php index 2767d53..f466d10 100644 --- a/src/Ephemeral/EphemeralHypernodeManager.php +++ b/src/Ephemeral/EphemeralHypernodeManager.php @@ -51,6 +51,8 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 $latest = microtime(true); $timeElapsed = 0; $resolved = false; + $interval = 3; + $allowedErrorWindow = 3; while ($timeElapsed < $timeout && !$resolved) { $now = microtime(true); @@ -76,10 +78,19 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 // Otherwise, there's an error, and it should be propagated. if ($e->getCode() !== 404) { throw $e; + } elseif ($timeElapsed < $allowedErrorWindow) { + // Some times we get an error where the logbook is not yet available, but it will be soon. + // We allow a small window for this to happen, and then we throw an exception. + sprintf( + 'Got an excepted exception during the allowed error window of HTTP code %d, waiting for %s to become available', + $e->getCode(), + $ephemeralHypernode + ); + continue; } } - sleep(5); + sleep($interval); } if (!$resolved) { From 5a9e5903725c025ab3cd2dfdc6f9579e06ced3f5 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Tue, 20 Sep 2022 10:08:10 +0200 Subject: [PATCH 030/210] typo: excepted -> expected --- src/Ephemeral/EphemeralHypernodeManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ephemeral/EphemeralHypernodeManager.php b/src/Ephemeral/EphemeralHypernodeManager.php index f466d10..7690f53 100644 --- a/src/Ephemeral/EphemeralHypernodeManager.php +++ b/src/Ephemeral/EphemeralHypernodeManager.php @@ -79,10 +79,10 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 if ($e->getCode() !== 404) { throw $e; } elseif ($timeElapsed < $allowedErrorWindow) { - // Some times we get an error where the logbook is not yet available, but it will be soon. + // Sometimes we get an error where the logbook is not yet available, but it will be soon. // We allow a small window for this to happen, and then we throw an exception. sprintf( - 'Got an excepted exception during the allowed error window of HTTP code %d, waiting for %s to become available', + 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available', $e->getCode(), $ephemeralHypernode ); From fd77a20ecdea4b626a3056ef6b45eaa08ce34a99 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Sep 2022 14:11:05 +0200 Subject: [PATCH 031/210] ci: rename pubkey --- ci/{key.pub => hypernode-insecure-deploy-ci-key.pub} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ci/{key.pub => hypernode-insecure-deploy-ci-key.pub} (100%) diff --git a/ci/key.pub b/ci/hypernode-insecure-deploy-ci-key.pub similarity index 100% rename from ci/key.pub rename to ci/hypernode-insecure-deploy-ci-key.pub From 399f8d4460abaf586e9b1d1e56497b96ff5a321a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Sep 2022 15:16:31 +0200 Subject: [PATCH 032/210] console: Add customized ConsoleLogger with different verbosity map --- src/Console/Output/ConsoleLogger.php | 136 +++++++++++++++++++++++++++ src/Di/ConsoleDefinition.php | 4 +- 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/Console/Output/ConsoleLogger.php diff --git a/src/Console/Output/ConsoleLogger.php b/src/Console/Output/ConsoleLogger.php new file mode 100644 index 0000000..da38b60 --- /dev/null +++ b/src/Console/Output/ConsoleLogger.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Hypernode\Deploy\Console\Output; + +use Psr\Log\AbstractLogger; +use Psr\Log\InvalidArgumentException; +use Psr\Log\LogLevel; +use Symfony\Component\Console\Output\ConsoleOutputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * PSR-3 compliant console logger. + * + * @author Kévin Dunglas + * + * @see https://www.php-fig.org/psr/psr-3/ + */ +class ConsoleLogger extends AbstractLogger +{ + public const INFO = 'info'; + public const ERROR = 'error'; + + private OutputInterface $output; + private array $verbosityLevelMap = [ + LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, + LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, + LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, + LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, + LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, + LogLevel::NOTICE => OutputInterface::VERBOSITY_NORMAL, + LogLevel::INFO => OutputInterface::VERBOSITY_NORMAL, + LogLevel::DEBUG => OutputInterface::VERBOSITY_VERBOSE, + ]; + private array $formatLevelMap = [ + LogLevel::EMERGENCY => self::ERROR, + LogLevel::ALERT => self::ERROR, + LogLevel::CRITICAL => self::ERROR, + LogLevel::ERROR => self::ERROR, + LogLevel::WARNING => self::INFO, + LogLevel::NOTICE => self::INFO, + LogLevel::INFO => self::INFO, + LogLevel::DEBUG => self::INFO, + ]; + private bool $errored = false; + + public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) + { + $this->output = $output; + $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; + $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; + } + + /** + * {@inheritdoc} + * + * @return void + */ + public function log($level, $message, array $context = []) + { + if (!isset($this->verbosityLevelMap[$level])) { + throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); + } + + $output = $this->output; + + // Write to the error output if necessary and available + if (self::ERROR === $this->formatLevelMap[$level]) { + if ($this->output instanceof ConsoleOutputInterface) { + $output = $this->output->getErrorOutput(); + } + $this->errored = true; + } + + // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. + // We only do it for efficiency here as the message formatting is relatively expensive. + if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { + $output->writeln( + sprintf( + '<%1$s>[%2$s] %3$s', + $this->formatLevelMap[$level], + $level, + $this->interpolate($message, $context) + ), + $this->verbosityLevelMap[$level] + ); + } + } + + /** + * Returns true when any messages have been logged at error levels. + * + * @return bool + */ + public function hasErrored() + { + return $this->errored; + } + + /** + * Interpolates context values into the message placeholders. + * + * @author PHP Framework Interoperability Group + */ + private function interpolate(string $message, array $context): string + { + if (!str_contains($message, '{')) { + return $message; + } + + $replacements = []; + foreach ($context as $key => $val) { + if (null === $val || \is_scalar($val) || (\is_object($val) && method_exists($val, '__toString'))) { + $replacements["{{$key}}"] = $val; + } elseif ($val instanceof \DateTimeInterface) { + $replacements["{{$key}}"] = $val->format(\DateTime::RFC3339); + } elseif (\is_object($val)) { + $replacements["{{$key}}"] = '[object ' . \get_class($val) . ']'; + } else { + $replacements["{{$key}}"] = '[' . \gettype($val) . ']'; + } + } + + return strtr($message, $replacements); + } +} diff --git a/src/Di/ConsoleDefinition.php b/src/Di/ConsoleDefinition.php index 32a03c0..26b269d 100644 --- a/src/Di/ConsoleDefinition.php +++ b/src/Di/ConsoleDefinition.php @@ -1,11 +1,13 @@ Date: Wed, 21 Sep 2022 14:47:36 +0200 Subject: [PATCH 033/210] feat: Allow `run-task` command to configure server / build stage --- src/Command/Build.php | 2 +- src/Command/ComposerAuth.php | 2 +- src/Command/Deploy.php | 2 +- src/Command/RunTask.php | 20 +++++++++++++++++--- src/DeployRunner.php | 29 +++++++++++++++-------------- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/Command/Build.php b/src/Command/Build.php index f979b19..c8bceec 100644 --- a/src/Command/Build.php +++ b/src/Command/Build.php @@ -33,6 +33,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD); + return $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD, true, false); } } diff --git a/src/Command/ComposerAuth.php b/src/Command/ComposerAuth.php index 6b5ea07..1dd5caf 100644 --- a/src/Command/ComposerAuth.php +++ b/src/Command/ComposerAuth.php @@ -34,6 +34,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth'); + return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth', false, false); } } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index e816d47..9b6031f 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -38,7 +38,7 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $result = $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY); + $result = $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY, false, true); if ($result === 0) { $this->reportWriter->write($this->deployRunner->getDeploymentReport()); diff --git a/src/Command/RunTask.php b/src/Command/RunTask.php index e7e42d7..93a303d 100644 --- a/src/Command/RunTask.php +++ b/src/Command/RunTask.php @@ -6,11 +6,17 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Throwable; class RunTask extends Command { + private const ARGUMENT_STAGE = 'stage'; + private const ARGUMENT_TASK = 'task'; + private const OPTION_CONFIGURE_BUILD_STAGE = 'configure-build-stage'; + private const OPTION_CONFIGURE_SERVERS = 'configure-servers'; + /** * @var DeployRunner */ @@ -27,8 +33,10 @@ protected function configure() parent::configure(); $this->setName('run-task'); $this->setDescription('Run a seperate deployer task'); - $this->addArgument('stage', InputArgument::REQUIRED, 'Stage'); - $this->addArgument('task', InputArgument::REQUIRED, 'Task to run'); + $this->addArgument(self::ARGUMENT_STAGE, InputArgument::REQUIRED, 'Stage'); + $this->addArgument(self::ARGUMENT_TASK, InputArgument::REQUIRED, 'Task to run'); + $this->addOption(self::OPTION_CONFIGURE_BUILD_STAGE, 'b', InputOption::VALUE_NONE, 'Configure build stage before running task'); + $this->addOption(self::OPTION_CONFIGURE_SERVERS, 's', InputOption::VALUE_NONE, 'Configure servers before running task'); } /** @@ -36,6 +44,12 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, $input->getArgument('stage'), $input->getArgument('task')); + return $this->deployRunner->run( + $output, + $input->getArgument(self::ARGUMENT_STAGE), + $input->getArgument(self::ARGUMENT_TASK), + $input->getOption(self::OPTION_CONFIGURE_BUILD_STAGE), + $input->getOption(self::OPTION_CONFIGURE_SERVERS), + ); } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index c4f8c8e..7b8753b 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -73,7 +73,7 @@ public function __construct( * @throws Throwable * @throws Exception */ - public function run(OutputInterface $output, string $stage, string $task = self::TASK_DEPLOY): int + public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers): int { $console = new Application(); $deployer = new Deployer($console); @@ -87,7 +87,7 @@ public function run(OutputInterface $output, string $stage, string $task = self: ); try { - $this->initializeDeployer($deployer, $task); + $this->initializeDeployer($deployer, $configureBuildStage, $configureServers); } catch (InvalidConfigurationException $e) { $output->write($e->getMessage()); return 1; @@ -104,13 +104,20 @@ public function run(OutputInterface $output, string $stage, string $task = self: * @throws Throwable * @throws InvalidConfigurationException */ - private function initializeDeployer(Deployer $deployer, string $task): void + private function initializeDeployer(Deployer $deployer, bool $configureBuildStage, bool $configureServers): void { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); $config = $this->getConfiguration($deployer); $config->setLogger($this->log); - $this->configureStages($config, $task); + + if ($configureBuildStage) { + $this->initializeBuildStage($config); + } + + if ($configureServers) { + $this->configureServers($config); + } foreach ($tasks as $task) { $task->configure($config); @@ -180,17 +187,11 @@ private function getConfiguration(Deployer $deployer): Configuration } } - private function configureStages(Configuration $config, string $task): void + private function configureServers(Configuration $config): void { - if ($task === self::TASK_BUILD) { - $this->initializeBuildStage($config); - } - - if ($task === self::TASK_DEPLOY) { - foreach ($config->getStages() as $stage) { - foreach ($stage->getServers() as $server) { - $this->configureStageServer($stage, $server, $config); - } + foreach ($config->getStages() as $stage) { + foreach ($stage->getServers() as $server) { + $this->configureStageServer($stage, $server, $config); } } } From 821c95c42aab289199a153bc5c6f3aab2c2b5cb1 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 21 Sep 2022 16:49:52 +0200 Subject: [PATCH 034/210] stage/deploy: Fix running `deploy:release` twice This caused the `deploy:cleanup` task to remove the just deployed release --- src/Deployer/Task/Deploy/PrepareTask.php | 4 ---- src/Deployer/Task/Deploy/UploadTask.php | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Deployer/Task/Deploy/PrepareTask.php b/src/Deployer/Task/Deploy/PrepareTask.php index 63e797c..6a0d19b 100644 --- a/src/Deployer/Task/Deploy/PrepareTask.php +++ b/src/Deployer/Task/Deploy/PrepareTask.php @@ -23,9 +23,5 @@ public function configure(Configuration $config): void 'deploy:shared', 'deploy:writable', ]); - task('deploy:prepare_release', [ - 'deploy:prepare', - 'deploy:release', - ])->select("roles=$role"); } } diff --git a/src/Deployer/Task/Deploy/UploadTask.php b/src/Deployer/Task/Deploy/UploadTask.php index 05eb608..75a114e 100644 --- a/src/Deployer/Task/Deploy/UploadTask.php +++ b/src/Deployer/Task/Deploy/UploadTask.php @@ -30,7 +30,7 @@ public function configure(Configuration $config): void task('deploy:upload', [ 'deploy:info', 'prepare:ssh', - 'deploy:prepare_release', + 'deploy:release', 'deploy:copy', 'deploy:deploy', ])->select("roles=$role"); From 6e85d5eb7cd19187ab127935187fc485a7147111 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Thu, 22 Sep 2022 08:14:38 +0200 Subject: [PATCH 035/210] add license --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d5c1e15 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Hypernode + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From f224e55f264698dbce933a089cf983cb68afb7fd Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Thu, 22 Sep 2022 08:16:53 +0200 Subject: [PATCH 036/210] move to LICENSE.txt (like hypernode-api-php) --- LICENSE => LICENSE.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename LICENSE => LICENSE.txt (95%) diff --git a/LICENSE b/LICENSE.txt similarity index 95% rename from LICENSE rename to LICENSE.txt index d5c1e15..691a79e 100644 --- a/LICENSE +++ b/LICENSE.txt @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) 2022 Hypernode +Copyright (c) 2022-present Hypernode Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From fc5ade8420a487e86046ed58b5f61a82353a09f5 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Thu, 22 Sep 2022 08:42:34 +0200 Subject: [PATCH 037/210] point users to deploy-configuration in the readme For most users the https://github.com/byteinternet/hypernode-deploy-configuration repository is the relevant repository to look at. --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 47296dc..f443d39 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +## Hypernode Deploy + +This is the official application deployment tool for the Hypernode, a highly automated hosting platform for ecommerce applications. + +If you want to use Hypernode Deploy in your shop you will probably want to head over to the [hypernode-deploy-configuration repository](https://github.com/ByteInternet/hypernode-deploy-configuration) instead. + +If you are looking to see how the internals of the deployment tool work or even want to contribute a change to the project yourself, then you're in the right place. + +This project builds the hypernode/deploy container image. + ## Switching node version ```bash From 85e5c490ae7d6a276d564b107fd384790bec2615 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 22 Sep 2022 09:24:56 +0200 Subject: [PATCH 038/210] Fix missing deploy:prepare step This problem was introduced in #54 --- src/Deployer/Task/Deploy/UploadTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/Deploy/UploadTask.php b/src/Deployer/Task/Deploy/UploadTask.php index 75a114e..d646e67 100644 --- a/src/Deployer/Task/Deploy/UploadTask.php +++ b/src/Deployer/Task/Deploy/UploadTask.php @@ -30,7 +30,7 @@ public function configure(Configuration $config): void task('deploy:upload', [ 'deploy:info', 'prepare:ssh', - 'deploy:release', + 'deploy:prepare', 'deploy:copy', 'deploy:deploy', ])->select("roles=$role"); From 20998fd5f2e19cb770098eed835b8ddc6179b4a8 Mon Sep 17 00:00:00 2001 From: Martijn Date: Tue, 18 Oct 2022 16:04:02 +0200 Subject: [PATCH 039/210] Added staging stage to ephemeral test deploy run --- ci/test/magento/deploy_ephemeral.php | 2 ++ ci/test/run-ephemeral.sh | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php index cda7fbe..546816b 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_ephemeral.php @@ -11,6 +11,8 @@ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); +$configuration->addStage('staging', 'banaan.store'); + $productionStage = $configuration->addStage('test', 'banaan.store'); $productionStage->addEphemeralServer('hndeployintegr8'); diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 7a1b00f..bf536e0 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -32,7 +32,8 @@ $DP hypernode-deploy build -f /web/deploy.php -vvv # Nginx/Supervisor/etc configs # ########################################## # SSH from deploy container to hypernode container -$DP hypernode-deploy deploy test -f /web/deploy.php -vvv +#$DP hypernode-deploy deploy test -f /web/deploy.php -vvv +$DP hypernode-deploy deploy staging -f /web/deploy.php -vvv # Run some tests From 9131b9b30a8e149a1a52c48d5733fba5e8e7f2c6 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Tue, 18 Oct 2022 16:57:46 +0200 Subject: [PATCH 040/210] fix: dont try public symlink if it exists --- src/Deployer/Task/Deploy/LinkTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index aadae07..7471de4 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -29,9 +29,9 @@ public function configure(Configuration $config): void } else { run('rmdir /data/web/public'); } + } else { + run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); } - - run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); })->select("roles=$role"); } } From 803e57aa46c4bec3fa13d38ec5b3a81520d6c5b5 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Tue, 18 Oct 2022 16:59:58 +0200 Subject: [PATCH 041/210] fix: also symlink if the empty dir was removed --- src/Deployer/Task/Deploy/LinkTask.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index 7471de4..519fa56 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -28,6 +28,7 @@ public function configure(Configuration $config): void return; } else { run('rmdir /data/web/public'); + run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); } } else { run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); From 3e99b3c1c5783c7edaab683a6869fe0d00f87f20 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Tue, 18 Oct 2022 17:04:22 +0200 Subject: [PATCH 042/210] fix: unlock deployer after failure Remove any lingering lockfiles after failure --- src/Deployer/Task/Deploy/FinalizeTask.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Deployer/Task/Deploy/FinalizeTask.php b/src/Deployer/Task/Deploy/FinalizeTask.php index c9628ea..39b86ea 100644 --- a/src/Deployer/Task/Deploy/FinalizeTask.php +++ b/src/Deployer/Task/Deploy/FinalizeTask.php @@ -7,6 +7,7 @@ use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\DeployConfiguration\Configuration; +use function Deployer\after; use function Deployer\fail; use function Deployer\task; @@ -35,5 +36,6 @@ public function configure(Configuration $config): void ])->select("roles=$role"); fail('deploy', 'deploy:failed'); + after('deploy:failed', 'deploy:unlock'); } } From d224798925d1003e95dac32626fba8a0434fb0f7 Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 11:17:23 +0200 Subject: [PATCH 043/210] Add server to stagingstage --- ci/test/magento/deploy_ephemeral.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php index 546816b..fa42da5 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_ephemeral.php @@ -11,9 +11,18 @@ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); -$configuration->addStage('staging', 'banaan.store'); +$stagingStage = $configuration->addStage('staging', 'banaan.store'); +$stagingStage->addServer('hypernode', null, [], [ + 'user' => 'app', + 'port' => 22, +]); $productionStage = $configuration->addStage('test', 'banaan.store'); +$productionStage->addServer('hypernode', null, [], [ + 'user' => 'app', + 'port' => 22, +]); + $productionStage->addEphemeralServer('hndeployintegr8'); return $configuration; From e22546fa388984493a223726d43cb9f42b1f3dd8 Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 11:57:40 +0200 Subject: [PATCH 044/210] Change hostname ephemeral testsuite --- ci/test/magento/deploy_ephemeral.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php index fa42da5..d81098b 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_ephemeral.php @@ -12,13 +12,13 @@ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); $stagingStage = $configuration->addStage('staging', 'banaan.store'); -$stagingStage->addServer('hypernode', null, [], [ +$stagingStage->addServer('hndeployintegr8', null, [], [ 'user' => 'app', 'port' => 22, ]); $productionStage = $configuration->addStage('test', 'banaan.store'); -$productionStage->addServer('hypernode', null, [], [ +$productionStage->addServer('hndeployintegr8', null, [], [ 'user' => 'app', 'port' => 22, ]); From 1eb2d53c9bc6ee58b93eb0450c5b71e3024325dc Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 12:37:46 +0200 Subject: [PATCH 045/210] Test and staging stage in ephemeral integration test. --- ci/test/magento/deploy_ephemeral.php | 4 ++-- ci/test/run-ephemeral.sh | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php index d81098b..1804544 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_ephemeral.php @@ -12,13 +12,13 @@ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); $stagingStage = $configuration->addStage('staging', 'banaan.store'); -$stagingStage->addServer('hndeployintegr8', null, [], [ +$stagingStage->addServer('hndeployintegr8.hypernode.io', null, [], [ 'user' => 'app', 'port' => 22, ]); $productionStage = $configuration->addStage('test', 'banaan.store'); -$productionStage->addServer('hndeployintegr8', null, [], [ +$productionStage->addServer('hndeployintegr8.hypernode.io', null, [], [ 'user' => 'app', 'port' => 22, ]); diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index bf536e0..4179652 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -32,10 +32,18 @@ $DP hypernode-deploy build -f /web/deploy.php -vvv # Nginx/Supervisor/etc configs # ########################################## # SSH from deploy container to hypernode container -#$DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP hypernode-deploy deploy staging -f /web/deploy.php -vvv -# Run some tests +# Run some tests, the staging environment should not have a ephemeral node +$DP ls -l +$DP test -f deployment-report.json +$DP jq . deployment-report.json +$DP jq .version deployment-report.json -r +$DP jq .stage deployment-report.json -r +$DP jq .hostnames[0] deployment-report.json -r + +# Now do a test deploy which should have a ephemeral node. +$DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json @@ -45,4 +53,5 @@ $DP jq .stage deployment-report.json -r $DP jq .hostnames[0] deployment-report.json -r $DP jq .ephemeral_hypernodes[0] deployment-report.json -r +# cleanup data $DP hypernode-deploy cleanup -vvv From cb9afc9adc3e8b8563e6ec182856b40bf91cdc2a Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 13:51:27 +0200 Subject: [PATCH 046/210] Only configure servers forgiven stage --- src/DeployRunner.php | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 7b8753b..cfd2903 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -87,7 +87,7 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ ); try { - $this->initializeDeployer($deployer, $configureBuildStage, $configureServers); + $this->initializeDeployer($deployer, $configureBuildStage, $configureServers, $stage); } catch (InvalidConfigurationException $e) { $output->write($e->getMessage()); return 1; @@ -101,11 +101,15 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ * * @throws Exception * @throws GracefulShutdownException - * @throws Throwable * @throws InvalidConfigurationException + * @throws Throwable */ - private function initializeDeployer(Deployer $deployer, bool $configureBuildStage, bool $configureServers): void - { + private function initializeDeployer( + Deployer $deployer, + bool $configureBuildStage, + bool $configureServers, + string $stage + ): void { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); $config = $this->getConfiguration($deployer); @@ -116,7 +120,7 @@ private function initializeDeployer(Deployer $deployer, bool $configureBuildStag } if ($configureServers) { - $this->configureServers($config); + $this->configureServers($config, $stage); } foreach ($tasks as $task) { @@ -187,11 +191,15 @@ private function getConfiguration(Deployer $deployer): Configuration } } - private function configureServers(Configuration $config): void + private function configureServers(Configuration $config, string $stage): void { - foreach ($config->getStages() as $stage) { - foreach ($stage->getServers() as $server) { - $this->configureStageServer($stage, $server, $config); + foreach ($config->getStages() as $configStage) { + if ($configStage->getName() !== $stage) { + continue; + } + + foreach ($configStage->getServers() as $server) { + $this->configureStageServer($configStage, $server, $config); } } } @@ -323,7 +331,7 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $exitCode = $executor->run($tasks, $hosts); if ($exitCode === 0) { - $this->deployedHostnames = array_map(fn (Host $host) => $host->getHostname(), $hosts); + $this->deployedHostnames = array_map(fn(Host $host) => $host->getHostname(), $hosts); $this->deployedStage = $stage; return 0; } From 31cd16ca0a9c19d54024ead6e2668f6ac064e0d8 Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 15:00:09 +0200 Subject: [PATCH 047/210] Deploy test only to ephemeral --- ci/test/magento/deploy_ephemeral.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_ephemeral.php index 1804544..cd5b9c3 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_ephemeral.php @@ -18,11 +18,6 @@ ]); $productionStage = $configuration->addStage('test', 'banaan.store'); -$productionStage->addServer('hndeployintegr8.hypernode.io', null, [], [ - 'user' => 'app', - 'port' => 22, -]); - $productionStage->addEphemeralServer('hndeployintegr8'); return $configuration; From ed2c368789236671f09efb7c2e9db45518d07364 Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 15:12:54 +0200 Subject: [PATCH 048/210] Renamed deploy folder ephemeral test suite --- ci/test/run-ephemeral.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 4179652..552b2aa 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" +DP="docker run --rm -v /tmp/m2build:/web1 -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web1 hndeploy" # Build Docker image docker build \ @@ -24,7 +24,7 @@ rsync -a -e "ssh -o StrictHostKeyChecking=no" app@hndeployintegr8.hypernode.io:m rm /tmp/m2build/app/etc/env.php # Build application -$DP hypernode-deploy build -f /web/deploy.php -vvv +$DP hypernode-deploy build -f /web1/deploy.php -vvv ########################################## # DEPLOY WITHOUT PLATFORM CONFIGURATIONS # @@ -32,7 +32,7 @@ $DP hypernode-deploy build -f /web/deploy.php -vvv # Nginx/Supervisor/etc configs # ########################################## # SSH from deploy container to hypernode container -$DP hypernode-deploy deploy staging -f /web/deploy.php -vvv +$DP hypernode-deploy deploy staging -f /web1/deploy.php -vvv # Run some tests, the staging environment should not have a ephemeral node $DP ls -l @@ -43,7 +43,7 @@ $DP jq .stage deployment-report.json -r $DP jq .hostnames[0] deployment-report.json -r # Now do a test deploy which should have a ephemeral node. -$DP hypernode-deploy deploy test -f /web/deploy.php -vvv +$DP hypernode-deploy deploy test -f /web1/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json From f989b749078f246b0415065c639b0ade7e575416 Mon Sep 17 00:00:00 2001 From: Martijn Date: Wed, 19 Oct 2022 16:41:36 +0200 Subject: [PATCH 049/210] remove var/log dir before build --- ci/test/run-ephemeral.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 552b2aa..d2f1402 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run --rm -v /tmp/m2build:/web1 -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web1 hndeploy" +DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" # Build Docker image docker build \ @@ -22,9 +22,10 @@ mkdir -p "$HOME/.ssh" cp ci/test/magento/deploy_ephemeral.php /tmp/m2build/deploy.php rsync -a -e "ssh -o StrictHostKeyChecking=no" app@hndeployintegr8.hypernode.io:magento2/ /tmp/m2build rm /tmp/m2build/app/etc/env.php +rm -rf /tmp/m2build/var/log # Build application -$DP hypernode-deploy build -f /web1/deploy.php -vvv +$DP hypernode-deploy build -f /web/deploy.php -vvv ########################################## # DEPLOY WITHOUT PLATFORM CONFIGURATIONS # @@ -32,7 +33,7 @@ $DP hypernode-deploy build -f /web1/deploy.php -vvv # Nginx/Supervisor/etc configs # ########################################## # SSH from deploy container to hypernode container -$DP hypernode-deploy deploy staging -f /web1/deploy.php -vvv +$DP hypernode-deploy deploy staging -f /web/deploy.php -vvv # Run some tests, the staging environment should not have a ephemeral node $DP ls -l @@ -43,7 +44,7 @@ $DP jq .stage deployment-report.json -r $DP jq .hostnames[0] deployment-report.json -r # Now do a test deploy which should have a ephemeral node. -$DP hypernode-deploy deploy test -f /web1/deploy.php -vvv +$DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json From ff85c38f6ae96d7ba3f699012fd9442e90d5ccdf Mon Sep 17 00:00:00 2001 From: Martijn Date: Thu, 20 Oct 2022 11:29:48 +0200 Subject: [PATCH 050/210] remove var/log dir before build --- ci/test/run-ephemeral.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index d2f1402..4bb7349 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -32,7 +32,7 @@ $DP hypernode-deploy build -f /web/deploy.php -vvv # This should pass, but not generate any # # Nginx/Supervisor/etc configs # ########################################## -# SSH from deploy container to hypernode container +# SSH from deploy container to Hypernode container $DP hypernode-deploy deploy staging -f /web/deploy.php -vvv # Run some tests, the staging environment should not have a ephemeral node From 9ccf71e8fad32ecd368c550aaf3828e9762d2953 Mon Sep 17 00:00:00 2001 From: Martijn Date: Thu, 20 Oct 2022 12:12:54 +0200 Subject: [PATCH 051/210] Added "-e" option: set the exit status code based on the output; --- ci/test/run-ephemeral.sh | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 4bb7349..0ac4f2d 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -39,9 +39,10 @@ $DP hypernode-deploy deploy staging -f /web/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json $DP jq . deployment-report.json -$DP jq .version deployment-report.json -r -$DP jq .stage deployment-report.json -r -$DP jq .hostnames[0] deployment-report.json -r +$DP jq .version deployment-report.json -r -e +$DP jq .stage deployment-report.json -r -e +$DP jq .hostnames[0] deployment-report.json -r -e +$DP jq .ephemeral_hypernodes | select(length == 0) deployment-report.json -r -e # Now do a test deploy which should have a ephemeral node. $DP hypernode-deploy deploy test -f /web/deploy.php -vvv @@ -49,10 +50,10 @@ $DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l $DP test -f deployment-report.json $DP jq . deployment-report.json -$DP jq .version deployment-report.json -r -$DP jq .stage deployment-report.json -r -$DP jq .hostnames[0] deployment-report.json -r -$DP jq .ephemeral_hypernodes[0] deployment-report.json -r +$DP jq .version deployment-report.json -r -e +$DP jq .stage deployment-report.json -r -e +$DP jq .hostnames[0] deployment-report.json -r -e +$DP jq .ephemeral_hypernodes[0] deployment-report.json -r -e # cleanup data $DP hypernode-deploy cleanup -vvv From 0f65bb694297c98e6ee66fd7f7b9b3e2071f5d28 Mon Sep 17 00:00:00 2001 From: Martijn Date: Thu, 20 Oct 2022 12:28:19 +0200 Subject: [PATCH 052/210] Added quotes to the ephemeral length check --- ci/test/run-ephemeral.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-ephemeral.sh index 0ac4f2d..61b6682 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-ephemeral.sh @@ -42,7 +42,7 @@ $DP jq . deployment-report.json $DP jq .version deployment-report.json -r -e $DP jq .stage deployment-report.json -r -e $DP jq .hostnames[0] deployment-report.json -r -e -$DP jq .ephemeral_hypernodes | select(length == 0) deployment-report.json -r -e +$DP jq '.ephemeral_hypernodes | select(length == 0)' deployment-report.json -r -e # Now do a test deploy which should have a ephemeral node. $DP hypernode-deploy deploy test -f /web/deploy.php -vvv From 732b453e5c9f60e5f5e6fc10e6c608ff3a46e06e Mon Sep 17 00:00:00 2001 From: Martijn Date: Fri, 21 Oct 2022 10:50:25 +0200 Subject: [PATCH 053/210] Updated dependencies --- .github/workflows/test.yaml | 14 +++--- ...ploy_ephemeral.php => deploy_brancher.php} | 2 +- ci/test/{run-ephemeral.sh => run-brancher.sh} | 4 +- composer.json | 2 +- composer.lock | 27 ++++++----- .../BrancherHypernodeManager.php} | 40 ++++++++-------- src/Command/Cleanup.php | 12 ++--- src/DeployRunner.php | 46 +++++++++---------- ...reateEphemeralHypernodeFailedException.php | 2 +- src/Report/Report.php | 16 +++---- 10 files changed, 82 insertions(+), 83 deletions(-) rename ci/test/magento/{deploy_ephemeral.php => deploy_brancher.php} (88%) rename ci/test/{run-ephemeral.sh => run-brancher.sh} (91%) rename src/{Ephemeral/EphemeralHypernodeManager.php => Brancher/BrancherHypernodeManager.php} (70%) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 590fad7..b2dc107 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,8 +6,8 @@ jobs: integration_test: strategy: matrix: - php_version: [7.4, 8.1] - testsuite: [general, ephemeral] + ngfhmbv n + testsuite: [general, brancher] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy @@ -18,14 +18,14 @@ jobs: shell: bash env: PHP_VERSION: ${{ matrix.php_version }} - - name: Start SSH agent for ephemeral testsuite - if: ${{ matrix.testsuite == 'ephemeral' && matrix.php_version == '8.1' }} + - name: Start SSH agent for brancher testsuite + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.1' }} uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - - name: Run ephemeral testsuite - if: ${{ matrix.testsuite == 'ephemeral' && matrix.php_version == '8.1' }} - run: ./runtests.sh ephemeral + - name: Run brancher testsuite + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.1' }} + run: ./runtests.sh brancher shell: bash env: PHP_VERSION: ${{ matrix.php_version }} diff --git a/ci/test/magento/deploy_ephemeral.php b/ci/test/magento/deploy_brancher.php similarity index 88% rename from ci/test/magento/deploy_ephemeral.php rename to ci/test/magento/deploy_brancher.php index cda7fbe..f1edfb0 100644 --- a/ci/test/magento/deploy_ephemeral.php +++ b/ci/test/magento/deploy_brancher.php @@ -12,6 +12,6 @@ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); $productionStage = $configuration->addStage('test', 'banaan.store'); -$productionStage->addEphemeralServer('hndeployintegr8'); +$productionStage->addBrancherServer('hndeployintegr8'); return $configuration; diff --git a/ci/test/run-ephemeral.sh b/ci/test/run-brancher.sh similarity index 91% rename from ci/test/run-ephemeral.sh rename to ci/test/run-brancher.sh index 7a1b00f..75cf4a4 100755 --- a/ci/test/run-ephemeral.sh +++ b/ci/test/run-brancher.sh @@ -19,7 +19,7 @@ docker build \ $HN /data/web/magento2/bin/magento app:config:dump scopes themes mkdir /tmp/m2build mkdir -p "$HOME/.ssh" -cp ci/test/magento/deploy_ephemeral.php /tmp/m2build/deploy.php +cp ci/test/magento/deploy_brancher.php /tmp/m2build/deploy.php rsync -a -e "ssh -o StrictHostKeyChecking=no" app@hndeployintegr8.hypernode.io:magento2/ /tmp/m2build rm /tmp/m2build/app/etc/env.php @@ -42,6 +42,6 @@ $DP jq . deployment-report.json $DP jq .version deployment-report.json -r $DP jq .stage deployment-report.json -r $DP jq .hostnames[0] deployment-report.json -r -$DP jq .ephemeral_hypernodes[0] deployment-report.json -r +$DP jq .brancher_hypernodes[0] deployment-report.json -r $DP hypernode-deploy cleanup -vvv diff --git a/composer.json b/composer.json index 59e7c49..31b2eb0 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "dev-master", - "hypernode/deploy-configuration": "v3.x-dev", + "hypernode/deploy-configuration": "v3.0.0", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 6f5c4b7..5535867 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c2050586df39ec657cd256f09544ea60", + "content-hash": "39b23eb540c8c7de2b3500a08cecdf01", "packages": [ { "name": "clue/stream-filter", @@ -733,12 +733,12 @@ "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "0a40102d119f5678447b6e0682d939fcb077a622" + "reference": "c40c85bcf1940486edb667e949ff09b9003df664" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/0a40102d119f5678447b6e0682d939fcb077a622", - "reference": "0a40102d119f5678447b6e0682d939fcb077a622", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/c40c85bcf1940486edb667e949ff09b9003df664", + "reference": "c40c85bcf1940486edb667e949ff09b9003df664", "shasum": "" }, "require": { @@ -775,22 +775,22 @@ "description": "Hypernode API Client for PHP", "support": { "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/master" + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.1.0" }, - "time": "2022-09-14T07:21:34+00:00" + "time": "2022-10-21T08:40:17+00:00" }, { "name": "hypernode/deploy-configuration", - "version": "v3.x-dev", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "39ba384b779da41e3f7c6e12056c6a2bdb9b62b4" + "reference": "c1d105abb790b57b5474da07afa66721d02f0442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/39ba384b779da41e3f7c6e12056c6a2bdb9b62b4", - "reference": "39ba384b779da41e3f7c6e12056c6a2bdb9b62b4", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/c1d105abb790b57b5474da07afa66721d02f0442", + "reference": "c1d105abb790b57b5474da07afa66721d02f0442", "shasum": "" }, "require": { @@ -817,9 +817,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/v3" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.0.0" }, - "time": "2022-09-16T13:49:04+00:00" + "time": "2022-10-21T08:39:30+00:00" }, { "name": "justinrainbow/json-schema", @@ -7549,7 +7549,6 @@ "stability-flags": { "deployer/deployer": 20, "hypernode/api-client": 20, - "hypernode/deploy-configuration": 20, "roave/security-advisories": 20 }, "prefer-stable": false, @@ -7560,5 +7559,5 @@ "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.0.0" } diff --git a/src/Ephemeral/EphemeralHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php similarity index 70% rename from src/Ephemeral/EphemeralHypernodeManager.php rename to src/Brancher/BrancherHypernodeManager.php index 7690f53..4358144 100644 --- a/src/Ephemeral/EphemeralHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -1,17 +1,17 @@ hypernodeClient->ephemeralApp->create($hypernode); + return $this->hypernodeClient->brancherApp->create($hypernode); } /** - * Wait for ephemeral Hypernode to become available. + * Wait for brancher Hypernode to become available. * - * @param string $ephemeralHypernode Name of the ephemeral Hypernode + * @param string $brancherHypernode Name of the brancher Hypernode * @param int $timeout Maximum time to wait for availability * @return void - * @throws CreateEphemeralHypernodeFailedException + * @throws CreateBrancherHypernodeFailedException * @throws HypernodeApiClientException * @throws HypernodeApiServerException * @throws TimeoutException */ - public function waitForAvailability(string $ephemeralHypernode, int $timeout = 900): void + public function waitForAvailability(string $brancherHypernode, int $timeout = 900): void { $latest = microtime(true); $timeElapsed = 0; @@ -60,13 +60,13 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 $latest = $now; try { - $flows = $this->hypernodeClient->logbook->getList($ephemeralHypernode); + $flows = $this->hypernodeClient->logbook->getList($brancherHypernode); $relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app'); $failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted()); $completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete()); if (count($failedFlows) === count($relevantFlows)) { - throw new CreateEphemeralHypernodeFailedException(); + throw new CreateBrancherHypernodeFailedException(); } if ($relevantFlows && count($completedFlows) === count($relevantFlows)) { @@ -84,7 +84,7 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 sprintf( 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available', $e->getCode(), - $ephemeralHypernode + $brancherHypernode ); continue; } @@ -95,23 +95,23 @@ public function waitForAvailability(string $ephemeralHypernode, int $timeout = 9 if (!$resolved) { throw new TimeoutException( - sprintf('Timed out waiting for ephemeral Hypernode %s to become available', $ephemeralHypernode) + sprintf('Timed out waiting for brancher Hypernode %s to become available', $brancherHypernode) ); } } /** - * Cancel one or multiple ephemeral Hypernodes. + * Cancel one or multiple brancher Hypernodes. * - * @param string ...$ephemeralHypernodes Name(s) of the ephemeral Hypernode(s) + * @param string ...$brancherHypernodes Name(s) of the brancher Hypernode(s) * @throws HypernodeApiClientException * @throws HypernodeApiServerException */ - public function cancel(string ...$ephemeralHypernodes): void + public function cancel(string ...$brancherHypernodes): void { - foreach ($ephemeralHypernodes as $ephemeralHypernode) { - $this->log->info(sprintf('Stopping ephemeral Hypernode %s...', $ephemeralHypernode)); - $this->hypernodeClient->ephemeralApp->cancel($ephemeralHypernode); + foreach ($brancherHypernodes as $brancherHypernode) { + $this->log->info(sprintf('Stopping brancher Hypernode %s...', $brancherHypernode)); + $this->hypernodeClient->brancherApp->cancel($brancherHypernode); } } } diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index e9608d5..fd0576b 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -4,7 +4,7 @@ namespace Hypernode\Deploy\Command; -use Hypernode\Deploy\Ephemeral\EphemeralHypernodeManager; +use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\Report\ReportLoader; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -14,14 +14,14 @@ class Cleanup extends Command { private ReportLoader $reportLoader; - private EphemeralHypernodeManager $ephemeralHypernodeManager; + private BrancherHypernodeManager $brancherHypernodeManager; - public function __construct(ReportLoader $reportLoader, EphemeralHypernodeManager $ephemeralHypernodeManager) + public function __construct(ReportLoader $reportLoader, BrancherHypernodeManager $brancherHypernodeManager) { parent::__construct(); $this->reportLoader = $reportLoader; - $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; + $this->brancherHypernodeManager = $brancherHypernodeManager; } protected function configure() @@ -29,7 +29,7 @@ protected function configure() parent::configure(); $this->setName('cleanup'); $this->setDescription( - 'Clean up any acquired resources during the deployment, like ephemeral Hypernodes.' + 'Clean up any acquired resources during the deployment, like brancher Hypernodes.' ); } @@ -45,7 +45,7 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } - $this->ephemeralHypernodeManager->cancel(...$report->getEphemeralHypernodes()); + $this->brancherHypernodeManager->cancel(...$report->getBrancherHypernodes()); return 0; } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 7b8753b..2c9ef21 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -10,8 +10,8 @@ use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; use Hypernode\Deploy\Deployer\Task\TaskFactory; -use Hypernode\Deploy\Ephemeral\EphemeralHypernodeManager; -use Hypernode\Deploy\Exception\CreateEphemeralHypernodeFailedException; +use Hypernode\Deploy\Brancher\BrancherHypernodeManager; +use Hypernode\Deploy\Exception\CreateBrancherHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Exception\TimeoutException; use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; @@ -42,14 +42,14 @@ class DeployRunner private InputInterface $input; private LoggerInterface $log; private RecipeLoader $recipeLoader; - private EphemeralHypernodeManager $ephemeralHypernodeManager; + private BrancherHypernodeManager $brancherHypernodeManager; /** - * Registered ephemeral Hypernodes to stop/cancel after running. + * Registered branccher Hypernodes to stop/cancel after running. * * @var string[] */ - private array $ephemeralHypernodesRegistered = []; + private array $brancherHypernodesRegistered = []; private array $deployedHostnames = []; private string $deployedStage = ''; @@ -59,13 +59,13 @@ public function __construct( InputInterface $input, LoggerInterface $log, RecipeLoader $recipeLoader, - EphemeralHypernodeManager $ephemeralHypernodeManager + BrancherHypernodeManager $brancherHypernodeManager ) { $this->taskFactory = $taskFactory; $this->input = $input; $this->log = $log; $this->recipeLoader = $recipeLoader; - $this->ephemeralHypernodeManager = $ephemeralHypernodeManager; + $this->brancherHypernodeManager = $brancherHypernodeManager; } /** @@ -198,7 +198,7 @@ private function configureServers(Configuration $config): void private function configureStageServer(Stage $stage, Server $server, Configuration $config): void { - $this->maybeConfigureEphemeralServer($server); + $this->maybeConfigureBrancherServer($server); $host = host($stage->getName() . ':' . $server->getHostname()); $host->setHostname($server->getHostname()); @@ -251,24 +251,24 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio } } - private function maybeConfigureEphemeralServer(Server $server): void + private function maybeConfigureBrancherServer(Server $server): void { $serverOptions = $server->getOptions(); - $isEphemeral = $serverOptions[Server::OPTION_HN_EPHEMERAL] ?? false; + $isBrancher = $serverOptions[Server::OPTION_HN_BRANCHER] ?? false; $parentApp = $serverOptions[Server::OPTION_HN_PARENT_APP] ?? null; - if ($isEphemeral && $parentApp) { - $this->log->info(sprintf('Creating an ephemeral Hypernode based on %s.', $parentApp)); - $ephemeralApp = $this->ephemeralHypernodeManager->createForHypernode($parentApp); - $server->setHostname(sprintf("%s.hypernode.io", $ephemeralApp)); - $this->ephemeralHypernodesRegistered[] = $ephemeralApp; - $this->log->info(sprintf('Successfully requested ephemeral Hypernode, name is %s.', $ephemeralApp)); + if ($isBrancher && $parentApp) { + $this->log->info(sprintf('Creating an brancher Hypernode based on %s.', $parentApp)); + $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp); + $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); + $this->brancherHypernodesRegistered[] = $brancherApp; + $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); try { - $this->log->info('Waiting for ephemeral Hypernode to become available...'); - $this->ephemeralHypernodeManager->waitForAvailability($ephemeralApp); - $this->log->info('Ephemeral Hypernode has become available!'); - } catch (CreateEphemeralHypernodeFailedException | TimeoutException $e) { - $this->ephemeralHypernodeManager->cancel($ephemeralApp); + $this->log->info('Waiting for brancher Hypernode to become available...'); + $this->brancherHypernodeManager->waitForAvailability($brancherApp); + $this->log->info('Brancher Hypernode has become available!'); + } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { + $this->brancherHypernodeManager->cancel($brancherApp); throw $e; } } @@ -340,7 +340,7 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $executor->run($tasks, $hosts); } - $this->ephemeralHypernodeManager->cancel(...$this->ephemeralHypernodesRegistered); + $this->brancherHypernodeManager->cancel(...$this->brancherHypernodesRegistered); return $exitCode; } @@ -409,7 +409,7 @@ public function getDeploymentReport() return new Report\Report( $this->deployedStage, $this->deployedHostnames, - $this->ephemeralHypernodesRegistered + $this->brancherHypernodesRegistered ); } } diff --git a/src/Exception/CreateEphemeralHypernodeFailedException.php b/src/Exception/CreateEphemeralHypernodeFailedException.php index dd068b0..3550992 100644 --- a/src/Exception/CreateEphemeralHypernodeFailedException.php +++ b/src/Exception/CreateEphemeralHypernodeFailedException.php @@ -6,6 +6,6 @@ use Exception; -class CreateEphemeralHypernodeFailedException extends Exception +class CreateBrancherHypernodeFailedException extends Exception { } diff --git a/src/Report/Report.php b/src/Report/Report.php index b79c838..bb12db6 100644 --- a/src/Report/Report.php +++ b/src/Report/Report.php @@ -17,24 +17,24 @@ class Report /** * @var string[] */ - private array $ephemeralHypernodes; + private array $brancherHypernodes; private string $version; /** * @param string $stage * @param string[] $hostnames - * @param string[] $ephemeralHypernodes + * @param string[] $brancherHypernodes * @param string $version Version of the report file */ public function __construct( string $stage, array $hostnames, - array $ephemeralHypernodes, + array $brancherHypernodes, string $version = self::REPORT_VERSION ) { $this->stage = $stage; $this->hostnames = $hostnames; - $this->ephemeralHypernodes = $ephemeralHypernodes; + $this->brancherHypernodes = $brancherHypernodes; $this->version = $version; } @@ -59,9 +59,9 @@ public function getHostnames(): array /** * @return string[] */ - public function getEphemeralHypernodes(): array + public function getBrancherHypernodes(): array { - return $this->ephemeralHypernodes; + return $this->brancherHypernodes; } public function toArray(): array @@ -70,7 +70,7 @@ public function toArray(): array 'version' => $this->version, 'stage' => $this->stage, 'hostnames' => $this->hostnames, - 'ephemeral_hypernodes' => $this->ephemeralHypernodes, + 'brancher_hypernodes' => $this->brancherHypernodes, ]; } @@ -79,7 +79,7 @@ public static function fromArray(array $data): Report return new Report( $data['stage'], $data['hostnames'], - $data['ephemeral_hypernodes'], + $data['brancher_hypernodes'], $data['version'], ); } From e14fa933ca4d38b6a43f5b252ead24db6d98f9ae Mon Sep 17 00:00:00 2001 From: Martijn Date: Fri, 21 Oct 2022 10:58:23 +0200 Subject: [PATCH 054/210] Fixed typo in github workflows --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b2dc107..f6cb4da 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - ngfhmbv n + php_version: [7.4, 8.1] testsuite: [general, brancher] runs-on: ubuntu-latest steps: From 35eceb4443545d98e68dae260f039392acd164b4 Mon Sep 17 00:00:00 2001 From: Martijn Date: Fri, 21 Oct 2022 12:08:52 +0200 Subject: [PATCH 055/210] Changed ephemeral to brancher in testsuite --- ci/test/run-brancher.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index dbb77a7..219c7ea 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -35,16 +35,16 @@ $DP hypernode-deploy build -f /web/deploy.php -vvv # SSH from deploy container to Hypernode container $DP hypernode-deploy deploy staging -f /web/deploy.php -vvv -# Run some tests, the staging environment should not have a ephemeral node +# Run some tests, the staging environment should not have a brancher node $DP ls -l $DP test -f deployment-report.json $DP jq . deployment-report.json $DP jq .version deployment-report.json -r -e $DP jq .stage deployment-report.json -r -e $DP jq .hostnames[0] deployment-report.json -r -e -$DP jq '.ephemeral_hypernodes | select(length == 0)' deployment-report.json -r -e +$DP jq '.brancher_hypernodes | select(length == 0)' deployment-report.json -r -e -# Now do a test deploy which should have a ephemeral node. +# Now do a test deploy which should have a brancher node. $DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l @@ -53,7 +53,7 @@ $DP jq . deployment-report.json $DP jq .version deployment-report.json -r -e $DP jq .stage deployment-report.json -r -e $DP jq .hostnames[0] deployment-report.json -r -e -$DP jq .ephemeral_hypernodes[0] deployment-report.json -r -e +$DP jq .brancher_hypernodes[0] deployment-report.json -r -e # cleanup data $DP hypernode-deploy cleanup -vvv From 2c453d4f4ed33682c05555ea5be63ca81d640f5c Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Fri, 21 Oct 2022 15:22:29 +0200 Subject: [PATCH 056/210] remove old 'build image locally' from readme --- README.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.md b/README.md index f443d39..7d7fa5c 100644 --- a/README.md +++ b/README.md @@ -28,17 +28,6 @@ tools/vendor/bin/grumphp run --config tools/grumphp.yml ### Docker container We use Google Container Structure Tests over https://github.com/aelsabbahy/goss because the Hipex deploy container does not require a health check. -## Build images locally - -```bash -CONTAINER_IMAGE=hipex/deploy/dev \ -CI_COMMIT_TAG=2.0.2 \ -PHP_VERSION=7.4 \ -NODE_VERSION=14 \ -LOCAL_BUILD= \ -./ci/build.sh -``` - ## Run with local image ```bash From 1c1ea5787dd8a180d45d77fcf458ffbb4fdb26e1 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Sat, 22 Oct 2022 14:17:48 +0200 Subject: [PATCH 057/210] add instructions to build and run local image add instructions to the README.md on how to build and use a local image (for development) --- README.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7d7fa5c..10801cd 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,31 @@ If you are looking to see how the internals of the deployment tool work or even This project builds the hypernode/deploy container image. +## Building and running a local image + +If you don't want to use a pre-built image from https://quay.io/hypernode/deploy or if you are doing development on this project and you want to test out your changes, you can built an image locally and use that. + +```bash +export LOCAL_BUILD= # So we don't try to push +export CONTAINER_IMAGE=hypernode/deploy/dev +export PHP_VERSION=7.4 +export NODE_VERSION=14 +bash -x ci/build.sh +``` + +This will give you a locally built image: +```bash +$ docker images | grep hypernode/deploy/dev +hypernode/deploy/dev php7.4-node14 ece785ad21f5 2 minutes ago 753MB +``` + +That you could then use like: +```bash +$ rm -Rf vendor # in case we need to do some cleanup +$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode/deploy/dev:php7.4-node14 hypernode-deploy build -vvv +$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode/deploy/dev:php7.4-node14 hypernode-deploy deploy staging -vvv +``` + ## Switching node version ```bash @@ -27,10 +52,3 @@ tools/vendor/bin/grumphp run --config tools/grumphp.yml ### Docker container We use Google Container Structure Tests over https://github.com/aelsabbahy/goss because the Hipex deploy container does not require a health check. - -## Run with local image - -```bash -rm -Rf vendor -docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa_mydeploykey | base64)" -v ${PWD}:/build hipex/deploy/dev:2.1.0-php7.3-node13 hipex-deploy build -vvv -``` From 1318d4ca33a09e3f9c448f92a387d9798a7b4584 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 24 Nov 2022 16:56:35 +0100 Subject: [PATCH 058/210] Create Brancher node with provided labels and settings This takes the labels and settings configured in the `deploy.php`, validates the data and passes them on to Hypernode API when creating a Brancher instance. Next step will be the ability to cleanup Brancher instances based on deployment stage and Brancher labels. --- composer.json | 4 +- composer.lock | 429 ++++++++++--------- src/Brancher/BrancherDataValidator.php | 38 ++ src/Brancher/BrancherHypernodeManager.php | 5 +- src/DeployRunner.php | 13 +- src/Exception/ValidationException.php | 11 + tests/Brancher/BrancherDataValidatorTest.php | 35 ++ 7 files changed, 326 insertions(+), 209 deletions(-) create mode 100644 src/Brancher/BrancherDataValidator.php create mode 100644 src/Exception/ValidationException.php create mode 100644 tests/Brancher/BrancherDataValidatorTest.php diff --git a/composer.json b/composer.json index 31b2eb0..90b338a 100644 --- a/composer.json +++ b/composer.json @@ -14,8 +14,8 @@ "deployer/deployer": "dev-master#e374a8e as v7.0.0", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", - "hypernode/api-client": "dev-master", - "hypernode/deploy-configuration": "v3.0.0", + "hypernode/api-client": "^0.2", + "hypernode/deploy-configuration": "^3.0", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 5535867..32afd88 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "39b23eb540c8c7de2b3500a08cecdf01", + "content-hash": "1753404b5ca6d05cc4b2c167bef4b0f3", "packages": [ { "name": "clue/stream-filter", @@ -142,7 +142,7 @@ "type": "github" } ], - "time": "2022-09-12T10:53:42+00:00" + "time": "2022-10-27T07:36:02+00:00" }, { "name": "doctrine/annotations", @@ -610,16 +610,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.4.1", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379" + "reference": "67c26b443f348a51926030c83481b85718457d3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/69568e4293f4fa993f3b0e51c9723e1e17c41379", - "reference": "69568e4293f4fa993f3b0e51c9723e1e17c41379", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", "shasum": "" }, "require": { @@ -709,7 +709,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.1" + "source": "https://github.com/guzzle/psr7/tree/2.4.3" }, "funding": [ { @@ -725,20 +725,20 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:45:39+00:00" + "time": "2022-10-26T14:07:24+00:00" }, { "name": "hypernode/api-client", - "version": "dev-master", + "version": "0.2.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "c40c85bcf1940486edb667e949ff09b9003df664" + "reference": "9a93ee94be06a2265cf7fb6eed75b50a376adc9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/c40c85bcf1940486edb667e949ff09b9003df664", - "reference": "c40c85bcf1940486edb667e949ff09b9003df664", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/9a93ee94be06a2265cf7fb6eed75b50a376adc9b", + "reference": "9a93ee94be06a2265cf7fb6eed75b50a376adc9b", "shasum": "" }, "require": { @@ -756,7 +756,6 @@ "nikic/php-parser": "^4.14", "phpunit/phpunit": "^9.5" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -775,22 +774,22 @@ "description": "Hypernode API Client for PHP", "support": { "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.1.0" + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.2.0" }, - "time": "2022-10-21T08:40:17+00:00" + "time": "2022-11-23T11:15:44+00:00" }, { "name": "hypernode/deploy-configuration", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "c1d105abb790b57b5474da07afa66721d02f0442" + "reference": "400b3b311e7f401220dbcc5d7901cc68ec212caf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/c1d105abb790b57b5474da07afa66721d02f0442", - "reference": "c1d105abb790b57b5474da07afa66721d02f0442", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/400b3b311e7f401220dbcc5d7901cc68ec212caf", + "reference": "400b3b311e7f401220dbcc5d7901cc68ec212caf", "shasum": "" }, "require": { @@ -817,9 +816,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.0.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.0" }, - "time": "2022-10-21T08:39:30+00:00" + "time": "2022-11-23T11:16:15+00:00" }, { "name": "justinrainbow/json-schema", @@ -953,16 +952,16 @@ }, { "name": "nesbot/carbon", - "version": "2.62.1", + "version": "2.63.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a" + "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", "shasum": "" }, "require": { @@ -1051,7 +1050,7 @@ "type": "tidelift" } ], - "time": "2022-09-02T07:48:13+00:00" + "time": "2022-10-30T18:34:28+00:00" }, { "name": "php-di/invoker", @@ -1228,16 +1227,16 @@ }, { "name": "php-http/client-common", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "d135751167d57e27c74de674d6a30cef2dc8e054" + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/d135751167d57e27c74de674d6a30cef2dc8e054", - "reference": "d135751167d57e27c74de674d6a30cef2dc8e054", + "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0", + "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0", "shasum": "" }, "require": { @@ -1297,9 +1296,9 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.5.0" + "source": "https://github.com/php-http/client-common/tree/2.6.0" }, - "time": "2021-11-26T15:01:24+00:00" + "time": "2022-09-29T09:59:43+00:00" }, { "name": "php-http/discovery", @@ -2202,16 +2201,16 @@ }, { "name": "react/http", - "version": "v1.7.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa" + "reference": "aa7512ee17258c88466de30f9cb44ec5f9df3ff3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa", - "reference": "4a1e85382e8c2a9e0fdb8ac04e94585da2083bfa", + "url": "https://api.github.com/repos/reactphp/http/zipball/aa7512ee17258c88466de30f9cb44ec5f9df3ff3", + "reference": "aa7512ee17258c88466de30f9cb44ec5f9df3ff3", "shasum": "" }, "require": { @@ -2220,16 +2219,16 @@ "php": ">=5.3.0", "psr/http-message": "^1.0", "react/event-loop": "^1.2", - "react/promise": "^2.3 || ^1.2.1", - "react/promise-stream": "^1.1", - "react/socket": "^1.9", + "react/promise": "^3 || ^2.3 || ^1.2.1", + "react/promise-stream": "^1.4", + "react/socket": "^1.12", "react/stream": "^1.2", "ringcentral/psr7": "^1.2" }, "require-dev": { - "clue/http-proxy-react": "^1.7", - "clue/reactphp-ssh-proxy": "^1.3", - "clue/socks-react": "^1.3", + "clue/http-proxy-react": "^1.8", + "clue/reactphp-ssh-proxy": "^1.4", + "clue/socks-react": "^1.4", "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", "react/async": "^4 || ^3 || ^2", "react/promise-timer": "^1.9" @@ -2282,7 +2281,7 @@ ], "support": { "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.7.0" + "source": "https://github.com/reactphp/http/tree/v1.8.0" }, "funding": [ { @@ -2294,7 +2293,7 @@ "type": "github" } ], - "time": "2022-08-23T12:31:28+00:00" + "time": "2022-09-29T12:55:52+00:00" }, { "name": "react/promise", @@ -2767,16 +2766,16 @@ }, { "name": "symfony/console", - "version": "v5.4.12", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" + "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "url": "https://api.github.com/repos/symfony/console/zipball/ea59bb0edfaf9f28d18d8791410ee0355f317669", + "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669", "shasum": "" }, "require": { @@ -2846,7 +2845,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.12" + "source": "https://github.com/symfony/console/tree/v5.4.15" }, "funding": [ { @@ -2862,7 +2861,7 @@ "type": "tidelift" } ], - "time": "2022-08-17T13:18:05+00:00" + "time": "2022-10-26T21:41:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2996,16 +2995,16 @@ }, { "name": "symfony/http-client", - "version": "v5.4.12", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "6a057be154824487fd5e6b65ab83899e0c5ac550" + "reference": "8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/6a057be154824487fd5e6b65ab83899e0c5ac550", - "reference": "6a057be154824487fd5e6b65ab83899e0c5ac550", + "url": "https://api.github.com/repos/symfony/http-client/zipball/8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b", + "reference": "8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b", "shasum": "" }, "require": { @@ -3063,7 +3062,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.12" + "source": "https://github.com/symfony/http-client/tree/v5.4.15" }, "funding": [ { @@ -3079,7 +3078,7 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:52:22+00:00" + "time": "2022-10-25T16:22:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -3228,16 +3227,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -3252,7 +3251,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3290,7 +3289,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -3306,20 +3305,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -3331,7 +3330,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3371,7 +3370,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -3387,20 +3386,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -3412,7 +3411,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3455,7 +3454,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -3471,20 +3470,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -3499,7 +3498,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3538,7 +3537,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -3554,20 +3553,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -3576,7 +3575,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3614,7 +3613,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -3630,20 +3629,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", "shasum": "" }, "require": { @@ -3652,7 +3651,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3693,7 +3692,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" }, "funding": [ { @@ -3709,20 +3708,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -3731,7 +3730,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3776,7 +3775,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -3792,7 +3791,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", @@ -3941,16 +3940,16 @@ }, { "name": "symfony/string", - "version": "v6.1.4", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "290972cad7b364e3befaa74ba0ec729800fb161c" + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/290972cad7b364e3befaa74ba0ec729800fb161c", - "reference": "290972cad7b364e3befaa74ba0ec729800fb161c", + "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", "shasum": "" }, "require": { @@ -4006,7 +4005,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.4" + "source": "https://github.com/symfony/string/tree/v6.1.7" }, "funding": [ { @@ -4022,20 +4021,20 @@ "type": "tidelift" } ], - "time": "2022-08-12T18:05:43+00:00" + "time": "2022-10-10T09:34:31+00:00" }, { "name": "symfony/translation", - "version": "v6.1.4", + "version": "v6.1.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "45d0f5bb8df7255651ca91c122fab604e776af03" + "reference": "e6cd330e5a072518f88d65148f3f165541807494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/45d0f5bb8df7255651ca91c122fab604e776af03", - "reference": "45d0f5bb8df7255651ca91c122fab604e776af03", + "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", + "reference": "e6cd330e5a072518f88d65148f3f165541807494", "shasum": "" }, "require": { @@ -4102,7 +4101,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.1.4" + "source": "https://github.com/symfony/translation/tree/v6.1.6" }, "funding": [ { @@ -4118,7 +4117,7 @@ "type": "tidelift" } ], - "time": "2022-08-02T16:17:38+00:00" + "time": "2022-10-07T08:04:03+00:00" }, { "name": "symfony/translation-contracts", @@ -4203,16 +4202,16 @@ }, { "name": "symfony/yaml", - "version": "v5.4.12", + "version": "v5.4.14", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" + "reference": "e83fe9a72011f07c662da46a05603d66deeeb487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e83fe9a72011f07c662da46a05603d66deeeb487", + "reference": "e83fe9a72011f07c662da46a05603d66deeeb487", "shasum": "" }, "require": { @@ -4258,7 +4257,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.12" + "source": "https://github.com/symfony/yaml/tree/v5.4.14" }, "funding": [ { @@ -4274,20 +4273,20 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:52:22+00:00" + "time": "2022-10-03T15:15:50+00:00" }, { "name": "twig/twig", - "version": "v2.15.2", + "version": "v2.15.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3e43405a9a8b578809426339cc3780e16fba0c52" + "reference": "ab402673db8746cb3a4c46f3869d6253699f614a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3e43405a9a8b578809426339cc3780e16fba0c52", - "reference": "3e43405a9a8b578809426339cc3780e16fba0c52", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/ab402673db8746cb3a4c46f3869d6253699f614a", + "reference": "ab402673db8746cb3a4c46f3869d6253699f614a", "shasum": "" }, "require": { @@ -4342,7 +4341,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.2" + "source": "https://github.com/twigphp/Twig/tree/v2.15.3" }, "funding": [ { @@ -4354,7 +4353,7 @@ "type": "tidelift" } ], - "time": "2022-08-12T06:43:37+00:00" + "time": "2022-09-28T08:40:08+00:00" }, { "name": "webmozart/assert", @@ -4657,16 +4656,16 @@ }, { "name": "composer/pcre", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { @@ -4708,7 +4707,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -4724,7 +4723,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", @@ -5193,16 +5192,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -5243,9 +5242,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "openlss/lib-array2xml", @@ -5523,25 +5522,30 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { "ext-tokenizer": "*", - "psalm/phar": "^4.8" + "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": { @@ -5567,9 +5571,9 @@ "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.6.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" }, - "time": "2022-03-15T21:29:03+00:00" + "time": "2022-10-14T12:47:21+00:00" }, { "name": "phpro/grumphp-shim", @@ -5929,16 +5933,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.29", + "version": "8.5.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e8c563c47a9a303662955518ca532b022b337f4d" + "reference": "33c126b09a42de5c99e5e8032b54e8221264a74e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8c563c47a9a303662955518ca532b022b337f4d", - "reference": "e8c563c47a9a303662955518ca532b022b337f4d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33c126b09a42de5c99e5e8032b54e8221264a74e", + "reference": "33c126b09a42de5c99e5e8032b54e8221264a74e", "shasum": "" }, "require": { @@ -5957,10 +5961,10 @@ "phpunit/php-file-iterator": "^2.0.4", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", + "sebastian/comparator": "^3.0.5", "sebastian/diff": "^3.0.2", "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", + "sebastian/exporter": "^3.1.5", "sebastian/global-state": "^3.0.0", "sebastian/object-enumerator": "^3.0.3", "sebastian/resource-operations": "^2.0.1", @@ -6006,7 +6010,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.31" }, "funding": [ { @@ -6016,9 +6020,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-08-22T13:59:39+00:00" + "time": "2022-10-28T05:57:37+00:00" }, { "name": "roave/security-advisories", @@ -6026,12 +6034,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "264a5085afd6e127daba3f47751fa971d3c29c3d" + "reference": "0399700d159e09b16645945758b65b921d3491fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/264a5085afd6e127daba3f47751fa971d3c29c3d", - "reference": "264a5085afd6e127daba3f47751fa971d3c29c3d", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0399700d159e09b16645945758b65b921d3491fe", + "reference": "0399700d159e09b16645945758b65b921d3491fe", "shasum": "" }, "conflict": { @@ -6048,11 +6056,15 @@ "amphp/http-client": ">=4,<4.4", "anchorcms/anchor-cms": "<=0.12.7", "andreapollastri/cipi": "<=3.1.15", + "apereo/phpcas": "<1.6", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2", "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "awesome-support/awesome-support": "<=6.0.7", "aws/aws-sdk-php": ">=3,<3.2.1", + "backdrop/backdrop": "<=1.23", + "badaso/core": "<2.6.1", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", @@ -6077,15 +6089,15 @@ "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", "catfan/medoo": "<1.7.5", - "centreon/centreon": "<20.10.7", + "centreon/centreon": "<22.10-beta.1", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "codeigniter4/framework": "<4.1.9", + "codeigniter4/framework": "<4.2.7", "codeigniter4/shield": "= 1.0.0-beta", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", - "concrete5/concrete5": "<9", + "concrete5/concrete5": "<9.1.3|>= 9.0.0RC1, < 9.1.3", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3", @@ -6093,7 +6105,7 @@ "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "contao/managed-edition": "<=1.5", - "craftcms/cms": "<3.7.36", + "craftcms/cms": "<3.7.55.2|>= 4.0.0-RC1, < 4.2.1", "croogo/croogo": "<3.0.7", "cuyz/valinor": "<0.12", "czproject/git-php": "<4.0.3", @@ -6111,8 +6123,8 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<16|= 12.0.5|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": "<2", + "dolibarr/dolibarr": "<16|>=16.0.1,<16.0.3|= 12.0.5|>= 3.3.beta1, < 13.0.2", + "dompdf/dompdf": "<2.0.1", "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", @@ -6131,25 +6143,26 @@ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.27", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.19", + "ezsystems/ezplatform-graphql": ">=1-rc.1,<1.0.13|>=2-beta.1,<2.3.12", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.26", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.29", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.30", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1|>=2.5,<2.5.15", "ezyang/htmlpurifier": "<4.1.1", "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", "facturascripts/facturascripts": "<=2022.8", "feehi/cms": "<=2.1.1", - "feehi/feehicms": "<=0.1.3", + "feehi/feehicms": "<=2.0.1.1", "fenom/fenom": "<=2.12.1", "filegator/filegator": "<7.8", "firebase/php-jwt": "<2", - "flarum/core": ">=1,<=1.0.1", + "flarum/core": ">=1,<=1.0.1|>=1.5,<1.6.2", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", @@ -6164,12 +6177,12 @@ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<0.10.38", + "froxlor/froxlor": "<0.10.39", "fuel/core": "<1.8.1", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", "getgrav/grav": "<1.7.34", - "getkirby/cms": "<3.5.8.1|>=3.6,<3.6.6.1|>=3.7,<3.7.4", + "getkirby/cms": "= 3.8.0|<3.5.8.2|>=3.6,<3.6.6.2|>=3.7,<3.7.5.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", "gilacms/gila": "<=1.11.4", @@ -6186,7 +6199,9 @@ "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", "hyn/multi-tenant": ">=5.6,<5.7.2", - "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4", + "ibexa/admin-ui": ">=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/post-install": "<=1.0.4", "icecoder/icecoder": "<=8.1", "idno/known": "<=1.3.1", @@ -6196,18 +6211,20 @@ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "impresscms/impresscms": "<=1.4.3", - "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "in2code/femanager": "<5.5.2|>=6,<6.3.3|>=7,<7.0.1", "in2code/lux": "<17.6.1|>=18,<24.0.2", "intelliants/subrion": "<=4.2.1", "islandora/islandora": ">=2,<2.4.1", "ivankristianto/phpwhois": "<=4.3", "jackalope/jackalope-doctrine-dbal": "<1.7.4", "james-heinrich/getid3": "<1.9.21", + "jasig/phpcas": "<1.3.3", "joomla/archive": "<1.1.12|>=2,<2.0.1", "joomla/filesystem": "<1.6.2|>=2,<2.0.1", "joomla/filter": "<1.4.4|>=2,<2.0.1", "joomla/input": ">=2,<2.0.2", "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", "jsdecena/laracom": "<2.0.9", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", @@ -6229,7 +6246,7 @@ "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<22.4", + "librenms/librenms": "<22.10", "limesurvey/limesurvey": "<3.27.19", "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": ">2.2.4,<2.2.6", @@ -6244,14 +6261,17 @@ "matyhtf/framework": "<3.0.6", "mautic/core": "<4.3|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", - "microweber/microweber": "<1.3.1", + "microweber/microweber": "<=1.3.1", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "modx/revolution": "<= 2.8.3-pl|<2.8", "mojo42/jirafeau": "<4.4", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.0.1", + "moodle/moodle": "<4.0.5", "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", "neoan3-apps/template": "<1.1.1", @@ -6273,15 +6293,15 @@ "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.15", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "open-web-analytics/open-web-analytics": "<1.7.4", - "opencart/opencart": "<=3.0.3.2", + "opencart/opencart": "<=3.0.3.7", "openid/php-openid": "<2.3", "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", - "oro/commerce": ">=5,<5.0.4", + "oro/commerce": ">=4.1,<5.0.6", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", "packbackbooks/lti-1-3-php-library": "<5", @@ -6300,6 +6320,7 @@ "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<5.1.3", + "phpmyfaq/phpmyfaq": "<=3.1.7", "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", @@ -6308,13 +6329,13 @@ "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/data-hub": "<1.2.4", - "pimcore/pimcore": "<10.5.6", + "pimcore/pimcore": "<10.5.9", "pocketmine/bedrock-protocol": "<8.0.2", "pocketmine/pocketmine-mp": "<4.7.2|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/blockwishlist": ">=2,<2.1.1", - "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", "prestashop/prestashop": ">=1.6.0.10,<1.7.8.7", "prestashop/productcomments": "<5.0.2", @@ -6322,6 +6343,7 @@ "prestashop/ps_facetedsearch": "<3.4.1", "prestashop/ps_linklist": "<3.1", "privatebin/privatebin": "<1.4", + "processwire/processwire": "<=3.0.200", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<1.7", @@ -6349,12 +6371,12 @@ "shopware/storefront": "<=6.4.8.1", "shopxo/shopxo": "<2.2.6", "showdoc/showdoc": "<2.10.4", - "silverstripe/admin": ">=1,<1.8.1", - "silverstripe/assets": ">=1,<1.10.1", - "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/admin": ">=1,<1.11.3", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.10.9", + "silverstripe/framework": "<4.11.14", "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|= 4.0.0-alpha1", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", @@ -6363,6 +6385,7 @@ "silverstripe/subsites": ">=2,<2.1.1", "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", + "silverstripe/versioned-admin": ">=1,<1.11.1", "simple-updates/phpwhois": "<=1", "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", "simplesamlphp/simplesamlphp": "<1.18.6", @@ -6430,14 +6453,16 @@ "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<=5.1.7", + "thorsten/phpmyfaq": "<3.1.8", "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", + "tobiasbg/tablepress": "<= 2.0-RC1", "topthink/framework": "<=6.0.13", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", - "tribalsystems/zenario": "<9.2.55826", + "tribalsystems/zenario": "<=9.3.57186", "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.14.11|>=3,<3.3.8", + "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.32|>=11,<11.5.16", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.58|>=8,<8.7.48|>=9,<9.5.37|>=10,<10.4.32|>=11,<11.5.16", @@ -6461,17 +6486,17 @@ "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", - "wintercms/winter": "<1.0.475|>=1.1,<1.1.9", + "wintercms/winter": "<1.0.475|>=1.1,<1.1.10|>=1.2,<1.2.1", "woocommerce/woocommerce": "<6.6", "wp-cli/wp-cli": "<2.5", "wp-graphql/wp-graphql": "<0.3.5", "wpanel/wpanel4-cms": "<=4.3.1", "wwbn/avideo": "<=11.6", "yeswiki/yeswiki": "<4.1", - "yetiforce/yetiforce-crm": "<6.4", + "yetiforce/yetiforce-crm": "<=6.4", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii": "<1.1.27", "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.43", @@ -6541,7 +6566,7 @@ "type": "tidelift" } ], - "time": "2022-09-16T22:04:31+00:00" + "time": "2022-11-23T23:04:03+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7380,16 +7405,16 @@ }, { "name": "vimeo/psalm", - "version": "4.27.0", + "version": "4.30.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff" + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/faf106e717c37b8c81721845dba9de3d8deed8ff", - "reference": "faf106e717c37b8c81721845dba9de3d8deed8ff", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/d0bc6e25d89f649e4f36a534f330f8bb4643dd69", + "reference": "d0bc6e25d89f649e4f36a534f330f8bb4643dd69", "shasum": "" }, "require": { @@ -7428,6 +7453,7 @@ "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", @@ -7481,9 +7507,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/4.27.0" + "source": "https://github.com/vimeo/psalm/tree/4.30.0" }, - "time": "2022-08-31T13:47:09+00:00" + "time": "2022-11-06T20:37:08+00:00" }, { "name": "webmozart/path-util", @@ -7548,7 +7574,6 @@ "minimum-stability": "stable", "stability-flags": { "deployer/deployer": 20, - "hypernode/api-client": 20, "roave/security-advisories": 20 }, "prefer-stable": false, @@ -7559,5 +7584,5 @@ "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } diff --git a/src/Brancher/BrancherDataValidator.php b/src/Brancher/BrancherDataValidator.php new file mode 100644 index 0000000..a95cd06 --- /dev/null +++ b/src/Brancher/BrancherDataValidator.php @@ -0,0 +1,38 @@ + !preg_match('/^[a-zA-Z0-9-_=]+$/', $label), + $labels + ); + + if (array_filter($violations)) { + throw new ValidationException(sprintf( + 'One or more of the provided labels are not valid. Labels provided: [%s].', + implode(', ', $labels) + )); + } + } + + /** + * @throws ValidationException + */ + public static function validate(array $data) + { + if (!empty($data['labels'])) { + self::validateLabels($data['labels']); + } + } +} diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index 4358144..4d7572f 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -26,13 +26,14 @@ public function __construct(LoggerInterface $log) * Create brancher Hypernode instance for given Hypernode. * * @param string $hypernode Name of the Hypernode + * @param string[] $data Extra data to be applied to brancher instance * @return string Name of the created brancher Hypernode * @throws HypernodeApiClientException * @throws HypernodeApiServerException */ - public function createForHypernode(string $hypernode): string + public function createForHypernode(string $hypernode, array $data = []): string { - return $this->hypernodeClient->brancherApp->create($hypernode); + return $this->hypernodeClient->brancherApp->create($hypernode, $data); } /** diff --git a/src/DeployRunner.php b/src/DeployRunner.php index df8d21a..c417e2c 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -6,6 +6,7 @@ use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; use Deployer\Host\Host; +use Hypernode\Deploy\Brancher\BrancherDataValidator; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; @@ -14,6 +15,7 @@ use Hypernode\Deploy\Exception\CreateBrancherHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Exception\TimeoutException; +use Hypernode\Deploy\Exception\ValidationException; use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\Configuration; @@ -88,7 +90,7 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ try { $this->initializeDeployer($deployer, $configureBuildStage, $configureServers, $stage); - } catch (InvalidConfigurationException $e) { + } catch (InvalidConfigurationException | ValidationException $e) { $output->write($e->getMessage()); return 1; } @@ -266,10 +268,15 @@ private function maybeConfigureBrancherServer(Server $server): void $parentApp = $serverOptions[Server::OPTION_HN_PARENT_APP] ?? null; if ($isBrancher && $parentApp) { $this->log->info(sprintf('Creating an brancher Hypernode based on %s.', $parentApp)); - $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp); + + $data = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; + $data['labels'] = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; + BrancherDataValidator::validate($data); + $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); + + $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); $this->brancherHypernodesRegistered[] = $brancherApp; - $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); try { $this->log->info('Waiting for brancher Hypernode to become available...'); diff --git a/src/Exception/ValidationException.php b/src/Exception/ValidationException.php new file mode 100644 index 0000000..7dd075e --- /dev/null +++ b/src/Exception/ValidationException.php @@ -0,0 +1,11 @@ +expectException(ValidationException::class); + $this->expectExceptionMessage( + 'One or more of the provided labels are not valid. Labels provided: [label, mylabel = myvalue].' + ); + BrancherDataValidator::validateLabels([ + 'label', + 'mylabel = myvalue' + ]); + } + + public function testValidate() + { + $this->expectException(ValidationException::class); + BrancherDataValidator::validate(['labels' => ['mylabel = myvalue']]); + } +} From ec337c4e7ed051b07a0921ef801916b91308f27f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 25 Nov 2022 16:03:44 +0100 Subject: [PATCH 059/210] Cleanup Brancher nodes by labels --- composer.lock | 12 +-- src/Brancher/BrancherHypernodeManager.php | 32 +++++- src/Command/Cleanup.php | 44 ++++++-- src/Command/Deploy.php | 13 ++- src/ConfigurationLoader.php | 38 +++++++ src/DeployRunner.php | 123 +++++----------------- 6 files changed, 148 insertions(+), 114 deletions(-) create mode 100644 src/ConfigurationLoader.php diff --git a/composer.lock b/composer.lock index 32afd88..22d36eb 100644 --- a/composer.lock +++ b/composer.lock @@ -729,16 +729,16 @@ }, { "name": "hypernode/api-client", - "version": "0.2.0", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "9a93ee94be06a2265cf7fb6eed75b50a376adc9b" + "reference": "5fc348028551b5c6d2bbf1c1894f2cc3d59230e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/9a93ee94be06a2265cf7fb6eed75b50a376adc9b", - "reference": "9a93ee94be06a2265cf7fb6eed75b50a376adc9b", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/5fc348028551b5c6d2bbf1c1894f2cc3d59230e9", + "reference": "5fc348028551b5c6d2bbf1c1894f2cc3d59230e9", "shasum": "" }, "require": { @@ -774,9 +774,9 @@ "description": "Hypernode API Client for PHP", "support": { "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.2.0" + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.2.1" }, - "time": "2022-11-23T11:15:44+00:00" + "time": "2022-11-25T14:45:54+00:00" }, { "name": "hypernode/deploy-configuration", diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index 4d7572f..f77b5c2 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -22,6 +22,36 @@ public function __construct(LoggerInterface $log) $this->hypernodeClient = HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); } + /** + * Query brancher instances for given Hypernode and return the Brancher instance names. + * + * @param string $hypernode The parent hypernode to query the Brancher instances from + * @param string[] $labels Labels to match against, may be empty + * @return string[] The found Brancher instance names + */ + public function queryBrancherHypernodes(string $hypernode, array $labels = []): array + { + $result = []; + + $hypernodes = $this->hypernodeClient->app->getList(['parent' => $hypernode, 'type' => 'brancher']); + foreach ($hypernodes as $brancher) { + $match = true; + + foreach ($labels as $label) { + if (!in_array($label, $brancher->labels)) { + $match = false; + break; + } + } + + if ($match) { + $result[] = $brancher->name; + } + } + + return $result; + } + /** * Create brancher Hypernode instance for given Hypernode. * @@ -82,7 +112,7 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 90 } elseif ($timeElapsed < $allowedErrorWindow) { // Sometimes we get an error where the logbook is not yet available, but it will be soon. // We allow a small window for this to happen, and then we throw an exception. - sprintf( + printf( 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available', $e->getCode(), $brancherHypernode diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index fd0576b..3881bec 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -5,8 +5,12 @@ namespace Hypernode\Deploy\Command; use Hypernode\Deploy\Brancher\BrancherHypernodeManager; +use Hypernode\Deploy\ConfigurationLoader; use Hypernode\Deploy\Report\ReportLoader; +use Hypernode\DeployConfiguration\BrancherServer; +use Hypernode\DeployConfiguration\Server; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Throwable; @@ -14,13 +18,18 @@ class Cleanup extends Command { private ReportLoader $reportLoader; + private ConfigurationLoader $configurationLoader; private BrancherHypernodeManager $brancherHypernodeManager; - public function __construct(ReportLoader $reportLoader, BrancherHypernodeManager $brancherHypernodeManager) - { + public function __construct( + ReportLoader $reportLoader, + ConfigurationLoader $configurationLoader, + BrancherHypernodeManager $brancherHypernodeManager + ) { parent::__construct(); $this->reportLoader = $reportLoader; + $this->configurationLoader = $configurationLoader; $this->brancherHypernodeManager = $brancherHypernodeManager; } @@ -31,6 +40,7 @@ protected function configure() $this->setDescription( 'Clean up any acquired resources during the deployment, like brancher Hypernodes.' ); + $this->addArgument('stage', InputArgument::OPTIONAL, 'Stage to cleanup'); } /** @@ -40,12 +50,34 @@ protected function execute(InputInterface $input, OutputInterface $output) { $report = $this->reportLoader->loadReport(); - if ($report === null) { - $output->writeln('No report found, skipping cleanup.'); - return 0; + if ($report !== null) { + $this->brancherHypernodeManager->cancel(...$report->getBrancherHypernodes()); } - $this->brancherHypernodeManager->cancel(...$report->getBrancherHypernodes()); + /** @var string $stageName */ + $stageName = $input->getArgument('stage'); + if ($stageName) { + $config = $this->configurationLoader->load( + $input->getOption('file') ?: 'deploy.php' + ); + foreach ($config->getStages() as $stage) { + if ($stage->getName() !== $stageName) { + continue; + } + foreach ($stage->getServers() as $server) { + if (!($server instanceof BrancherServer)) { + continue; + } + $labels = $server->getLabels(); + $hypernode = $server->getOptions()[Server::OPTION_HN_PARENT_APP]; + $brancherHypernodes = $this->brancherHypernodeManager->queryBrancherHypernodes( + $hypernode, + $labels + ); + $this->brancherHypernodeManager->cancel(...$brancherHypernodes); + } + } + } return 0; } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 9b6031f..2ec7c46 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -12,10 +12,7 @@ class Deploy extends Command { - /** - * @var DeployRunner - */ - private $deployRunner; + private DeployRunner $deployRunner; private ReportWriter $reportWriter; public function __construct(DeployRunner $deployRunner, ReportWriter $reportWriter) @@ -38,7 +35,13 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - $result = $this->deployRunner->run($output, $input->getArgument('stage'), DeployRunner::TASK_DEPLOY, false, true); + $result = $this->deployRunner->run( + $output, + $input->getArgument('stage'), + DeployRunner::TASK_DEPLOY, + false, + true + ); if ($result === 0) { $this->reportWriter->write($this->deployRunner->getDeploymentReport()); diff --git a/src/ConfigurationLoader.php b/src/ConfigurationLoader.php new file mode 100644 index 0000000..8891c8c --- /dev/null +++ b/src/ConfigurationLoader.php @@ -0,0 +1,38 @@ +taskFactory = $taskFactory; @@ -68,6 +70,7 @@ public function __construct( $this->log = $log; $this->recipeLoader = $recipeLoader; $this->brancherHypernodeManager = $brancherHypernodeManager; + $this->configurationLoader = $configurationLoader; } /** @@ -77,19 +80,10 @@ public function __construct( */ public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers): int { - $console = new Application(); - $deployer = new Deployer($console); - $deployer['output'] = new OutputWatcher($output); - $deployer['input'] = new ArrayInput( - [], - new InputDefinition([ - new InputOption('limit'), - new InputOption('profile'), - ]) - ); + $deployer = $this->getDeployerInstance($output); try { - $this->initializeDeployer($deployer, $configureBuildStage, $configureServers, $stage); + $this->prepare($configureBuildStage, $configureServers, $stage); } catch (InvalidConfigurationException | ValidationException $e) { $output->write($e->getMessage()); return 1; @@ -99,22 +93,20 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ } /** - * Initialize deployer settings + * Prepare deploy runner before running stage * * @throws Exception * @throws GracefulShutdownException * @throws InvalidConfigurationException * @throws Throwable */ - private function initializeDeployer( - Deployer $deployer, - bool $configureBuildStage, - bool $configureServers, - string $stage - ): void { + private function prepare(bool $configureBuildStage, bool $configureServers, string $stage): void + { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); - $config = $this->getConfiguration($deployer); + $config = $this->configurationLoader->load( + $this->input->getOption('file') ?: 'deploy.php' + ); $config->setLogger($this->log); if ($configureBuildStage) { @@ -176,23 +168,6 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con } } - /** - * @throws Exception - * @throws GracefulShutdownException - * @throws Throwable - */ - private function getConfiguration(Deployer $deployer): Configuration - { - try { - return $this->tryGetConfiguration(); - } catch (\Throwable $e) { - $this->log->warning(sprintf('Failed to initialize deploy.php configuration file: %s', $e->getMessage())); - $this->tryComposerInstall($deployer); - $this->initializeAppAutoloader(); - return $this->tryGetConfiguration(); - } - } - private function configureServers(Configuration $config, string $stage): void { foreach ($config->getStages() as $configStage) { @@ -360,65 +335,6 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep return $exitCode; } - private function tryGetConfiguration(): Configuration - { - $file = $this->input->getOption('file'); - if (!$file) { - $file = 'deploy.php'; - } - - if (!is_readable($file)) { - throw new \RuntimeException(sprintf('No %s file found in project root %s', $file, getcwd())); - } - - $configuration = \call_user_func(function () use ($file) { - return require $file; - }); - - if (!$configuration instanceof Configuration) { - throw new \RuntimeException( - sprintf('%s/deploy.php did not return object of type %s', getcwd(), Configuration::class) - ); - } - - return $configuration; - } - - /** - * @throws GracefulShutdownException - * @throws Throwable - * @throws Exception - */ - private function tryComposerInstall(Deployer $deployer): void - { - /** @psalm-suppress InvalidArgument deployer will have proper typing in 7.x */ - $host = localhost('composer-prepare'); - $host->set('labels', ['stage' => 'composer-prepare']); - $host->set('bin/php', 'php'); - - task('composer-prepare:install', function () { - run('composer install --ignore-platform-reqs --optimize-autoloader --no-dev'); - }); - - task('composer-prepare', [ - 'deploy:vendors:auth', - 'composer-prepare:install', - ]); - - $this->runStage($deployer, 'composer-prepare', 'composer-prepare'); - } - - /** - * Initialize autoloader of the application being deployed - */ - private function initializeAppAutoloader(): void - { - /** @psalm-suppress UndefinedConstant */ - if (file_exists(WORKING_DIR . '/vendor/autoload.php')) { - require_once WORKING_DIR . '/vendor/autoload.php'; - } - } - public function getDeploymentReport() { return new Report\Report( @@ -427,4 +343,19 @@ public function getDeploymentReport() $this->brancherHypernodesRegistered ); } + + private function getDeployerInstance(OutputInterface $output): Deployer + { + $console = new Application(); + $deployer = new Deployer($console); + $deployer['output'] = new OutputWatcher($output); + $deployer['input'] = new ArrayInput( + [], + new InputDefinition([ + new InputOption('limit'), + new InputOption('profile'), + ]) + ); + return $deployer; + } } From bb990ea1c74d51359e45e95d54d14ecc7013584e Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 28 Nov 2022 12:33:56 +0100 Subject: [PATCH 060/210] Extract cancel by stage code to separate method --- src/Command/Cleanup.php | 51 +++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index 3881bec..42e81dd 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -8,6 +8,7 @@ use Hypernode\Deploy\ConfigurationLoader; use Hypernode\Deploy\Report\ReportLoader; use Hypernode\DeployConfiguration\BrancherServer; +use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -50,35 +51,45 @@ protected function execute(InputInterface $input, OutputInterface $output) { $report = $this->reportLoader->loadReport(); - if ($report !== null) { + if ($report) { $this->brancherHypernodeManager->cancel(...$report->getBrancherHypernodes()); } /** @var string $stageName */ $stageName = $input->getArgument('stage'); if ($stageName) { - $config = $this->configurationLoader->load( - $input->getOption('file') ?: 'deploy.php' - ); - foreach ($config->getStages() as $stage) { - if ($stage->getName() !== $stageName) { + $config = $this->configurationLoader->load($input->getOption('file') ?: 'deploy.php'); + $this->cancelByStage($stageName, $config); + } + + return 0; + } + + /** + * Cancel brancher nodes by stage and their configured labels. + * + * @param string $stageName Stage to clean up + * @param Configuration $config Deployment configuration to read stages/servers from + * @return void + */ + private function cancelByStage(string $stageName, Configuration $config): void + { + foreach ($config->getStages() as $stage) { + if ($stage->getName() !== $stageName) { + continue; + } + foreach ($stage->getServers() as $server) { + if (!($server instanceof BrancherServer)) { continue; } - foreach ($stage->getServers() as $server) { - if (!($server instanceof BrancherServer)) { - continue; - } - $labels = $server->getLabels(); - $hypernode = $server->getOptions()[Server::OPTION_HN_PARENT_APP]; - $brancherHypernodes = $this->brancherHypernodeManager->queryBrancherHypernodes( - $hypernode, - $labels - ); - $this->brancherHypernodeManager->cancel(...$brancherHypernodes); - } + $labels = $server->getLabels(); + $hypernode = $server->getOptions()[Server::OPTION_HN_PARENT_APP]; + $brancherHypernodes = $this->brancherHypernodeManager->queryBrancherHypernodes( + $hypernode, + $labels + ); + $this->brancherHypernodeManager->cancel(...$brancherHypernodes); } } - - return 0; } } From 8f62dace046a48459790041a5eaa8eaa5771d050 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 28 Nov 2022 12:35:34 +0100 Subject: [PATCH 061/210] Remove usage of BrancherDataValidator Validation of brancher labels is now done on the server side, so this doesn't make sense anymore. --- src/Brancher/BrancherDataValidator.php | 38 -------------------- src/DeployRunner.php | 2 -- tests/Brancher/BrancherDataValidatorTest.php | 35 ------------------ 3 files changed, 75 deletions(-) delete mode 100644 src/Brancher/BrancherDataValidator.php delete mode 100644 tests/Brancher/BrancherDataValidatorTest.php diff --git a/src/Brancher/BrancherDataValidator.php b/src/Brancher/BrancherDataValidator.php deleted file mode 100644 index a95cd06..0000000 --- a/src/Brancher/BrancherDataValidator.php +++ /dev/null @@ -1,38 +0,0 @@ - !preg_match('/^[a-zA-Z0-9-_=]+$/', $label), - $labels - ); - - if (array_filter($violations)) { - throw new ValidationException(sprintf( - 'One or more of the provided labels are not valid. Labels provided: [%s].', - implode(', ', $labels) - )); - } - } - - /** - * @throws ValidationException - */ - public static function validate(array $data) - { - if (!empty($data['labels'])) { - self::validateLabels($data['labels']); - } - } -} diff --git a/src/DeployRunner.php b/src/DeployRunner.php index c417e2c..fa9f1e0 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -6,7 +6,6 @@ use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; use Deployer\Host\Host; -use Hypernode\Deploy\Brancher\BrancherDataValidator; use Hypernode\Deploy\Console\Output\OutputWatcher; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; @@ -271,7 +270,6 @@ private function maybeConfigureBrancherServer(Server $server): void $data = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; $data['labels'] = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; - BrancherDataValidator::validate($data); $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); diff --git a/tests/Brancher/BrancherDataValidatorTest.php b/tests/Brancher/BrancherDataValidatorTest.php deleted file mode 100644 index 85aeed9..0000000 --- a/tests/Brancher/BrancherDataValidatorTest.php +++ /dev/null @@ -1,35 +0,0 @@ -expectException(ValidationException::class); - $this->expectExceptionMessage( - 'One or more of the provided labels are not valid. Labels provided: [label, mylabel = myvalue].' - ); - BrancherDataValidator::validateLabels([ - 'label', - 'mylabel = myvalue' - ]); - } - - public function testValidate() - { - $this->expectException(ValidationException::class); - BrancherDataValidator::validate(['labels' => ['mylabel = myvalue']]); - } -} From 486dbd06d8247055ced26237d43b4fd0401794e0 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 2 Dec 2022 09:59:36 +0100 Subject: [PATCH 062/210] ci: Test brancher node cleanup using hnapi and label matching --- ci/test/run-brancher.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 219c7ea..f9ecc2a 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -57,3 +57,22 @@ $DP jq .brancher_hypernodes[0] deployment-report.json -r -e # cleanup data $DP hypernode-deploy cleanup -vvv + +rm -f deployment-report.json + +# Now do a test deploy which should have a brancher node. +$DP hypernode-deploy deploy test -f /web/deploy.php -vvv + +$DP ls -l +$DP test -f deployment-report.json +$DP jq . deployment-report.json +$DP jq .version deployment-report.json -r -e +$DP jq .stage deployment-report.json -r -e +$DP jq .hostnames[0] deployment-report.json -r -e +$DP jq .brancher_hypernodes[0] deployment-report.json -r -e + +# Remove deployment report to make sure we can clean up using hnapi and labels matching +rm -f deployment-report.json + +# cleanup data +$DP hypernode-deploy cleanup test -vvv From bceb6c5cd5e22fb5223f8a650519cacea836140a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 2 Dec 2022 10:41:49 +0100 Subject: [PATCH 063/210] Move deployer initialization to separate class --- src/Command/Cleanup.php | 5 +++++ src/DeployRunner.php | 30 ++++++------------------------ src/DeployerLoader.php | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 24 deletions(-) create mode 100644 src/DeployerLoader.php diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index 42e81dd..6232b15 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -6,6 +6,7 @@ use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\ConfigurationLoader; +use Hypernode\Deploy\DeployerLoader; use Hypernode\Deploy\Report\ReportLoader; use Hypernode\DeployConfiguration\BrancherServer; use Hypernode\DeployConfiguration\Configuration; @@ -19,17 +20,20 @@ class Cleanup extends Command { private ReportLoader $reportLoader; + private DeployerLoader $deployerLoader; private ConfigurationLoader $configurationLoader; private BrancherHypernodeManager $brancherHypernodeManager; public function __construct( ReportLoader $reportLoader, + DeployerLoader $deployerLoader, ConfigurationLoader $configurationLoader, BrancherHypernodeManager $brancherHypernodeManager ) { parent::__construct(); $this->reportLoader = $reportLoader; + $this->deployerLoader = $deployerLoader; $this->configurationLoader = $configurationLoader; $this->brancherHypernodeManager = $brancherHypernodeManager; } @@ -58,6 +62,7 @@ protected function execute(InputInterface $input, OutputInterface $output) /** @var string $stageName */ $stageName = $input->getArgument('stage'); if ($stageName) { + $this->deployerLoader->getOrCreateInstance($output); $config = $this->configurationLoader->load($input->getOption('file') ?: 'deploy.php'); $this->cancelByStage($stageName, $config); } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 4b74e14..0e1434a 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -6,11 +6,10 @@ use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; use Deployer\Host\Host; -use Hypernode\Deploy\Console\Output\OutputWatcher; +use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; use Hypernode\Deploy\Deployer\Task\TaskFactory; -use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\Exception\CreateBrancherHypernodeFailedException; use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Exception\TimeoutException; @@ -21,18 +20,13 @@ use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\Stage; use Psr\Log\LoggerInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Throwable; use function Deployer\host; use function Deployer\localhost; use function Deployer\run; -use function Deployer\task; class DeployRunner { @@ -43,6 +37,7 @@ class DeployRunner private InputInterface $input; private LoggerInterface $log; private RecipeLoader $recipeLoader; + private DeployerLoader $deployerLoader; private ConfigurationLoader $configurationLoader; private BrancherHypernodeManager $brancherHypernodeManager; @@ -61,6 +56,7 @@ public function __construct( InputInterface $input, LoggerInterface $log, RecipeLoader $recipeLoader, + DeployerLoader $deployerLoader, ConfigurationLoader $configurationLoader, BrancherHypernodeManager $brancherHypernodeManager ) { @@ -68,8 +64,9 @@ public function __construct( $this->input = $input; $this->log = $log; $this->recipeLoader = $recipeLoader; - $this->brancherHypernodeManager = $brancherHypernodeManager; + $this->deployerLoader = $deployerLoader; $this->configurationLoader = $configurationLoader; + $this->brancherHypernodeManager = $brancherHypernodeManager; } /** @@ -79,7 +76,7 @@ public function __construct( */ public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers): int { - $deployer = $this->getDeployerInstance($output); + $deployer = $this->deployerLoader->getOrCreateInstance($output); try { $this->prepare($configureBuildStage, $configureServers, $stage); @@ -341,19 +338,4 @@ public function getDeploymentReport() $this->brancherHypernodesRegistered ); } - - private function getDeployerInstance(OutputInterface $output): Deployer - { - $console = new Application(); - $deployer = new Deployer($console); - $deployer['output'] = new OutputWatcher($output); - $deployer['input'] = new ArrayInput( - [], - new InputDefinition([ - new InputOption('limit'), - new InputOption('profile'), - ]) - ); - return $deployer; - } } diff --git a/src/DeployerLoader.php b/src/DeployerLoader.php new file mode 100644 index 0000000..976dec0 --- /dev/null +++ b/src/DeployerLoader.php @@ -0,0 +1,38 @@ +deployer) { + return $this->deployer; + } + + $console = new Application(); + $this->deployer = new Deployer($console); + $this->deployer['output'] = new OutputWatcher($output); + $this->deployer['input'] = new ArrayInput( + [], + new InputDefinition([ + new InputOption('limit'), + new InputOption('profile'), + ]) + ); + + return $this->deployer; + } +} From 7df579673350fecf49685c391c9399cf45c28ba3 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 2 Dec 2022 10:42:36 +0100 Subject: [PATCH 064/210] ci: Fix deployment-report removal --- ci/test/run-brancher.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index f9ecc2a..a0d09fe 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -60,7 +60,7 @@ $DP hypernode-deploy cleanup -vvv rm -f deployment-report.json -# Now do a test deploy which should have a brancher node. +# Now do a test deploy again to deploy to a brancher node and clean it up by hnapi and labels matching $DP hypernode-deploy deploy test -f /web/deploy.php -vvv $DP ls -l @@ -72,7 +72,7 @@ $DP jq .hostnames[0] deployment-report.json -r -e $DP jq .brancher_hypernodes[0] deployment-report.json -r -e # Remove deployment report to make sure we can clean up using hnapi and labels matching -rm -f deployment-report.json +$DP rm -f deployment-report.json # cleanup data $DP hypernode-deploy cleanup test -vvv From 7400356f043784ec6e68ee8aa5a6d5b01557947e Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 2 Dec 2022 11:10:20 +0100 Subject: [PATCH 065/210] BrancherHypernodeManager: Only query non-destroyed apps --- src/Brancher/BrancherHypernodeManager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index f77b5c2..d986204 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -33,7 +33,11 @@ public function queryBrancherHypernodes(string $hypernode, array $labels = []): { $result = []; - $hypernodes = $this->hypernodeClient->app->getList(['parent' => $hypernode, 'type' => 'brancher']); + $hypernodes = $this->hypernodeClient->app->getList([ + 'parent' => $hypernode, + 'type' => 'brancher', + 'destroyed' => 'False', + ]); foreach ($hypernodes as $brancher) { $match = true; From 37f6d787a5bac99e7972577332565a85a66b89b4 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 5 Dec 2022 11:33:01 +0100 Subject: [PATCH 066/210] ci: Test if we're actually only cleaning up the expected Brancher instance --- ci/test/magento/deploy_brancher.php | 3 ++- ci/test/run-brancher.sh | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ci/test/magento/deploy_brancher.php b/ci/test/magento/deploy_brancher.php index 65581a1..947bf1b 100644 --- a/ci/test/magento/deploy_brancher.php +++ b/ci/test/magento/deploy_brancher.php @@ -18,6 +18,7 @@ ]); $productionStage = $configuration->addStage('test', 'banaan.store'); -$productionStage->addBrancherServer('hndeployintegr8'); +$productionStage->addBrancherServer('hndeployintegr8') + ->setLabels(['gitref='.\getenv('GITHUB_SHA') ?: 'unknown']); return $configuration; diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index a0d09fe..35e1437 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -72,7 +72,11 @@ $DP jq .hostnames[0] deployment-report.json -r -e $DP jq .brancher_hypernodes[0] deployment-report.json -r -e # Remove deployment report to make sure we can clean up using hnapi and labels matching +BRANCHER_INSTANCE=$($DP jq .brancher_hypernodes[0] deployment-report.json -r -e) $DP rm -f deployment-report.json # cleanup data -$DP hypernode-deploy cleanup test -vvv +$DP hypernode-deploy cleanup test -vvv | tee cleanup.log + +# Run tests on cleanup +grep "Stopping brancher Hypernode ${BRANCHER_INSTANCE}..." cleanup.log From 36b0391dd5bc3e36c9710cc6233fcb6622e98d32 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Thu, 8 Dec 2022 13:43:11 +0100 Subject: [PATCH 067/210] fix: ensure .hypernode/nginx or supervisor exists This is done for Varnish but not for Nginx/Supervisor --- src/Deployer/Task/PlatformConfiguration/NginxSyncTask.php | 1 + src/Deployer/Task/PlatformConfiguration/SupervisorUploadTask.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Deployer/Task/PlatformConfiguration/NginxSyncTask.php b/src/Deployer/Task/PlatformConfiguration/NginxSyncTask.php index 7349341..3594306 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxSyncTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxSyncTask.php @@ -59,6 +59,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta '--delete', ]; $args = implode(' ', array_map('escapeshellarg', $args)); + run("mkdir -p {{nginx_release_path}}"); run("rsync {$args} {{nginx/config_path}}/ {{nginx_release_path}}/"); run("ln -sf {{nginx_current_path}} /data/web/nginx/{{domain}}"); }); diff --git a/src/Deployer/Task/PlatformConfiguration/SupervisorUploadTask.php b/src/Deployer/Task/PlatformConfiguration/SupervisorUploadTask.php index a227b5b..84f35d5 100644 --- a/src/Deployer/Task/PlatformConfiguration/SupervisorUploadTask.php +++ b/src/Deployer/Task/PlatformConfiguration/SupervisorUploadTask.php @@ -55,6 +55,7 @@ function () use ($config) { ]; upload($sourceDir . '/', '{{supervisor/config_path}}/'); $args = implode(' ', array_map('escapeshellarg', $args)); + run("mkdir -p {{supervisor_release_path}}"); run("rsync {$args} {{supervisor/config_path}}/ {{supervisor_release_path}}/"); } ); From 38b00a277be4ce75642d0a08a8e39e2d24ed243c Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 13:24:08 +0100 Subject: [PATCH 068/210] distrobox: Update PhpStorm to 2022.3 Also run phpstorm command within a screen instead of putting it to the background --- .distrobox/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.distrobox/Dockerfile b/.distrobox/Dockerfile index 81a2298..64a0f2a 100644 --- a/.distrobox/Dockerfile +++ b/.distrobox/Dockerfile @@ -32,8 +32,8 @@ RUN wget https://raw.githubusercontent.com/composer/getcomposer.org/master/web/i mv composer.phar /usr/local/bin/composer # Install PhpStorm -RUN wget -q https://download-cdn.jetbrains.com/webide/PhpStorm-2022.2.tar.gz -O /tmp/phpstorm.tar.gz && \ +RUN wget -q https://download-cdn.jetbrains.com/webide/PhpStorm-2022.3.tar.gz -O /tmp/phpstorm.tar.gz && \ mkdir /opt/phpstorm && \ tar -xzf /tmp/phpstorm.tar.gz -C /opt/phpstorm --strip-components=1 && \ - printf '#!/usr/bin/env bash\n/opt/phpstorm/bin/phpstorm.sh $@ &> /dev/null &' > /usr/local/bin/phpstorm && \ + printf '#!/usr/bin/env bash\nscreen -d -m bash -c "/opt/phpstorm/bin/phpstorm.sh $@"' > /usr/local/bin/phpstorm && \ chmod +x /usr/local/bin/phpstorm From 0124c0f5f58ea18a2966e5e37717d84f8b8559a7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 14:55:34 +0100 Subject: [PATCH 069/210] ci: Fix empty labels being used to when creating brancher nodes --- ci/test/magento/deploy_brancher.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/magento/deploy_brancher.php b/ci/test/magento/deploy_brancher.php index 947bf1b..1b49742 100644 --- a/ci/test/magento/deploy_brancher.php +++ b/ci/test/magento/deploy_brancher.php @@ -19,6 +19,6 @@ $productionStage = $configuration->addStage('test', 'banaan.store'); $productionStage->addBrancherServer('hndeployintegr8') - ->setLabels(['gitref='.\getenv('GITHUB_SHA') ?: 'unknown']); + ->setLabels(['gitref='.\getenv('GITHUB_REF_NAME') ?: 'unknown']); return $configuration; From e0e8ba4c31f1a5aa9fd88f2177335e7c079ff4c0 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 14:56:00 +0100 Subject: [PATCH 070/210] DeployRunner: Add logging for brancher settings and labels to be applied --- src/DeployRunner.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 0e1434a..78e4700 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -238,10 +238,23 @@ private function maybeConfigureBrancherServer(Server $server): void $isBrancher = $serverOptions[Server::OPTION_HN_BRANCHER] ?? false; $parentApp = $serverOptions[Server::OPTION_HN_PARENT_APP] ?? null; if ($isBrancher && $parentApp) { + $settings = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; + $labels = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; + $this->log->info(sprintf('Creating an brancher Hypernode based on %s.', $parentApp)); + if ($settings) { + $this->log->info( + sprintf('Settings to be applied: [%s].', implode(', ', $settings)) + ); + } + if ($labels) { + $this->log->info( + sprintf('Labels to be applied: [%s].', implode(', ', $labels)) + ); + } - $data = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; - $data['labels'] = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; + $data = $settings; + $data['labels'] = $settings; $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); From 8392607bcc222d851975a51bda7eec08a5644226 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 15:22:53 +0100 Subject: [PATCH 071/210] ci: Pass GITHUB_REF_NAME env to docker run command --- ci/test/magento/deploy_brancher.php | 2 +- ci/test/run-brancher.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/test/magento/deploy_brancher.php b/ci/test/magento/deploy_brancher.php index 1b49742..16be90d 100644 --- a/ci/test/magento/deploy_brancher.php +++ b/ci/test/magento/deploy_brancher.php @@ -19,6 +19,6 @@ $productionStage = $configuration->addStage('test', 'banaan.store'); $productionStage->addBrancherServer('hndeployintegr8') - ->setLabels(['gitref='.\getenv('GITHUB_REF_NAME') ?: 'unknown']); + ->setLabels(['gitref='. (\getenv('GITHUB_REF_NAME') ?: 'unknown')]); return $configuration; diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 35e1437..0811d39 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -w /web hndeploy" +DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -e GITHUB_REF_NAME -w /web hndeploy" # Build Docker image docker build \ From b98012854c83219943e591e8c1a18dbc5fd91501 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 15:47:10 +0100 Subject: [PATCH 072/210] fixup! DeployRunner: Add logging for brancher settings and labels to be applied --- src/DeployRunner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 78e4700..fa20fd0 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -254,7 +254,7 @@ private function maybeConfigureBrancherServer(Server $server): void } $data = $settings; - $data['labels'] = $settings; + $data['labels'] = $labels; $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); From 570bf8ee89c228878f70976ba1546f96776b3d2f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Dec 2022 16:26:42 +0100 Subject: [PATCH 073/210] ci: Use GITHUB_SHA again to label brancher nodes --- ci/test/magento/deploy_brancher.php | 2 +- ci/test/run-brancher.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/test/magento/deploy_brancher.php b/ci/test/magento/deploy_brancher.php index 16be90d..4399a7d 100644 --- a/ci/test/magento/deploy_brancher.php +++ b/ci/test/magento/deploy_brancher.php @@ -19,6 +19,6 @@ $productionStage = $configuration->addStage('test', 'banaan.store'); $productionStage->addBrancherServer('hndeployintegr8') - ->setLabels(['gitref='. (\getenv('GITHUB_REF_NAME') ?: 'unknown')]); + ->setLabels(['gitref='. (\getenv('GITHUB_SHA') ?: 'unknown')]); return $configuration; diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 0811d39..8fa5814 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -5,7 +5,7 @@ set -x # Handy aliases HN="ssh app@hndeployintegr8.hypernode.io -o StrictHostKeyChecking=no" -DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -e GITHUB_REF_NAME -w /web hndeploy" +DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_KEY -e GITHUB_SHA -w /web hndeploy" # Build Docker image docker build \ From 88fc0db77a884076a6e6e18d9681d14e62250dc7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 23 Dec 2022 14:54:16 +0100 Subject: [PATCH 074/210] Install python3 as default python executable --- ci/build/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 518e671..56df6e1 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -39,6 +39,7 @@ RUN apt-get update && \ bash \ jq \ ca-certificates \ + python3 \ wget \ curl \ openssl \ @@ -104,6 +105,9 @@ RUN curl -sS https://getcomposer.org/installer | php -- --2.2 --filename=compose # Use version 1 for main composer binary RUN rm -f /usr/local/bin/composer; ln -s /usr/local/bin/composer2 /usr/local/bin/composer +# Set python3 as default python executable +RUN ln -s /usr/bin/python3 /usr/local/bin/python + # Copy container files COPY ./ci/build/files / From d2c6e1d8cc6d567dd33df5a09acd3b7d03bdae76 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Thu, 29 Dec 2022 15:14:22 +0100 Subject: [PATCH 075/210] increase brancher node wait timeout in the event where there is not enough compute capacity available the system will start creating new cloud resources on the fly. in that case we should not give up too quickly but wait a bit longer. --- src/Brancher/BrancherHypernodeManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index d986204..27867cb 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -81,7 +81,7 @@ public function createForHypernode(string $hypernode, array $data = []): string * @throws HypernodeApiServerException * @throws TimeoutException */ - public function waitForAvailability(string $brancherHypernode, int $timeout = 900): void + public function waitForAvailability(string $brancherHypernode, int $timeout = 1500): void { $latest = microtime(true); $timeElapsed = 0; From 8ae81b334990221273b3a86ef5fa176f750a891a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 30 Dec 2022 15:56:33 +0100 Subject: [PATCH 076/210] ci/image: Install virtualenv --- ci/build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 56df6e1..fc18696 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -40,6 +40,7 @@ RUN apt-get update && \ jq \ ca-certificates \ python3 \ + virtualenv \ wget \ curl \ openssl \ From e8565b77bc47e97f41f613948bd919f80c265f25 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 30 Dec 2022 16:26:08 +0100 Subject: [PATCH 077/210] ci: Add publishing of Docker images --- .github/workflows/publish.yaml | 47 +++++++++++++++++++++++++++++++++ ci/release_semantic_versions.sh | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..fbc9791 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,47 @@ +name: Release Docker images +on: + release: + types: [published] + +jobs: + publish: + strategy: + matrix: + php_version: + - "7.4" + - "8.0" + - "8.1" + node_version: + - 12 + - 14 + - 16 + - 18 + runs-on: ubuntu-latest + env: + PHP_VERSION: ${{ matrix.php_version }} + NODE_VERSION: ${{ matrix.node_version }} + LATEST_PHP_VERSION: 8.1 + LATEST_NODE_VERSION: 18 + steps: + - name: Checkout hypernode-deploy + uses: actions/checkout@v3 + - name: Prepare environment + run: | + export TAG_SPECS="php${{ matrix.php_version }}-node${{ matrix.node_version }}" + echo "TAG_SPECS=${TAG_SPECS}" >> $GITHUB_ENV + echo "DOCKER_TAG=quay.io/hypernode/deploy:${GITHUB_REF_NAME}-${TAG_SPECS}" >> $GITHUB_ENV + - name: Login to Quay + run: docker login -u "${QUAY_USER}" -p "${QUAY_TOKEN}" quay.io + env: + QUAY_USER: ${{ secrets.QUAY_USER }} + QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }} + - name: Build image + run: | + docker build -t "$DOCKER_TAG" -f "./ci/build/Dockerfile" \ + --build-arg PHP_VERSION=${{ matrix.php_version }} \ + --build-arg NODE_VERSION=${{ matrix.node_version }} \ + . + - name: Push image + run: docker push "$DOCKER_TAG" + - name: Push semantic versions + run: ci/release_semantic_versions.sh diff --git a/ci/release_semantic_versions.sh b/ci/release_semantic_versions.sh index 147f3b7..99c5875 100755 --- a/ci/release_semantic_versions.sh +++ b/ci/release_semantic_versions.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash IMAGE=${IMAGE:-quay.io/hypernode/deploy} -INPUT_VERSION=${INPUT_VERSION:-} +INPUT_VERSION=${GITHUB_REF_NAME} TAG_SPECS="php${PHP_VERSION}-node${NODE_VERSION}" if [ -z "${INPUT_VERSION}" ]; then From df2328c80ebc7df5cc7c3cf8bad65829db43e259 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 2 Jan 2023 11:01:31 +0100 Subject: [PATCH 078/210] distrobox: Update PhpStorm to 2022.3.1 --- .distrobox/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.distrobox/Dockerfile b/.distrobox/Dockerfile index 64a0f2a..83d8aa5 100644 --- a/.distrobox/Dockerfile +++ b/.distrobox/Dockerfile @@ -32,7 +32,7 @@ RUN wget https://raw.githubusercontent.com/composer/getcomposer.org/master/web/i mv composer.phar /usr/local/bin/composer # Install PhpStorm -RUN wget -q https://download-cdn.jetbrains.com/webide/PhpStorm-2022.3.tar.gz -O /tmp/phpstorm.tar.gz && \ +RUN wget -q https://download-cdn.jetbrains.com/webide/PhpStorm-2022.3.1.tar.gz -O /tmp/phpstorm.tar.gz && \ mkdir /opt/phpstorm && \ tar -xzf /tmp/phpstorm.tar.gz -C /opt/phpstorm --strip-components=1 && \ printf '#!/usr/bin/env bash\nscreen -d -m bash -c "/opt/phpstorm/bin/phpstorm.sh $@"' > /usr/local/bin/phpstorm && \ From eab093c3156d0503597663458430576f97194a01 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 3 Jan 2023 10:16:22 +0100 Subject: [PATCH 079/210] Cleanup: Log about Hypernode and labels used for cleanup --- ci/test/run-brancher.sh | 1 + src/Command/Cleanup.php | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 8fa5814..d25dc06 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -79,4 +79,5 @@ $DP rm -f deployment-report.json $DP hypernode-deploy cleanup test -vvv | tee cleanup.log # Run tests on cleanup +grep -F "Cleaning up Brancher instances based on Hypernode hndeployintegr8 with labels [gitref=${GITHUB_SHA:-unknown}]" cleanup.log grep "Stopping brancher Hypernode ${BRANCHER_INSTANCE}..." cleanup.log diff --git a/src/Command/Cleanup.php b/src/Command/Cleanup.php index 6232b15..946f39c 100644 --- a/src/Command/Cleanup.php +++ b/src/Command/Cleanup.php @@ -11,6 +11,7 @@ use Hypernode\DeployConfiguration\BrancherServer; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; +use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -23,12 +24,14 @@ class Cleanup extends Command private DeployerLoader $deployerLoader; private ConfigurationLoader $configurationLoader; private BrancherHypernodeManager $brancherHypernodeManager; + private LoggerInterface $logger; public function __construct( ReportLoader $reportLoader, DeployerLoader $deployerLoader, ConfigurationLoader $configurationLoader, - BrancherHypernodeManager $brancherHypernodeManager + BrancherHypernodeManager $brancherHypernodeManager, + LoggerInterface $logger ) { parent::__construct(); @@ -36,6 +39,7 @@ public function __construct( $this->deployerLoader = $deployerLoader; $this->configurationLoader = $configurationLoader; $this->brancherHypernodeManager = $brancherHypernodeManager; + $this->logger = $logger; } protected function configure() @@ -89,6 +93,13 @@ private function cancelByStage(string $stageName, Configuration $config): void } $labels = $server->getLabels(); $hypernode = $server->getOptions()[Server::OPTION_HN_PARENT_APP]; + $this->logger->debug( + sprintf( + 'Cleaning up Brancher instances based on Hypernode %s with labels [%s]', + $hypernode, + implode(', ', $labels), + ) + ); $brancherHypernodes = $this->brancherHypernodeManager->queryBrancherHypernodes( $hypernode, $labels From 729d278eaa2310fefc34ee16f51050777a18d12b Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 3 Jan 2023 17:40:00 +0100 Subject: [PATCH 080/210] Remove roles selector from builtin tasks This was causing task with a certain selector always running. In the future, when we reiterate on Hypernode Deploy for clusters, we'll see what we really need and what's best to do. For now, it doesn't make sense to keep this in here. --- src/DeployRunner.php | 20 +++---------------- src/Deployer/Task/After/AfterTaskGlobal.php | 8 ++------ src/Deployer/Task/After/CachetoolTask.php | 13 ++++-------- src/Deployer/Task/Deploy/CopyTask.php | 6 ++---- src/Deployer/Task/Deploy/DeployTask.php | 6 ++---- src/Deployer/Task/Deploy/DeployTaskGlobal.php | 4 +--- src/Deployer/Task/Deploy/FinalizeTask.php | 6 ++---- src/Deployer/Task/Deploy/LinkTask.php | 6 ++---- src/Deployer/Task/Deploy/UploadTask.php | 6 ++---- 9 files changed, 20 insertions(+), 55 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index fa20fd0..599f13f 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -14,8 +14,6 @@ use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Exception\TimeoutException; use Hypernode\Deploy\Exception\ValidationException; -use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; -use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\Stage; @@ -135,7 +133,7 @@ private function prepare(bool $configureBuildStage, bool $configureServers, stri } /** - * Configure deploy tasks based on specific configuration in Hipex deploy configuration + * Configure deploy tasks based on specific configuration in Hypernode Deploy configuration * @throws InvalidConfigurationException */ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Configuration $mainConfig): void @@ -146,20 +144,8 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con ); foreach ($configurations as $taskConfig) { - if (!$task->supports($taskConfig)) { - continue; - } - - $deployerTask = $task->configureWithTaskConfig($taskConfig); - if ($deployerTask) { - if ($taskConfig instanceof StageConfigurableInterface && $taskConfig->getStage()) { - $deployerTask->select("stage={$taskConfig->getStage()->getName()}"); - } - - if ($taskConfig instanceof ServerRoleConfigurableInterface && $taskConfig->getServerRoles()) { - $roles = implode("&", $taskConfig->getServerRoles()); - $deployerTask->select("roles={$roles}"); - } + if ($task->supports($taskConfig)) { + $task->configureWithTaskConfig($taskConfig); } } } diff --git a/src/Deployer/Task/After/AfterTaskGlobal.php b/src/Deployer/Task/After/AfterTaskGlobal.php index b000649..3655425 100644 --- a/src/Deployer/Task/After/AfterTaskGlobal.php +++ b/src/Deployer/Task/After/AfterTaskGlobal.php @@ -2,10 +2,9 @@ namespace Hypernode\Deploy\Deployer\Task\After; -use Hypernode\Deploy\Deployer\TaskBuilder; use Hypernode\Deploy\Deployer\Task\TaskBase; +use Hypernode\Deploy\Deployer\TaskBuilder; use Hypernode\DeployConfiguration\Configuration; -use Hypernode\DeployConfiguration\ServerRole; use function count; use function Deployer\task; @@ -32,9 +31,6 @@ public function configure(Configuration $config): void }; } - $role = ServerRole::APPLICATION; - task('deploy:after', $tasks) - ->once() - ->select("roles=$role"); + task('deploy:after', $tasks)->once(); } } diff --git a/src/Deployer/Task/After/CachetoolTask.php b/src/Deployer/Task/After/CachetoolTask.php index c3e33c8..2f097e6 100644 --- a/src/Deployer/Task/After/CachetoolTask.php +++ b/src/Deployer/Task/After/CachetoolTask.php @@ -3,8 +3,6 @@ namespace Hypernode\Deploy\Deployer\Task\After; use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\ServerRole; -use Hypernode\Deploy\Deployer\Task\TaskInterface; use Hypernode\DeployConfiguration\Configuration; use function Deployer\after; @@ -57,7 +55,7 @@ public function configure(Configuration $config): void run('curl -L -o cachetool.phar ' . $this->getCachetoolUrl()); $cachetoolBinary = '{{release_path}}/cachetool.phar'; - writeln(sprintf("Downloaded cachetool %s for PHP %d", $cachetoolBinary, $this->getPhpVersion())); + writeln(sprintf("Downloaded cachetool %s for PHP %f", $cachetoolBinary, $this->getPhpVersion())); return $cachetoolBinary; }); return $cachetoolBinary; @@ -98,14 +96,11 @@ public function configure(Configuration $config): void run("cd {{release_path}} && {{bin/php}} {{bin/cachetool}} apcu:cache:clear {{cachetool_options}}"); }); - - $role = ServerRole::APPLICATION; - task('cachetool:clear:opcache') - ->select("roles=$role"); + task('cachetool:clear:opcache'); task('cachetool:cleanup', function () { run('cd {{deploy_path}} && rm -f current/{{bin/cachetool}}'); - })->select("roles=$role"); + }); } protected function getPhpVersion(): float @@ -121,7 +116,7 @@ public function getCachetoolUrl(): string } if ($phpVersion >= 7.3) { - return $this->versionBinaryMapping[6]; + return $this->versionBinaryMapping[7]; } if ($phpVersion >= 7.2) { diff --git a/src/Deployer/Task/Deploy/CopyTask.php b/src/Deployer/Task/Deploy/CopyTask.php index f31a98c..99e6095 100644 --- a/src/Deployer/Task/Deploy/CopyTask.php +++ b/src/Deployer/Task/Deploy/CopyTask.php @@ -4,7 +4,6 @@ use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; -use Hypernode\DeployConfiguration\ServerRole; use function Deployer\run; use function Deployer\task; @@ -14,7 +13,6 @@ class CopyTask extends TaskBase { public function configure(Configuration $config): void { - $role = ServerRole::APPLICATION; task('deploy:copy:code', function () use ($config) { $packageFilepath = $config->getBuildArchiveFile(); $packageFilename = pathinfo($packageFilepath, PATHINFO_BASENAME); @@ -22,11 +20,11 @@ public function configure(Configuration $config): void upload($packageFilepath, '{{release_path}}'); run('cd {{release_path}} && tar -xf ' . $packageFilename); run('cd {{release_path}} && rm -f ' . $packageFilename); - })->select("roles=$role"); + }); task('deploy:copy', [ 'deploy:copy:code', 'deploy:shared', - ])->select("roles=$role"); + ]); } } diff --git a/src/Deployer/Task/Deploy/DeployTask.php b/src/Deployer/Task/Deploy/DeployTask.php index 06959f8..9fa040e 100644 --- a/src/Deployer/Task/Deploy/DeployTask.php +++ b/src/Deployer/Task/Deploy/DeployTask.php @@ -2,9 +2,8 @@ namespace Hypernode\Deploy\Deployer\Task\Deploy; -use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\ServerRole; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; use function Deployer\fail; @@ -25,13 +24,12 @@ public function __construct(RecipeLoader $loader) public function configure(Configuration $config): void { $this->loader->load('deploy/info.php'); - $role = ServerRole::APPLICATION; task('deploy', [ 'deploy:upload', 'deploy:link', 'deploy:finalize', - ])->select("roles=$role"); + ]); fail('deploy', 'deploy:failed'); } diff --git a/src/Deployer/Task/Deploy/DeployTaskGlobal.php b/src/Deployer/Task/Deploy/DeployTaskGlobal.php index b3d6a9b..d68dd9e 100644 --- a/src/Deployer/Task/Deploy/DeployTaskGlobal.php +++ b/src/Deployer/Task/Deploy/DeployTaskGlobal.php @@ -4,7 +4,6 @@ use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; -use Hypernode\DeployConfiguration\ServerRole; use function Deployer\task; use function Hypernode\Deploy\Deployer\noop; @@ -14,7 +13,6 @@ class DeployTaskGlobal extends TaskBase public function configure(Configuration $config): void { $tasks = $config->getDeployTasks(); - $role = ServerRole::APPLICATION; if (count($tasks)) { task('deploy:deploy', $tasks); @@ -22,6 +20,6 @@ public function configure(Configuration $config): void task('deploy:deploy', noop()); } - task('deploy:deploy', $tasks)->select("roles=$role"); + task('deploy:deploy', $tasks); } } diff --git a/src/Deployer/Task/Deploy/FinalizeTask.php b/src/Deployer/Task/Deploy/FinalizeTask.php index 39b86ea..eafec6c 100644 --- a/src/Deployer/Task/Deploy/FinalizeTask.php +++ b/src/Deployer/Task/Deploy/FinalizeTask.php @@ -2,9 +2,8 @@ namespace Hypernode\Deploy\Deployer\Task\Deploy; -use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\ServerRole; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; use function Deployer\after; @@ -26,14 +25,13 @@ public function __construct(RecipeLoader $loader) public function configure(Configuration $config): void { $this->loader->load('deploy/info.php'); - $role = ServerRole::APPLICATION; task('deploy:finalize', [ 'deploy:after', 'deploy:unlock', 'deploy:cleanup', 'deploy:success', - ])->select("roles=$role"); + ]); fail('deploy', 'deploy:failed'); after('deploy:failed', 'deploy:unlock'); diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index 519fa56..bdd595b 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -4,7 +4,6 @@ use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; -use Hypernode\DeployConfiguration\ServerRole; use function Deployer\run; use function Deployer\task; @@ -14,11 +13,10 @@ class LinkTask extends TaskBase { public function configure(Configuration $config): void { - $role = ServerRole::APPLICATION; task('deploy:link', [ 'deploy:symlink', 'deploy:public_link', - ])->select("roles=$role"); + ]); // Symlink public_html folder task('deploy:public_link', function () { @@ -33,6 +31,6 @@ public function configure(Configuration $config): void } else { run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); } - })->select("roles=$role"); + }); } } diff --git a/src/Deployer/Task/Deploy/UploadTask.php b/src/Deployer/Task/Deploy/UploadTask.php index d646e67..f8c31ec 100644 --- a/src/Deployer/Task/Deploy/UploadTask.php +++ b/src/Deployer/Task/Deploy/UploadTask.php @@ -2,9 +2,8 @@ namespace Hypernode\Deploy\Deployer\Task\Deploy; -use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\ServerRole; use Hypernode\Deploy\Deployer\RecipeLoader; +use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; use function Deployer\fail; @@ -25,7 +24,6 @@ public function __construct(RecipeLoader $loader) public function configure(Configuration $config): void { $this->loader->load('deploy/info.php'); - $role = ServerRole::APPLICATION; task('deploy:upload', [ 'deploy:info', @@ -33,7 +31,7 @@ public function configure(Configuration $config): void 'deploy:prepare', 'deploy:copy', 'deploy:deploy', - ])->select("roles=$role"); + ]); fail('deploy', 'deploy:failed'); } From 018af56d6a7d74787427a396d3ce313b24122d9a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 4 Jan 2023 11:05:08 +0100 Subject: [PATCH 081/210] Remove roles selector from builtin tasks in TaskBuilder --- src/Deployer/TaskBuilder.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/Deployer/TaskBuilder.php b/src/Deployer/TaskBuilder.php index 83cc2db..d97e767 100644 --- a/src/Deployer/TaskBuilder.php +++ b/src/Deployer/TaskBuilder.php @@ -8,8 +8,6 @@ use Deployer\Task\Task; use Hypernode\DeployConfiguration\Command\Command; use Hypernode\DeployConfiguration\Command\DeployCommand; -use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; -use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\TaskConfigurationInterface; use function Deployer\parse; @@ -54,15 +52,6 @@ private function build(Command $command, string $name): Task $this->runCommandWithin($command); }); - if ($command instanceof StageConfigurableInterface && $command->getStage()) { - $task->select("stage={$command->getStage()->getName()}"); - } - - if ($command instanceof ServerRoleConfigurableInterface && $command->getServerRoles()) { - $roles = implode("&", $command->getServerRoles()); - $task->select("roles=$roles"); - } - return $task; } From 862ecbf3379a92cc5eed1f09eb2cbcd837dc52f6 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Fri, 20 Jan 2023 15:44:07 +0100 Subject: [PATCH 082/210] feat: allow reusing of previous brancher instance Useful for doing rapid development, and you don't care too much about pristine environments. Instead of creating a new Brancher node when using `addBrancherServer`, just reuse the last one if there is any. --- ci/test/run-brancher.sh | 8 +++++- src/Brancher/BrancherHypernodeManager.php | 19 ++++++++++++++ src/Command/Build.php | 2 +- src/Command/ComposerAuth.php | 2 +- src/Command/Deploy.php | 10 +++++++- src/Command/RunTask.php | 1 + src/DeployRunner.php | 31 +++++++++++++++-------- 7 files changed, 59 insertions(+), 14 deletions(-) diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index d25dc06..30bf146 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -52,9 +52,15 @@ $DP test -f deployment-report.json $DP jq . deployment-report.json $DP jq .version deployment-report.json -r -e $DP jq .stage deployment-report.json -r -e -$DP jq .hostnames[0] deployment-report.json -r -e +BRANCHER_INSTANCE=$($DP jq .hostnames[0] deployment-report.json -r -e) $DP jq .brancher_hypernodes[0] deployment-report.json -r -e +# Run another test by reusing the last instance +$DP hypernode-deploy deploy test -f /web/deploy.php -vvv --reuse-brancher + +# Hostname of the reused Brancher instance should be the same as the previous one +$DP jq .hostnames[0] deployment-report.json -r -e | grep -F "${BRANCHER_INSTANCE}" + # cleanup data $DP hypernode-deploy cleanup -vvv diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index 27867cb..d51213f 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -56,6 +56,25 @@ public function queryBrancherHypernodes(string $hypernode, array $labels = []): return $result; } + /** + * Query brancher instances for the given Hypernode and label and return the + * most recent Brancher instance name. + * + * @param string $hypernode The parent hypernode to query the Brancher instances from + * @param string[] $labels Labels to match against, may be empty + * @return string|null The found Brancher instance name, or null if none was found + */ + public function reuseExistingBrancherHypernode(string $hypernode, array $labels = []): ?string + { + $brancherHypernodes = $this->queryBrancherHypernodes($hypernode, $labels); + if (count($brancherHypernodes) > 0) { + // Return the last brancher Hypernode, which is the most recently created one + return $brancherHypernodes[count($brancherHypernodes) - 1]; + } + + return null; + } + /** * Create brancher Hypernode instance for given Hypernode. * diff --git a/src/Command/Build.php b/src/Command/Build.php index c8bceec..ba82b2e 100644 --- a/src/Command/Build.php +++ b/src/Command/Build.php @@ -33,6 +33,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD, true, false); + return $this->deployRunner->run($output, 'build', DeployRunner::TASK_BUILD, true, false, false); } } diff --git a/src/Command/ComposerAuth.php b/src/Command/ComposerAuth.php index 1dd5caf..524faff 100644 --- a/src/Command/ComposerAuth.php +++ b/src/Command/ComposerAuth.php @@ -34,6 +34,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth', false, false); + return $this->deployRunner->run($output, 'build', 'deploy:vendors:auth', false, false, false); } } diff --git a/src/Command/Deploy.php b/src/Command/Deploy.php index 2ec7c46..1e6edfe 100644 --- a/src/Command/Deploy.php +++ b/src/Command/Deploy.php @@ -7,6 +7,7 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Throwable; @@ -28,6 +29,12 @@ protected function configure() $this->setName('deploy'); $this->setDescription('Deploy application.'); $this->addArgument('stage', InputArgument::REQUIRED, 'Stage deploy to'); + $this->addOption( + 'reuse-brancher', + null, + InputOption::VALUE_NONE, + 'Reuse the brancher Hypernode from the previous deploy. Only works when using addBrancherServer in your deploy configuration.' + ); } /** @@ -40,7 +47,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $input->getArgument('stage'), DeployRunner::TASK_DEPLOY, false, - true + true, + $input->getOption('reuse-brancher') ); if ($result === 0) { diff --git a/src/Command/RunTask.php b/src/Command/RunTask.php index 93a303d..18651d4 100644 --- a/src/Command/RunTask.php +++ b/src/Command/RunTask.php @@ -50,6 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $input->getArgument(self::ARGUMENT_TASK), $input->getOption(self::OPTION_CONFIGURE_BUILD_STAGE), $input->getOption(self::OPTION_CONFIGURE_SERVERS), + false ); } } diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 599f13f..b822189 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -72,12 +72,12 @@ public function __construct( * @throws Throwable * @throws Exception */ - public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers): int + public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers, bool $reuseBrancher): int { $deployer = $this->deployerLoader->getOrCreateInstance($output); try { - $this->prepare($configureBuildStage, $configureServers, $stage); + $this->prepare($configureBuildStage, $configureServers, $stage, $reuseBrancher); } catch (InvalidConfigurationException | ValidationException $e) { $output->write($e->getMessage()); return 1; @@ -94,7 +94,7 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ * @throws InvalidConfigurationException * @throws Throwable */ - private function prepare(bool $configureBuildStage, bool $configureServers, string $stage): void + private function prepare(bool $configureBuildStage, bool $configureServers, string $stage, bool $reuseBrancher): void { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); @@ -108,7 +108,7 @@ private function prepare(bool $configureBuildStage, bool $configureServers, stri } if ($configureServers) { - $this->configureServers($config, $stage); + $this->configureServers($config, $stage, $reuseBrancher); } foreach ($tasks as $task) { @@ -150,7 +150,7 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con } } - private function configureServers(Configuration $config, string $stage): void + private function configureServers(Configuration $config, string $stage, bool $reuseBrancher): void { foreach ($config->getStages() as $configStage) { if ($configStage->getName() !== $stage) { @@ -158,14 +158,14 @@ private function configureServers(Configuration $config, string $stage): void } foreach ($configStage->getServers() as $server) { - $this->configureStageServer($configStage, $server, $config); + $this->configureStageServer($configStage, $server, $config, $reuseBrancher); } } } - private function configureStageServer(Stage $stage, Server $server, Configuration $config): void + private function configureStageServer(Stage $stage, Server $server, Configuration $config, bool $reuseBrancher): void { - $this->maybeConfigureBrancherServer($server); + $this->maybeConfigureBrancherServer($server, $reuseBrancher); $host = host($stage->getName() . ':' . $server->getHostname()); $host->setHostname($server->getHostname()); @@ -218,7 +218,7 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio } } - private function maybeConfigureBrancherServer(Server $server): void + private function maybeConfigureBrancherServer(Server $server, bool $reuseBrancher): void { $serverOptions = $server->getOptions(); $isBrancher = $serverOptions[Server::OPTION_HN_BRANCHER] ?? false; @@ -241,7 +241,18 @@ private function maybeConfigureBrancherServer(Server $server): void $data = $settings; $data['labels'] = $labels; - $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); + if ($reuseBrancher) { + $this->log->info('Looking for existing brancher Hypernode. If none is found, a new one will be created.'); + $brancherApp = $this->brancherHypernodeManager->reuseExistingBrancherHypernode($parentApp, $labels); + if ($brancherApp) { + $this->log->info(sprintf('Found existing brancher Hypernode, name is %s.', $brancherApp)); + } else { + $this->log->info('No existing brancher Hypernode found, creating a new one.'); + $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); + } + } else { + $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); + } $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); From ee561d61de01127fb67349a8f62dd2c4d3da4838 Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Sat, 21 Jan 2023 16:17:43 +0100 Subject: [PATCH 083/210] fix: don't wait for recycled brancher Only check availability when creating a new brancher node --- src/DeployRunner.php | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index b822189..a78a840 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -241,30 +241,24 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche $data = $settings; $data['labels'] = $labels; - if ($reuseBrancher) { - $this->log->info('Looking for existing brancher Hypernode. If none is found, a new one will be created.'); + if ($reuseBrancher && $this->brancherHypernodeManager->queryBrancherHypernodes($parentApp, $labels)) { $brancherApp = $this->brancherHypernodeManager->reuseExistingBrancherHypernode($parentApp, $labels); - if ($brancherApp) { - $this->log->info(sprintf('Found existing brancher Hypernode, name is %s.', $brancherApp)); - } else { - $this->log->info('No existing brancher Hypernode found, creating a new one.'); - $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); - } + $this->log->info(sprintf('Found existing brancher Hypernode, name is %s.', $brancherApp)); + $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); } else { $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); - } - - $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); - $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); - $this->brancherHypernodesRegistered[] = $brancherApp; - - try { - $this->log->info('Waiting for brancher Hypernode to become available...'); - $this->brancherHypernodeManager->waitForAvailability($brancherApp); - $this->log->info('Brancher Hypernode has become available!'); - } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { - $this->brancherHypernodeManager->cancel($brancherApp); - throw $e; + $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); + $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); + $this->brancherHypernodesRegistered[] = $brancherApp; + + try { + $this->log->info('Waiting for brancher Hypernode to become available...'); + $this->brancherHypernodeManager->waitForAvailability($brancherApp); + $this->log->info('Brancher Hypernode has become available!'); + } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { + $this->brancherHypernodeManager->cancel($brancherApp); + throw $e; + } } } } From 7531ce9e3fe8ac4109343104accecc42cb5416bb Mon Sep 17 00:00:00 2001 From: Alexander Grooff Date: Mon, 23 Jan 2023 09:53:17 +0100 Subject: [PATCH 084/210] refactor: inline if assignment Saves another line of code --- src/DeployRunner.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index a78a840..6fe045d 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -241,8 +241,7 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche $data = $settings; $data['labels'] = $labels; - if ($reuseBrancher && $this->brancherHypernodeManager->queryBrancherHypernodes($parentApp, $labels)) { - $brancherApp = $this->brancherHypernodeManager->reuseExistingBrancherHypernode($parentApp, $labels); + if ($reuseBrancher && $brancherApp = $this->brancherHypernodeManager->reuseExistingBrancherHypernode($parentApp, $labels)) { $this->log->info(sprintf('Found existing brancher Hypernode, name is %s.', $brancherApp)); $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); } else { From 71ee0205896056f903e94ac3d558284ac0de716c Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 24 Jan 2023 10:20:29 +0100 Subject: [PATCH 085/210] DeployRunner: Add SIGINT handler to run fail tasks Works like this: ``` $ hypernode-deploy deploy production task deploy:info [production:example.hypernode.io] info deploying HEAD task prepare:ssh task deploy:info [production:example.hypernode.io] info deploying HEAD task deploy:setup task deploy:lock task deploy:release task deploy:shared task deploy:writable task deploy:copy:code ^C[warning] Received signal SIGINT, running fail jobs [production:example.hypernode.io] error in CopyTask.php on line 20: [production:example.hypernode.io] run readlink /data/web/apps/example/release [production:example.hypernode.io] exit code -1 (Unknown error) task deploy:failed task deploy:unlock ``` --- src/DeployRunner.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 6fe045d..0ceef75 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -303,6 +303,12 @@ private function runStage(Deployer $deployer, string $stage, string $task = 'dep $tasks = $deployer->scriptManager->getTasks($task); $executor = $deployer->master; + pcntl_signal(SIGINT, function () { + $this->log->warning("Received signal SIGINT, running fail jobs"); + // We don't have to do anything here. Underlying processes will receive the SIGINT signal as well + // and that will cause the $exitCode below to be 255, which will cause the fail tasks to be run. + }); + /** * Set the env variable to tell deployer to deploy the hosts sequentially instead of parallel. * @see \Deployer\Executor\Master::runTask() From d3905487584a28a75e3abd572d39df01565140df Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 31 Jan 2023 11:48:58 +0100 Subject: [PATCH 086/210] composer: Add ext-pcntl requirement --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 90b338a..fd344d2 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ ], "require": { "ext-json": "*", + "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2", "deployer/deployer": "dev-master#e374a8e as v7.0.0", From 8bd60032dfe5f50bb545ee3433659e67dc596b9d Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 31 Jan 2023 11:49:14 +0100 Subject: [PATCH 087/210] composer: Update composer dependencies --- composer.lock | 421 +++++++++++++++++++++++++++++--------------------- 1 file changed, 248 insertions(+), 173 deletions(-) diff --git a/composer.lock b/composer.lock index 22d36eb..89c10ad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1753404b5ca6d05cc4b2c167bef4b0f3", + "content-hash": "4009781c378347521f06e78afe5c6adf", "packages": [ { "name": "clue/stream-filter", @@ -92,7 +92,7 @@ "php": "^8.0|^7.3", "psr/http-message": "^1", "react/http": "^1.5", - "symfony/console": "^5", + "symfony/console": "^5.4.9", "symfony/polyfill-php80": "^1.22", "symfony/process": "^5", "symfony/yaml": "^5" @@ -142,36 +142,39 @@ "type": "github" } ], - "time": "2022-10-27T07:36:02+00:00" + "time": "2023-01-30T20:19:57+00:00" }, { "name": "doctrine/annotations", - "version": "1.13.3", + "version": "1.14.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/ad785217c1e9555a7d6c6c8c9f406395a5e2882b", + "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^1 || ^2", "ext-tokenizer": "*", "php": "^7.1 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^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": { @@ -213,37 +216,82 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.3" + "source": "https://github.com/doctrine/annotations/tree/1.14.2" }, - "time": "2022-07-02T10:48:51+00:00" + "time": "2022-12-15T06:48:22+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5|^8.5|^9.5", + "psr/log": "^1|^2|^3" + }, + "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/v1.0.0" + }, + "time": "2022-05-02T15:47:09+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "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.0", + "doctrine/coding-standard": "^9 || ^10", "phpstan/phpstan": "^1.3", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -275,7 +323,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { @@ -291,7 +339,7 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { "name": "evenement/evenement", @@ -952,16 +1000,16 @@ }, { "name": "nesbot/carbon", - "version": "2.63.0", + "version": "2.66.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347" + "reference": "496712849902241f04902033b0441b269effe001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ad35dd71a6a212b98e4b87e97389b6fa85f0e347", - "reference": "ad35dd71a6a212b98e4b87e97389b6fa85f0e347", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", + "reference": "496712849902241f04902033b0441b269effe001", "shasum": "" }, "require": { @@ -972,7 +1020,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -1050,7 +1098,7 @@ "type": "tidelift" } ], - "time": "2022-10-30T18:34:28+00:00" + "time": "2023-01-29T18:53:47+00:00" }, { "name": "php-di/invoker", @@ -1967,16 +2015,16 @@ }, { "name": "react/cache", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/cache.git", - "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e" + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/4bf736a2cccec7298bdf745db77585966fc2ca7e", - "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { @@ -1984,7 +2032,7 @@ "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { @@ -2027,19 +2075,15 @@ ], "support": { "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.1.1" + "source": "https://github.com/reactphp/cache/tree/v1.2.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-02-02T06:47:52+00:00" + "time": "2022-11-30T15:59:55+00:00" }, { "name": "react/dns", @@ -2766,16 +2810,16 @@ }, { "name": "symfony/console", - "version": "v5.4.15", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669" + "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ea59bb0edfaf9f28d18d8791410ee0355f317669", - "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669", + "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", + "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", "shasum": "" }, "require": { @@ -2845,7 +2889,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.15" + "source": "https://github.com/symfony/console/tree/v5.4.19" }, "funding": [ { @@ -2861,20 +2905,20 @@ "type": "tidelift" } ], - "time": "2022-10-26T21:41:52+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", "shasum": "" }, "require": { @@ -2883,7 +2927,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -2912,7 +2956,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" }, "funding": [ { @@ -2928,20 +2972,20 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/6071aebf810ad13fe8200c224f36103abb37cf1f", + "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f", "shasum": "" }, "require": { @@ -2975,7 +3019,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.19" }, "funding": [ { @@ -2991,20 +3035,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2023-01-14T19:14:44+00:00" }, { "name": "symfony/http-client", - "version": "v5.4.15", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b" + "reference": "0c22562d0601e19bd01c4480893f5438e6b12db5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b", - "reference": "8f29b0f06c9ff48c8431e78eb90c8bd6f82cb12b", + "url": "https://api.github.com/repos/symfony/http-client/zipball/0c22562d0601e19bd01c4480893f5438e6b12db5", + "reference": "0c22562d0601e19bd01c4480893f5438e6b12db5", "shasum": "" }, "require": { @@ -3062,7 +3106,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.15" + "source": "https://github.com/symfony/http-client/tree/v5.4.19" }, "funding": [ { @@ -3078,7 +3122,7 @@ "type": "tidelift" } ], - "time": "2022-10-25T16:22:13+00:00" + "time": "2023-01-12T15:47:53+00:00" }, { "name": "symfony/http-client-contracts", @@ -3160,16 +3204,16 @@ }, { "name": "symfony/options-resolver", - "version": "v6.1.0", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", "shasum": "" }, "require": { @@ -3207,7 +3251,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" }, "funding": [ { @@ -3223,7 +3267,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3795,16 +3839,16 @@ }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", "shasum": "" }, "require": { @@ -3837,7 +3881,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v5.4.19" }, "funding": [ { @@ -3853,7 +3897,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2023-01-01T08:32:19+00:00" }, { "name": "symfony/service-contracts", @@ -3940,16 +3984,16 @@ }, { "name": "symfony/string", - "version": "v6.1.7", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", "shasum": "" }, "require": { @@ -3965,6 +4009,7 @@ "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", "symfony/translation-contracts": "^2.0|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, @@ -4005,7 +4050,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.7" + "source": "https://github.com/symfony/string/tree/v6.2.5" }, "funding": [ { @@ -4021,20 +4066,20 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:31+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/translation", - "version": "v6.1.6", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e6cd330e5a072518f88d65148f3f165541807494" + "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", - "reference": "e6cd330e5a072518f88d65148f3f165541807494", + "url": "https://api.github.com/repos/symfony/translation/zipball/60556925a703cfbc1581cde3b3f35b0bb0ea904c", + "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c", "shasum": "" }, "require": { @@ -4054,6 +4099,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", "symfony/config": "^5.4|^6.0", "symfony/console": "^5.4|^6.0", @@ -4068,6 +4114,7 @@ "symfony/yaml": "^5.4|^6.0" }, "suggest": { + "nikic/php-parser": "To use PhpAstExtractor", "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" @@ -4101,7 +4148,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.1.6" + "source": "https://github.com/symfony/translation/tree/v6.2.5" }, "funding": [ { @@ -4117,20 +4164,20 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:04:03+00:00" + "time": "2023-01-05T07:00:27+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7", + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7", "shasum": "" }, "require": { @@ -4142,7 +4189,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -4182,7 +4229,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0" }, "funding": [ { @@ -4198,20 +4245,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.14", + "version": "v5.4.19", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e83fe9a72011f07c662da46a05603d66deeeb487" + "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e83fe9a72011f07c662da46a05603d66deeeb487", - "reference": "e83fe9a72011f07c662da46a05603d66deeeb487", + "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", + "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", "shasum": "" }, "require": { @@ -4257,7 +4304,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.14" + "source": "https://github.com/symfony/yaml/tree/v5.4.19" }, "funding": [ { @@ -4273,20 +4320,20 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:50+00:00" + "time": "2023-01-10T18:51:14+00:00" }, { "name": "twig/twig", - "version": "v2.15.3", + "version": "v2.15.4", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "ab402673db8746cb3a4c46f3869d6253699f614a" + "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/ab402673db8746cb3a4c46f3869d6253699f614a", - "reference": "ab402673db8746cb3a4c46f3869d6253699f614a", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3e059001d6d597dd50ea7c74dd2464b4adea48d3", + "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3", "shasum": "" }, "require": { @@ -4341,7 +4388,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.3" + "source": "https://github.com/twigphp/Twig/tree/v2.15.4" }, "funding": [ { @@ -4353,7 +4400,7 @@ "type": "tidelift" } ], - "time": "2022-09-28T08:40:08+00:00" + "time": "2022-12-27T12:26:20+00:00" }, { "name": "webmozart/assert", @@ -4911,30 +4958,30 @@ }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -4961,7 +5008,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -4977,7 +5024,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "felixfbecker/advanced-json-rpc", @@ -5141,16 +5188,16 @@ }, { "name": "netresearch/jsonmapper", - "version": "v4.0.0", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" + "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", - "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", "shasum": "" }, "require": { @@ -5186,22 +5233,22 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" }, - "time": "2020-12-01T19:48:11+00:00" + "time": "2022-12-08T20:46:14+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.2", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -5242,9 +5289,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-11-12T15:38:23+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "openlss/lib-array2xml", @@ -5577,22 +5624,22 @@ }, { "name": "phpro/grumphp-shim", - "version": "v1.13.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/phpro/grumphp-shim.git", - "reference": "973a933d176be41f1196d8db7851e32f985dd798" + "reference": "dbb5ce58f57005ac2c6fddb2073337381ecf5893" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/973a933d176be41f1196d8db7851e32f985dd798", - "reference": "973a933d176be41f1196d8db7851e32f985dd798", + "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/dbb5ce58f57005ac2c6fddb2073337381ecf5893", + "reference": "dbb5ce58f57005ac2c6fddb2073337381ecf5893", "shasum": "" }, "require": { "composer-plugin-api": "~2.0", "ext-json": "*", - "php": "^7.4 || ^8.0" + "php": "^8.0" }, "replace": { "phpro/grumphp": "self.version" @@ -5630,9 +5677,9 @@ "description": "GrumPHP Phar distribution", "support": { "issues": "https://github.com/phpro/grumphp-shim/issues", - "source": "https://github.com/phpro/grumphp-shim/tree/v1.13.0" + "source": "https://github.com/phpro/grumphp-shim/tree/v1.15.0" }, - "time": "2022-06-24T08:34:50+00:00" + "time": "2022-12-22T12:37:59+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5933,16 +5980,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.31", + "version": "8.5.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "33c126b09a42de5c99e5e8032b54e8221264a74e" + "reference": "375686930d05c9fd7d20f6e5fc38121e8d7a9d55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33c126b09a42de5c99e5e8032b54e8221264a74e", - "reference": "33c126b09a42de5c99e5e8032b54e8221264a74e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/375686930d05c9fd7d20f6e5fc38121e8d7a9d55", + "reference": "375686930d05c9fd7d20f6e5fc38121e8d7a9d55", "shasum": "" }, "require": { @@ -6010,7 +6057,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.31" + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.32" }, "funding": [ { @@ -6026,7 +6073,7 @@ "type": "tidelift" } ], - "time": "2022-10-28T05:57:37+00:00" + "time": "2023-01-26T08:30:25+00:00" }, { "name": "roave/security-advisories", @@ -6034,12 +6081,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "0399700d159e09b16645945758b65b921d3491fe" + "reference": "85ea494f3599c1d23c81c65d0c994e0f80895a75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0399700d159e09b16645945758b65b921d3491fe", - "reference": "0399700d159e09b16645945758b65b921d3491fe", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/85ea494f3599c1d23c81c65d0c994e0f80895a75", + "reference": "85ea494f3599c1d23c81c65d0c994e0f80895a75", "shasum": "" }, "conflict": { @@ -6048,6 +6095,7 @@ "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "aheinze/cockpit": "<=2.2.1", "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", "alextselegidis/easyappointments": "<=1.4.3", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", @@ -6059,17 +6107,19 @@ "apereo/phpcas": "<1.6", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2", + "arc/web": "<3", "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "awesome-support/awesome-support": "<=6.0.7", "aws/aws-sdk-php": ">=3,<3.2.1", "backdrop/backdrop": "<=1.23", - "badaso/core": "<2.6.1", + "badaso/core": "<2.7", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.2", - "baserproject/basercms": "<4.5.4", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<4.7.2", "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bmarshall511/wordpress_zero_spam": "<5.2.13", @@ -6084,7 +6134,8 @@ "bugsnag/bugsnag-laravel": ">=2,<2.0.2", "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": "<3.10.3|>=4,<4.0.6", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|= 1.3.7|>=4.1,<4.1.4", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", "cardgate/magento2": "<2.0.33", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", @@ -6093,11 +6144,11 @@ "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "codeigniter4/framework": "<4.2.7", + "codeigniter4/framework": "<4.2.11", "codeigniter4/shield": "= 1.0.0-beta", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", - "concrete5/concrete5": "<9.1.3|>= 9.0.0RC1, < 9.1.3", + "concrete5/concrete5": "<=9.1.3|>= 9.0.0RC1, < 9.1.3", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3", @@ -6112,6 +6163,7 @@ "darylldoyle/safe-svg": "<1.9.10", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", @@ -6158,11 +6210,12 @@ "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", "facturascripts/facturascripts": "<=2022.8", "feehi/cms": "<=2.1.1", - "feehi/feehicms": "<=2.0.1.1", + "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", "filegator/filegator": "<7.8", "firebase/php-jwt": "<2", - "flarum/core": ">=1,<=1.0.1|>=1.5,<1.6.2", + "flarum/core": "<1.6.3", + "flarum/mentions": "<1.6.3", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", @@ -6177,7 +6230,7 @@ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<0.10.39", + "froxlor/froxlor": "<2.0.8", "fuel/core": "<1.8.1", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", @@ -6191,11 +6244,13 @@ "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.6.5", + "grumpydictator/firefly-iii": "<5.8", "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", "guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1", + "harvesthq/chosen": "<1.8.7", "helloxz/imgurl": "= 2.31|<=2.31", "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", "hyn/multi-tenant": ">=5.6,<5.7.2", @@ -6213,6 +6268,7 @@ "impresscms/impresscms": "<=1.4.3", "in2code/femanager": "<5.5.2|>=6,<6.3.3|>=7,<7.0.1", "in2code/lux": "<17.6.1|>=18,<24.0.2", + "innologi/typo3-appointments": "<2.0.6", "intelliants/subrion": "<=4.2.1", "islandora/islandora": ">=2,<2.4.1", "ivankristianto/phpwhois": "<=4.3", @@ -6228,6 +6284,7 @@ "jsdecena/laracom": "<2.0.9", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", "kitodo/presentation": "<3.1.2", "klaviyo/magento2-extension": ">=1,<3", @@ -6247,6 +6304,7 @@ "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "librenms/librenms": "<22.10", + "liftkit/database": "<2.13.2", "limesurvey/limesurvey": "<3.27.19", "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": ">2.2.4,<2.2.6", @@ -6265,6 +6323,7 @@ "melisplatform/melis-cms": "<5.0.1", "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", "microweber/microweber": "<=1.3.1", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", @@ -6299,7 +6358,7 @@ "open-web-analytics/open-web-analytics": "<1.7.4", "opencart/opencart": "<=3.0.3.7", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", + "openmage/magento-lts": "<19.4.22|>=20,<20.0.19", "orchid/platform": ">=9,<9.4.4", "oro/commerce": ">=4.1,<5.0.6", "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", @@ -6316,6 +6375,7 @@ "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", + "php-mod/curl": "<2.3.2", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", @@ -6328,16 +6388,17 @@ "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", "pimcore/data-hub": "<1.2.4", - "pimcore/pimcore": "<10.5.9", + "pimcore/pimcore": "<10.5.14", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<4.7.2|>= 4.0.0-BETA5, < 4.4.2", + "pocketmine/pocketmine-mp": "<4.12.5|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": ">=1.6.0.10,<1.7.8.7", + "prestashop/prestashop": "<1.7.8.8", "prestashop/productcomments": "<5.0.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", @@ -6350,12 +6411,14 @@ "ptrofimov/beanstalk_console": "<1.7.14", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", + "pyrocms/pyrocms": "<=3.9.1", "rainlab/debugbar-plugin": "<3.1", "rankmath/seo-by-rank-math": "<=1.0.95", "react/http": ">=0.7,<1.7", "remdex/livehelperchat": "<3.99", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", + "roots/soil": "<4.1", "rudloff/alltube": "<3.0.3", "s-cart/core": "<6.9", "s-cart/s-cart": "<6.9", @@ -6364,8 +6427,8 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.9", - "shopware/platform": "<=6.4.9", + "shopware/core": "<=6.4.18", + "shopware/platform": "<=6.4.18", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.7.14", "shopware/storefront": "<=6.4.8.1", @@ -6382,7 +6445,7 @@ "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", - "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/subsites": ">=2,<2.6.1", "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", "silverstripe/versioned-admin": ">=1,<1.11.1", @@ -6390,12 +6453,15 @@ "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", "simplesamlphp/simplesamlphp": "<1.18.6", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.47|>=4,<4.2.1", - "snipe/snipe-it": "<6.0.11|>= 6.0.0-RC-1, <= 6.0.0-RC-5", + "snipe/snipe-it": "<=6.0.14|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", "spipu/html2pdf": "<5.2.4", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", @@ -6404,7 +6470,9 @@ "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", "subrion/cms": "<=4.2.1", + "sukohi/surpass": "<1", "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", + "sumocoders/framework-user-bundle": "<1.4", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", @@ -6414,8 +6482,9 @@ "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfont/process": ">=0,<4", + "symfont/process": ">=0", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", @@ -6453,22 +6522,23 @@ "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<=5.1.7", - "thorsten/phpmyfaq": "<3.1.8", - "tinymce/tinymce": "<5.10", + "thorsten/phpmyfaq": "<3.1.10", + "tinymce/tinymce": "<5.10.7|>=6,<6.3.1", "titon/framework": ">=0,<9.9.99", "tobiasbg/tablepress": "<= 2.0-RC1", - "topthink/framework": "<=6.0.13", + "topthink/framework": "<6.0.14", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", - "tribalsystems/zenario": "<=9.3.57186", + "tribalsystems/zenario": "<=9.3.57595", "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.32|>=11,<11.5.16", + "typo3/cms": "<2.0.5|>=3,<3.0.3|>=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.58|>=8,<8.7.48|>=9,<9.5.37|>=10,<10.4.32|>=11,<11.5.16", + "typo3/cms-core": "<8.7.49|>=9,<9.5.38|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "typo3/html-sanitizer": ">=1,<1.0.7|>=2,<2.0.16", + "typo3/html-sanitizer": ">=1,<1.5|>=2,<2.1.1", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", @@ -6479,11 +6549,13 @@ "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vova07/yii2-fileapi-widget": "<0.1.9", "vrana/adminer": "<4.8.1", "wallabag/tcpdf": "<6.2.22", "wanglelecc/laracms": "<=1.0.3", "web-auth/webauthn-framework": ">=3.3,<3.3.4", "webcoast/deferred-image-processing": "<1.0.2", + "webpa/webpa": "<3.1.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "wintercms/winter": "<1.0.475|>=1.1,<1.1.10|>=1.2,<1.2.1", @@ -6492,6 +6564,7 @@ "wp-graphql/wp-graphql": "<0.3.5", "wpanel/wpanel4-cms": "<=4.3.1", "wwbn/avideo": "<=11.6", + "xataface/xataface": "<3", "yeswiki/yeswiki": "<4.1", "yetiforce/yetiforce-crm": "<=6.4", "yidashi/yii2cmf": "<=2", @@ -6501,9 +6574,10 @@ "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.43", "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-gii": "<=2.2.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", "yoast-seo-for-typo3/yoast_seo": "<7.2.3", "yourls/yourls": "<=1.8.2", "zendesk/zendesk_api_client_php": "<2.2.11", @@ -6566,7 +6640,7 @@ "type": "tidelift" } ], - "time": "2022-11-23T23:04:03+00:00" + "time": "2023-01-26T20:04:06+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -7580,6 +7654,7 @@ "prefer-lowest": false, "platform": { "ext-json": "*", + "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2" }, From ea55c7fd469ded61125d7e67d3d68957ad7b32c2 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 1 Feb 2023 09:20:32 +0100 Subject: [PATCH 088/210] varnish: Fix invalid varnish 6 vcl name generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to varnish: > VCL names are restricted to alphanumeric characters, dashes (-) and underscores (_). In addition, the first character should be alphabetic. That is, the name should match “[A-Za-z][A-Za-z0-9_-]*”. Source: https://varnish-cache.org/docs/5.0/whats-new/upgrading-5.0.html#changes-to-vcl --- .../Task/PlatformConfiguration/VarnishLoadTask.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Deployer/Task/PlatformConfiguration/VarnishLoadTask.php b/src/Deployer/Task/PlatformConfiguration/VarnishLoadTask.php index d653e57..2a6d4b1 100644 --- a/src/Deployer/Task/PlatformConfiguration/VarnishLoadTask.php +++ b/src/Deployer/Task/PlatformConfiguration/VarnishLoadTask.php @@ -2,14 +2,15 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\PlatformConfiguration\VarnishConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; use function Deployer\fail; +use function Deployer\get; use function Deployer\run; use function Deployer\set; use function Deployer\task; @@ -43,7 +44,14 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta }); task(self::TASK_NAME, function () { - run('{{varnishadm_path}} vcl.load {{domain}}.{{release_name}}_varnish {{varnish_release_path}}/varnish.vcl'); + $appName = get('domain'); + $appName = preg_replace('/[^a-zA-Z0-9-_]+/', '-', $appName); + $appName = trim($appName, '-'); + + $releaseName = get('release_name'); + $vclName = sprintf('varnish-%s-%s', $appName, $releaseName); + set('varnish_vcl_name', $vclName); + run('{{varnishadm_path}} vcl.load {{varnish_vcl_name}} {{varnish_release_path}}/varnish.vcl'); }); fail(self::TASK_NAME, 'deploy:varnish:cleanup'); From e5f3e80b35d2905be08ff397bfc10d6388cc25f0 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 1 Feb 2023 11:20:55 +0100 Subject: [PATCH 089/210] composer: Update dependencies --- composer.lock | 54 +++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/composer.lock b/composer.lock index 89c10ad..8137846 100644 --- a/composer.lock +++ b/composer.lock @@ -142,7 +142,7 @@ "type": "github" } ], - "time": "2023-01-30T20:19:57+00:00" + "time": "2023-01-31T21:46:00+00:00" }, { "name": "doctrine/annotations", @@ -828,16 +828,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "400b3b311e7f401220dbcc5d7901cc68ec212caf" + "reference": "a22fe5010d51edd118208fde9701e87fa37fdc22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/400b3b311e7f401220dbcc5d7901cc68ec212caf", - "reference": "400b3b311e7f401220dbcc5d7901cc68ec212caf", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/a22fe5010d51edd118208fde9701e87fa37fdc22", + "reference": "a22fe5010d51edd118208fde9701e87fa37fdc22", "shasum": "" }, "require": { @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.1" }, - "time": "2022-11-23T11:16:15+00:00" + "time": "2023-02-01T10:18:35+00:00" }, { "name": "justinrainbow/json-schema", @@ -940,16 +940,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.2.2", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae" + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae", - "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", "shasum": "" }, "require": { @@ -996,7 +996,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2022-09-08T13:45:54+00:00" + "time": "2023-01-30T18:31:20+00:00" }, { "name": "nesbot/carbon", @@ -3039,16 +3039,16 @@ }, { "name": "symfony/http-client", - "version": "v5.4.19", + "version": "v5.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "0c22562d0601e19bd01c4480893f5438e6b12db5" + "reference": "b4d936b657c7952a41e89efd0ddcea51f8c90f34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/0c22562d0601e19bd01c4480893f5438e6b12db5", - "reference": "0c22562d0601e19bd01c4480893f5438e6b12db5", + "url": "https://api.github.com/repos/symfony/http-client/zipball/b4d936b657c7952a41e89efd0ddcea51f8c90f34", + "reference": "b4d936b657c7952a41e89efd0ddcea51f8c90f34", "shasum": "" }, "require": { @@ -3106,7 +3106,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.19" + "source": "https://github.com/symfony/http-client/tree/v5.4.20" }, "funding": [ { @@ -3122,7 +3122,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T15:47:53+00:00" + "time": "2023-01-25T18:32:18+00:00" }, { "name": "symfony/http-client-contracts", @@ -6081,12 +6081,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "85ea494f3599c1d23c81c65d0c994e0f80895a75" + "reference": "f087fe2eb186ac46e06b797e243a923f643772ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/85ea494f3599c1d23c81c65d0c994e0f80895a75", - "reference": "85ea494f3599c1d23c81c65d0c994e0f80895a75", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f087fe2eb186ac46e06b797e243a923f643772ca", + "reference": "f087fe2eb186ac46e06b797e243a923f643772ca", "shasum": "" }, "conflict": { @@ -6176,7 +6176,7 @@ "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<16|>=16.0.1,<16.0.3|= 12.0.5|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": "<2.0.1", + "dompdf/dompdf": "<2.0.2", "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", @@ -6230,7 +6230,7 @@ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<2.0.8", + "froxlor/froxlor": "<2.0.10", "fuel/core": "<1.8.1", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", @@ -6491,7 +6491,7 @@ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", @@ -6501,13 +6501,13 @@ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12", + "symfony/security-bundle": ">=2,<4.4.42|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", + "symfony/symfony": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -6640,7 +6640,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T20:04:06+00:00" + "time": "2023-02-01T09:04:53+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", From 7f2533e1fbbbe1d281c018b84dd2db8c2df75a37 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 1 Feb 2023 11:23:39 +0100 Subject: [PATCH 090/210] varnish: Fix vcl.use passing the wrong vcl name --- src/Deployer/Task/PlatformConfiguration/VarnishActivateTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/PlatformConfiguration/VarnishActivateTask.php b/src/Deployer/Task/PlatformConfiguration/VarnishActivateTask.php index 5b34666..7c47989 100644 --- a/src/Deployer/Task/PlatformConfiguration/VarnishActivateTask.php +++ b/src/Deployer/Task/PlatformConfiguration/VarnishActivateTask.php @@ -44,7 +44,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta }); task(self::TASK_NAME, function () { - run('{{varnishadm_path}} vcl.use {{domain}}.{{release_name}}_varnish'); + run('{{varnishadm_path}} vcl.use {{varnish_vcl_name}}'); }); after('deploy:symlink', self::TASK_NAME); From d5eeea91c47218f87fdc3d080d5bc5453bd2b22f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 20 Feb 2023 10:29:40 +0100 Subject: [PATCH 091/210] Enable Dependabot We make use of Composer and have locked package versions. We should keep the dependency versions up to date. --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..c59038a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "composer" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From 2279c94e3c715ccc55e2a284e95125f74e76f08f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 20 Feb 2023 10:30:26 +0100 Subject: [PATCH 092/210] Remove comments from depndabot.yml --- .github/dependabot.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c59038a..bc3ab5c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,6 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - version: 2 updates: - - package-ecosystem: "composer" # See documentation for possible values - directory: "/" # Location of package manifests + - package-ecosystem: "composer" + directory: "/" schedule: interval: "daily" From 9163f85fc8c1f7c70a5c2cd6596f78a27b3485dd Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Fri, 17 Feb 2023 16:17:44 +0100 Subject: [PATCH 093/210] Add support for PHP 8.2 --- .github/workflows/publish.yaml | 3 ++- .github/workflows/test.yaml | 6 +++--- ci/test/run-brancher.sh | 2 +- ci/test/run-general.sh | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index fbc9791..cf769d2 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -11,6 +11,7 @@ jobs: - "7.4" - "8.0" - "8.1" + - "8.2" node_version: - 12 - 14 @@ -36,7 +37,7 @@ jobs: QUAY_USER: ${{ secrets.QUAY_USER }} QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }} - name: Build image - run: | + run: | docker build -t "$DOCKER_TAG" -f "./ci/build/Dockerfile" \ --build-arg PHP_VERSION=${{ matrix.php_version }} \ --build-arg NODE_VERSION=${{ matrix.node_version }} \ diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f6cb4da..07848ac 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [7.4, 8.1] + php_version: [7.4, 8.1] # 8.2 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -34,13 +34,13 @@ jobs: code_quality: strategy: matrix: - php_version: [7.4, 8.1] + php_version: [7.4, 8.1, 8.2] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 - name: Install PHP - uses: shivammathur/setup-php@2.21.1 + uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php_version }} tools: composer:v2 diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 30bf146..0a43afa 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -11,7 +11,7 @@ DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_K docker build \ -f ci/build/Dockerfile \ --build-arg NODE_VERSION=16 \ - --build-arg PHP_VERSION="${PHP_VERSION:-8.1}" \ + --build-arg PHP_VERSION="${PHP_VERSION:-8.2}" \ -t hndeploy \ . diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index b8d2ddc..972dfa5 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -3,7 +3,7 @@ set -e set -x -export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.1}" | sed 's/\.//') +export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.2}" | sed 's/\.//') # Handy aliases HN="docker-compose exec -T hypernode" From 1c4b0bb588d54a6601716601c2473392c13039c5 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 27 Feb 2023 14:57:47 +0100 Subject: [PATCH 094/210] Allow configuration to have no ssh key available --- src/Deployer/Task/Common/PrepareSshTaskGlobal.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php index 5f39d5d..3170bff 100644 --- a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php +++ b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php @@ -4,9 +4,9 @@ namespace Hypernode\Deploy\Deployer\Task\Common; +use Deployer\Exception\RunException; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\Configuration; -use Symfony\Component\Process\Exception\ProcessFailedException; use function Deployer\get; use function Deployer\runLocally; @@ -31,16 +31,19 @@ public function configure(Configuration $config): void task('prepare:ssh', function () { $this->configureKey(); - if (testLocally('ssh-add -l | grep -q "no identities"')) { + $agentHasNoIdentities = testLocally('ssh-add -l | grep -q "no identities"'); + $sshKeyFileExists = testLocally('[ -f {{ssh_key_file}} ]'); + + if ($agentHasNoIdentities && $sshKeyFileExists) { try { runLocally('ssh-add -k {{ssh_key_file}}'); - } catch (ProcessFailedException $e) { + } catch (RunException $e) { writeln('Failed to add key to ssh agent.'); writeln('Trying key {{ssh_key_file}}'); try { $keyMd5 = runLocally('md5sum {{ssh_key_file}}'); writeln("With MD5 $keyMd5"); - } catch (ProcessFailedException $e) { + } catch (RunException $e) { writeln('Failed to get keyfile MD5 ' . $e); } throw $e; From a6f4a1ebd688124d096a4b20820adaed23a14a01 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 23 Mar 2023 11:40:00 +0100 Subject: [PATCH 095/210] brancher: Write allowed error message using logger --- src/Brancher/BrancherHypernodeManager.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index d51213f..f30551d 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -135,11 +135,14 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 } elseif ($timeElapsed < $allowedErrorWindow) { // Sometimes we get an error where the logbook is not yet available, but it will be soon. // We allow a small window for this to happen, and then we throw an exception. - printf( - 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available', - $e->getCode(), - $brancherHypernode + $this->log->info( + sprintf( + 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available.', + $e->getCode(), + $brancherHypernode + ) ); + ; continue; } } From bd916fa31ce49453800c279eb2f7fcae49e291d3 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 23 Mar 2023 11:42:34 +0100 Subject: [PATCH 096/210] Deployer: Pass-through GitHub Workflow commands If a task writes a GitHub Workflow command, it gets prefixed with the [host], which renders it useless for GitHub. With this PR, it detects a GitHub Workflow command being written to the output and writes it directly (without any decorators) to the output interface. --- ci/test/magento/deploy1.php | 9 +++++ ci/test/run-general.sh | 28 +++++++++++--- src/DeployerLoader.php | 6 +++ src/Printer/GithubWorkflowPrinter.php | 54 +++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 src/Printer/GithubWorkflowPrinter.php diff --git a/ci/test/magento/deploy1.php b/ci/test/magento/deploy1.php index a2747b8..46934fa 100644 --- a/ci/test/magento/deploy1.php +++ b/ci/test/magento/deploy1.php @@ -2,6 +2,9 @@ namespace Hypernode\DeployConfiguration; +use function Deployer\run; +use function Deployer\task; + /** * Start by setting up the configuration * @@ -10,6 +13,12 @@ */ $configuration = new ApplicationTemplate\Magento2(['en_US', 'nl_NL']); +task('debug:github:msg', static function () { + run('echo "::notice::This message should pass through to Github Workflow Summary!"'); +}); + +$configuration->addDeployTask('debug:github:msg'); + $productionStage = $configuration->addStage('production', 'banaan1.store'); $productionStage->addServer('hypernode', null, [], [ 'user' => 'app', diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index 972dfa5..db68d05 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -7,9 +7,9 @@ export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.2}" | sed 's/\.//') # Handy aliases HN="docker-compose exec -T hypernode" -DP="docker-compose exec -T deploy" -DP1="docker-compose exec --workdir=/web1 -T deploy" -DP2="docker-compose exec --workdir=/web2 -T deploy" +DP="docker-compose exec -e GITHUB_WORKFLOW -T deploy" +DP1="docker-compose exec -e GITHUB_WORKFLOW --workdir=/web1 -T deploy" +DP2="docker-compose exec -e GITHUB_WORKFLOW --workdir=/web2 -T deploy" function install_magento() { $HN mysql -e "DROP DATABASE IF EXISTS dummytag_preinstalled_magento" @@ -30,6 +30,20 @@ function install_magento() { --timezone=America/Chicago --elasticsearch-host=localhost" } +function begin_task() { + if [[ -n "${GITHUB_WORKFLOW}" ]]; then + echo "::group::$@" + else + echo "$@" + fi +} + +function end_task() { + if [[ -n "${GITHUB_WORKFLOW}" ]]; then + echo "::endgroup::" + fi +} + # Install docker-compose if it's not installed if ! [ -x "$(command -v docker-compose)" ]; then pip install docker-compose @@ -38,13 +52,17 @@ fi # Clear up env trap "docker-compose down -v" EXIT +begin_task "Setting up Docker stack" docker-compose up -d +end_task +begin_task "Setting Magento 2" # Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mage-os.hypernode.com/mirror/ magento/project-community-edition /data/web/magento2 +$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.5-p2 /data/web/magento2 echo "Waiting for MySQL to be available on the Hypernode container" $HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" install_magento +end_task # Copy env to the deploy container $HN /data/web/magento2/bin/magento app:config:dump scopes themes @@ -52,7 +70,7 @@ echo "Waiting for SSH to be available on the Hypernode container" chmod 0600 ci/test/.ssh/id_rsa chmod 0600 ci/test/.ssh/authorized_keys $DP rsync -a app@hypernode:/data/web/magento2/ /web -$DP rsync -v -a /config/ /web +$DP rsync -a /config/ /web $DP rm /web/app/etc/env.php # Create second app diff --git a/src/DeployerLoader.php b/src/DeployerLoader.php index 976dec0..062f645 100644 --- a/src/DeployerLoader.php +++ b/src/DeployerLoader.php @@ -6,6 +6,7 @@ use Deployer\Deployer; use Hypernode\Deploy\Console\Output\OutputWatcher; +use Hypernode\Deploy\Printer\GithubWorkflowPrinter; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputDefinition; @@ -32,6 +33,11 @@ public function getOrCreateInstance(OutputInterface $output): Deployer new InputOption('profile'), ]) ); + if (getenv('GITHUB_WORKFLOW')) { + $this->deployer['pop'] = function ($c) { + return new GithubWorkflowPrinter($c['output']); + }; + } return $this->deployer; } diff --git a/src/Printer/GithubWorkflowPrinter.php b/src/Printer/GithubWorkflowPrinter.php new file mode 100644 index 0000000..9061ca6 --- /dev/null +++ b/src/Printer/GithubWorkflowPrinter.php @@ -0,0 +1,54 @@ +output = $output; + } + + public function contentHasWorkflowCommand(string $content): bool + { + return (bool)preg_match(self::WORKFLOW_COMMAND_PATTERN, trim($content)); + } + + public function callback(Host $host, bool $forceOutput): callable + { + return function ($type, $buffer) use ($forceOutput, $host) { + if ( + $this->output->isVerbose() || $forceOutput || + ($type == Process::OUT && $this->contentHasWorkflowCommand($buffer)) + ) { + $this->printBuffer($type, $host, $buffer); + } + }; + } + + public function writeln(string $type, Host $host, string $line): void + { + if (empty($line)) { + return; + } + + if ($type == Process::OUT && $this->contentHasWorkflowCommand($line)) { + $this->output->writeln($line); + return; + } + + parent::writeln($type, $host, $line); + } +} From 580a065caf20b0b13ee863e5f1a9226f1f94a96e Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 23 Mar 2023 16:42:34 +0100 Subject: [PATCH 097/210] GithubWorkflowPrinter: Match workflow command in multiline string buffer --- src/Printer/GithubWorkflowPrinter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Printer/GithubWorkflowPrinter.php b/src/Printer/GithubWorkflowPrinter.php index 9061ca6..3a676ce 100644 --- a/src/Printer/GithubWorkflowPrinter.php +++ b/src/Printer/GithubWorkflowPrinter.php @@ -11,7 +11,7 @@ class GithubWorkflowPrinter extends Printer { - public const WORKFLOW_COMMAND_PATTERN = '/^::[a-zA-Z0-9-].*::.*$/'; + public const WORKFLOW_COMMAND_PATTERN = '/^::[a-zA-Z0-9-].*::.*$/m'; private OutputInterface $output; From c85498435a3005948f229fd1169bd17cb010c566 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 2 May 2023 16:18:24 +0200 Subject: [PATCH 098/210] twig: Disable autoescape We don't need any escaping, because the Twig template engine only supplies escaping for web-related assets. See the autoescape option described here: https://twig.symfony.com/doc/2.x/api.html#environment_options --- src/Bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Bootstrap.php b/src/Bootstrap.php index c533154..563bd06 100644 --- a/src/Bootstrap.php +++ b/src/Bootstrap.php @@ -95,7 +95,7 @@ private function initApplication(Container $container): Application private function registerTwigLoader(Container $container): void { $loader = new FilesystemLoader(__DIR__ . '/Resource/template'); - $twig = new Environment($loader); + $twig = new Environment($loader, ['autoescape' => false]); $container->set(Environment::class, $twig); } From 43c1c6b98f7dc3b135acd2f848089b29411b8b91 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 22 Jun 2023 10:22:36 +0200 Subject: [PATCH 099/210] composer: Update Deployer to 7.3.1 In the process other packages were also installed and updated. --- composer.json | 5 +- composer.lock | 1231 +++++++++++++++++++++++-------------------------- 2 files changed, 580 insertions(+), 656 deletions(-) diff --git a/composer.json b/composer.json index fd344d2..591ec9d 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2", - "deployer/deployer": "dev-master#e374a8e as v7.0.0", + "deployer/deployer": "dev-master#d99377d as v7.3.1", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.2", @@ -47,7 +47,8 @@ }, "sort-packages": true, "allow-plugins": { - "phpro/grumphp-shim": true + "phpro/grumphp-shim": true, + "php-http/discovery": true } } } diff --git a/composer.lock b/composer.lock index 8137846..9636035 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4009781c378347521f06e78afe5c6adf", + "content-hash": "37aef9e9af4806ffb6f067cbee645a10", "packages": [ { "name": "clue/stream-filter", @@ -78,12 +78,12 @@ "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "e374a8e" + "reference": "d99377d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/e374a8e", - "reference": "e374a8e", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/d99377d", + "reference": "d99377d", "shasum": "" }, "require": { @@ -94,6 +94,7 @@ "react/http": "^1.5", "symfony/console": "^5.4.9", "symfony/polyfill-php80": "^1.22", + "symfony/polyfill-php81": "^1.26", "symfony/process": "^5", "symfony/yaml": "^5" }, @@ -103,7 +104,8 @@ "phpunit/php-code-coverage": "^9.2", "phpunit/phpunit": "^9.3", "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-exporter": "^5.4" }, "default-branch": true, "bin": [ @@ -142,20 +144,20 @@ "type": "github" } ], - "time": "2023-01-31T21:46:00+00:00" + "time": "2023-06-16T10:01:27+00:00" }, { "name": "doctrine/annotations", - "version": "1.14.2", + "version": "1.14.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b" + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ad785217c1e9555a7d6c6c8c9f406395a5e2882b", - "reference": "ad785217c1e9555a7d6c6c8c9f406395a5e2882b", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "shasum": "" }, "require": { @@ -216,31 +218,35 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.2" + "source": "https://github.com/doctrine/annotations/tree/1.14.3" }, - "time": "2022-12-15T06:48:22+00:00" + "time": "2023-02-01T09:20:38+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "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" @@ -259,9 +265,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/lexer", @@ -446,22 +452,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.5.0", + "version": "7.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", - "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.9 || ^2.4", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -472,7 +478,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.1", "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.29 || ^9.5.23", "psr/log": "^1.1 || ^2.0 || ^3.0" }, @@ -486,9 +493,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "7.5-dev" } }, "autoload": { @@ -554,7 +558,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + "source": "https://github.com/guzzle/guzzle/tree/7.7.0" }, "funding": [ { @@ -570,38 +574,37 @@ "type": "tidelift" } ], - "time": "2022-08-28T15:39:27+00:00" + "time": "2023-05-21T14:04:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.5.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "b94b2807d85443f9719887892882d0329d1e2598" + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", - "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", "shasum": "" }, "require": { - "php": ">=5.5" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.5-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\Promise\\": "src/" } @@ -638,7 +641,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.2" + "source": "https://github.com/guzzle/promises/tree/2.0.0" }, "funding": [ { @@ -654,26 +657,26 @@ "type": "tidelift" } ], - "time": "2022-08-28T14:55:35+00:00" + "time": "2023-05-21T13:50:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.4.3", + "version": "2.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "67c26b443f348a51926030c83481b85718457d3d" + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", - "reference": "67c26b443f348a51926030c83481b85718457d3d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.1 || ^2.0", "ralouphie/getallheaders": "^3.0" }, "provide": { @@ -693,9 +696,6 @@ "bamarni-bin": { "bin-links": true, "forward-command": false - }, - "branch-alias": { - "dev-master": "2.4-dev" } }, "autoload": { @@ -757,7 +757,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.4.3" + "source": "https://github.com/guzzle/psr7/tree/2.5.0" }, "funding": [ { @@ -773,7 +773,7 @@ "type": "tidelift" } ], - "time": "2022-10-26T14:07:24+00:00" + "time": "2023-04-17T16:11:26+00:00" }, { "name": "hypernode/api-client", @@ -828,16 +828,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.1.1", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "a22fe5010d51edd118208fde9701e87fa37fdc22" + "reference": "959628f305cea2ba17b5e195cce67fc853942c03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/a22fe5010d51edd118208fde9701e87fa37fdc22", - "reference": "a22fe5010d51edd118208fde9701e87fa37fdc22", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/959628f305cea2ba17b5e195cce67fc853942c03", + "reference": "959628f305cea2ba17b5e195cce67fc853942c03", "shasum": "" }, "require": { @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.1" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.3" }, - "time": "2023-02-01T10:18:35+00:00" + "time": "2023-02-20T09:14:10+00:00" }, { "name": "justinrainbow/json-schema", @@ -1000,16 +1000,16 @@ }, { "name": "nesbot/carbon", - "version": "2.66.0", + "version": "2.67.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "496712849902241f04902033b0441b269effe001" + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001", - "reference": "496712849902241f04902033b0441b269effe001", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", "shasum": "" }, "require": { @@ -1098,7 +1098,7 @@ "type": "tidelift" } ], - "time": "2023-01-29T18:53:47+00:00" + "time": "2023-05-25T22:09:47+00:00" }, { "name": "php-di/invoker", @@ -1275,26 +1275,25 @@ }, { "name": "php-http/client-common", - "version": "2.6.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0" + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0", - "reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0", + "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/httplug": "^2.0", "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", "symfony/polyfill-php80": "^1.17" }, @@ -1304,7 +1303,7 @@ "nyholm/psr7": "^1.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, "suggest": { "ext-json": "To detect JSON responses with the ContentTypePlugin", @@ -1314,11 +1313,6 @@ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\Common\\": "src/" @@ -1344,49 +1338,59 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.6.0" + "source": "https://github.com/php-http/client-common/tree/2.7.0" }, - "time": "2022-09-29T09:59:43+00:00" + "time": "2023-05-17T06:46:59+00:00" }, { "name": "php-http/discovery", - "version": "1.14.3", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735" + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/31d8ee46d0215108df16a8527c7438e96a4d7735", - "reference": "31d8ee46d0215108df16a8527c7438e96a4d7735", + "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", "shasum": "" }, "require": { + "composer-plugin-api": "^1.0|^2.0", "php": "^7.1 || ^8.0" }, "conflict": { - "nyholm/psr7": "<1.0" + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { + "composer/composer": "^1.0.2|^2.0", "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1" + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" - }, - "type": "library", + "type": "composer-plugin", "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, "autoload": { "psr-4": { "Http\\Discovery\\": "src/" - } + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1398,7 +1402,7 @@ "email": "mark.sagikazar@gmail.com" } ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", "homepage": "http://php-http.org", "keywords": [ "adapter", @@ -1407,44 +1411,40 @@ "factory", "http", "message", + "psr17", "psr7" ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.3" + "source": "https://github.com/php-http/discovery/tree/1.19.0" }, - "time": "2022-07-11T14:04:40+00:00" + "time": "2023-06-19T08:45:36+00:00" }, { "name": "php-http/httplug", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "f640739f80dfa1152533976e3c112477f69274eb" + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb", - "reference": "f640739f80dfa1152533976e3c112477f69274eb", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "php-http/promise": "^1.1", "psr/http-client": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, "autoload": { "psr-4": { "Http\\Client\\": "src/" @@ -1473,29 +1473,28 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.3.0" + "source": "https://github.com/php-http/httplug/tree/2.4.0" }, - "time": "2022-02-21T09:52:22+00:00" + "time": "2023-04-14T15:10:03+00:00" }, { "name": "php-http/message", - "version": "1.13.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361" + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361", - "reference": "7886e647a30a966a1a8d1dad1845b71ca8678361", + "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", "shasum": "" }, "require": { "clue/stream-filter": "^1.5", - "php": "^7.1 || ^8.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" }, "provide": { "php-http/message-factory-implementation": "1.0" @@ -1503,8 +1502,9 @@ "require-dev": { "ergebnis/composer-normalize": "^2.6", "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", "slim/slim": "^3.0" }, @@ -1515,11 +1515,6 @@ "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "files": [ "src/filters.php" @@ -1547,63 +1542,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.13.0" + "source": "https://github.com/php-http/message/tree/1.16.0" }, - "time": "2022-02-11T13:41:14+00:00" - }, - { - "name": "php-http/message-factory", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" - ], - "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" - }, - "time": "2015-12-19T14:08:53+00:00" + "time": "2023-05-17T06:43:38+00:00" }, { "name": "php-http/promise", @@ -1761,21 +1702,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1795,7 +1736,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -1807,27 +1748,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client/tree/1.0.2" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-04-10T20:12:12+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1847,7 +1788,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -1862,31 +1803,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1915,9 +1856,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/log", @@ -2087,33 +2028,33 @@ }, { "name": "react/dns", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "a5427e7dfa47713e438016905605819d101f238c" + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/a5427e7dfa47713e438016905605819d101f238c", - "reference": "a5427e7dfa47713e438016905605819d101f238c", + "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", "shasum": "" }, "require": { "php": ">=5.3.0", "react/cache": "^1.0 || ^0.6 || ^0.5", "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1", - "react/promise-timer": "^1.9" + "react/promise": "^3.0 || ^2.7 || ^1.2.1" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^4.8.35", - "react/async": "^4 || ^3 || ^2" + "phpunit/phpunit": "^9.5 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "React\\Dns\\": "src" + "React\\Dns\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2151,49 +2092,43 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.10.0" + "source": "https://github.com/reactphp/dns/tree/v1.11.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-09-08T12:22:46+00:00" + "time": "2023-06-02T12:45:26+00:00" }, { "name": "react/event-loop", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137" + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/187fb56f46d424afb6ec4ad089269c72eec2e137", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "ext-event": "~1.0 for ExtEventLoop", - "ext-pcntl": "For signal handling support when using the StreamSelectLoop", - "ext-uv": "* for ExtUvLoop" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { "psr-4": { - "React\\EventLoop\\": "src" + "React\\EventLoop\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2229,32 +2164,28 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.3.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-03-17T11:10:22+00:00" + "time": "2023-05-05T10:11:24+00:00" }, { "name": "react/http", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "aa7512ee17258c88466de30f9cb44ec5f9df3ff3" + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/aa7512ee17258c88466de30f9cb44ec5f9df3ff3", - "reference": "aa7512ee17258c88466de30f9cb44ec5f9df3ff3", + "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", "shasum": "" }, "require": { @@ -2264,7 +2195,6 @@ "psr/http-message": "^1.0", "react/event-loop": "^1.2", "react/promise": "^3 || ^2.3 || ^1.2.1", - "react/promise-stream": "^1.4", "react/socket": "^1.12", "react/stream": "^1.2", "ringcentral/psr7": "^1.2" @@ -2273,14 +2203,15 @@ "clue/http-proxy-react": "^1.8", "clue/reactphp-ssh-proxy": "^1.4", "clue/socks-react": "^1.4", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "React\\Http\\": "src" + "React\\Http\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2325,39 +2256,35 @@ ], "support": { "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.8.0" + "source": "https://github.com/reactphp/http/tree/v1.9.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-09-29T12:55:52+00:00" + "time": "2023-04-26T10:29:24+00:00" }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -2401,213 +2328,43 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" - }, - { - "name": "react/promise-stream", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-stream.git", - "reference": "e6d2805e09ad50c4896f65f5e8705fe4ee7731a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/e6d2805e09ad50c4896f65f5e8705fe4ee7731a3", - "reference": "e6d2805e09ad50c4896f65f5e8705fe4ee7731a3", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/promise": "^3 || ^2.1 || ^1.2", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\Stream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "The missing link between Promise-land and Stream-land for ReactPHP", - "homepage": "https://github.com/reactphp/promise-stream", - "keywords": [ - "Buffer", - "async", - "promise", - "reactphp", - "stream", - "unwrap" - ], - "support": { - "issues": "https://github.com/reactphp/promise-stream/issues", - "source": "https://github.com/reactphp/promise-stream/tree/v1.5.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-09-09T11:42:18+00:00" - }, - { - "name": "react/promise-timer", - "version": "v1.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-timer.git", - "reference": "aa7a73c74b8d8c0f622f5982ff7b0351bc29e495" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/aa7a73c74b8d8c0f622f5982ff7b0351bc29e495", - "reference": "aa7a73c74b8d8c0f622f5982ff7b0351bc29e495", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7.0 || ^1.2.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\Timer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", - "homepage": "https://github.com/reactphp/promise-timer", - "keywords": [ - "async", - "event-loop", - "promise", - "reactphp", - "timeout", - "timer" - ], - "support": { - "issues": "https://github.com/reactphp/promise-timer/issues", - "source": "https://github.com/reactphp/promise-timer/tree/v1.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.10.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-06-13T13:41:03+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { "name": "react/socket", - "version": "v1.12.0", + "version": "v1.13.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b" + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b", - "reference": "81e1b4d7f5450ebd8d2e9a95bb008bb15ca95a7b", + "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.8", + "react/dns": "^1.11", "react/event-loop": "^1.2", "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/promise-timer": "^1.9", "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", "react/async": "^4 || ^3 || ^2", - "react/promise-stream": "^1.4" + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { @@ -2651,32 +2408,28 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.12.0" + "source": "https://github.com/reactphp/socket/tree/v1.13.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-08-25T12:32:25+00:00" + "time": "2023-06-07T10:28:34+00:00" }, { "name": "react/stream", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9" + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/7a423506ee1903e89f1e08ec5f0ed430ff784ae9", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", "shasum": "" }, "require": { @@ -2686,12 +2439,12 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src" + "React\\Stream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2733,19 +2486,15 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.2.0" + "source": "https://github.com/reactphp/stream/tree/v1.3.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-07-11T12:37:55+00:00" + "time": "2023-06-16T10:52:11+00:00" }, { "name": "ringcentral/psr7", @@ -2810,16 +2559,16 @@ }, { "name": "symfony/console", - "version": "v5.4.19", + "version": "v5.4.24", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740" + "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/dccb8d251a9017d5994c988b034d3e18aaabf740", - "reference": "dccb8d251a9017d5994c988b034d3e18aaabf740", + "url": "https://api.github.com/repos/symfony/console/zipball/560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", + "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", "shasum": "" }, "require": { @@ -2884,12 +2633,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.19" + "source": "https://github.com/symfony/console/tree/v5.4.24" }, "funding": [ { @@ -2905,20 +2654,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-05-26T05:13:16+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -2927,7 +2676,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2956,7 +2705,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -2972,20 +2721,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/finder", - "version": "v5.4.19", + "version": "v5.4.21", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f" + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6071aebf810ad13fe8200c224f36103abb37cf1f", - "reference": "6071aebf810ad13fe8200c224f36103abb37cf1f", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { @@ -3019,7 +2768,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.19" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { @@ -3035,20 +2784,20 @@ "type": "tidelift" } ], - "time": "2023-01-14T19:14:44+00:00" + "time": "2023-02-16T09:33:00+00:00" }, { "name": "symfony/http-client", - "version": "v5.4.20", + "version": "v5.4.24", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "b4d936b657c7952a41e89efd0ddcea51f8c90f34" + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/b4d936b657c7952a41e89efd0ddcea51f8c90f34", - "reference": "b4d936b657c7952a41e89efd0ddcea51f8c90f34", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", "shasum": "" }, "require": { @@ -3074,6 +2823,7 @@ "guzzlehttp/promises": "^1.4", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", + "php-http/message-factory": "^1.0", "psr/http-client": "^1.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", @@ -3105,8 +2855,11 @@ ], "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", + "keywords": [ + "http" + ], "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.20" + "source": "https://github.com/symfony/http-client/tree/v5.4.24" }, "funding": [ { @@ -3122,7 +2875,7 @@ "type": "tidelift" } ], - "time": "2023-01-25T18:32:18+00:00" + "time": "2023-05-07T13:11:28+00:00" }, { "name": "symfony/http-client-contracts", @@ -3204,21 +2957,21 @@ }, { "name": "symfony/options-resolver", - "version": "v6.2.5", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", - "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -3251,7 +3004,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" + "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" }, "funding": [ { @@ -3267,7 +3020,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-05-12T14:21:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3837,18 +3590,97 @@ ], "time": "2022-11-03T14:55:06+00:00" }, + { + "name": "symfony/polyfill-php81", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, { "name": "symfony/process", - "version": "v5.4.19", + "version": "v5.4.24", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1" + "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ba874c9b636dbccf761e22ce750e88ec3f55e1", - "reference": "c5ba874c9b636dbccf761e22ce750e88ec3f55e1", + "url": "https://api.github.com/repos/symfony/process/zipball/e3c46cc5689c8782944274bb30702106ecbe3b64", + "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64", "shasum": "" }, "require": { @@ -3881,7 +3713,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.19" + "source": "https://github.com/symfony/process/tree/v5.4.24" }, "funding": [ { @@ -3897,7 +3729,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:32:19+00:00" + "time": "2023-05-17T11:26:05+00:00" }, { "name": "symfony/service-contracts", @@ -3984,16 +3816,16 @@ }, { "name": "symfony/string", - "version": "v6.2.5", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", - "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", "shasum": "" }, "require": { @@ -4004,13 +3836,13 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", @@ -4050,7 +3882,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.5" + "source": "https://github.com/symfony/string/tree/v6.3.0" }, "funding": [ { @@ -4066,32 +3898,34 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-03-21T21:06:29+00:00" }, { "name": "symfony/translation", - "version": "v6.2.5", + "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c" + "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/60556925a703cfbc1581cde3b3f35b0bb0ea904c", - "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c", + "url": "https://api.github.com/repos/symfony/translation/zipball/f72b2cba8f79dd9d536f534f76874b58ad37876f", + "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.3|^3.0" + "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { "symfony/config": "<5.4", "symfony/console": "<5.4", "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", "symfony/twig-bundle": "<5.4", "symfony/yaml": "<5.4" }, @@ -4105,20 +3939,14 @@ "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-client-contracts": "^2.5|^3.0", "symfony/http-kernel": "^5.4|^6.0", "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "nikic/php-parser": "To use PhpAstExtractor", - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, "type": "library", "autoload": { "files": [ @@ -4148,7 +3976,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.2.5" + "source": "https://github.com/symfony/translation/tree/v6.3.0" }, "funding": [ { @@ -4164,32 +3992,29 @@ "type": "tidelift" } ], - "time": "2023-01-05T07:00:27+00:00" + "time": "2023-05-19T12:46:45+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "68cce71402305a015f8c1589bfada1280dc64fe7" + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7", - "reference": "68cce71402305a015f8c1589bfada1280dc64fe7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", "shasum": "" }, "require": { "php": ">=8.1" }, - "suggest": { - "symfony/translation-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4229,7 +4054,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" }, "funding": [ { @@ -4245,20 +4070,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-05-30T17:17:10+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.19", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5" + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/71c05db20cb9b54d381a28255f17580e2b7e36a5", - "reference": "71c05db20cb9b54d381a28255f17580e2b7e36a5", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { @@ -4304,7 +4129,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.19" + "source": "https://github.com/symfony/yaml/tree/v5.4.23" }, "funding": [ { @@ -4320,20 +4145,20 @@ "type": "tidelift" } ], - "time": "2023-01-10T18:51:14+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { "name": "twig/twig", - "version": "v2.15.4", + "version": "v2.15.5", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3" + "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3e059001d6d597dd50ea7c74dd2464b4adea48d3", - "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", "shasum": "" }, "require": { @@ -4388,7 +4213,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.4" + "source": "https://github.com/twigphp/Twig/tree/v2.15.5" }, "funding": [ { @@ -4400,7 +4225,7 @@ "type": "tidelift" } ], - "time": "2022-12-27T12:26:20+00:00" + "time": "2023-05-03T17:49:41+00:00" }, { "name": "webmozart/assert", @@ -5129,16 +4954,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -5176,7 +5001,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -5184,20 +5009,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "netresearch/jsonmapper", - "version": "v4.1.0", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f" + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", - "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", + "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", "shasum": "" }, "require": { @@ -5233,22 +5058,22 @@ "support": { "email": "cweiske@cweiske.de", "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0" + "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" }, - "time": "2022-12-08T20:46:14+00:00" + "time": "2023-04-09T17:37:40+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.15.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", "shasum": "" }, "require": { @@ -5289,9 +5114,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-05-19T20:20:00+00:00" }, { "name": "openlss/lib-array2xml", @@ -5569,24 +5394,27 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.2", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", - "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", + "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.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", @@ -5618,22 +5446,22 @@ "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.6.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" }, - "time": "2022-10-14T12:47:21+00:00" + "time": "2023-05-30T18:13:47+00:00" }, { "name": "phpro/grumphp-shim", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/phpro/grumphp-shim.git", - "reference": "dbb5ce58f57005ac2c6fddb2073337381ecf5893" + "reference": "98f7d27631785b48270af88e33abcc591ae022fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/dbb5ce58f57005ac2c6fddb2073337381ecf5893", - "reference": "dbb5ce58f57005ac2c6fddb2073337381ecf5893", + "url": "https://api.github.com/repos/phpro/grumphp-shim/zipball/98f7d27631785b48270af88e33abcc591ae022fc", + "reference": "98f7d27631785b48270af88e33abcc591ae022fc", "shasum": "" }, "require": { @@ -5677,9 +5505,56 @@ "description": "GrumPHP Phar distribution", "support": { "issues": "https://github.com/phpro/grumphp-shim/issues", - "source": "https://github.com/phpro/grumphp-shim/tree/v1.15.0" + "source": "https://github.com/phpro/grumphp-shim/tree/v1.16.0" }, - "time": "2022-12-22T12:37:59+00:00" + "time": "2023-04-27T11:06:59+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.22.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "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.22.0" + }, + "time": "2023-06-01T12:35:21+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5980,16 +5855,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.32", + "version": "8.5.33", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "375686930d05c9fd7d20f6e5fc38121e8d7a9d55" + "reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/375686930d05c9fd7d20f6e5fc38121e8d7a9d55", - "reference": "375686930d05c9fd7d20f6e5fc38121e8d7a9d55", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e", + "reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e", "shasum": "" }, "require": { @@ -6057,7 +5932,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.32" + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.33" }, "funding": [ { @@ -6073,7 +5948,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T08:30:25+00:00" + "time": "2023-02-27T13:04:50+00:00" }, { "name": "roave/security-advisories", @@ -6081,22 +5956,22 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "f087fe2eb186ac46e06b797e243a923f643772ca" + "reference": "4e267f401487bcc7edb65cd7b6af218018aa32b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f087fe2eb186ac46e06b797e243a923f643772ca", - "reference": "f087fe2eb186ac46e06b797e243a923f643772ca", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4e267f401487bcc7edb65cd7b6af218018aa32b4", + "reference": "4e267f401487bcc7edb65cd7b6af218018aa32b4", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "admidio/admidio": "<4.1.9", + "admidio/admidio": "<4.2.8", "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "aheinze/cockpit": "<=2.2.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<=1.4.3", + "alextselegidis/easyappointments": "<1.5", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", @@ -6104,22 +5979,27 @@ "amphp/http-client": ">=4,<4.4", "anchorcms/anchor-cms": "<=0.12.7", "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", "apereo/phpcas": "<1.6", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", "arc/web": "<3", "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "automad/automad": "<1.8", "awesome-support/awesome-support": "<=6.0.7", "aws/aws-sdk-php": ">=3,<3.2.1", - "backdrop/backdrop": "<=1.23", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.24.2", "badaso/core": "<2.7", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "barryvdh/laravel-translation-manager": "<0.6.2", "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<4.7.2", + "baserproject/basercms": "<4.7.5", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", "bmarshall511/wordpress_zero_spam": "<5.2.13", @@ -6142,21 +6022,22 @@ "catfan/medoo": "<1.7.5", "centreon/centreon": "<22.10-beta.1", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "cockpit-hq/cockpit": "<2.4.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", - "codeigniter4/framework": "<4.2.11", - "codeigniter4/shield": "= 1.0.0-beta", + "codeigniter4/framework": "<4.3.5", + "codeigniter4/shield": "<1-beta.4|= 1.0.0-beta", "codiad/codiad": "<=2.8.4", "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", - "concrete5/concrete5": "<=9.1.3|>= 9.0.0RC1, < 9.1.3", + "concrete5/concrete5": "<9.2|>= 9.0.0RC1, < 9.1.3", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0", + "contao/core-bundle": "<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "contao/managed-edition": "<=1.5", - "craftcms/cms": "<3.7.55.2|>= 4.0.0-RC1, < 4.2.1", + "craftcms/cms": "<=4.4.9|>= 4.0.0-RC1, < 4.4.12|>= 4.0.0-RC1, <= 4.4.5|>= 4.0.0-RC1, <= 4.4.6|>= 4.0.0-RC1, < 4.4.6|>= 4.0.0-RC1, < 4.3.7|>= 4.0.0-RC1, < 4.2.1", "croogo/croogo": "<3.0.7", "cuyz/valinor": "<0.12", "czproject/git-php": "<4.0.3", @@ -6164,6 +6045,8 @@ "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3-beta", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", @@ -6175,15 +6058,16 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<16|>=16.0.1,<16.0.3|= 12.0.5|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": "<2.0.2", - "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3", + "dolibarr/dolibarr": "<17.0.1|= 12.0.5|>= 3.3.beta1, < 13.0.2", + "dompdf/dompdf": "<2.0.2|= 2.0.2", + "drupal/core": ">=7,<7.96|>=8,<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", "ectouch/ectouch": "<=2.7.2", "elefant/cms": "<1.3.13", "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "encore/laravel-admin": "<=1.8.19", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", @@ -6198,11 +6082,11 @@ "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", "ezsystems/ezplatform-graphql": ">=1-rc.1,<1.0.13|>=2-beta.1,<2.3.12", - "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.26", + "ezsystems/ezplatform-kernel": "<1.2.5.1|>=1.3,<1.3.26", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", - "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.30", + "ezsystems/ezpublish-kernel": "<6.13.8.2|>=7,<7.5.30", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1|>=2.5,<2.5.15", @@ -6213,8 +6097,10 @@ "feehi/feehicms": "<=2.1.1", "fenom/fenom": "<=2.12.1", "filegator/filegator": "<7.8", - "firebase/php-jwt": "<2", - "flarum/core": "<1.6.3", + "firebase/php-jwt": "<6", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.7", "flarum/mentions": "<1.6.3", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", @@ -6224,17 +6110,19 @@ "fooman/tcpdf": "<6.2.22", "forkcms/forkcms": "<5.11.1", "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<10.1", + "francoisjacquet/rosariosis": "<11", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<2.0.10", + "froxlor/froxlor": "<2.1", "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", - "getgrav/grav": "<1.7.34", + "getgrav/grav": "<1.7.42", "getkirby/cms": "= 3.8.0|<3.5.8.2|>=3.6,<3.6.6.2|>=3.7,<3.7.5.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -6242,22 +6130,24 @@ "globalpayments/php-sdk": "<2", "google/protobuf": "<3.15", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<=2.2", + "gree/jose": "<2.2.1", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.8", + "grumpydictator/firefly-iii": "<6", "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", - "guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", "harvesthq/chosen": "<1.8.7", "helloxz/imgurl": "= 2.31|<=2.31", "hillelcoren/invoice-ninja": "<5.3.35", "himiklab/yii2-jqgrid-widget": "<1.0.8", "hjue/justwriting": "<=1", "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", "hyn/multi-tenant": ">=5.6,<5.7.2", "ibexa/admin-ui": ">=4.2,<4.2.3", "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", "ibexa/post-install": "<=1.0.4", + "ibexa/user": ">=4,<4.4.3", "icecoder/icecoder": "<=8.1", "idno/known": "<=1.3.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", @@ -6266,7 +6156,8 @@ "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "impresscms/impresscms": "<=1.4.3", - "in2code/femanager": "<5.5.2|>=6,<6.3.3|>=7,<7.0.1", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.1", + "in2code/ipandlanguageredirect": "<5.1.2", "in2code/lux": "<17.6.1|>=18,<24.0.2", "innologi/typo3-appointments": "<2.0.6", "intelliants/subrion": "<=4.2.1", @@ -6286,19 +6177,22 @@ "kazist/phpwhois": "<=4.2.6", "kelvinmo/simplexrd": "<3.1.1", "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<1.1", "kitodo/presentation": "<3.1.2", "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<1.4.2", "krayin/laravel-crm": "<1.2.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laminas/laminas-diactoros": "<2.11.1", + "laminas/laminas-diactoros": "<2.18.1|>=2.24,<2.24.2|>=2.25,<2.25.2|= 2.23.0|= 2.22.0|= 2.21.0|= 2.20.0|= 2.19.0", "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", "laminas/laminas-http": "<2.14.2", "laravel/fortify": "<1.11.1", "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "latte/latte": "<2.10.8", - "lavalite/cms": "<=5.8", + "lavalite/cms": "<=9", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", @@ -6315,22 +6209,26 @@ "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "maikuolan/phpmussel": ">=1,<1.6", + "mantisbt/mantisbt": "<=2.25.5", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", "mautic/core": "<4.3|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mediawiki/matomo": "<2.4.3", "melisplatform/melis-asset-manager": "<5.0.1", "melisplatform/melis-cms": "<5.0.1", "melisplatform/melis-front": "<5.0.1", "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", "mgallegos/laravel-jqgrid": "<=1.3", - "microweber/microweber": "<=1.3.1", + "microweber/microweber": "<=1.3.4", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", "modx/revolution": "<= 2.8.3-pl|<2.8", "mojo42/jirafeau": "<4.4", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.0.5", + "moodle/moodle": "<4.2-rc.2|= 3.11", "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", "neoan3-apps/template": "<1.1.1", @@ -6342,10 +6240,11 @@ "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nilsteampassnet/teampass": "<=2.1.27.36", + "nilsteampassnet/teampass": "<3.0.9", "notrinos/notrinos-erp": "<=0.7", "noumo/easyii": "<=0.9", "nukeviet/nukeviet": "<4.5.2", + "nyholm/psr7": "<1.6.1", "nystudio107/craft-seomatic": "<3.4.12", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", @@ -6376,29 +6275,34 @@ "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", "php-mod/curl": "<2.3.2", + "phpbb/phpbb": ">=3.2,<3.2.10|>=3.3,<3.3.1", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<5.1.3", + "phpmyadmin/phpmyadmin": "<5.2.1", "phpmyfaq/phpmyfaq": "<=3.1.7", "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", - "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19", "phpservermon/phpservermon": "<=3.5.2", + "phpsysinfo/phpsysinfo": "<3.2.5", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pimcore/customer-management-framework-bundle": "<3.3.10", "pimcore/data-hub": "<1.2.4", - "pimcore/pimcore": "<10.5.14", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<10.5.23", + "pixelfed/pixelfed": "<=0.11.4", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<4.12.5|>= 4.0.0-BETA5, < 4.4.2", + "pocketmine/pocketmine-mp": "<4.20.5|>=4.21,<4.21.1|< 4.18.0-ALPHA2|>= 4.0.0-BETA5, < 4.4.2", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<1.7.8.8", + "prestashop/prestashop": "<8.0.4", "prestashop/productcomments": "<5.0.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", @@ -6414,7 +6318,8 @@ "pyrocms/pyrocms": "<=3.9.1", "rainlab/debugbar-plugin": "<3.1", "rankmath/seo-by-rank-math": "<=1.0.95", - "react/http": ">=0.7,<1.7", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", "remdex/livehelperchat": "<3.99", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", @@ -6427,20 +6332,21 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.18", - "shopware/platform": "<=6.4.18", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.4.20", + "shopware/platform": "<=6.4.20", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.7.14", "shopware/storefront": "<=6.4.8.1", "shopxo/shopxo": "<2.2.6", "showdoc/showdoc": "<2.10.4", - "silverstripe/admin": ">=1,<1.11.3", + "silverstripe/admin": "<1.12.7", "silverstripe/assets": ">=1,<1.11.1", "silverstripe/cms": "<4.11.3", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.11.14", - "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|= 4.0.0-alpha1", + "silverstripe/framework": "<4.12.5", + "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|>=4.1.1,<4.1.2|>=4.2.2,<4.2.3|= 4.0.0-alpha1", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", @@ -6456,8 +6362,10 @@ "simplesamlphp/simplesamlphp-module-openid": "<1", "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.47|>=4,<4.2.1", + "smarty/smarty": "<3.1.48|>=4,<4.3.1", "snipe/snipe-it": "<=6.0.14|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", @@ -6468,11 +6376,12 @@ "ssddanbrown/bookstack": "<22.2.3", "statamic/cms": "<3.2.39|>=3.3,<3.3.2", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.59", + "studio-42/elfinder": "<2.1.62", "subrion/cms": "<=4.2.1", "sukohi/surpass": "<1", "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", "sumocoders/framework-user-bundle": "<1.4", + "swag/paypal": "<5.4.4", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", @@ -6501,7 +6410,7 @@ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<4.4.42|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", @@ -6516,26 +6425,29 @@ "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", "tastyigniter/tastyigniter": "<3.3", + "tcg/voyager": "<=1.4", "tecnickcom/tcpdf": "<6.2.22", "terminal42/contao-tablelookupwizard": "<3.3.5", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "thinkcmf/thinkcmf": "<=5.1.7", - "thorsten/phpmyfaq": "<3.1.10", + "thorsten/phpmyfaq": "<3.2-beta", "tinymce/tinymce": "<5.10.7|>=6,<6.3.1", + "tinymighty/wiki-seo": "<1.2.2", "titon/framework": ">=0,<9.9.99", "tobiasbg/tablepress": "<= 2.0-RC1", "topthink/framework": "<6.0.14", - "topthink/think": "<=6.0.9", + "topthink/think": "<=6.1.1", "topthink/thinkphp": "<=3.2.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", "tribalsystems/zenario": "<=9.3.57595", "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", - "typo3/cms": "<2.0.5|>=3,<3.0.3|>=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1", + "typo3/cms": "<2.0.5|>=3,<3.0.3|>=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": "<8.7.49|>=9,<9.5.38|>=10,<10.4.33|>=11,<11.5.20|>=12,<12.1.1", + "typo3/cms-core": "<8.7.51|>=9,<9.5.40|>=10,<10.4.36|>=11,<11.5.23|>=12,<12.2", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/html-sanitizer": ">=1,<1.5|>=2,<2.1.1", @@ -6547,14 +6459,19 @@ "unisharp/laravel-filemanager": "<=2.5.1", "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vova07/yii2-fileapi-widget": "<0.1.9", "vrana/adminer": "<4.8.1", "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.5.4", "wanglelecc/laracms": "<=1.0.3", "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", "webpa/webpa": "<3.1.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", @@ -6563,8 +6480,10 @@ "wp-cli/wp-cli": "<2.5", "wp-graphql/wp-graphql": "<0.3.5", "wpanel/wpanel4-cms": "<=4.3.1", - "wwbn/avideo": "<=11.6", + "wpcloud/wp-stateless": "<3.2", + "wwbn/avideo": "<=12.4", "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", "yeswiki/yeswiki": "<4.1", "yetiforce/yetiforce-crm": "<=6.4", "yidashi/yii2cmf": "<=2", @@ -6626,6 +6545,9 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], "support": { "issues": "https://github.com/Roave/SecurityAdvisories/issues", "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" @@ -6640,7 +6562,7 @@ "type": "tidelift" } ], - "time": "2023-02-01T09:04:53+00:00" + "time": "2023-06-21T23:04:35+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6773,16 +6695,16 @@ }, { "name": "sebastian/diff", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", "shasum": "" }, "require": { @@ -6827,7 +6749,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" }, "funding": [ { @@ -6835,7 +6757,7 @@ "type": "github" } ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2023-05-07T05:30:20+00:00" }, { "name": "sebastian/environment", @@ -7373,16 +7295,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, "require": { @@ -7418,14 +7340,15 @@ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ "phpcs", - "standards" + "standards", + "static analysis" ], "support": { "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2022-06-18T07:21:10+00:00" + "time": "2023-02-22T23:07:41+00:00" }, { "name": "theseer/tokenizer", @@ -7641,8 +7564,8 @@ { "package": "deployer/deployer", "version": "9999999-dev", - "alias": "v7.0.0", - "alias_normalized": "7.0.0.0" + "alias": "v7.3.1", + "alias_normalized": "7.3.1.0" } ], "minimum-stability": "stable", From 19debace1718d25eb0668ecee23b26395bd4b848 Mon Sep 17 00:00:00 2001 From: SBernards Date: Wed, 4 Oct 2023 18:48:58 +0200 Subject: [PATCH 100/210] fix: use releases path instead of current to prevent invalid configs being loaded --- src/DeployRunner.php | 12 ++++++++---- src/Deployer/Task/Deploy/LinkTask.php | 4 ++-- .../PlatformConfiguration/NginxManageVHostTask.php | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 0ceef75..c5bba0b 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -181,13 +181,17 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio run('mkdir -p ~/apps/{{domain}}/shared'); return run('realpath ~/apps/{{domain}}'); }); - $host->set('current_path', '{{deploy_path}}/current'); + $host->set('release_number', function () { + $latest = run('cat {{deploy_path}}.dep/latest_release || echo 0'); + return strval(intval($latest) + 1); + }); + $host->set('release_path', '{{deploy_path}}/releases/{{release_number}}'); $host->set('nginx_release_path', '{{release_path}}/.hypernode/nginx'); - $host->set('nginx_current_path', '{{current_path}}/.hypernode/nginx'); + $host->set('nginx_current_path', '{{release_path}}/.hypernode/nginx'); $host->set('supervisor_release_path', '{{release_path}}/.hypernode/supervisor'); - $host->set('supervisor_current_path', '{{current_path}}/.hypernode/supervisor'); + $host->set('supervisor_current_path', '{{release_path}}/.hypernode/supervisor'); $host->set('varnish_release_path', '{{release_path}}/.hypernode/varnish'); - $host->set('varnish_current_path', '{{current_path}}/.hypernode/varnish'); + $host->set('varnish_current_path', '{{release_path}}/.hypernode/varnish'); $host->set('configuration_stage', $stage); $host->set('writable_mode', 'chmod'); diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index bdd595b..08922f0 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -26,10 +26,10 @@ public function configure(Configuration $config): void return; } else { run('rmdir /data/web/public'); - run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); + run('ln -s {{release_path}}/{{public_folder}} /data/web/public'); } } else { - run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); + run('ln -s {{release_path}}/{{public_folder}} /data/web/public'); } }); } diff --git a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php index faf551e..496d748 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php @@ -30,7 +30,7 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { task('deploy:nginx:manage_vhost', function () { - run('hypernode-manage-vhosts {{domain}} --webroot {{current_path}}/{{public_folder}} --no'); + run('hypernode-manage-vhosts {{domain}} --webroot {{release_path}}/{{public_folder}} --no'); }); return null; From 4e30c474f8093ca4a66b81674599daa279a6d5d8 Mon Sep 17 00:00:00 2001 From: SBernards Date: Wed, 4 Oct 2023 19:00:20 +0200 Subject: [PATCH 101/210] fix: active vhost after deploy --- src/DeployRunner.php | 12 ++++-------- src/Deployer/Task/Deploy/LinkTask.php | 2 +- .../PlatformConfiguration/NginxManageVHostTask.php | 2 +- .../Task/PlatformConfiguration/NginxTask.php | 3 ++- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index c5bba0b..0ceef75 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -181,17 +181,13 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio run('mkdir -p ~/apps/{{domain}}/shared'); return run('realpath ~/apps/{{domain}}'); }); - $host->set('release_number', function () { - $latest = run('cat {{deploy_path}}.dep/latest_release || echo 0'); - return strval(intval($latest) + 1); - }); - $host->set('release_path', '{{deploy_path}}/releases/{{release_number}}'); + $host->set('current_path', '{{deploy_path}}/current'); $host->set('nginx_release_path', '{{release_path}}/.hypernode/nginx'); - $host->set('nginx_current_path', '{{release_path}}/.hypernode/nginx'); + $host->set('nginx_current_path', '{{current_path}}/.hypernode/nginx'); $host->set('supervisor_release_path', '{{release_path}}/.hypernode/supervisor'); - $host->set('supervisor_current_path', '{{release_path}}/.hypernode/supervisor'); + $host->set('supervisor_current_path', '{{current_path}}/.hypernode/supervisor'); $host->set('varnish_release_path', '{{release_path}}/.hypernode/varnish'); - $host->set('varnish_current_path', '{{release_path}}/.hypernode/varnish'); + $host->set('varnish_current_path', '{{current_path}}/.hypernode/varnish'); $host->set('configuration_stage', $stage); $host->set('writable_mode', 'chmod'); diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index 08922f0..92f483c 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -29,7 +29,7 @@ public function configure(Configuration $config): void run('ln -s {{release_path}}/{{public_folder}} /data/web/public'); } } else { - run('ln -s {{release_path}}/{{public_folder}} /data/web/public'); + run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); } }); } diff --git a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php index 496d748..faf551e 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php @@ -30,7 +30,7 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { task('deploy:nginx:manage_vhost', function () { - run('hypernode-manage-vhosts {{domain}} --webroot {{release_path}}/{{public_folder}} --no'); + run('hypernode-manage-vhosts {{domain}} --webroot {{current_path}}/{{public_folder}} --no'); }); return null; diff --git a/src/Deployer/Task/PlatformConfiguration/NginxTask.php b/src/Deployer/Task/PlatformConfiguration/NginxTask.php index 92c903e..67262c4 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxTask.php @@ -37,13 +37,14 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta task('deploy:nginx', [ 'deploy:nginx:prepare', - 'deploy:nginx:manage_vhost', 'deploy:nginx:upload', 'deploy:nginx:sync', 'deploy:nginx:cleanup', ]); before('deploy:symlink', 'deploy:nginx'); + after('deploy:symlink', 'deploy:nginx:manage_vhost'); + foreach ($this->getRegisteredTasks() as $taskName) { after('deploy:nginx:prepare', $taskName); } From 231801deebf2d42d2db03856e3a6aabf05d683ae Mon Sep 17 00:00:00 2001 From: SBernards Date: Fri, 6 Oct 2023 10:29:34 +0200 Subject: [PATCH 102/210] fix: hypernode deploy breaks when yes/no prompt is shown for redis updates --- src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php b/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php index 8d53bcc..c8e5ca4 100644 --- a/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php +++ b/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php @@ -36,7 +36,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta { if ($config->useSupervisor()) { task(self::TASK_NAME, function () use ($config) { - run("hypernode-systemctl settings redis_version {$config->getVersion()} --block"); + run("yes | hypernode-systemctl settings redis_version {$config->getVersion()} --block"); run("hypernode-systemctl settings supervisor_enabled True --block"); $instance = $config->getPersistence() ? 'redis-persistent' : 'redis'; @@ -44,7 +44,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta }); } else { task(self::TASK_NAME, function () use ($config) { - run("hypernode-systemctl settings redis_version {$config->getVersion()} --block"); + run("yes | hypernode-systemctl settings redis_version {$config->getVersion()} --block"); if ($config->getPersistence()) { run("hypernode-systemctl settings redis_persistent_instance --value True --block"); } From f5037d435498eb9feb6ded83d2ba84cea5a5dae7 Mon Sep 17 00:00:00 2001 From: SBernards Date: Fri, 6 Oct 2023 10:31:06 +0200 Subject: [PATCH 103/210] fix: revert release path change --- src/Deployer/Task/Deploy/LinkTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/Deploy/LinkTask.php b/src/Deployer/Task/Deploy/LinkTask.php index 92f483c..bdd595b 100644 --- a/src/Deployer/Task/Deploy/LinkTask.php +++ b/src/Deployer/Task/Deploy/LinkTask.php @@ -26,7 +26,7 @@ public function configure(Configuration $config): void return; } else { run('rmdir /data/web/public'); - run('ln -s {{release_path}}/{{public_folder}} /data/web/public'); + run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); } } else { run('ln -s {{current_path}}/{{public_folder}} /data/web/public'); From 20ec168969b4f2b6b852b305a7a74ca90138fffb Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 26 Oct 2023 12:38:09 +0200 Subject: [PATCH 104/210] composer: Update hypernode/deploy-configuration to 3.1.4 --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 9636035..e60a112 100644 --- a/composer.lock +++ b/composer.lock @@ -828,21 +828,21 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "959628f305cea2ba17b5e195cce67fc853942c03" + "reference": "2a8f5d256c156790b2c3cb6b6d43171a53159659" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/959628f305cea2ba17b5e195cce67fc853942c03", - "reference": "959628f305cea2ba17b5e195cce67fc853942c03", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/2a8f5d256c156790b2c3cb6b6d43171a53159659", + "reference": "2a8f5d256c156790b2c3cb6b6d43171a53159659", "shasum": "" }, "require": { "deployer/deployer": "^7.0", - "psr/log": "^1.0" + "psr/log": "^1.0||^2.0||^3.0" }, "conflict": { "hipex/deploy-configuration": "*" @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.3" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.4" }, - "time": "2023-02-20T09:14:10+00:00" + "time": "2023-10-26T10:35:09+00:00" }, { "name": "justinrainbow/json-schema", @@ -7582,5 +7582,5 @@ "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 7fbf918541d22e55dd4433e81300dd6539bd6014 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Dec 2023 13:56:02 +0100 Subject: [PATCH 105/210] composer: Update hypernode/deploy-configuration to 3.1.5 --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index e60a112..97460ce 100644 --- a/composer.lock +++ b/composer.lock @@ -828,16 +828,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.1.4", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "2a8f5d256c156790b2c3cb6b6d43171a53159659" + "reference": "85323a32dc9c0806984e97a5483b724002f2e472" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/2a8f5d256c156790b2c3cb6b6d43171a53159659", - "reference": "2a8f5d256c156790b2c3cb6b6d43171a53159659", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/85323a32dc9c0806984e97a5483b724002f2e472", + "reference": "85323a32dc9c0806984e97a5483b724002f2e472", "shasum": "" }, "require": { @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.4" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.5" }, - "time": "2023-10-26T10:35:09+00:00" + "time": "2023-12-05T12:52:54+00:00" }, { "name": "justinrainbow/json-schema", From bece1fad7df26fc9e0537818b7d6c8ce60f55736 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 17 Jan 2024 12:10:15 +0100 Subject: [PATCH 106/210] ci: Build PHP 8.3 image Also bump other default settings from 8.1 to 8.2 --- .github/workflows/publish.yaml | 3 ++- .github/workflows/test.yaml | 8 ++++---- ci/test/run-general.sh | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index cf769d2..d64b832 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -12,6 +12,7 @@ jobs: - "8.0" - "8.1" - "8.2" + - "8.3" node_version: - 12 - 14 @@ -21,7 +22,7 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} NODE_VERSION: ${{ matrix.node_version }} - LATEST_PHP_VERSION: 8.1 + LATEST_PHP_VERSION: 8.3 LATEST_NODE_VERSION: 18 steps: - name: Checkout hypernode-deploy diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 07848ac..2e442eb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [7.4, 8.1] # 8.2 is disabled for now, since Magento 2 does not support this yet. + php_version: [8.1, 8.2] # 8.3 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -19,12 +19,12 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} - name: Start SSH agent for brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.1' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Run brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.1' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} run: ./runtests.sh brancher shell: bash env: @@ -34,7 +34,7 @@ jobs: code_quality: strategy: matrix: - php_version: [7.4, 8.1, 8.2] + php_version: [7.4, 8.1, 8.2, 8.3] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index db68d05..b293098 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -58,7 +58,7 @@ end_task begin_task "Setting Magento 2" # Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.5-p2 /data/web/magento2 +$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.6-p3 /data/web/magento2 echo "Waiting for MySQL to be available on the Hypernode container" $HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" install_magento From 7b4be8f99002981b2cbe734347c21dcc1ac63ae1 Mon Sep 17 00:00:00 2001 From: Stijn Bernards Date: Thu, 22 Feb 2024 20:07:17 +0100 Subject: [PATCH 107/210] fix: resolve blocking error when switching varnish versions --- src/Deployer/Task/PlatformConfiguration/VarnishEnableTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/PlatformConfiguration/VarnishEnableTask.php b/src/Deployer/Task/PlatformConfiguration/VarnishEnableTask.php index 9d452f1..1249bfb 100644 --- a/src/Deployer/Task/PlatformConfiguration/VarnishEnableTask.php +++ b/src/Deployer/Task/PlatformConfiguration/VarnishEnableTask.php @@ -36,7 +36,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta { if ($config->useSupervisor()) { task(self::TASK_NAME, function () use ($config) { - run("hypernode-systemctl settings varnish_version {$config->getVersion()} --block"); + run("echo yes | hypernode-systemctl settings varnish_version {$config->getVersion()} --block"); run("hypernode-systemctl settings supervisor_enabled True --block"); run("hypernode-manage-supervisor {{domain}}.{{release_name}} --service varnish --ram {$config->getMemory()}"); }); From ab1aff7af4a64de53a81e1361c82c3fcc0e87215 Mon Sep 17 00:00:00 2001 From: Stijn Bernards Date: Thu, 22 Feb 2024 21:27:28 +0100 Subject: [PATCH 108/210] fix: resolve blocking error when changing redis versions --- src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php b/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php index 8d53bcc..4470e52 100644 --- a/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php +++ b/src/Deployer/Task/PlatformConfiguration/RedisEnableTask.php @@ -36,7 +36,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta { if ($config->useSupervisor()) { task(self::TASK_NAME, function () use ($config) { - run("hypernode-systemctl settings redis_version {$config->getVersion()} --block"); + run("echo yes | hypernode-systemctl settings redis_version {$config->getVersion()} --block"); run("hypernode-systemctl settings supervisor_enabled True --block"); $instance = $config->getPersistence() ? 'redis-persistent' : 'redis'; @@ -44,7 +44,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta }); } else { task(self::TASK_NAME, function () use ($config) { - run("hypernode-systemctl settings redis_version {$config->getVersion()} --block"); + run("echo yes | hypernode-systemctl settings redis_version {$config->getVersion()} --block"); if ($config->getPersistence()) { run("hypernode-systemctl settings redis_persistent_instance --value True --block"); } From 5b8f24a44bb0df18e8a45a561e354fe6edd7053a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 16:31:09 +0100 Subject: [PATCH 109/210] composer: Update deployer/deployer to 7.3.3 --- composer.json | 2 +- composer.lock | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 591ec9d..34d8efa 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2", - "deployer/deployer": "dev-master#d99377d as v7.3.1", + "deployer/deployer": "dev-master#5c62c45 as v7.3.3", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.2", diff --git a/composer.lock b/composer.lock index 97460ce..4245dca 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "37aef9e9af4806ffb6f067cbee645a10", + "content-hash": "2569c67a5e053a04388ef456650c5acf", "packages": [ { "name": "clue/stream-filter", @@ -78,12 +78,12 @@ "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "d99377d" + "reference": "5c62c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/d99377d", - "reference": "d99377d", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/5c62c45", + "reference": "5c62c45", "shasum": "" }, "require": { @@ -104,8 +104,7 @@ "phpunit/php-code-coverage": "^9.2", "phpunit/phpunit": "^9.3", "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "symfony/var-exporter": "^5.4" + "squizlabs/php_codesniffer": "^3.5" }, "default-branch": true, "bin": [ @@ -144,7 +143,7 @@ "type": "github" } ], - "time": "2023-06-16T10:01:27+00:00" + "time": "2024-02-26T13:30:43+00:00" }, { "name": "doctrine/annotations", @@ -7564,8 +7563,8 @@ { "package": "deployer/deployer", "version": "9999999-dev", - "alias": "v7.3.1", - "alias_normalized": "7.3.1.0" + "alias": "v7.3.3", + "alias_normalized": "7.3.3.0" } ], "minimum-stability": "stable", From 30002b7d7e0f13c91e36a56c487e2b212e2dc910 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 16:33:41 +0100 Subject: [PATCH 110/210] composer: Update guzzlehttp/guzzle to 7.7.1 --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 4245dca..24105c9 100644 --- a/composer.lock +++ b/composer.lock @@ -451,16 +451,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.7.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", "shasum": "" }, "require": { @@ -557,7 +557,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.7.1" }, "funding": [ { @@ -573,7 +573,7 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-08-27T10:02:06+00:00" }, { "name": "guzzlehttp/promises", From 337d73980c516711524f487e925bd88bd7c6e790 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 16:36:26 +0100 Subject: [PATCH 111/210] composer: Update hypernode/deploy-configuration to 3.2.0 --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 34d8efa..fca78a7 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.2", - "hypernode/deploy-configuration": "^3.0", + "hypernode/deploy-configuration": "^3.2", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 24105c9..e982f01 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2569c67a5e053a04388ef456650c5acf", + "content-hash": "bd93b92df4e23ffc663b8309e32aee8d", "packages": [ { "name": "clue/stream-filter", @@ -827,16 +827,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.1.5", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "85323a32dc9c0806984e97a5483b724002f2e472" + "reference": "0caa36f837353bb5bdb527b092ffcdf87acf6eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/85323a32dc9c0806984e97a5483b724002f2e472", - "reference": "85323a32dc9c0806984e97a5483b724002f2e472", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/0caa36f837353bb5bdb527b092ffcdf87acf6eba", + "reference": "0caa36f837353bb5bdb527b092ffcdf87acf6eba", "shasum": "" }, "require": { @@ -863,9 +863,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.1.5" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.2.0" }, - "time": "2023-12-05T12:52:54+00:00" + "time": "2024-03-05T15:25:53+00:00" }, { "name": "justinrainbow/json-schema", From 4a4fc7db5bc03e44104f63e82af83516b935bac3 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 16:37:46 +0100 Subject: [PATCH 112/210] composer: Update hypernode/api-client to 0.4.1 --- composer.json | 2 +- composer.lock | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index fca78a7..550ae36 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "deployer/deployer": "dev-master#5c62c45 as v7.3.3", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", - "hypernode/api-client": "^0.2", + "hypernode/api-client": "^0.4", "hypernode/deploy-configuration": "^3.2", "php-di/php-di": "^6.0", "psr/log": "^1.0", diff --git a/composer.lock b/composer.lock index e982f01..12868d8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bd93b92df4e23ffc663b8309e32aee8d", + "content-hash": "6edc3724a5f78348140ef75de75a3141", "packages": [ { "name": "clue/stream-filter", @@ -776,19 +776,20 @@ }, { "name": "hypernode/api-client", - "version": "0.2.1", + "version": "0.4.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "5fc348028551b5c6d2bbf1c1894f2cc3d59230e9" + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/5fc348028551b5c6d2bbf1c1894f2cc3d59230e9", - "reference": "5fc348028551b5c6d2bbf1c1894f2cc3d59230e9", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0", "ext-curl": "*", "ext-json": "*", "nesbot/carbon": "^2.0", @@ -821,9 +822,9 @@ "description": "Hypernode API Client for PHP", "support": { "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.2.1" + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" }, - "time": "2022-11-25T14:45:54+00:00" + "time": "2023-04-05T07:29:39+00:00" }, { "name": "hypernode/deploy-configuration", From 0226c102c6fe6baf3c50011a3dbfe2c102bed53d Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 17:01:09 +0100 Subject: [PATCH 113/210] ci: Remove old hipex build scripts --- .gitlab-ci.yml | 77 ------------------------ .releaserc | 28 --------- ci/build.sh | 38 ------------ ci/container-structure-test.yaml | 24 -------- ci/publish.sh | 36 ------------ ci/test.sh | 16 ----- gitlab/.gitlab-ci-build.yml | 87 ---------------------------- gitlab/.gitlab-ci-publish.yml | 87 ---------------------------- gitlab/.gitlab-ci-test.yml | 87 ---------------------------- gitlab/.gitlab-ci-variables-node.yml | 11 ---- gitlab/.gitlab-ci-variables-php.yml | 15 ----- hadolint.yaml | 9 --- 12 files changed, 515 deletions(-) delete mode 100644 .gitlab-ci.yml delete mode 100644 .releaserc delete mode 100755 ci/build.sh delete mode 100644 ci/container-structure-test.yaml delete mode 100755 ci/publish.sh delete mode 100755 ci/test.sh delete mode 100644 gitlab/.gitlab-ci-build.yml delete mode 100644 gitlab/.gitlab-ci-publish.yml delete mode 100644 gitlab/.gitlab-ci-test.yml delete mode 100644 gitlab/.gitlab-ci-variables-node.yml delete mode 100644 gitlab/.gitlab-ci-variables-php.yml delete mode 100644 hadolint.yaml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index ecff5c0..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,77 +0,0 @@ -image: docker:latest - -variables: - CONTAINER_IMAGE: git-registry.emico.nl/$CI_PROJECT_PATH - CONTAINER_IMAGE_HUB: hipex/deploy - DOCKER_DRIVER: overlay2 - COMPOSER_CACHE_DIR: composer-cache - -stages: - - quality - - build - - test - - release - - publish - -services: - - docker:dind - -# General extends -.default: - only: - - tags - - merge_requests - -include: - - '/gitlab/.gitlab-ci-variables-php.yml' - - '/gitlab/.gitlab-ci-variables-node.yml' - - '/gitlab/.gitlab-ci-build.yml' - - '/gitlab/.gitlab-ci-test.yml' - - '/gitlab/.gitlab-ci-publish.yml' - -# Code quality step -quality:dockerfile: - extends: .default - stage: quality - image: hadolint/hadolint:latest-debian - script: - - find . -type f -name "Dockerfile" | xargs --max-lines=1 hadolint --config=hadolint.yaml - -# Build include -.build: - extends: .default - stage: build - script: - - ./ci/build.sh - -# Test include -.test: - extends: .default - image: docker:latest - stage: test - before_script: - - apk add curl - - curl -LO https://storage.googleapis.com/container-structure-test/latest/container-structure-test-linux-amd64 && chmod +x container-structure-test-linux-amd64 && mkdir -p $HOME/bin && export PATH=$PATH:$HOME/bin && mv container-structure-test-linux-amd64 $HOME/bin/container-structure-test - script: - - ./ci/test.sh - -# Publish include -.publish: - extends: .default - stage: publish - only: - - tags - script: - - ./ci/publish.sh - -# Release step -release: - image: registry.hipex.cloud/hipex-services/release-cl - stage: release - script: - - semantic-release - only: - - master - - alpha - - beta - - next diff --git a/.releaserc b/.releaserc deleted file mode 100644 index c944358..0000000 --- a/.releaserc +++ /dev/null @@ -1,28 +0,0 @@ -{ - "plugins": [ - "@semantic-release/commit-analyzer", - "@semantic-release/release-notes-generator", - [ - "@semantic-release/gitlab", - { - "gitlabUrl": "https://git.emico.nl/" - } - ], - [ - "semantic-release-slack-bot", - { - "notifyOnSuccess": true, - "notifyOnFail": true - } - ], - [ - "@semantic-release/git", - { - "assets": [ - "docs/CHANGELOG.md" - ], - "message": "chore(release): ${nextRelease.version}\n\n${nextRelease.notes}" - } - ] - ] -} diff --git a/ci/build.sh b/ci/build.sh deleted file mode 100755 index f3398f7..0000000 --- a/ci/build.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env sh -set -e - -DEFAULT_PHP_VERSION="7.2" -DEFAULT_NODE_VERSION="12" - -echo "${CONTAINER_IMAGE}" - -cd "$(dirname "$0")/../" - -function build { - docker pull ${CONTAINER_IMAGE}:${2} || true - docker build -t ${CONTAINER_IMAGE}:${1} --build-arg PHP_VERSION=${PHP_VERSION} --build-arg NODE_VERSION=${NODE_VERSION} -f ./ci/build/Dockerfile . - - # Push image unless LOCAL_BUILD var is set - if [ -z "${LOCAL_BUILD+xxx}" ]; then - docker push ${CONTAINER_IMAGE}:${1} - fi -} - -if [ "$CI_JOB_TOKEN" ]; then - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN git-registry.emico.nl -fi - -if [ -z "$PHP_VERSION" ]; then - PHP_VERSION="$DEFAULT_PHP_VERSION" # PHP_VERSION is empty set default value -fi - -if [ -z "$NODE_VERSION" ]; then - NODE_VERSION="$DEFAULT_NODE_VERSION" # NODE_VERSION is empty set default value -fi - -IMAGE_NAME="php${PHP_VERSION}-node${NODE_VERSION}" -if [ "$CI_COMMIT_TAG" ]; then - build "${CI_COMMIT_TAG}-${IMAGE_NAME}" "${IMAGE_NAME}" -else - build "${IMAGE_NAME}" "${IMAGE_NAME}" -fi diff --git a/ci/container-structure-test.yaml b/ci/container-structure-test.yaml deleted file mode 100644 index 0d5d65e..0000000 --- a/ci/container-structure-test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -schemaVersion: "2.0.0" - -commandTests: - - name: "Node Version" - command: "node" - args: - - "-v" - expectedOutput: [".*NODE_VERSION.*"] - - name: "Hipex deploy" - command: "hipex-deploy" - expectedOutput: [".*Build application and package.*"] - - name: "Composer" - command: "composer" - expectedOutput: [".*Composer version.*"] - - name: "PHP" - command: "php" - args: - - "-v" - expectedOutput: [".*PHP_VERSION.*"] - - name: "Docker Version" - command: "docker" - args: - - "-v" - expectedOutput: [ ".*Docker version.*" ] diff --git a/ci/publish.sh b/ci/publish.sh deleted file mode 100755 index d6fcb4a..0000000 --- a/ci/publish.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env sh -set -e - -DEFAULT_PHP_VERSION="7.1" -DEFAULT_NODE_VERSION="8" - -function deploy { - echo "This is output from build.sh" - - docker pull ${CONTAINER_IMAGE}:${1} - docker tag ${CONTAINER_IMAGE}:${1} ${CONTAINER_IMAGE_HUB}:${1} - docker push ${CONTAINER_IMAGE_HUB}:${1} -} - -docker login -u gitlab-ci-token -p $CI_JOB_TOKEN git-registry.emico.nl -docker login -u ${DOCKER_HUB_USERNAME} -p ${DOCKER_HUB_PASSWORD} - -if [ -z "$PHP_VERSION" ]; then - PHP_VERSION="$DEFAULT_PHP_VERSION" # PHP_VERSION is empty set default value -fi - -if [ -z "$NODE_VERSION" ]; then - NODE_VERSION="$DEFAULT_NODE_VERSION" # NODE_VERSION is empty set default value -fi - -IMAGE_NAME="php${PHP_VERSION}-node${NODE_VERSION}" -if [ "$CI_COMMIT_TAG" ]; then - deploy "${CI_COMMIT_TAG}-${IMAGE_NAME}" "${IMAGE_NAME}" -else - deploy "${IMAGE_NAME}" "${IMAGE_NAME}" - - # If PHP_VERSION and NODE_VERSION is default (latest) deploy without tag - if [ "$PHP_VERSION" == "$DEFAULT_PHP_VERSION" ] && [ "$NODE_VERSION" == "$DEFAULT_NODE_VERSION" ]; then - deploy - fi -fi diff --git a/ci/test.sh b/ci/test.sh deleted file mode 100755 index 7b6a24c..0000000 --- a/ci/test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env sh -set -e - -docker login -u gitlab-ci-token -p $CI_JOB_TOKEN git-registry.emico.nl - -sed -i "s/PHP_VERSION/${PHP_VERSION}/g" ./ci/container-structure-test.yaml -sed -i "s/NODE_VERSION/${NODE_VERSION}/g" ./ci/container-structure-test.yaml - -if [ "$CI_COMMIT_TAG" ]; then - IMAGE="${CONTAINER_IMAGE}:${CI_COMMIT_TAG}-php${PHP_VERSION}-node${NODE_VERSION}" -else - IMAGE="${CONTAINER_IMAGE}:php${PHP_VERSION}-node${NODE_VERSION}" -fi - -docker pull ${IMAGE} -container-structure-test test --image ${IMAGE} --config ./ci/container-structure-test.yaml diff --git a/gitlab/.gitlab-ci-build.yml b/gitlab/.gitlab-ci-build.yml deleted file mode 100644 index ca3babc..0000000 --- a/gitlab/.gitlab-ci-build.yml +++ /dev/null @@ -1,87 +0,0 @@ -# PHP 7.2 -build:php7-2-node10: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-2 - - .variables-node10 - -build:php7-2-node12: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-2 - - .variables-node12 - -build:php7-2-node14: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-2 - - .variables-node14 - -# PHP 7.3 -build:php7-3-node10: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-3 - - .variables-node10 - -build:php7-3-node12: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-3 - - .variables-node12 - -build:php7-3-node14: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-3 - - .variables-node14 - -# PHP 7.4 -build:php7-4-node10: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-4 - - .variables-node10 - -build:php7-4-node12: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-4 - - .variables-node12 - -build:php7-4-node14: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php7-4 - - .variables-node14 - -# PHP 8.0 -build:php8-0-node10: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php8-0 - - .variables-node10 - -build:php8-0-node12: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php8-0 - - .variables-node12 - -build:php8-0-node14: - needs: ["quality:dockerfile"] - extends: - - .build - - .variables-php8-0 - - .variables-node14 diff --git a/gitlab/.gitlab-ci-publish.yml b/gitlab/.gitlab-ci-publish.yml deleted file mode 100644 index 7a2ff45..0000000 --- a/gitlab/.gitlab-ci-publish.yml +++ /dev/null @@ -1,87 +0,0 @@ -# PHP 7.2 -publish:php7-2-node10: - needs: ["test:php7-2-node10"] - extends: - - .publish - - .variables-php7-2 - - .variables-node10 - -publish:php7-2-node12: - needs: ["test:php7-2-node12"] - extends: - - .publish - - .variables-php7-2 - - .variables-node12 - -publish:php7-2-node14: - needs: ["test:php7-2-node14"] - extends: - - .publish - - .variables-php7-2 - - .variables-node14 - -# PHP 7.3 -publish:php7-3-node10: - needs: ["test:php7-3-node10"] - extends: - - .publish - - .variables-php7-3 - - .variables-node10 - -publish:php7-3-node12: - needs: ["test:php7-3-node12"] - extends: - - .publish - - .variables-php7-3 - - .variables-node12 - -publish:php7-3-node14: - needs: ["test:php7-3-node14"] - extends: - - .publish - - .variables-php7-3 - - .variables-node14 - -# PHP 7.4 -publish:php7-4-node10: - needs: ["test:php7-4-node10"] - extends: - - .publish - - .variables-php7-4 - - .variables-node10 - -publish:php7-4-node12: - needs: ["test:php7-4-node12"] - extends: - - .publish - - .variables-php7-4 - - .variables-node12 - -publish:php7-4-node14: - needs: ["test:php7-4-node14"] - extends: - - .publish - - .variables-php7-4 - - .variables-node14 - -# PHP 8.0 -publish:php8-0-node10: - needs: ["test:php8-0-node10"] - extends: - - .publish - - .variables-php8-0 - - .variables-node10 - -publish:php8-0-node12: - needs: ["test:php8-0-node12"] - extends: - - .publish - - .variables-php8-0 - - .variables-node12 - -publish:php8-0-node14: - needs: ["test:php8-0-node14"] - extends: - - .publish - - .variables-php8-0 - - .variables-node14 diff --git a/gitlab/.gitlab-ci-test.yml b/gitlab/.gitlab-ci-test.yml deleted file mode 100644 index 6956640..0000000 --- a/gitlab/.gitlab-ci-test.yml +++ /dev/null @@ -1,87 +0,0 @@ -# PHP 7.2 -test:php7-2-node10: - needs: ["build:php7-2-node10"] - extends: - - .test - - .variables-php7-2 - - .variables-node10 - -test:php7-2-node12: - needs: ["build:php7-2-node12"] - extends: - - .test - - .variables-php7-2 - - .variables-node12 - -test:php7-2-node14: - needs: ["build:php7-2-node14"] - extends: - - .test - - .variables-php7-2 - - .variables-node14 - -# PHP 7.3 -test:php7-3-node10: - needs: ["build:php7-3-node10"] - extends: - - .test - - .variables-php7-3 - - .variables-node10 - -test:php7-3-node12: - needs: ["build:php7-3-node12"] - extends: - - .test - - .variables-php7-3 - - .variables-node12 - -test:php7-3-node14: - needs: ["build:php7-3-node14"] - extends: - - .test - - .variables-php7-3 - - .variables-node14 - -# PHP 7.4 -test:php7-4-node10: - needs: ["build:php7-4-node10"] - extends: - - .test - - .variables-php7-4 - - .variables-node10 - -test:php7-4-node12: - needs: ["build:php7-4-node12"] - extends: - - .test - - .variables-php7-4 - - .variables-node12 - -test:php7-4-node14: - needs: ["build:php7-4-node14"] - extends: - - .test - - .variables-php7-4 - - .variables-node14 - -# PHP 8.0 -test:php8-0-node10: - needs: ["build:php8-0-node10"] - extends: - - .test - - .variables-php8-0 - - .variables-node10 - -test:php8-0-node12: - needs: ["build:php8-0-node12"] - extends: - - .test - - .variables-php8-0 - - .variables-node12 - -test:php8-0-node14: - needs: ["build:php8-0-node14"] - extends: - - .test - - .variables-php8-0 - - .variables-node14 diff --git a/gitlab/.gitlab-ci-variables-node.yml b/gitlab/.gitlab-ci-variables-node.yml deleted file mode 100644 index 1f25ac9..0000000 --- a/gitlab/.gitlab-ci-variables-node.yml +++ /dev/null @@ -1,11 +0,0 @@ -.variables-node10: - variables: - NODE_VERSION: "10" - -.variables-node12: - variables: - NODE_VERSION: "12" - -.variables-node14: - variables: - NODE_VERSION: "14" diff --git a/gitlab/.gitlab-ci-variables-php.yml b/gitlab/.gitlab-ci-variables-php.yml deleted file mode 100644 index f0e5e00..0000000 --- a/gitlab/.gitlab-ci-variables-php.yml +++ /dev/null @@ -1,15 +0,0 @@ -.variables-php7-2: - variables: - PHP_VERSION: "7.2" - -.variables-php7-3: - variables: - PHP_VERSION: "7.3" - -.variables-php7-4: - variables: - PHP_VERSION: "7.4" - -.variables-php8-0: - variables: - PHP_VERSION: "8.0" diff --git a/hadolint.yaml b/hadolint.yaml deleted file mode 100644 index 3e0a228..0000000 --- a/hadolint.yaml +++ /dev/null @@ -1,9 +0,0 @@ -ignored: - - DL3018 # tag apk add versions - - DL4006 # set -o pipefail - - SC2039 # POSIX sh [[ ]] - - SC2038 # Use -print0/-0 or -exec + to allow for non-alphanumeric filenames. - - SC2086 # Double quote to prevent globbing and word splitting. - - DL3022 # Allowed to copy from external image - - DL3008 # Do not require specific pinned package versions - - DL3059 # Allow multiple consecutive RUN statements From 2f265f2da25b9330c08e49cd2de4f858434d6bb9 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 5 Mar 2024 17:01:20 +0100 Subject: [PATCH 114/210] Update notes on building in README.md --- README.md | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 10801cd..2b7e696 100644 --- a/README.md +++ b/README.md @@ -6,38 +6,33 @@ If you want to use Hypernode Deploy in your shop you will probably want to head If you are looking to see how the internals of the deployment tool work or even want to contribute a change to the project yourself, then you're in the right place. -This project builds the hypernode/deploy container image. +This project builds the `hypernode/deploy` container image, which can be found on [quay.io/hypernode/deploy](https://quay.io/hypernode/deploy). ## Building and running a local image If you don't want to use a pre-built image from https://quay.io/hypernode/deploy or if you are doing development on this project and you want to test out your changes, you can built an image locally and use that. ```bash -export LOCAL_BUILD= # So we don't try to push -export CONTAINER_IMAGE=hypernode/deploy/dev -export PHP_VERSION=7.4 -export NODE_VERSION=14 -bash -x ci/build.sh +export DOCKER_TAG=hypernode_deploy_dev:latest +export PHP_VERSION=8.2 +export NODE_VERSION=18 +docker build -t "$DOCKER_TAG" -f "./ci/build/Dockerfile" \ + --build-arg PHP_VERSION=$PHP_VERSION \ + --build-arg NODE_VERSION=$NODE_VERSION \ + . ``` This will give you a locally built image: -```bash -$ docker images | grep hypernode/deploy/dev -hypernode/deploy/dev php7.4-node14 ece785ad21f5 2 minutes ago 753MB +```console +$ docker images | grep hypernode_deploy_dev +localhost/hypernode_deploy_dev latest 5280aaef3a82 52 seconds ago 842 MB ``` That you could then use like: -```bash -$ rm -Rf vendor # in case we need to do some cleanup -$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode/deploy/dev:php7.4-node14 hypernode-deploy build -vvv -$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode/deploy/dev:php7.4-node14 hypernode-deploy deploy staging -vvv -``` - -## Switching node version - -```bash -source /etc/profile.d/nvm.sh -nvm install -s stable +```console +$ rm -Rf vendor +$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode_deploy_dev:latest hypernode-deploy build -vvv +$ docker run --rm -it --env SSH_PRIVATE_KEY="$(cat ~/.ssh/yourdeploykey | base64)" -v ${PWD}:/build hypernode_deploy_dev:latest hypernode-deploy deploy staging -vvv ``` ## Tests @@ -49,6 +44,3 @@ To run the static tests, please run the following commands: composer --working-dir tools install tools/vendor/bin/grumphp run --config tools/grumphp.yml ``` - -### Docker container -We use Google Container Structure Tests over https://github.com/aelsabbahy/goss because the Hipex deploy container does not require a health check. From d12eff7772e025a5f2ddc967d13fb33d83b73d0d Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 6 Mar 2024 10:34:34 +0100 Subject: [PATCH 115/210] brancher: Poll for SSH reachability after delivery This prevents continuing the process and deploy to a brancher which we cannot reach yet. So essentially this wait for DNS to settle and potentially other things. The SSH polling continues on the same time elapsed and timeout that the initial polling system used. So if a Brancher node is delivered in 1200 seconds, it only has 300 seconds left for SSH to become reachable (given the default 1500 seconds timeout). --- src/Brancher/BrancherHypernodeManager.php | 66 +++++++++++++++++++---- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index f30551d..3d85f16 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -4,6 +4,7 @@ use Hypernode\Api\Exception\HypernodeApiClientException; use Hypernode\Api\Exception\HypernodeApiServerException; +use Hypernode\Api\Exception\ResponseException; use Hypernode\Api\HypernodeClient; use Hypernode\Api\HypernodeClientFactory; use Hypernode\Api\Resource\Logbook\Flow; @@ -28,6 +29,7 @@ public function __construct(LoggerInterface $log) * @param string $hypernode The parent hypernode to query the Brancher instances from * @param string[] $labels Labels to match against, may be empty * @return string[] The found Brancher instance names + * @throws ResponseException */ public function queryBrancherHypernodes(string $hypernode, array $labels = []): array { @@ -66,10 +68,21 @@ public function queryBrancherHypernodes(string $hypernode, array $labels = []): */ public function reuseExistingBrancherHypernode(string $hypernode, array $labels = []): ?string { - $brancherHypernodes = $this->queryBrancherHypernodes($hypernode, $labels); - if (count($brancherHypernodes) > 0) { - // Return the last brancher Hypernode, which is the most recently created one - return $brancherHypernodes[count($brancherHypernodes) - 1]; + try { + $brancherHypernodes = $this->queryBrancherHypernodes($hypernode, $labels); + if (count($brancherHypernodes) > 0) { + // Return the last brancher Hypernode, which is the most recently created one + return $brancherHypernodes[count($brancherHypernodes) - 1]; + } + } catch (ResponseException $e) { + $this->log->error( + sprintf( + 'Got an API exception (code %d) while querying for existing brancher Hypernodes for Hypernode %s with labels (%s).', + $e->getCode(), + $hypernode, + implode(', ', $labels) + ) + ); } return null; @@ -108,16 +121,16 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 $interval = 3; $allowedErrorWindow = 3; - while ($timeElapsed < $timeout && !$resolved) { + while ($timeElapsed < $timeout) { $now = microtime(true); $timeElapsed += $now - $latest; $latest = $now; try { $flows = $this->hypernodeClient->logbook->getList($brancherHypernode); - $relevantFlows = array_filter($flows, fn (Flow $flow) => $flow->name === 'ensure_app'); - $failedFlows = array_filter($flows, fn (Flow $flow) => $flow->isReverted()); - $completedFlows = array_filter($flows, fn (Flow $flow) => $flow->isComplete()); + $relevantFlows = array_filter($flows, fn(Flow $flow) => $flow->name === 'ensure_app'); + $failedFlows = array_filter($flows, fn(Flow $flow) => $flow->isReverted()); + $completedFlows = array_filter($flows, fn(Flow $flow) => $flow->isComplete()); if (count($failedFlows) === count($relevantFlows)) { throw new CreateBrancherHypernodeFailedException(); @@ -142,7 +155,6 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 $brancherHypernode ) ); - ; continue; } } @@ -150,11 +162,45 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 sleep($interval); } + $this->log->info( + sprintf( + 'Brancher Hypernode %s was delivered. Now waiting for node to become reachable...', + $brancherHypernode + ) + ); + if (!$resolved) { throw new TimeoutException( - sprintf('Timed out waiting for brancher Hypernode %s to become available', $brancherHypernode) + sprintf('Timed out waiting for brancher Hypernode %s to be delivered', $brancherHypernode) ); } + + $resolved = false; + while ($timeElapsed < $timeout) { + $now = microtime(true); + $timeElapsed += $now - $latest; + $latest = $now; + + $connection = @fsockopen(sprintf("%s.hypernode.io", $brancherHypernode), 22); + if ($connection) { + fclose($connection); + $resolved = true; + break; + } + } + + if (!$resolved) { + throw new TimeoutException( + sprintf('Timed out waiting for brancher Hypernode %s to become reachable', $brancherHypernode) + ); + } + + $this->log->info( + sprintf( + 'Brancher Hypernode %s became reachable!', + $brancherHypernode + ) + ); } /** From 31c9cdf16dc74eb7932cf281d0fbd6bd0c8c7f0a Mon Sep 17 00:00:00 2001 From: SBernards Date: Wed, 6 Mar 2024 13:40:58 +0100 Subject: [PATCH 116/210] fix: allow tasks to be configured on server role --- src/DeployRunner.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 0ceef75..5174a1d 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -6,6 +6,7 @@ use Deployer\Exception\Exception; use Deployer\Exception\GracefulShutdownException; use Deployer\Host\Host; +use Deployer\Task\Task; use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\Deployer\RecipeLoader; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; @@ -14,6 +15,7 @@ use Hypernode\Deploy\Exception\InvalidConfigurationException; use Hypernode\Deploy\Exception\TimeoutException; use Hypernode\Deploy\Exception\ValidationException; +use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\Stage; @@ -145,11 +147,19 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con foreach ($configurations as $taskConfig) { if ($task->supports($taskConfig)) { - $task->configureWithTaskConfig($taskConfig); + $task = $task->configureWithTaskConfig($taskConfig); + + if ($task && $taskConfig instanceof ServerRoleConfigurableInterface) { + $this->configureTaskOnServerRoles($task, $taskConfig); + } } } } + private function configureTaskOnServerRoles(Task $task, ServerRoleConfigurableInterface $taskConfiguration) { + $task->select('role=' . implode(',role=', $taskConfiguration->getServerRoles())); + } + private function configureServers(Configuration $config, string $stage, bool $reuseBrancher): void { foreach ($config->getStages() as $configStage) { From bd418e1d7eba2f8a5317bb7cd13bff88dfede3dc Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 3 Apr 2024 17:50:05 +0200 Subject: [PATCH 117/210] ci: Add Node.js 20 to build matrix This will make Node.js 20 for all supported PHP versions available --- .github/workflows/publish.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index d64b832..84bdcbf 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -18,12 +18,13 @@ jobs: - 14 - 16 - 18 + - 20 runs-on: ubuntu-latest env: PHP_VERSION: ${{ matrix.php_version }} NODE_VERSION: ${{ matrix.node_version }} LATEST_PHP_VERSION: 8.3 - LATEST_NODE_VERSION: 18 + LATEST_NODE_VERSION: 20 steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 From ff71b6ada471ee0e95d20b3284842cc7fe3bf22e Mon Sep 17 00:00:00 2001 From: SBernards Date: Wed, 17 Apr 2024 08:15:03 +0200 Subject: [PATCH 118/210] fix: allow tasks to be configured on stages --- src/DeployRunner.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 5174a1d..f087982 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -16,6 +16,7 @@ use Hypernode\Deploy\Exception\TimeoutException; use Hypernode\Deploy\Exception\ValidationException; use Hypernode\DeployConfiguration\Configurable\ServerRoleConfigurableInterface; +use Hypernode\DeployConfiguration\Configurable\StageConfigurableInterface; use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\Stage; @@ -152,6 +153,10 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con if ($task && $taskConfig instanceof ServerRoleConfigurableInterface) { $this->configureTaskOnServerRoles($task, $taskConfig); } + + if ($task && $taskConfig instanceof StageConfigurableInterface) { + $this->configureTaskOnStage($task, $taskConfig); + } } } } @@ -160,6 +165,14 @@ private function configureTaskOnServerRoles(Task $task, ServerRoleConfigurableIn $task->select('role=' . implode(',role=', $taskConfiguration->getServerRoles())); } + private function configureTaskOnStage(Task $task, StageConfigurableInterface $taskConfiguration) { + if (!$taskConfiguration->getStage()) { + return; + } + + $task->select('stage=' . $taskConfiguration->getStage()->getName()); + } + private function configureServers(Configuration $config, string $stage, bool $reuseBrancher): void { foreach ($config->getStages() as $configStage) { From 26a92689a00020494563e4cb2eea7615635ac232 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 20 Jun 2024 17:35:23 +0200 Subject: [PATCH 119/210] DefaultsTaskGlobal: Set configured php version from configuration --- src/Deployer/Task/Common/DefaultsTaskGlobal.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Deployer/Task/Common/DefaultsTaskGlobal.php b/src/Deployer/Task/Common/DefaultsTaskGlobal.php index 6edd1a4..202a344 100644 --- a/src/Deployer/Task/Common/DefaultsTaskGlobal.php +++ b/src/Deployer/Task/Common/DefaultsTaskGlobal.php @@ -45,7 +45,11 @@ public function configure(Configuration $config): void return $this->releaseInfo->getCommitSha(); }); - set('configured/bin/php', 'php'); + if (str_starts_with($config->getPhpVersion(), 'php')) { + set('configured/bin/php', $config->getPhpVersion()); + } else { + set('configured/bin/php', 'php' . $config->getPhpVersion()); + } set('configured/public_folder', $config->getPublicFolder()); } } From b2a0c5537add0f8b131aadf9f31cc8c5157b04a3 Mon Sep 17 00:00:00 2001 From: Bram Gerritsen Date: Thu, 27 Jun 2024 15:18:34 +0200 Subject: [PATCH 120/210] fix escaping issue --- src/Deployer/Task/PlatformConfiguration/CronSyncTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php b/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php index 0017052..3a09c28 100644 --- a/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php +++ b/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php @@ -35,7 +35,7 @@ public function getCurrentCrontab(): string public function setCrontab(string $newCrontab): void { - run('echo "' . $newCrontab . '" | crontab -'); + run("echo $'" . str_replace('\'', '\\\'', $newCrontab) . "' | crontab -"); } public function replaceExistingCronBlocks(string $newCronBlock): string From 17806306dfe475c2521e8b3af9d762785e78f02a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 2 Jul 2024 16:43:05 +0200 Subject: [PATCH 121/210] ci: Run test workflow on base repository By running the test workflow on the base repository, a contributor can make use of our integration tests etc. --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2e442eb..30285f0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,6 +1,6 @@ name: Run tests for PR on: - pull_request: + pull_request_target: jobs: integration_test: From dea888f4642061c0d749ddd1589df093e6dbe2e4 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 3 Jul 2024 10:44:59 +0200 Subject: [PATCH 122/210] DeployRunner: Fix codestyle error --- src/DeployRunner.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index f087982..1617ff5 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -161,11 +161,13 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con } } - private function configureTaskOnServerRoles(Task $task, ServerRoleConfigurableInterface $taskConfiguration) { + private function configureTaskOnServerRoles(Task $task, ServerRoleConfigurableInterface $taskConfiguration) + { $task->select('role=' . implode(',role=', $taskConfiguration->getServerRoles())); } - private function configureTaskOnStage(Task $task, StageConfigurableInterface $taskConfiguration) { + private function configureTaskOnStage(Task $task, StageConfigurableInterface $taskConfiguration) + { if (!$taskConfiguration->getStage()) { return; } From 32ef185e9d8d7402e27219636573ae3465ac61c1 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 4 Jul 2024 13:54:41 +0200 Subject: [PATCH 123/210] ci: Checkout pull request ref instead Commit 17806306 set the pull request event to `pull_request_target`, which means the pipelines run on the base ref with the secrets from base as well. That's all fine, but we actually want to test the code on the pull request ref --- .github/workflows/test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 30285f0..ed2843d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,6 +12,8 @@ jobs: steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} - name: Run general testsuite if: ${{ matrix.testsuite == 'general' }} run: MAGENTO_REPO=./magento2 ./runtests.sh general From f34dc9e96714f245bd85ca6cdff6174919c37f34 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 4 Jul 2024 13:05:44 +0200 Subject: [PATCH 124/210] DeployRunner: Fix regression caused by role selection This reverts commit 31c9cdf1. The role selection does not work, because: - The label is actually called `roles` - The `roles` label is an array, so `=` comparison with a role string does not work - Deployer selector does not support a comparison operator to check if an array contains a value --- src/DeployRunner.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 1617ff5..47f4f95 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -150,10 +150,6 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con if ($task->supports($taskConfig)) { $task = $task->configureWithTaskConfig($taskConfig); - if ($task && $taskConfig instanceof ServerRoleConfigurableInterface) { - $this->configureTaskOnServerRoles($task, $taskConfig); - } - if ($task && $taskConfig instanceof StageConfigurableInterface) { $this->configureTaskOnStage($task, $taskConfig); } @@ -161,11 +157,6 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con } } - private function configureTaskOnServerRoles(Task $task, ServerRoleConfigurableInterface $taskConfiguration) - { - $task->select('role=' . implode(',role=', $taskConfiguration->getServerRoles())); - } - private function configureTaskOnStage(Task $task, StageConfigurableInterface $taskConfiguration) { if (!$taskConfiguration->getStage()) { From b3387fc583d9de627d3dfd4a80a92060be83120a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Thu, 4 Jul 2024 13:07:35 +0200 Subject: [PATCH 125/210] DeployRunner: Fix task variable being overridden by other var type $task is of type ConfigurableTaskInterface, while $deployerTask is of type Task (from Deployer). Next taskConfig iteration would run `supports` on Deployer Task type, which obviously does not exist. --- src/DeployRunner.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 47f4f95..aa0fda3 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -148,10 +148,10 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con foreach ($configurations as $taskConfig) { if ($task->supports($taskConfig)) { - $task = $task->configureWithTaskConfig($taskConfig); + $deployerTask = $task->configureWithTaskConfig($taskConfig); - if ($task && $taskConfig instanceof StageConfigurableInterface) { - $this->configureTaskOnStage($task, $taskConfig); + if ($deployerTask && $taskConfig instanceof StageConfigurableInterface) { + $this->configureTaskOnStage($deployerTask, $taskConfig); } } } From 8cabfd46bbcddafa7ce077faf5dac33081ca4955 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 13:11:40 +0200 Subject: [PATCH 126/210] DeployRunner: Add full support for roles/stage selection - If a configuration has a stage configured, it will select hosts with that stage - If a configuration has roles configured, it will select hosts with any of those roles - If a configuration has both stage and roles configured, they will be combined together with AND. --- src/DeployRunner.php | 81 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index aa0fda3..454949a 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -20,10 +20,12 @@ use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\Server; use Hypernode\DeployConfiguration\Stage; +use Hypernode\DeployConfiguration\TaskConfigurationInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Throwable; +use Webmozart\Assert\Assert; use function Deployer\host; use function Deployer\localhost; @@ -51,6 +53,10 @@ class DeployRunner private array $deployedHostnames = []; private string $deployedStage = ''; + /** + * @var Host[] + */ + private array $configuredHosts = []; public function __construct( TaskFactory $taskFactory, @@ -75,8 +81,14 @@ public function __construct( * @throws Throwable * @throws Exception */ - public function run(OutputInterface $output, string $stage, string $task, bool $configureBuildStage, bool $configureServers, bool $reuseBrancher): int - { + public function run( + OutputInterface $output, + string $stage, + string $task, + bool $configureBuildStage, + bool $configureServers, + bool $reuseBrancher + ): int { $deployer = $this->deployerLoader->getOrCreateInstance($output); try { @@ -97,8 +109,12 @@ public function run(OutputInterface $output, string $stage, string $task, bool $ * @throws InvalidConfigurationException * @throws Throwable */ - private function prepare(bool $configureBuildStage, bool $configureServers, string $stage, bool $reuseBrancher): void - { + private function prepare( + bool $configureBuildStage, + bool $configureServers, + string $stage, + bool $reuseBrancher + ): void { $this->recipeLoader->load('common.php'); $tasks = $this->taskFactory->loadAll(); $config = $this->configurationLoader->load( @@ -150,20 +166,54 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con if ($task->supports($taskConfig)) { $deployerTask = $task->configureWithTaskConfig($taskConfig); - if ($deployerTask && $taskConfig instanceof StageConfigurableInterface) { - $this->configureTaskOnStage($deployerTask, $taskConfig); + if ($deployerTask) { + $this->configureDeployerTask($deployerTask, $taskConfig); } } } } - private function configureTaskOnStage(Task $task, StageConfigurableInterface $taskConfiguration) + private function configureDeployerTask(Task $deployerTask, TaskConfigurationInterface $taskConfig): void { - if (!$taskConfiguration->getStage()) { - return; + $rolesConfigured = false; + foreach ($this->configuredHosts as $host) { + $roles = $host->get('roles', []); + if ($roles) { + $rolesConfigured = true; + break; + } } - $task->select('stage=' . $taskConfiguration->getStage()->getName()); + $roles = $taskConfig instanceof ServerRoleConfigurableInterface + ? $taskConfig->getServerRoles() + : []; + $stage = $taskConfig instanceof StageConfigurableInterface + ? $taskConfig->getStage()->getName() + : null; + + if ($roles) { + if (!$rolesConfigured) { + throw new InvalidConfigurationException( + sprintf( + 'No roles configured for task %s, skipping role selection', + get_class($taskConfig) + ) + ); + } + + if ($stage) { + $deployerTask->select( + sprintf( + "stage=${stage}&roles=%s", + implode(",stage=${stage}&roles=", $roles) + ) + ); + } else { + $deployerTask->select('roles=' . implode(',roles=', $roles)); + } + } elseif ($stage) { + $deployerTask->select("stage={$stage}"); + } } private function configureServers(Configuration $config, string $stage, bool $reuseBrancher): void @@ -179,8 +229,12 @@ private function configureServers(Configuration $config, string $stage, bool $re } } - private function configureStageServer(Stage $stage, Server $server, Configuration $config, bool $reuseBrancher): void - { + private function configureStageServer( + Stage $stage, + Server $server, + Configuration $config, + bool $reuseBrancher + ): void { $this->maybeConfigureBrancherServer($server, $reuseBrancher); $host = host($stage->getName() . ':' . $server->getHostname()); @@ -232,6 +286,9 @@ private function configureStageServer(Stage $stage, Server $server, Configuratio ); $host->set($key, $value); } + + Assert::isInstanceOf($host, Host::class); + $this->configuredHosts[] = $host; } private function maybeConfigureBrancherServer(Server $server, bool $reuseBrancher): void From decdad065d379556afbfe4417f9fc2dac0287e6b Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 13:12:30 +0200 Subject: [PATCH 127/210] PlatformConfiguration: return deployer task By returning the deployer task, it can be configured later on to have roles/stage selection --- src/Deployer/Task/PlatformConfiguration/CronTask.php | 10 +++------- .../PlatformConfiguration/NginxManageVHostTask.php | 7 +++---- src/Deployer/Task/PlatformConfiguration/NginxTask.php | 6 +++--- src/Deployer/Task/PlatformConfiguration/RedisTask.php | 6 +++--- .../Task/PlatformConfiguration/SupervisorTask.php | 6 +++--- .../Task/PlatformConfiguration/VarnishTask.php | 6 +++--- 6 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/Deployer/Task/PlatformConfiguration/CronTask.php b/src/Deployer/Task/PlatformConfiguration/CronTask.php index a894608..f75af91 100644 --- a/src/Deployer/Task/PlatformConfiguration/CronTask.php +++ b/src/Deployer/Task/PlatformConfiguration/CronTask.php @@ -2,19 +2,15 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\PlatformConfiguration\CronConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; use function Deployer\before; -use function Deployer\get; -use function Deployer\set; use function Deployer\task; -use function Deployer\writeln; class CronTask extends TaskBase implements ConfigurableTaskInterface { @@ -27,14 +23,14 @@ protected function getIncrementalNamePrefix(): string public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { - task('deploy:cron', [ + $task = task('deploy:cron', [ 'deploy:cron:render', 'deploy:cron:sync', ]); before('deploy:symlink', 'deploy:cron'); - return null; + return $task; } public function supports(TaskConfigurationInterface $config): bool diff --git a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php index faf551e..1091126 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxManageVHostTask.php @@ -2,11 +2,10 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; -use Hypernode\DeployConfiguration\Configuration; use Hypernode\DeployConfiguration\PlatformConfiguration\NginxConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; @@ -29,10 +28,10 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { - task('deploy:nginx:manage_vhost', function () { + $task = task('deploy:nginx:manage_vhost', function () { run('hypernode-manage-vhosts {{domain}} --webroot {{current_path}}/{{public_folder}} --no'); }); - return null; + return $task; } } diff --git a/src/Deployer/Task/PlatformConfiguration/NginxTask.php b/src/Deployer/Task/PlatformConfiguration/NginxTask.php index 67262c4..1280130 100644 --- a/src/Deployer/Task/PlatformConfiguration/NginxTask.php +++ b/src/Deployer/Task/PlatformConfiguration/NginxTask.php @@ -2,9 +2,9 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\PlatformConfiguration\NginxConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; @@ -35,7 +35,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta return '/tmp/nginx-config-' . get('domain'); }); - task('deploy:nginx', [ + $task = task('deploy:nginx', [ 'deploy:nginx:prepare', 'deploy:nginx:upload', 'deploy:nginx:sync', @@ -49,6 +49,6 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta after('deploy:nginx:prepare', $taskName); } - return null; + return $task; } } diff --git a/src/Deployer/Task/PlatformConfiguration/RedisTask.php b/src/Deployer/Task/PlatformConfiguration/RedisTask.php index 6d07126..e069179 100644 --- a/src/Deployer/Task/PlatformConfiguration/RedisTask.php +++ b/src/Deployer/Task/PlatformConfiguration/RedisTask.php @@ -2,9 +2,9 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\PlatformConfiguration\RedisConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; @@ -30,11 +30,11 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { - task('deploy:redis', [ + $task = task('deploy:redis', [ 'deploy:redis:enable', ]); before('deploy:symlink', self::TASK_NAME); - return null; + return $task; } } diff --git a/src/Deployer/Task/PlatformConfiguration/SupervisorTask.php b/src/Deployer/Task/PlatformConfiguration/SupervisorTask.php index cd154f6..f2aa255 100644 --- a/src/Deployer/Task/PlatformConfiguration/SupervisorTask.php +++ b/src/Deployer/Task/PlatformConfiguration/SupervisorTask.php @@ -2,9 +2,9 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\PlatformConfiguration\SupervisorConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; @@ -35,7 +35,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta return '/tmp/supervisor-config-' . get('domain'); }); - task('deploy:supervisor', [ + $task = task('deploy:supervisor', [ 'deploy:supervisor:prepare', 'deploy:supervisor:upload', 'deploy:supervisor:sync', @@ -47,6 +47,6 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta after('deploy:supervisor:prepare', $taskName); } - return null; + return $task; } } diff --git a/src/Deployer/Task/PlatformConfiguration/VarnishTask.php b/src/Deployer/Task/PlatformConfiguration/VarnishTask.php index 15ea0e3..0a17ab1 100644 --- a/src/Deployer/Task/PlatformConfiguration/VarnishTask.php +++ b/src/Deployer/Task/PlatformConfiguration/VarnishTask.php @@ -2,9 +2,9 @@ namespace Hypernode\Deploy\Deployer\Task\PlatformConfiguration; -use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Deployer\Task\Task; use Hypernode\Deploy\Deployer\Task\ConfigurableTaskInterface; +use Hypernode\Deploy\Deployer\Task\IncrementedTaskTrait; use Hypernode\Deploy\Deployer\Task\TaskBase; use Hypernode\DeployConfiguration\PlatformConfiguration\VarnishConfiguration; use Hypernode\DeployConfiguration\TaskConfigurationInterface; @@ -31,7 +31,7 @@ public function supports(TaskConfigurationInterface $config): bool public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { - task('deploy:varnish', [ + $task = task('deploy:varnish', [ 'deploy:varnish:enable', 'deploy:varnish:prepare', 'deploy:varnish:upload', @@ -46,6 +46,6 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta after('deploy:varnish:prepare', $taskName); } - return null; + return $task; } } From 03aa8ac609e1887e126614dc11679c77a209b30b Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 13:20:09 +0200 Subject: [PATCH 128/210] ci/test/run-general: Fix docker-compose installation The pypi version of docker-compose is very old and becomes less likely to be compatible with Docker as time passes. --- ci/test/run-general.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index b293098..7cb8dd6 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -46,7 +46,8 @@ function end_task() { # Install docker-compose if it's not installed if ! [ -x "$(command -v docker-compose)" ]; then - pip install docker-compose + curl -sSL https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose fi # Clear up env From f0cbdf8aeff738cfc6c1a5391c657907fe523674 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 13:27:18 +0200 Subject: [PATCH 129/210] DeployRunner: Fix null error for task config stage selection --- src/DeployRunner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 454949a..2ca5e48 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -187,7 +187,7 @@ private function configureDeployerTask(Task $deployerTask, TaskConfigurationInte $roles = $taskConfig instanceof ServerRoleConfigurableInterface ? $taskConfig->getServerRoles() : []; - $stage = $taskConfig instanceof StageConfigurableInterface + $stage = $taskConfig instanceof StageConfigurableInterface && $taskConfig->getStage() ? $taskConfig->getStage()->getName() : null; From 569d390e5e581250ef458f411eaf38c516f29a05 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 14:32:04 +0200 Subject: [PATCH 130/210] DeployRunner: Don't check for hosts with no roles --- src/DeployRunner.php | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 2ca5e48..9307eb0 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -25,7 +25,6 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Throwable; -use Webmozart\Assert\Assert; use function Deployer\host; use function Deployer\localhost; @@ -53,10 +52,6 @@ class DeployRunner private array $deployedHostnames = []; private string $deployedStage = ''; - /** - * @var Host[] - */ - private array $configuredHosts = []; public function __construct( TaskFactory $taskFactory, @@ -175,15 +170,6 @@ private function initializeConfigurableTask(ConfigurableTaskInterface $task, Con private function configureDeployerTask(Task $deployerTask, TaskConfigurationInterface $taskConfig): void { - $rolesConfigured = false; - foreach ($this->configuredHosts as $host) { - $roles = $host->get('roles', []); - if ($roles) { - $rolesConfigured = true; - break; - } - } - $roles = $taskConfig instanceof ServerRoleConfigurableInterface ? $taskConfig->getServerRoles() : []; @@ -192,15 +178,6 @@ private function configureDeployerTask(Task $deployerTask, TaskConfigurationInte : null; if ($roles) { - if (!$rolesConfigured) { - throw new InvalidConfigurationException( - sprintf( - 'No roles configured for task %s, skipping role selection', - get_class($taskConfig) - ) - ); - } - if ($stage) { $deployerTask->select( sprintf( @@ -286,9 +263,6 @@ private function configureStageServer( ); $host->set($key, $value); } - - Assert::isInstanceOf($host, Host::class); - $this->configuredHosts[] = $host; } private function maybeConfigureBrancherServer(Server $server, bool $reuseBrancher): void From d671460dad5594ecd850e8016a4d591fba229009 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 15:40:36 +0200 Subject: [PATCH 131/210] composer: Change license to MIT --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 550ae36..0efc16a 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "hypernode/deploy", "description": "Hypernode Deploy", "type": "application", - "license": "proprietary", + "license": "MIT", "bin": [ "bin/hypernode-deploy.php", "bin/hypernode-deploy" From f0e1ad3b97e6ef4dd2819f7c979f557c71475cab Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 1 Oct 2024 15:41:42 +0200 Subject: [PATCH 132/210] composer: Update hypernode/deploy-configuration to 3.2.1 --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 12868d8..05f4a15 100644 --- a/composer.lock +++ b/composer.lock @@ -828,16 +828,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "0caa36f837353bb5bdb527b092ffcdf87acf6eba" + "reference": "6eddfb953f36cef655703d722928a5be97aaafe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/0caa36f837353bb5bdb527b092ffcdf87acf6eba", - "reference": "0caa36f837353bb5bdb527b092ffcdf87acf6eba", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/6eddfb953f36cef655703d722928a5be97aaafe3", + "reference": "6eddfb953f36cef655703d722928a5be97aaafe3", "shasum": "" }, "require": { @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.2.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.2.1" }, - "time": "2024-03-05T15:25:53+00:00" + "time": "2024-10-01T13:24:26+00:00" }, { "name": "justinrainbow/json-schema", From 1f4b730afa94ad881d4edb042c13bb6ddc302475 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 2 Oct 2024 12:23:02 +0200 Subject: [PATCH 133/210] composer: Update deployer to 7.4.0 --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 0efc16a..d9b9feb 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2", - "deployer/deployer": "dev-master#5c62c45 as v7.3.3", + "deployer/deployer": "dev-master#a3bab59 as v7.4.0", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.4", diff --git a/composer.lock b/composer.lock index 05f4a15..199513b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6edc3724a5f78348140ef75de75a3141", + "content-hash": "a0ee2f27bcd1e60886d23d064882ab6d", "packages": [ { "name": "clue/stream-filter", @@ -78,12 +78,12 @@ "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "5c62c45" + "reference": "a3bab59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/5c62c45", - "reference": "5c62c45", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/a3bab59", + "reference": "a3bab59", "shasum": "" }, "require": { @@ -143,7 +143,7 @@ "type": "github" } ], - "time": "2024-02-26T13:30:43+00:00" + "time": "2024-09-17T08:54:36+00:00" }, { "name": "doctrine/annotations", @@ -7564,8 +7564,8 @@ { "package": "deployer/deployer", "version": "9999999-dev", - "alias": "v7.3.3", - "alias_normalized": "7.3.3.0" + "alias": "v7.4.0", + "alias_normalized": "7.4.0.0" } ], "minimum-stability": "stable", From 9e2b48afef4c288b088888316c744be859567d08 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 2 Oct 2024 13:05:34 +0200 Subject: [PATCH 134/210] task/upload: Fix deploy:info missing SSH dependency Since deployer 7.4.0, the deploy:info task requires SSH to be configured, so we need to run prepare:ssh before that. --- src/Deployer/Task/Deploy/UploadTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/Deploy/UploadTask.php b/src/Deployer/Task/Deploy/UploadTask.php index f8c31ec..10a57d7 100644 --- a/src/Deployer/Task/Deploy/UploadTask.php +++ b/src/Deployer/Task/Deploy/UploadTask.php @@ -26,8 +26,8 @@ public function configure(Configuration $config): void $this->loader->load('deploy/info.php'); task('deploy:upload', [ - 'deploy:info', 'prepare:ssh', + 'deploy:info', 'deploy:prepare', 'deploy:copy', 'deploy:deploy', From 85add1de387788ae893b911920ac2745bc8d445f Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Wed, 2 Oct 2024 13:43:21 +0200 Subject: [PATCH 135/210] composer: Update hypernode/deploy-configuration to 3.3.0 --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 199513b..41bf47a 100644 --- a/composer.lock +++ b/composer.lock @@ -828,20 +828,20 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "6eddfb953f36cef655703d722928a5be97aaafe3" + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/6eddfb953f36cef655703d722928a5be97aaafe3", - "reference": "6eddfb953f36cef655703d722928a5be97aaafe3", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", "shasum": "" }, "require": { - "deployer/deployer": "^7.0", + "deployer/deployer": "7.0 - 7.4", "psr/log": "^1.0||^2.0||^3.0" }, "conflict": { @@ -864,9 +864,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.2.1" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" }, - "time": "2024-10-01T13:24:26+00:00" + "time": "2024-10-02T11:40:49+00:00" }, { "name": "justinrainbow/json-schema", From aeaef816a56596d00d97c640618d267f51f7ad0a Mon Sep 17 00:00:00 2001 From: Pieter Zandbergen Date: Mon, 4 Nov 2024 14:53:15 +0100 Subject: [PATCH 136/210] feat: Added gettext-base Useful tools (like envsubst) during build steps --- ci/build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index fc18696..2252ed0 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -19,6 +19,7 @@ RUN apt-get update \ gnupg-agent \ gnupg \ software-properties-common \ + gettext-base \ && rm -rf /var/lib/apt/lists/* \ && curl -sSL http://debian.hypernode.com/repo.key | apt-key add - \ && echo "deb http://debian.hypernode.com buster main hypernode" | tee /etc/apt/sources.list.d/hypernode.list \ From 678252223f629e00e453bec8d4a2e1d49013aea7 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 4 Nov 2024 16:06:07 +0100 Subject: [PATCH 137/210] composer: Use deployer fork instead By using our fork instead, we can make use of our proper custom tags, which are full revisions with all the engine code. This problem fixes composer confusion when doing dependency checking for `dev-master`, which then gets confused a little bit because dev-master could have new version requirements, without checking the requirements specifically for the specified git revision. --- README.md | 17 ++++++++++++++ composer.json | 8 ++++++- composer.lock | 62 ++++++++++++++++++++++++++++++--------------------- 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 2b7e696..e942dcd 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,23 @@ If you are looking to see how the internals of the deployment tool work or even This project builds the `hypernode/deploy` container image, which can be found on [quay.io/hypernode/deploy](https://quay.io/hypernode/deploy). +## Updating deployer dependency + +Deployer is an integral part of Hypernode Deploy. +The official packagist distribution (and the git tags) are just phar distributions with all the engine code stripped away. +To properly install Deployer as a dependency, we install a very simple fork, which has git tags based on the engine code. + +Whenever a new Deployer version is released, here's the process: +- Sync the fork [ByteInternet/deployer](https://github.com/ByteInternet/deployer) +- Locate the commit for the release in the master branch. + - Usually this comes down to finding the commit that was pushed most recent to the release tag. +- Clone/update the fork locally. +- Run `git checkout ` +- Run `git tag v` +- Run `git push --tags` + +Finally, to utilize the new fork in Hypernode Deploy, you can simply change the deployer/deployer dependency in the `composer.json` file. + ## Building and running a local image If you don't want to use a pre-built image from https://quay.io/hypernode/deploy or if you are doing development on this project and you want to test out your changes, you can built an image locally and use that. diff --git a/composer.json b/composer.json index d9b9feb..fae8d0e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2", - "deployer/deployer": "dev-master#a3bab59 as v7.4.0", + "deployer/deployer": "v7.4.0", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.4", @@ -50,5 +50,11 @@ "phpro/grumphp-shim": true, "php-http/discovery": true } + }, + "repositories": { + "deployer-fork": { + "type": "vcs", + "url": "https://github.com/ByteInternet/deployer" + } } } diff --git a/composer.lock b/composer.lock index 41bf47a..cc2dc9f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0ee2f27bcd1e60886d23d064882ab6d", + "content-hash": "a8161c1ede390e143f1581d8c15a9753", "packages": [ { "name": "clue/stream-filter", @@ -74,16 +74,16 @@ }, { "name": "deployer/deployer", - "version": "dev-master", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/deployphp/deployer.git", - "reference": "a3bab59" + "url": "https://github.com/ByteInternet/deployer.git", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/a3bab59", - "reference": "a3bab59", + "url": "https://api.github.com/repos/ByteInternet/deployer/zipball/a3bab59d448de84099e52fc5b6c652737a8c2942", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942", "shasum": "" }, "require": { @@ -106,21 +106,39 @@ "slevomat/coding-standard": "^7.0", "squizlabs/php_codesniffer": "^3.5" }, - "default-branch": true, "bin": [ "bin/dep" ], "type": "library", "autoload": { + "psr-4": { + "Deployer\\": "src/" + }, "files": [ "src/Support/helpers.php", "src/functions.php" + ] + }, + "scripts": { + "test": [ + "pest" ], - "psr-4": { - "Deployer\\": "src/" - } + "test:e2e": [ + "pest --config tests/e2e/phpunit-e2e.xml" + ], + "phpcs": [ + "phpcs" + ], + "fix": [ + "phpcbf" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "phpstan:baseline": [ + "@phpstan --generate-baseline tests/phpstan-baseline.neon" + ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -134,16 +152,16 @@ "homepage": "https://deployer.org", "support": { "docs": "https://deployer.org/docs", - "issues": "https://github.com/deployphp/deployer/issues", - "source": "https://github.com/deployphp/deployer" + "source": "https://github.com/deployphp/deployer", + "issues": "https://github.com/deployphp/deployer/issues" }, "funding": [ { - "url": "https://github.com/sponsors/antonmedv", - "type": "github" + "type": "github", + "url": "https://github.com/sponsors/antonmedv" } ], - "time": "2024-09-17T08:54:36+00:00" + "time": "2024-04-17T21:19:58+00:00" }, { "name": "doctrine/annotations", @@ -7560,17 +7578,9 @@ "time": "2015-12-17T08:42:14+00:00" } ], - "aliases": [ - { - "package": "deployer/deployer", - "version": "9999999-dev", - "alias": "v7.4.0", - "alias_normalized": "7.4.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", "stability-flags": { - "deployer/deployer": 20, "roave/security-advisories": 20 }, "prefer-stable": false, @@ -7581,6 +7591,6 @@ "ext-zlib": "*", "composer-runtime-api": "^2" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } From 5e843bf956a2a46efc3eb9c67e011df5644f9f60 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 4 Nov 2024 16:18:50 +0100 Subject: [PATCH 138/210] Revert "ci: Checkout pull request ref instead" This reverts commit 32ef185e9d8d7402e27219636573ae3465ac61c1. --- .github/workflows/test.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ed2843d..30285f0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,8 +12,6 @@ jobs: steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.ref }} - name: Run general testsuite if: ${{ matrix.testsuite == 'general' }} run: MAGENTO_REPO=./magento2 ./runtests.sh general From cd1a702901651dab0efa1cfe4943cbc421ecb76a Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Mon, 23 Dec 2024 09:33:59 +0100 Subject: [PATCH 139/210] use bookworm for hypernode-deploy --- .distrobox/Dockerfile | 2 +- .github/workflows/test.yaml | 2 +- ci/build/Dockerfile | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.distrobox/Dockerfile b/.distrobox/Dockerfile index 83d8aa5..21063b5 100644 --- a/.distrobox/Dockerfile +++ b/.distrobox/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:10 +FROM debian:12 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 30285f0..2e442eb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,6 +1,6 @@ name: Run tests for PR on: - pull_request_target: + pull_request: jobs: integration_test: diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 2252ed0..b5118aa 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:buster +FROM debian:bookworm ARG NODE_VERSION ARG PHP_VERSION @@ -22,9 +22,9 @@ RUN apt-get update \ gettext-base \ && rm -rf /var/lib/apt/lists/* \ && curl -sSL http://debian.hypernode.com/repo.key | apt-key add - \ - && echo "deb http://debian.hypernode.com buster main hypernode" | tee /etc/apt/sources.list.d/hypernode.list \ + && echo "deb http://debian.hypernode.com bookworm main hypernode" | tee /etc/apt/sources.list.d/hypernode.list \ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - \ - && echo "deb http://deb.nodesource.com/node_${NODE_VERSION}.x buster main" | tee /etc/apt/sources.list.d/nodesource.list \ + && echo "deb http://deb.nodesource.com/node_${NODE_VERSION}.x bookworm main" | tee /etc/apt/sources.list.d/nodesource.list \ && echo \ "Package: * \ Pin origin deb.nodesource.com \ From 88e2aa76d77f805c53a5bac75894dbe2305d6820 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Mon, 23 Dec 2024 10:24:04 +0100 Subject: [PATCH 140/210] Revert "ci: Run test workflow on base repository" --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 30285f0..2e442eb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,6 +1,6 @@ name: Run tests for PR on: - pull_request_target: + pull_request: jobs: integration_test: From 77c678533047038665a71101627e4841a9049ed8 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 23 Dec 2024 10:36:51 +0100 Subject: [PATCH 141/210] composer: Remove roave/security-advisories Let's consider it later again, when we have had the chance to update our dependencies properly. --- composer.json | 1 - composer.lock | 636 +------------------------------------------------- 2 files changed, 10 insertions(+), 627 deletions(-) diff --git a/composer.json b/composer.json index fae8d0e..ba2ab62 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,6 @@ "require-dev": { "phpro/grumphp-shim": "^1.13", "phpunit/phpunit": "^8.5", - "roave/security-advisories": "dev-master", "squizlabs/php_codesniffer": "^3.7", "vimeo/psalm": "^4.26" }, diff --git a/composer.lock b/composer.lock index cc2dc9f..1a79ac2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a8161c1ede390e143f1581d8c15a9753", + "content-hash": "380d904dca7d545c8ea98379f77f71d6", "packages": [ { "name": "clue/stream-filter", @@ -4167,16 +4167,16 @@ }, { "name": "twig/twig", - "version": "v2.15.5", + "version": "v2.16.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e" + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", - "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", "shasum": "" }, "require": { @@ -4187,12 +4187,12 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.15-dev" + "dev-master": "2.16-dev" } }, "autoload": { @@ -4231,7 +4231,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.15.5" + "source": "https://github.com/twigphp/Twig/tree/v2.16.1" }, "funding": [ { @@ -4243,7 +4243,7 @@ "type": "tidelift" } ], - "time": "2023-05-03T17:49:41+00:00" + "time": "2024-09-09T17:53:56+00:00" }, { "name": "webmozart/assert", @@ -5968,620 +5968,6 @@ ], "time": "2023-02-27T13:04:50+00:00" }, - { - "name": "roave/security-advisories", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "4e267f401487bcc7edb65cd7b6af218018aa32b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4e267f401487bcc7edb65cd7b6af218018aa32b4", - "reference": "4e267f401487bcc7edb65cd7b6af218018aa32b4", - "shasum": "" - }, - "conflict": { - "3f/pygmentize": "<1.2", - "admidio/admidio": "<4.2.8", - "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", - "aheinze/cockpit": "<=2.2.1", - "akaunting/akaunting": "<2.1.13", - "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<1.5", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amazing/media2click": ">=1,<1.3.3", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<1.0.1", - "amphp/http-client": ">=4,<4.4", - "anchorcms/anchor-cms": "<=0.12.7", - "andreapollastri/cipi": "<=3.1.15", - "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", - "apereo/phpcas": "<1.6", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", - "appwrite/server-ce": "<=1.2.1", - "arc/web": "<3", - "area17/twill": "<1.2.5|>=2,<2.5.3", - "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", - "automad/automad": "<1.8", - "awesome-support/awesome-support": "<=6.0.7", - "aws/aws-sdk-php": ">=3,<3.2.1", - "azuracast/azuracast": "<0.18.3", - "backdrop/backdrop": "<1.24.2", - "badaso/core": "<2.7", - "bagisto/bagisto": "<0.1.5", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "barryvdh/laravel-translation-manager": "<0.6.2", - "barzahlen/barzahlen-php": "<2.0.1", - "baserproject/basercms": "<4.7.5", - "bassjobsen/bootstrap-3-typeahead": ">4.0.2", - "bigfork/silverstripe-form-capture": ">=3,<3.1.1", - "billz/raspap-webgui": "<=2.6.6", - "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", - "bmarshall511/wordpress_zero_spam": "<5.2.13", - "bolt/bolt": "<3.7.2", - "bolt/core": "<=4.2", - "bottelet/flarepoint": "<2.2.1", - "brightlocal/phpwhois": "<=4.2.5", - "brotkrueml/codehighlight": "<2.7", - "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", - "brotkrueml/typo3-matomo-integration": "<1.3.2", - "buddypress/buddypress": "<7.2.1", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "bytefury/crater": "<6.0.2", - "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|= 1.3.7|>=4.1,<4.1.4", - "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", - "cardgate/magento2": "<2.0.33", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "catfan/medoo": "<1.7.5", - "centreon/centreon": "<22.10-beta.1", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "cockpit-hq/cockpit": "<2.4.1", - "codeception/codeception": "<3.1.3|>=4,<4.1.22", - "codeigniter/framework": "<=3.0.6", - "codeigniter4/framework": "<4.3.5", - "codeigniter4/shield": "<1-beta.4|= 1.0.0-beta", - "codiad/codiad": "<=2.8.4", - "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", - "concrete5/concrete5": "<9.2|>= 9.0.0RC1, < 9.1.3", - "concrete5/core": "<8.5.8|>=9,<9.1", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", - "contao/core": ">=2,<3.5.39", - "contao/core-bundle": "<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4|= 4.10.0", - "contao/listing-bundle": ">=4,<4.4.8", - "contao/managed-edition": "<=1.5", - "craftcms/cms": "<=4.4.9|>= 4.0.0-RC1, < 4.4.12|>= 4.0.0-RC1, <= 4.4.5|>= 4.0.0-RC1, <= 4.4.6|>= 4.0.0-RC1, < 4.4.6|>= 4.0.0-RC1, < 4.3.7|>= 4.0.0-RC1, < 4.2.1", - "croogo/croogo": "<3.0.7", - "cuyz/valinor": "<0.12", - "czproject/git-php": "<4.0.3", - "darylldoyle/safe-svg": "<1.9.10", - "datadog/dd-trace": ">=0.30,<0.30.2", - "david-garcia/phpwhois": "<=4.3.1", - "dbrisinajumi/d2files": "<1", - "dcat/laravel-admin": "<=2.1.3-beta", - "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", - "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", - "directmailteam/direct-mail": "<5.2.4", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<17.0.1|= 12.0.5|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": "<2.0.2|= 2.0.2", - "drupal/core": ">=7,<7.96|>=8,<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", - "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", - "dweeves/magmi": "<=0.7.24", - "ecodev/newsletter": "<=4", - "ectouch/ectouch": "<=2.7.2", - "elefant/cms": "<1.3.13", - "elgg/elgg": "<3.3.24|>=4,<4.0.5", - "encore/laravel-admin": "<=1.8.19", - "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.15", - "erusev/parsedown": "<1.7.2", - "ether/logs": "<3.0.4", - "exceedone/exment": "<4.4.3|>=5,<5.0.3", - "exceedone/laravel-admin": "= 3.0.0|<2.2.3", - "ezsystems/demobundle": ">=5.4,<5.4.6.1", - "ezsystems/ez-support-tools": ">=2.2,<2.2.3", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-graphql": ">=1-rc.1,<1.0.13|>=2-beta.1,<2.3.12", - "ezsystems/ezplatform-kernel": "<1.2.5.1|>=1.3,<1.3.26", - "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", - "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<6.13.8.2|>=7,<7.5.30", - "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", - "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1|>=2.5,<2.5.15", - "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", - "facturascripts/facturascripts": "<=2022.8", - "feehi/cms": "<=2.1.1", - "feehi/feehicms": "<=2.1.1", - "fenom/fenom": "<=2.12.1", - "filegator/filegator": "<7.8", - "firebase/php-jwt": "<6", - "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", - "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", - "flarum/core": "<1.7", - "flarum/mentions": "<1.6.3", - "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", - "flarum/tags": "<=0.1-beta.13", - "fluidtypo3/vhs": "<5.1.1", - "fof/byobu": ">=0.3-beta.2,<1.1.7", - "fof/upload": "<1.2.3", - "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<5.11.1", - "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<11", - "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", - "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", - "froala/wysiwyg-editor": "<3.2.7", - "froxlor/froxlor": "<2.1", - "fuel/core": "<1.8.1", - "funadmin/funadmin": "<=3.2", - "gaoming13/wechat-php-sdk": "<=1.10.2", - "genix/cms": "<=1.1.11", - "getgrav/grav": "<1.7.42", - "getkirby/cms": "= 3.8.0|<3.5.8.2|>=3.6,<3.6.6.2|>=3.7,<3.7.5.1", - "getkirby/panel": "<2.5.14", - "getkirby/starterkit": "<=3.7.0.2", - "gilacms/gila": "<=1.11.4", - "globalpayments/php-sdk": "<2", - "google/protobuf": "<3.15", - "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<2.2.1", - "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<6", - "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", - "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", - "harvesthq/chosen": "<1.8.7", - "helloxz/imgurl": "= 2.31|<=2.31", - "hillelcoren/invoice-ninja": "<5.3.35", - "himiklab/yii2-jqgrid-widget": "<1.0.8", - "hjue/justwriting": "<=1", - "hov/jobfair": "<1.0.13|>=2,<2.0.2", - "httpsoft/http-message": "<1.0.12", - "hyn/multi-tenant": ">=5.6,<5.7.2", - "ibexa/admin-ui": ">=4.2,<4.2.3", - "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", - "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", - "ibexa/post-install": "<=1.0.4", - "ibexa/user": ">=4,<4.4.3", - "icecoder/icecoder": "<=8.1", - "idno/known": "<=1.3.1", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", - "impresscms/impresscms": "<=1.4.3", - "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.1", - "in2code/ipandlanguageredirect": "<5.1.2", - "in2code/lux": "<17.6.1|>=18,<24.0.2", - "innologi/typo3-appointments": "<2.0.6", - "intelliants/subrion": "<=4.2.1", - "islandora/islandora": ">=2,<2.4.1", - "ivankristianto/phpwhois": "<=4.3", - "jackalope/jackalope-doctrine-dbal": "<1.7.4", - "james-heinrich/getid3": "<1.9.21", - "jasig/phpcas": "<1.3.3", - "joomla/archive": "<1.1.12|>=2,<2.0.1", - "joomla/filesystem": "<1.6.2|>=2,<2.0.1", - "joomla/filter": "<1.4.4|>=2,<2.0.1", - "joomla/input": ">=2,<2.0.2", - "joomla/session": "<1.3.1", - "joyqi/hyper-down": "<=2.4.27", - "jsdecena/laracom": "<2.0.9", - "jsmitty12/phpwhois": "<5.1", - "kazist/phpwhois": "<=4.2.6", - "kelvinmo/simplexrd": "<3.1.1", - "kevinpapst/kimai2": "<1.16.7", - "khodakhah/nodcms": "<=3", - "kimai/kimai": "<1.1", - "kitodo/presentation": "<3.1.2", - "klaviyo/magento2-extension": ">=1,<3", - "knplabs/knp-snappy": "<1.4.2", - "krayin/laravel-crm": "<1.2.2", - "kreait/firebase-php": ">=3.2,<3.8.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laminas/laminas-diactoros": "<2.18.1|>=2.24,<2.24.2|>=2.25,<2.25.2|= 2.23.0|= 2.22.0|= 2.21.0|= 2.20.0|= 2.19.0", - "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", - "laminas/laminas-http": "<2.14.2", - "laravel/fortify": "<1.11.1", - "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", - "latte/latte": "<2.10.8", - "lavalite/cms": "<=9", - "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", - "league/commonmark": "<0.18.3", - "league/flysystem": "<1.1.4|>=2,<2.1.1", - "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<22.10", - "liftkit/database": "<2.13.2", - "limesurvey/limesurvey": "<3.27.19", - "livehelperchat/livehelperchat": "<=3.91", - "livewire/livewire": ">2.2.4,<2.2.6", - "lms/routes": "<2.1.1", - "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", - "luyadev/yii-helpers": "<1.2.1", - "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", - "magento/magento1ce": "<1.9.4.3", - "magento/magento1ee": ">=1,<1.14.4.3", - "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", - "maikuolan/phpmussel": ">=1,<1.6", - "mantisbt/mantisbt": "<=2.25.5", - "marcwillmann/turn": "<0.3.3", - "matyhtf/framework": "<3.0.6", - "mautic/core": "<4.3|= 2.13.1", - "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", - "mediawiki/matomo": "<2.4.3", - "melisplatform/melis-asset-manager": "<5.0.1", - "melisplatform/melis-cms": "<5.0.1", - "melisplatform/melis-front": "<5.0.1", - "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", - "mgallegos/laravel-jqgrid": "<=1.3", - "microweber/microweber": "<=1.3.4", - "miniorange/miniorange-saml": "<1.4.3", - "mittwald/typo3_forum": "<1.2.1", - "mobiledetect/mobiledetectlib": "<2.8.32", - "modx/revolution": "<= 2.8.3-pl|<2.8", - "mojo42/jirafeau": "<4.4", - "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.2-rc.2|= 3.11", - "mustache/mustache": ">=2,<2.14.1", - "namshi/jose": "<2.2", - "neoan3-apps/template": "<1.1.1", - "neorazorx/facturascripts": "<2022.4", - "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", - "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", - "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", - "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", - "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", - "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nilsteampassnet/teampass": "<3.0.9", - "notrinos/notrinos-erp": "<=0.7", - "noumo/easyii": "<=0.9", - "nukeviet/nukeviet": "<4.5.2", - "nyholm/psr7": "<1.6.1", - "nystudio107/craft-seomatic": "<3.4.12", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": "<1.1.2", - "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", - "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", - "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "open-web-analytics/open-web-analytics": "<1.7.4", - "opencart/opencart": "<=3.0.3.7", - "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.22|>=20,<20.0.19", - "orchid/platform": ">=9,<9.4.4", - "oro/commerce": ">=4.1,<5.0.6", - "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", - "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", - "packbackbooks/lti-1-3-php-library": "<5", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": ">=0,<3", - "pagekit/pagekit": "<=1.0.18", - "paragonie/random_compat": "<2", - "passbolt/passbolt_api": "<2.11", - "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.14", - "pear/crypt_gpg": "<1.6.7", - "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", - "personnummer/personnummer": "<3.0.2", - "phanan/koel": "<5.1.4", - "php-mod/curl": "<2.3.2", - "phpbb/phpbb": ">=3.2,<3.2.10|>=3.3,<3.3.1", - "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", - "phpmailer/phpmailer": "<6.5", - "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<5.2.1", - "phpmyfaq/phpmyfaq": "<=3.1.7", - "phpoffice/phpexcel": "<1.8", - "phpoffice/phpspreadsheet": "<1.16", - "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19", - "phpservermon/phpservermon": "<=3.5.2", - "phpsysinfo/phpsysinfo": "<3.2.5", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "phpxmlrpc/phpxmlrpc": "<4.9.2", - "pimcore/customer-management-framework-bundle": "<3.3.10", - "pimcore/data-hub": "<1.2.4", - "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<10.5.23", - "pixelfed/pixelfed": "<=0.11.4", - "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<4.20.5|>=4.21,<4.21.1|< 4.18.0-ALPHA2|>= 4.0.0-BETA5, < 4.4.2", - "pressbooks/pressbooks": "<5.18", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/blockwishlist": ">=2,<2.1.1", - "prestashop/contactform": ">=1.0.1,<4.3", - "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<8.0.4", - "prestashop/productcomments": "<5.0.2", - "prestashop/ps_emailsubscription": "<2.6.1", - "prestashop/ps_facetedsearch": "<3.4.1", - "prestashop/ps_linklist": "<3.1", - "privatebin/privatebin": "<1.4", - "processwire/processwire": "<=3.0.200", - "propel/propel": ">=2-alpha.1,<=2-alpha.7", - "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<1.7", - "ptrofimov/beanstalk_console": "<1.7.14", - "pusher/pusher-php-server": "<2.2.1", - "pwweb/laravel-core": "<=0.3.6-beta", - "pyrocms/pyrocms": "<=3.9.1", - "rainlab/debugbar-plugin": "<3.1", - "rankmath/seo-by-rank-math": "<=1.0.95", - "react/http": ">=0.7,<1.9", - "really-simple-plugins/complianz-gdpr": "<6.4.2", - "remdex/livehelperchat": "<3.99", - "rmccue/requests": ">=1.6,<1.8", - "robrichards/xmlseclibs": "<3.0.4", - "roots/soil": "<4.1", - "rudloff/alltube": "<3.0.3", - "s-cart/core": "<6.9", - "s-cart/s-cart": "<6.9", - "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "sheng/yiicms": "<=1.2", - "shopware/core": "<=6.4.20", - "shopware/platform": "<=6.4.20", - "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<=5.7.14", - "shopware/storefront": "<=6.4.8.1", - "shopxo/shopxo": "<2.2.6", - "showdoc/showdoc": "<2.10.4", - "silverstripe/admin": "<1.12.7", - "silverstripe/assets": ">=1,<1.11.1", - "silverstripe/cms": "<4.11.3", - "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.12.5", - "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|>=4.1.1,<4.1.2|>=4.2.2,<4.2.3|= 4.0.0-alpha1", - "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", - "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", - "silverstripe/subsites": ">=2,<2.6.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3", - "silverstripe/versioned-admin": ">=1,<1.11.1", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplesamlphp/simplesamlphp-module-openid": "<1", - "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", - "simplito/elliptic-php": "<1.0.6", - "sitegeist/fluid-components": "<3.5", - "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", - "slim/slim": "<2.6", - "smarty/smarty": "<3.1.48|>=4,<4.3.1", - "snipe/snipe-it": "<=6.0.14|>= 6.0.0-RC-1, <= 6.0.0-RC-5", - "socalnick/scn-social-auth": "<1.15.2", - "socialiteproviders/steam": "<1.1", - "spatie/browsershot": "<3.57.4", - "spipu/html2pdf": "<5.2.4", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<22.2.3", - "statamic/cms": "<3.2.39|>=3.3,<3.3.2", - "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.62", - "subrion/cms": "<=4.2.1", - "sukohi/surpass": "<1", - "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", - "sumocoders/framework-user-bundle": "<1.4", - "swag/paypal": "<5.4.4", - "swiftmailer/swiftmailer": ">=4,<5.4.5", - "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", - "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": "<1.10.1", - "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", - "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", - "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", - "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", - "symbiote/silverstripe-seed": "<6.0.3", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfont/process": ">=0", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", - "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", - "symfony/symfony": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", - "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", - "t3/dce": ">=2.2,<2.6.2", - "t3g/svg-sanitizer": "<1.0.3", - "tastyigniter/tastyigniter": "<3.3", - "tcg/voyager": "<=1.4", - "tecnickcom/tcpdf": "<6.2.22", - "terminal42/contao-tablelookupwizard": "<3.3.5", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1-beta.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "thinkcmf/thinkcmf": "<=5.1.7", - "thorsten/phpmyfaq": "<3.2-beta", - "tinymce/tinymce": "<5.10.7|>=6,<6.3.1", - "tinymighty/wiki-seo": "<1.2.2", - "titon/framework": ">=0,<9.9.99", - "tobiasbg/tablepress": "<= 2.0-RC1", - "topthink/framework": "<6.0.14", - "topthink/think": "<=6.1.1", - "topthink/thinkphp": "<=3.2.3", - "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", - "tribalsystems/zenario": "<=9.3.57595", - "truckersmp/phpwhois": "<=4.3.1", - "ttskch/pagination-service-provider": "<1", - "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", - "typo3/cms": "<2.0.5|>=3,<3.0.3|>=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": "<8.7.51|>=9,<9.5.40|>=10,<10.4.36|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", - "typo3/html-sanitizer": ">=1,<1.5|>=2,<2.1.1", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", - "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", - "ua-parser/uap-php": "<3.8", - "unisharp/laravel-filemanager": "<=2.5.1", - "userfrosting/userfrosting": ">=0.3.1,<4.6.3", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "uvdesk/community-skeleton": "<=1.1.1", - "vanilla/safecurl": "<0.9.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "vova07/yii2-fileapi-widget": "<0.1.9", - "vrana/adminer": "<4.8.1", - "wallabag/tcpdf": "<6.2.22", - "wallabag/wallabag": "<2.5.4", - "wanglelecc/laracms": "<=1.0.3", - "web-auth/webauthn-framework": ">=3.3,<3.3.4", - "webbuilders-group/silverstripe-kapost-bridge": "<0.4", - "webcoast/deferred-image-processing": "<1.0.2", - "webklex/laravel-imap": "<5.3", - "webklex/php-imap": "<5.3", - "webpa/webpa": "<3.1.2", - "wikimedia/parsoid": "<0.12.2", - "willdurand/js-translation-bundle": "<2.1.1", - "wintercms/winter": "<1.0.475|>=1.1,<1.1.10|>=1.2,<1.2.1", - "woocommerce/woocommerce": "<6.6", - "wp-cli/wp-cli": "<2.5", - "wp-graphql/wp-graphql": "<0.3.5", - "wpanel/wpanel4-cms": "<=4.3.1", - "wpcloud/wp-stateless": "<3.2", - "wwbn/avideo": "<=12.4", - "xataface/xataface": "<3", - "xpressengine/xpressengine": "<3.0.15", - "yeswiki/yeswiki": "<4.1", - "yetiforce/yetiforce-crm": "<=6.4", - "yidashi/yii2cmf": "<=2", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": "<1.1.27", - "yiisoft/yii2": "<2.0.38", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.43", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<=2.2.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", - "yoast-seo-for-typo3/yoast_seo": "<7.2.3", - "yourls/yourls": "<=1.8.2", - "zendesk/zendesk_api_client_php": "<2.2.11", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": "<1.8.4", - "zendframework/zend-feed": "<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": "<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<=3", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2", - "zoujingli/thinkadmin": "<6.0.22" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" - }, - { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" - } - ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "keywords": [ - "dev" - ], - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", - "type": "tidelift" - } - ], - "time": "2023-06-21T23:04:35+00:00" - }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.2", @@ -7580,9 +6966,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "roave/security-advisories": 20 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { From c548eca605a394db9d1cfd0ab421ec0607217b59 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 19 Dec 2024 10:10:07 +0100 Subject: [PATCH 142/210] Add support for PHP 8.4 for docker image --- .github/workflows/publish.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 84bdcbf..c04eaa0 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -13,6 +13,7 @@ jobs: - "8.1" - "8.2" - "8.3" + - "8.4" node_version: - 12 - 14 From 826793699d37e9e29c269dc412877c31b7c070f5 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Mon, 23 Dec 2024 11:15:16 +0100 Subject: [PATCH 143/210] add php8.4 to code_quality test --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2e442eb..afdf101 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -34,7 +34,7 @@ jobs: code_quality: strategy: matrix: - php_version: [7.4, 8.1, 8.2, 8.3] + php_version: [7.4, 8.1, 8.2, 8.3, 8.4] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy From 161ac2633971bcfa0ba78a73d84dd641fd41f78c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 3 Jan 2025 11:56:51 +0100 Subject: [PATCH 144/210] Include amqp with the hypernode deploy docker image --- ci/build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index b5118aa..b146800 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -55,6 +55,7 @@ RUN apt-get update && \ bc \ && apt install -y --no-install-recommends \ php${PHP_VERSION} \ + php${PHP_VERSION}-amqp \ php${PHP_VERSION}-bcmath \ php${PHP_VERSION}-bz2 \ php${PHP_VERSION}-cli \ From 6c777d09215e3992a20b898cc84a9c5a6e75e5b6 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 13:38:07 +0100 Subject: [PATCH 145/210] Update php-di/php-di to ^7.0 --- composer.json | 2 +- composer.lock | 75 ++++++++++------------------------------------- src/Bootstrap.php | 2 +- 3 files changed, 17 insertions(+), 62 deletions(-) diff --git a/composer.json b/composer.json index ba2ab62..45b9823 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.4", "hypernode/deploy-configuration": "^3.2", - "php-di/php-di": "^6.0", + "php-di/php-di": "^7.0", "psr/log": "^1.0", "symfony/console": "^5.4", "symfony/finder": "^5.4", diff --git a/composer.lock b/composer.lock index 1a79ac2..b90ade5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "380d904dca7d545c8ea98379f77f71d6", + "content-hash": "718a3a48634317cb62c8b864f48694fa", "packages": [ { "name": "clue/stream-filter", @@ -1175,39 +1175,36 @@ }, { "name": "php-di/php-di", - "version": "6.4.0", + "version": "7.0.7", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4" + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/ae0f1b3b03d8b29dff81747063cbfd6276246cc4", - "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", "shasum": "" }, "require": { "laravel/serializable-closure": "^1.0", - "php": ">=7.4.0", + "php": ">=8.0", "php-di/invoker": "^2.0", - "php-di/phpdoc-reader": "^2.0.1", - "psr/container": "^1.0" + "psr/container": "^1.1 || ^2.0" }, "provide": { "psr/container-implementation": "^1.0" }, "require-dev": { - "doctrine/annotations": "~1.10", - "friendsofphp/php-cs-fixer": "^2.4", - "mnapoli/phpunit-easymock": "^1.2", - "ocramius/proxy-manager": "^2.11.2", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^9.5" + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.6" }, "suggest": { - "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", - "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~2.0)" + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "type": "library", "autoload": { @@ -1235,7 +1232,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/6.4.0" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" }, "funding": [ { @@ -1247,49 +1244,7 @@ "type": "tidelift" } ], - "time": "2022-04-09T16:46:38+00:00" - }, - { - "name": "php-di/phpdoc-reader", - "version": "2.2.1", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/PhpDocReader.git", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^8.5|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpDocReader\\": "src/PhpDocReader" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", - "keywords": [ - "phpdoc", - "reflection" - ], - "support": { - "issues": "https://github.com/PHP-DI/PhpDocReader/issues", - "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" - }, - "time": "2020-10-12T12:39:22+00:00" + "time": "2024-07-21T15:55:45+00:00" }, { "name": "php-http/client-common", diff --git a/src/Bootstrap.php b/src/Bootstrap.php index 563bd06..bc1eb9f 100644 --- a/src/Bootstrap.php +++ b/src/Bootstrap.php @@ -55,7 +55,7 @@ private function initContainer(): Container { $builder = new ContainerBuilder(); $builder->useAutowiring(true); - $builder->useAnnotations(true); + $builder->useAttributes(true); $builder->addDefinitions(Di\ConsoleDefinition::getDefinition()); $builder->addDefinitions([ 'version' => $this->getVersion(), From d96cf2f0e61aee6246d5884b0839d59db2029911 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 13:38:52 +0100 Subject: [PATCH 146/210] Fix deprecated warning about vars in strings --- src/DeployRunner.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 9307eb0..da0ddc7 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -181,8 +181,8 @@ private function configureDeployerTask(Task $deployerTask, TaskConfigurationInte if ($stage) { $deployerTask->select( sprintf( - "stage=${stage}&roles=%s", - implode(",stage=${stage}&roles=", $roles) + "stage={$stage}&roles=%s", + implode(",stage={$stage}&roles=", $roles) ) ); } else { From a79fdd77d7e9a3fe29b3409b85c2beba7886f48f Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 13:40:20 +0100 Subject: [PATCH 147/210] Dropping php7.4 to support php-di:^7 --- .github/workflows/publish.yaml | 1 - .github/workflows/test.yaml | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index c04eaa0..75d0d59 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -8,7 +8,6 @@ jobs: strategy: matrix: php_version: - - "7.4" - "8.0" - "8.1" - "8.2" diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index afdf101..2977b88 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.1, 8.2] # 8.3 is disabled for now, since Magento 2 does not support this yet. + php_version: [8.0, 8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -19,12 +19,12 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} - name: Start SSH agent for brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Run brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} run: ./runtests.sh brancher shell: bash env: @@ -34,7 +34,7 @@ jobs: code_quality: strategy: matrix: - php_version: [7.4, 8.1, 8.2, 8.3, 8.4] + php_version: [8.0, 8.1, 8.2, 8.3, 8.4] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy From 32ff2648f660891cbb61ead782a456335af4370e Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 13:45:57 +0100 Subject: [PATCH 148/210] Better support slack notifications --- src/Bootstrap.php | 4 ++++ src/DeployRunner.php | 1 + src/Deployer/Task/After/SlackTask.php | 2 +- src/Deployer/Task/Common/DefaultsTaskGlobal.php | 7 ++++++- src/Stdlib/ReleaseInfo.php | 9 ++++++++- 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Bootstrap.php b/src/Bootstrap.php index 563bd06..a3e1e03 100644 --- a/src/Bootstrap.php +++ b/src/Bootstrap.php @@ -63,6 +63,10 @@ private function initContainer(): Container $container = $builder->build(); + if (!defined('DEPLOYER_VERSION')) { + define("DEPLOYER_VERSION", sprintf("Hypernode Deploy %s", $this->getVersion())); + } + $this->registerTwigLoader($container); return $container; diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 9307eb0..e9de6a1 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -223,6 +223,7 @@ private function configureStageServer( $host->setSshMultiplexing(true); $host->set('roles', $server->getRoles()); $host->set('domain', $stage->getDomain()); + $host->set('stage', $stage->getName()); $host->set('deploy_path', function () { // Ensure directory exists before returning it run('mkdir -p ~/apps/{{domain}}/shared'); diff --git a/src/Deployer/Task/After/SlackTask.php b/src/Deployer/Task/After/SlackTask.php index 1aab66d..f3d62ef 100644 --- a/src/Deployer/Task/After/SlackTask.php +++ b/src/Deployer/Task/After/SlackTask.php @@ -35,7 +35,7 @@ public function supports(TaskConfigurationInterface $config): bool */ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Task { - $this->recipeLoader->load('slack.php'); + $this->recipeLoader->load('../contrib/slack.php'); set('slack_webhook', $config->getWebHook()); set('slack_text', '{{release_message}}'); diff --git a/src/Deployer/Task/Common/DefaultsTaskGlobal.php b/src/Deployer/Task/Common/DefaultsTaskGlobal.php index 202a344..90fb4c3 100644 --- a/src/Deployer/Task/Common/DefaultsTaskGlobal.php +++ b/src/Deployer/Task/Common/DefaultsTaskGlobal.php @@ -42,7 +42,12 @@ public function configure(Configuration $config): void }); set('commit_sha', function () { - return $this->releaseInfo->getCommitSha(); + try { + return $this->releaseInfo->getCommitSha(); + } + catch (\Throwable $e) { + return ''; + } }); if (str_starts_with($config->getPhpVersion(), 'php')) { diff --git a/src/Stdlib/ReleaseInfo.php b/src/Stdlib/ReleaseInfo.php index 3be2fc6..6d60efc 100644 --- a/src/Stdlib/ReleaseInfo.php +++ b/src/Stdlib/ReleaseInfo.php @@ -2,6 +2,7 @@ namespace Hypernode\Deploy\Stdlib; +use Deployer\Exception\RunException; use Hypernode\DeployConfiguration\Stage; use function Deployer\get; @@ -52,7 +53,13 @@ public function getMessage(): string */ private function branchList(): array { - $gitLogOutput = runLocally('git log --merges -n 1'); + $gitLogOutput = ''; + + try { + $gitLogOutput = runLocally('git log --merges -n 1'); + } + catch (RunException $e) { + } if (!preg_match(self::MERGE_PATTERN, $gitLogOutput, $matches)) { output()->write('No merge commit found'); From c4a8224e141669438d855c8270b1bc74f1fe609b Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 13:47:23 +0100 Subject: [PATCH 149/210] Solving linting issues --- src/Deployer/Task/Common/DefaultsTaskGlobal.php | 3 +-- src/Stdlib/ReleaseInfo.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Deployer/Task/Common/DefaultsTaskGlobal.php b/src/Deployer/Task/Common/DefaultsTaskGlobal.php index 90fb4c3..a899762 100644 --- a/src/Deployer/Task/Common/DefaultsTaskGlobal.php +++ b/src/Deployer/Task/Common/DefaultsTaskGlobal.php @@ -44,8 +44,7 @@ public function configure(Configuration $config): void set('commit_sha', function () { try { return $this->releaseInfo->getCommitSha(); - } - catch (\Throwable $e) { + } catch (\Throwable $e) { return ''; } }); diff --git a/src/Stdlib/ReleaseInfo.php b/src/Stdlib/ReleaseInfo.php index 6d60efc..f86750a 100644 --- a/src/Stdlib/ReleaseInfo.php +++ b/src/Stdlib/ReleaseInfo.php @@ -57,8 +57,7 @@ private function branchList(): array try { $gitLogOutput = runLocally('git log --merges -n 1'); - } - catch (RunException $e) { + } catch (RunException $e) { } if (!preg_match(self::MERGE_PATTERN, $gitLogOutput, $matches)) { From 9e1624ed1f1b66d915146cda275cd4e9c5d39b49 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 15:40:56 +0100 Subject: [PATCH 150/210] Wait for reused branche when it's still being created --- src/Brancher/BrancherHypernodeManager.php | 4 ++-- src/DeployRunner.php | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index 3d85f16..b30f08a 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -129,8 +129,8 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 try { $flows = $this->hypernodeClient->logbook->getList($brancherHypernode); $relevantFlows = array_filter($flows, fn(Flow $flow) => $flow->name === 'ensure_app'); - $failedFlows = array_filter($flows, fn(Flow $flow) => $flow->isReverted()); - $completedFlows = array_filter($flows, fn(Flow $flow) => $flow->isComplete()); + $failedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isReverted()); + $completedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isComplete()); if (count($failedFlows) === count($relevantFlows)) { throw new CreateBrancherHypernodeFailedException(); diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 9307eb0..ded16e9 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -290,22 +290,24 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche $data['labels'] = $labels; if ($reuseBrancher && $brancherApp = $this->brancherHypernodeManager->reuseExistingBrancherHypernode($parentApp, $labels)) { $this->log->info(sprintf('Found existing brancher Hypernode, name is %s.', $brancherApp)); - $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); } else { $brancherApp = $this->brancherHypernodeManager->createForHypernode($parentApp, $data); $this->log->info(sprintf('Successfully requested brancher Hypernode, name is %s.', $brancherApp)); - $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); $this->brancherHypernodesRegistered[] = $brancherApp; + } - try { - $this->log->info('Waiting for brancher Hypernode to become available...'); - $this->brancherHypernodeManager->waitForAvailability($brancherApp); - $this->log->info('Brancher Hypernode has become available!'); - } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { + try { + $this->log->info('Waiting for brancher Hypernode to become available...'); + $this->brancherHypernodeManager->waitForAvailability($brancherApp); + $this->log->info('Brancher Hypernode has become available!'); + } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { + if (in_array($brancherApp, $this->brancherHypernodesRegistered)) { $this->brancherHypernodeManager->cancel($brancherApp); - throw $e; } + + throw $e; } + $server->setHostname(sprintf("%s.hypernode.io", $brancherApp)); } } From 30b6d34e42694f2f07391d7e7297f92253b242b3 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Thu, 9 Jan 2025 15:42:47 +0100 Subject: [PATCH 151/210] Add return []; when git log fails --- src/Stdlib/ReleaseInfo.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Stdlib/ReleaseInfo.php b/src/Stdlib/ReleaseInfo.php index f86750a..c819f41 100644 --- a/src/Stdlib/ReleaseInfo.php +++ b/src/Stdlib/ReleaseInfo.php @@ -58,6 +58,7 @@ private function branchList(): array try { $gitLogOutput = runLocally('git log --merges -n 1'); } catch (RunException $e) { + return []; } if (!preg_match(self::MERGE_PATTERN, $gitLogOutput, $matches)) { From 33342aa27a86f5453148d84f1027e011397d1c59 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 15 Jan 2025 14:07:14 +0100 Subject: [PATCH 152/210] Display appropiate branchname based on CI runner --- .../Task/Common/DefaultsTaskGlobal.php | 13 +++- src/Stdlib/ReleaseInfo.php | 6 +- src/Stdlib/TargetFinder.php | 74 +++++++++++++++++++ 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/Stdlib/TargetFinder.php diff --git a/src/Deployer/Task/Common/DefaultsTaskGlobal.php b/src/Deployer/Task/Common/DefaultsTaskGlobal.php index a899762..da36b27 100644 --- a/src/Deployer/Task/Common/DefaultsTaskGlobal.php +++ b/src/Deployer/Task/Common/DefaultsTaskGlobal.php @@ -8,6 +8,7 @@ use Hypernode\Deploy\Stdlib\CpuCoreInfo; use Hypernode\Deploy\Stdlib\ReleaseInfo; use Hypernode\DeployConfiguration\Configuration; +use Hypernode\Deploy\Stdlib\TargetFinder; use function Deployer\set; @@ -23,10 +24,16 @@ class DefaultsTaskGlobal extends TaskBase */ private $releaseInfo; - public function __construct(CpuCoreInfo $cpuInfo, ReleaseInfo $releaseInfo) + /** + * @var TargetFinder + */ + private $targetFinder; + + public function __construct(CpuCoreInfo $cpuInfo, ReleaseInfo $releaseInfo, TargetFinder $targetFinder) { $this->cpuInfo = $cpuInfo; $this->releaseInfo = $releaseInfo; + $this->targetFinder = $targetFinder; } public function configure(Configuration $config): void @@ -41,6 +48,10 @@ public function configure(Configuration $config): void return $this->releaseInfo->getMessage(); }); + set('target', function () { + return $this->targetFinder->getTarget(); + }); + set('commit_sha', function () { try { return $this->releaseInfo->getCommitSha(); diff --git a/src/Stdlib/ReleaseInfo.php b/src/Stdlib/ReleaseInfo.php index c819f41..1970d98 100644 --- a/src/Stdlib/ReleaseInfo.php +++ b/src/Stdlib/ReleaseInfo.php @@ -25,8 +25,8 @@ public function getCommitSha(): string public function getMessage(): string { $body = []; - $body[] = parse('Successful deployment to **{{stage}}**'); - $body[] = parse('Branch: `{{branch}}`'); + $body[] = parse('Successful deployment to *{{stage}}*'); + $body[] = parse('Branch: `{{target}}`'); $body[] = parse('User: `{{user}}`'); $body[] = parse('Commit: `{{commit_sha}}`'); @@ -40,7 +40,7 @@ public function getMessage(): string } $body[] = ''; - $body[] = '**Servers:**'; + $body[] = '*Servers:*'; foreach ($this->getServers() as $server) { $body[] = '- ' . $server; } diff --git a/src/Stdlib/TargetFinder.php b/src/Stdlib/TargetFinder.php new file mode 100644 index 0000000..5f19d50 --- /dev/null +++ b/src/Stdlib/TargetFinder.php @@ -0,0 +1,74 @@ +getBranchFromCI(); + if (!empty($branch)) { + return $branch; + } + + return get('branch', 'HEAD'); + } + + private function getBranchFromCI(): ?string + { + // Check GitHub Actions + if ($githubBranch = getenv('GITHUB_HEAD_REF')) { + return $githubBranch; + } + if ($githubBaseRef = getenv('GITHUB_REF')) { + return $this->parseGithubRef($githubBaseRef); + } + + // Check GitLab CI + if ($gitlabBranch = getenv('CI_COMMIT_REF_NAME')) { + return $gitlabBranch; + } + + // Check Bitbucket Pipelines + if ($bitbucketBranch = getenv('BITBUCKET_BRANCH')) { + return $bitbucketBranch; + } + + // Check Azure Pipelines + if ($azureBranch = getenv('BUILD_SOURCEBRANCH')) { + return $this->parseAzureBranch($azureBranch); + } + + return null; + } + + private function parseGithubRef(string $ref): ?string + { + // Extract branch or tag name from refs/heads/ or refs/tags/ + if (preg_match('#refs/heads/(.+)#', $ref, $matches)) { + return $matches[1]; + } + if (preg_match('#refs/tags/(.+)#', $ref, $matches)) { + return $matches[1]; + } + + return null; + } + + private function parseAzureBranch(string $branch): ?string + { + // Extract branch name from refs/heads/ + if (strpos($branch, 'refs/heads/') === 0) { + return substr($branch, strlen('refs/heads/')); + } + + return $branch; + } +} From 75db12cb6132e3518eb7068d1b17b05fa683d3ec Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Mon, 27 Jan 2025 13:11:29 +0100 Subject: [PATCH 153/210] brancher polling waits for ensure_copied_app --- src/Brancher/BrancherHypernodeManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index b30f08a..cb82ef2 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -128,7 +128,7 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 try { $flows = $this->hypernodeClient->logbook->getList($brancherHypernode); - $relevantFlows = array_filter($flows, fn(Flow $flow) => $flow->name === 'ensure_app'); + $relevantFlows = array_filter($flows, fn(Flow $flow) => in_array($flow->name, ["ensure_app", "ensure_copied_app"], true)); $failedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isReverted()); $completedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isComplete()); From 5f012bfb842f80d9b4a5fd23eb51df10759ed769 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 10 Feb 2025 15:26:38 +0100 Subject: [PATCH 154/210] Add safe directory wildcard to dockerfiles --- ci/build/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index b146800..8620d27 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -128,6 +128,9 @@ RUN rm -rvf \ /var/lib/apt/lists/* \ && apt-get autoremove -y +# Allow hypernode-deploy to be ran in ordinary git repository locations +RUN git config --global --add safe.directory "*" + # Setup default command CMD ["hypernode-deploy"] From aab479d7f979bdcaa9af286c51bf594de8d2a59f Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 12 Feb 2025 15:48:53 +0100 Subject: [PATCH 155/210] Install npm when building docker image --- ci/build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index b146800..bbe5bdf 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -50,6 +50,7 @@ RUN apt-get update && \ make \ libtool \ nodejs \ + npm \ gnupg \ zip \ bc \ From ddcb59acc8cb9c11f5ccbdcc00301736b390d29e Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 19 Feb 2025 13:40:00 +0100 Subject: [PATCH 156/210] Add docker image for :latest-phpX.X-nodeX --- ci/release_semantic_versions.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/release_semantic_versions.sh b/ci/release_semantic_versions.sh index 99c5875..b19aceb 100755 --- a/ci/release_semantic_versions.sh +++ b/ci/release_semantic_versions.sh @@ -40,6 +40,7 @@ if echo "${INPUT_VERSION}" | grep -F "."; then fi tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:$MAJOR_VERSION-$TAG_SPECS" + tag_and_publish "$LOCAL_IMAGE_TAG" "$IMAGE:latest-$TAG_SPECS" fi if [[ "${PHP_VERSION}" == "${LATEST_PHP_VERSION}" ]] && [[ "${NODE_VERSION}" == "${LATEST_NODE_VERSION}" ]]; then From e359c160827bc17e9e7b84d099e9ec9d9831ad8c Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 24 Mar 2025 12:03:52 +0100 Subject: [PATCH 157/210] Don't automatically autoload app vendor autoloader --- bin/hypernode-deploy.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/hypernode-deploy.php b/bin/hypernode-deploy.php index a2e73f7..49545ec 100644 --- a/bin/hypernode-deploy.php +++ b/bin/hypernode-deploy.php @@ -9,17 +9,17 @@ \define('WORKING_DIR', getcwd()); \define('APPLICATION_ROOT', \dirname(__DIR__)); -$customAutoLoadPath = WORKING_DIR . '/vendor/autoload.php'; // Allows to specify a custom autoload path to avoid overriding Hipex deploy packages // when the same packages are used by your application and Hipex Deploy. if (getenv('DEPLOY_AUTOLOAD_PATH') !== false) { $customAutoLoadPath = getenv('DEPLOY_AUTOLOAD_PATH'); -} -if (file_exists($customAutoLoadPath)) { - require_once $customAutoLoadPath; + if (file_exists($customAutoLoadPath)) { + require_once $customAutoLoadPath; + } } + /** @var \Composer\Autoload\ClassLoader $loader */ $loader = require_once APPLICATION_ROOT . '/vendor/autoload.php'; if (!array_key_exists('Deployer\\', $loader->getPrefixesPsr4())) { From 07ec0854c389b3c318be2d89b499aa309286cf64 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 24 Mar 2025 14:00:49 +0100 Subject: [PATCH 158/210] Only install npm through APT when node version is under 20 --- ci/build/Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 8bdb3c5..2be5624 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -50,7 +50,6 @@ RUN apt-get update && \ make \ libtool \ nodejs \ - npm \ gnupg \ zip \ bc \ @@ -82,6 +81,13 @@ RUN apt-get update && \ php${PHP_VERSION}-zip \ && rm -rf /var/lib/apt/lists/* +# Only install npm if node version is less than 20, otherwise it's already installed +RUN if [ "${NODE_VERSION}" -lt 20 ]; then \ + apt-get update \ + && apt-get install -y --no-install-recommends npm \ + && rm -rf /var/lib/apt/lists/*; \ + fi + COPY ./.git /hypernode/.git COPY ./bin /hypernode/bin COPY ./ci /hypernode/ci From 06f559e78cab74334c44e3cea04d2d4dcb393db0 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 24 Mar 2025 14:38:03 +0100 Subject: [PATCH 159/210] Update hypernode/deploy-configuration to 3.4.0 --- composer.json | 2 +- composer.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index ba2ab62..a4e36a9 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.4", - "hypernode/deploy-configuration": "^3.2", + "hypernode/deploy-configuration": "^3.4", "php-di/php-di": "^6.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 1a79ac2..71a8562 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "380d904dca7d545c8ea98379f77f71d6", + "content-hash": "9d18f2970cf2fc0621ceb74307a44705", "packages": [ { "name": "clue/stream-filter", @@ -846,16 +846,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" + "reference": "d999a767c53df06b59d93ada6af106e05af21736" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/d999a767c53df06b59d93ada6af106e05af21736", + "reference": "d999a767c53df06b59d93ada6af106e05af21736", "shasum": "" }, "require": { @@ -882,9 +882,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.4.0" }, - "time": "2024-10-02T11:40:49+00:00" + "time": "2025-03-24T13:35:29+00:00" }, { "name": "justinrainbow/json-schema", @@ -6966,7 +6966,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6975,6 +6975,6 @@ "ext-zlib": "*", "composer-runtime-api": "^2" }, - "platform-dev": {}, - "plugin-api-version": "2.6.0" + "platform-dev": [], + "plugin-api-version": "2.2.0" } From 59da3274255c3690ab229703398914d4e71e443a Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Tue, 1 Apr 2025 17:02:08 +0200 Subject: [PATCH 160/210] Add support for node 22 --- .github/workflows/publish.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 84bdcbf..dce62d5 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -19,12 +19,13 @@ jobs: - 16 - 18 - 20 + - 22 runs-on: ubuntu-latest env: PHP_VERSION: ${{ matrix.php_version }} NODE_VERSION: ${{ matrix.node_version }} LATEST_PHP_VERSION: 8.3 - LATEST_NODE_VERSION: 20 + LATEST_NODE_VERSION: 22 steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 From 68563c93bd6694744950b530a1338de35d66dd3a Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 4 Apr 2025 10:58:10 +0200 Subject: [PATCH 161/210] Update testflow to support PHP 8.3, and use newer Magento version for tests --- .github/workflows/test.yaml | 6 +++--- ci/test/run-general.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2e442eb..d7bc18c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.1, 8.2] # 8.3 is disabled for now, since Magento 2 does not support this yet. + php_version: [8.1, 8.2, 8.3] testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -19,12 +19,12 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} - name: Start SSH agent for brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Run brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.2' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} run: ./runtests.sh brancher shell: bash env: diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index 7cb8dd6..49817fa 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -59,7 +59,7 @@ end_task begin_task "Setting Magento 2" # Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.6-p3 /data/web/magento2 +$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.7-p3 /data/web/magento2 echo "Waiting for MySQL to be available on the Hypernode container" $HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" install_magento From eff7d37a358e03f541cbdeae8350173d6cf27950 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 4 Apr 2025 11:58:18 +0200 Subject: [PATCH 162/210] Temporarily disable brancher in pipeline so we can run a succesful release --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d7bc18c..1ff6231 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: php_version: [8.1, 8.2, 8.3] - testsuite: [general, brancher] + testsuite: [general] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy From 1c2a684fdcdbb2e2f7c9f1d047eff3d3c43b931e Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 4 Apr 2025 12:08:38 +0200 Subject: [PATCH 163/210] Re-enable brancher, set brancher test node version to 22 --- .github/workflows/test.yaml | 2 +- ci/test/run-brancher.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1ff6231..d7bc18c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,7 +7,7 @@ jobs: strategy: matrix: php_version: [8.1, 8.2, 8.3] - testsuite: [general] + testsuite: [general, brancher] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy diff --git a/ci/test/run-brancher.sh b/ci/test/run-brancher.sh index 0a43afa..352dfef 100755 --- a/ci/test/run-brancher.sh +++ b/ci/test/run-brancher.sh @@ -10,7 +10,7 @@ DP="docker run --rm -v /tmp/m2build:/web -e HYPERNODE_API_TOKEN -e SSH_PRIVATE_K # Build Docker image docker build \ -f ci/build/Dockerfile \ - --build-arg NODE_VERSION=16 \ + --build-arg NODE_VERSION=22 \ --build-arg PHP_VERSION="${PHP_VERSION:-8.2}" \ -t hndeploy \ . From 0d8a3e160f6b79e0f5a5e1968f8ab6002088cbce Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 4 Apr 2025 20:11:03 +0200 Subject: [PATCH 164/210] Use gpg keys for APT, optimize APT update, confirm NodeJS installation --- ci/build/Dockerfile | 64 +++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 2be5624..28b54e4 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -5,34 +5,33 @@ ARG PHP_VERSION ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git zip unzip wget \ - && rm -rf /var/lib/apt/lists/* +RUN apt-get update + +RUN apt-get install -y --no-install-recommends \ + git zip unzip wget # Add repositories -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg-agent \ - gnupg \ - software-properties-common \ - gettext-base \ - && rm -rf /var/lib/apt/lists/* \ - && curl -sSL http://debian.hypernode.com/repo.key | apt-key add - \ - && echo "deb http://debian.hypernode.com bookworm main hypernode" | tee /etc/apt/sources.list.d/hypernode.list \ - && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - \ - && echo "deb http://deb.nodesource.com/node_${NODE_VERSION}.x bookworm main" | tee /etc/apt/sources.list.d/nodesource.list \ +RUN apt-get install -y --no-install-recommends \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg-agent \ + gnupg \ + software-properties-common \ + gettext-base + +RUN apt-get clean \ + && curl -fsSL http://debian.hypernode.com/repo.key | gpg --dearmor -o /usr/share/keyrings/hypernode.gpg \ + && echo "deb [signed-by=/usr/share/keyrings/hypernode.gpg] http://debian.hypernode.com bookworm main hypernode" > /etc/apt/sources.list.d/hypernode.list \ && echo \ - "Package: * \ - Pin origin deb.nodesource.com \ - Pin-Priority: 1001" > /etc/apt/preferences.d/nodejs + "Package: * \ + Pin origin debian.hypernode.com \ + Pin-Priority: 1000" > /etc/apt/preferences.d/hypernode + +RUN curl -fsSL https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - # Install dependencies -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ +RUN apt-get install -y --no-install-recommends \ openssh-client \ rsync \ git \ @@ -52,8 +51,10 @@ RUN apt-get update && \ nodejs \ gnupg \ zip \ - bc \ - && apt install -y --no-install-recommends \ + bc + +# Install PHP +RUN apt-get install -y --no-install-recommends \ php${PHP_VERSION} \ php${PHP_VERSION}-amqp \ php${PHP_VERSION}-bcmath \ @@ -78,15 +79,10 @@ RUN apt-get update && \ php${PHP_VERSION}-soap \ php${PHP_VERSION}-tidy \ php${PHP_VERSION}-xml \ - php${PHP_VERSION}-zip \ - && rm -rf /var/lib/apt/lists/* - -# Only install npm if node version is less than 20, otherwise it's already installed -RUN if [ "${NODE_VERSION}" -lt 20 ]; then \ - apt-get update \ - && apt-get install -y --no-install-recommends npm \ - && rm -rf /var/lib/apt/lists/*; \ - fi + php${PHP_VERSION}-zip + +# Confirm NodeJS & NPM are installed +RUN node -v && npm -v COPY ./.git /hypernode/.git COPY ./bin /hypernode/bin From 7c94758821e9e8beddf02e879dd2a2c71ef2412b Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 7 Apr 2025 09:37:14 +0200 Subject: [PATCH 165/210] Drop support for Node 12 and Node 14, as this is no longer supported in the Hypernode Platform --- .github/workflows/publish.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index dce62d5..d0f72f2 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -14,8 +14,6 @@ jobs: - "8.2" - "8.3" node_version: - - 12 - - 14 - 16 - 18 - 20 From 734e1641bed8a2451539a6a856715a0a12b8a9ce Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 11:17:06 +0200 Subject: [PATCH 166/210] Update dependencies psalm and phpunit to support php8.4 --- composer.json | 6 +- composer.lock | 7204 +++++++++-------- psalm.xml | 11 +- .../PlatformConfiguration/CronSyncTask.php | 2 +- 4 files changed, 3930 insertions(+), 3293 deletions(-) diff --git a/composer.json b/composer.json index 45b9823..a991260 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "symfony/http-client": "^5.4", "symfony/process": "^5.4", "twig/twig": "^2.12", + "vimeo/psalm": "^6.0", "webmozart/assert": "^1.11" }, "autoload": { @@ -36,9 +37,8 @@ }, "require-dev": { "phpro/grumphp-shim": "^1.13", - "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.7", - "vimeo/psalm": "^4.26" + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.7" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index b90ade5..ebc726f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,35 +4,40 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "718a3a48634317cb62c8b864f48694fa", + "content-hash": "be2c8cf74f20db668442cbbc0d94622c", "packages": [ { - "name": "clue/stream-filter", - "version": "v1.6.0", + "name": "amphp/amp", + "version": "v3.1.0", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "url": "https://github.com/amphp/amp.git", + "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23.1" }, "type": "library", "autoload": { "files": [ - "src/functions_include.php" + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" ], "psr-4": { - "Clue\\StreamFilter\\": "src/" + "Amp\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -41,163 +46,148 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "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 simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.1.0" }, "funding": [ { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", + "url": "https://github.com/amphp", "type": "github" } ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2025-01-26T16:07:39+00:00" }, { - "name": "deployer/deployer", - "version": "v7.4.0", + "name": "amphp/byte-stream", + "version": "v2.1.2", "source": { "type": "git", - "url": "https://github.com/ByteInternet/deployer.git", - "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/deployer/zipball/a3bab59d448de84099e52fc5b6c652737a8c2942", - "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", "shasum": "" }, "require": { - "ext-json": "*", - "justinrainbow/json-schema": "^5.2", - "php": "^8.0|^7.3", - "psr/http-message": "^1", - "react/http": "^1.5", - "symfony/console": "^5.4.9", - "symfony/polyfill-php80": "^1.22", - "symfony/polyfill-php81": "^1.26", - "symfony/process": "^5", - "symfony/yaml": "^5" + "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": { - "pestphp/pest": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/php-code-coverage": "^9.2", - "phpunit/phpunit": "^9.3", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" }, - "bin": [ - "bin/dep" - ], "type": "library", "autoload": { - "psr-4": { - "Deployer\\": "src/" - }, "files": [ - "src/Support/helpers.php", - "src/functions.php" - ] - }, - "scripts": { - "test": [ - "pest" - ], - "test:e2e": [ - "pest --config tests/e2e/phpunit-e2e.xml" - ], - "phpcs": [ - "phpcs" - ], - "fix": [ - "phpcbf" - ], - "phpstan": [ - "phpstan analyse -c phpstan.neon" + "src/functions.php", + "src/Internal/functions.php" ], - "phpstan:baseline": [ - "@phpstan --generate-baseline tests/phpstan-baseline.neon" - ] + "psr-4": { + "Amp\\ByteStream\\": "src" + } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Anton Medvedev", - "email": "anton@medv.io" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Deployment Tool", - "homepage": "https://deployer.org", + "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": { - "docs": "https://deployer.org/docs", - "source": "https://github.com/deployphp/deployer", - "issues": "https://github.com/deployphp/deployer/issues" + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" }, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/antonmedv" + "url": "https://github.com/amphp", + "type": "github" } ], - "time": "2024-04-17T21:19:58+00:00" + "time": "2025-03-16T17:10:27+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.3", + "name": "amphp/parser", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": ">=7.4" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + "Amp\\Parser\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -206,115 +196,129 @@ ], "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": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", "keywords": [ - "annotations", - "docblock", - "parser" + "async", + "non-blocking", + "parser", + "stream" ], "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" }, - "time": "2023-02-01T09:20:38+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" }, { - "name": "doctrine/deprecations", - "version": "v1.1.1", + "name": "amphp/pipeline", + "version": "v1.2.3", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "url": "https://github.com/amphp/pipeline.git", + "reference": "7b52598c2e9105ebcddf247fc523161581930367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", + "reference": "7b52598c2e9105ebcddf247fc523161581930367", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" }, "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" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Amp\\Pipeline\\": "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/", + "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/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.3" }, - "time": "2023-06-03T09:27:29+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2025-03-16T16:33:53+00:00" }, { - "name": "doctrine/lexer", - "version": "2.1.0", + "name": "amphp/serialization", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "php": ">=7.1" }, "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" + "amphp/php-cs-fixer-config": "dev-master", + "phpunit/phpunit": "^9 || ^8 || ^7" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Amp\\Serialization\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -323,71 +327,62 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Niklas Keller", + "email": "me@kelunik.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", + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "async", + "asynchronous", + "serialization", + "serialize" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/master" }, - "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" + "time": "2020-03-25T21:39:07+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.1", + "name": "amphp/sync", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", "shasum": "" }, "require": { - "php": ">=7.0" + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Sync\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -396,50 +391,66 @@ ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", "keywords": [ - "event-dispatcher", - "event-emitter" + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" ], "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" }, - "time": "2017-07-23T21:35:13+00:00" + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-08-03T19:31:26+00:00" }, { - "name": "fig/http-message-util", - "version": "1.1.5", + "name": "clue/stream-filter", + "version": "v1.6.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message-util.git", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "php": ">=5.3" }, - "suggest": { - "psr/http-message": "The package containing the PSR-7 interfaces" + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Fig\\Http\\Message\\": "src/" + "Clue\\StreamFilter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -448,76 +459,76 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" ], "support": { - "issues": "https://github.com/php-fig/http-message-util/issues", - "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" }, - "time": "2020-11-24T22:02:12+00:00" + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-02-21T13:15:14+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.7.1", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "php": "^7.4 || ^8.0" }, - "provide": { - "psr/http-client-implementation": "1.0" + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", - "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" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -526,104 +537,68 @@ ], "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" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Guzzle is a PHP HTTP client library", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.1" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "url": "https://packagist.com", + "type": "custom" }, { - "url": "https://github.com/Nyholm", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2023-08-27T10:02:06+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.0", + "name": "composer/semver", + "version": "3.4.3", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -632,92 +607,77 @@ ], "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": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" }, { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" }, { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "Guzzle promises library", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "promise" + "semantic", + "semver", + "validation", + "versioning" ], "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.0" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { - "url": "https://github.com/GrahamCampbell", - "type": "github" + "url": "https://packagist.com", + "type": "custom" }, { - "url": "https://github.com/Nyholm", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2023-05-21T13:50:22+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.5.0", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "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/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" + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -726,200 +686,199 @@ ], "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": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "Restarts a process without Xdebug.", "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" + "Xdebug", + "performance" ], "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "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://github.com/GrahamCampbell", - "type": "github" + "url": "https://packagist.com", + "type": "custom" }, { - "url": "https://github.com/Nyholm", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "hypernode/api-client", - "version": "0.4.1", + "name": "deployer/deployer", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" + "url": "https://github.com/ByteInternet/deployer.git", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", + "url": "https://api.github.com/repos/ByteInternet/deployer/zipball/a3bab59d448de84099e52fc5b6c652737a8c2942", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0", - "ext-curl": "*", "ext-json": "*", - "nesbot/carbon": "^2.0", - "php-http/client-common": "^2.5", - "php-http/discovery": "^1.14", - "psr/http-client-implementation": "^1.0", - "symfony/polyfill-php80": "^1.0" + "justinrainbow/json-schema": "^5.2", + "php": "^8.0|^7.3", + "psr/http-message": "^1", + "react/http": "^1.5", + "symfony/console": "^5.4.9", + "symfony/polyfill-php80": "^1.22", + "symfony/polyfill-php81": "^1.26", + "symfony/process": "^5", + "symfony/yaml": "^5" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.9", - "guzzlehttp/guzzle": "^7.4", - "nikic/php-parser": "^4.14", - "phpunit/phpunit": "^9.5" + "pestphp/pest": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/php-code-coverage": "^9.2", + "phpunit/phpunit": "^9.3", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5" }, + "bin": [ + "bin/dep" + ], "type": "library", "autoload": { "psr-4": { - "Hypernode\\Api\\": "src/" - } + "Deployer\\": "src/" + }, + "files": [ + "src/Support/helpers.php", + "src/functions.php" + ] + }, + "scripts": { + "test": [ + "pest" + ], + "test:e2e": [ + "pest --config tests/e2e/phpunit-e2e.xml" + ], + "phpcs": [ + "phpcs" + ], + "fix": [ + "phpcbf" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "phpstan:baseline": [ + "@phpstan --generate-baseline tests/phpstan-baseline.neon" + ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Hypernode" + "name": "Anton Medvedev", + "email": "anton@medv.io" } ], - "description": "Hypernode API Client for PHP", + "description": "Deployment Tool", + "homepage": "https://deployer.org", "support": { - "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" + "docs": "https://deployer.org/docs", + "source": "https://github.com/deployphp/deployer", + "issues": "https://github.com/deployphp/deployer/issues" }, - "time": "2023-04-05T07:29:39+00:00" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/antonmedv" + } + ], + "time": "2024-04-17T21:19:58+00:00" }, { - "name": "hypernode/deploy-configuration", - "version": "3.3.0", + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", "source": { "type": "git", - "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", "shasum": "" }, "require": { - "deployer/deployer": "7.0 - 7.4", - "psr/log": "^1.0||^2.0||^3.0" + "php": ">=5.3.2" }, - "conflict": { - "hipex/deploy-configuration": "*" + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" }, "type": "library", "autoload": { - "files": [ - "src/autoload.php", - "src/functions.php" - ], "psr-4": { - "Hypernode\\DeployConfiguration\\": "src/" + "XdgBaseDir\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "MIT" ], - "description": "Hypernode deploy configuration files", + "description": "implementation of xdg base directory specification for php", "support": { - "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" + "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", + "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" }, - "time": "2024-10-02T11:40:49+00:00" + "time": "2019-12-04T15:06:13+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.2.12", + "name": "doctrine/annotations", + "version": "1.14.3", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "url": "https://github.com/doctrine/annotations.git", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "shasum": "" }, "require": { - "php": ">=5.3.3" + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "vimeo/psalm": "^4.10" }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" }, + "type": "library", "autoload": { "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -928,151 +887,116 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" + "name": "Roman Borschel", + "email": "roman@code-factory.org" }, { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" }, { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ - "json", - "schema" + "annotations", + "docblock", + "parser" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.3" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2023-02-01T09:20:38+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.3.0", + "name": "doctrine/deprecations", + "version": "1.1.5", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" }, "require-dev": { - "nesbot/carbon": "^2.61", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "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" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, + "type": "library", "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "Doctrine\\Deprecations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" - } - ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", - "keywords": [ - "closure", - "laravel", - "serializable" - ], + "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/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2023-01-30T18:31:20+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { - "name": "nesbot/carbon", - "version": "2.67.0", + "name": "doctrine/lexer", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" + "url": "https://github.com/doctrine/lexer.git", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "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" }, - "bin": [ - "bin/carbon" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1081,289 +1005,228 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.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": [ - "date", - "datetime", - "time" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, "funding": [ { - "url": "https://github.com/sponsors/kylekatarnls", - "type": "github" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", "type": "tidelift" } ], - "time": "2023-05-25T22:09:47+00:00" + "time": "2022-12-14T08:49:07+00:00" }, { - "name": "php-di/invoker", - "version": "2.3.3", + "name": "evenement/evenement", + "version": "v3.0.1", "source": { "type": "git", - "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", "shasum": "" }, "require": { - "php": ">=7.3", - "psr/container": "^1.0|^2.0" + "php": ">=7.0" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^6.0" }, "type": "library", "autoload": { - "psr-4": { - "Invoker\\": "src/" + "psr-0": { + "Evenement": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Generic and extensible callable invoker", - "homepage": "https://github.com/PHP-DI/Invoker", + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", "keywords": [ - "callable", - "dependency", - "dependency-injection", - "injection", - "invoke", - "invoker" + "event-dispatcher", + "event-emitter" ], "support": { - "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/master" }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - } - ], - "time": "2021-12-13T09:22:56+00:00" + "time": "2017-07-23T21:35:13+00:00" }, { - "name": "php-di/php-di", - "version": "7.0.7", + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", "source": { "type": "git", - "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", "shasum": "" }, "require": { - "laravel/serializable-closure": "^1.0", - "php": ">=8.0", - "php-di/invoker": "^2.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" + "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": { - "friendsofphp/php-cs-fixer": "^3", - "friendsofphp/proxy-manager-lts": "^1", - "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.6" - }, - "suggest": { - "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + "phpunit/phpunit": "^7.0 || ^8.0" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "DI\\": "src/" + "AdvancedJsonRpc\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "description": "The dependency injection container for humans", - "homepage": "https://php-di.org/", - "keywords": [ - "PSR-11", - "container", - "container-interop", - "dependency injection", - "di", - "ioc", - "psr11" + "ISC" ], - "support": { - "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", - "type": "tidelift" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "time": "2024-07-21T15:55:45+00:00" + "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": "php-http/client-common", - "version": "2.7.0", + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", "source": { "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.17" + "php": ">=7.1" }, "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Http\\Client\\Common\\": "src/" + "LanguageServerProtocol\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "ISC" ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", + "description": "PHP classes for the Language Server Protocol", "keywords": [ - "client", - "common", - "http", - "httplug" + "language", + "microsoft", + "php", + "server" ], "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.0" + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2023-05-17T06:46:59+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { - "name": "php-http/discovery", - "version": "1.19.0", + "name": "fidry/cpu-core-counter", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, + "type": "library", "autoload": { "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] + "Fidry\\CpuCoreCounter\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1371,56 +1234,56 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" } ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", + "description": "Tiny utility to get the number of CPU cores.", "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" + "CPU", + "core" ], "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.0" + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, - "time": "2023-06-19T08:45:36+00:00" + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" }, { - "name": "php-http/httplug", - "version": "2.4.0", + "name": "fig/http-message-util", + "version": "1.1.5", "source": { "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0 || ^2.0" + "php": "^5.3 || ^7.0 || ^8.0" }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-4": { - "Http\\Client\\": "src/" + "Fig\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1429,71 +1292,76 @@ ], "authors": [ { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", "keywords": [ - "client", - "http" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2020-11-24T22:02:12+00:00" }, { - "name": "php-http/message", - "version": "1.16.0", + "name": "guzzlehttp/guzzle", + "version": "7.7.1", "source": { "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", "shasum": "" }, "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { - "php-http/message-factory-implementation": "1.0" + "psr/http-client-implementation": "1.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" + "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/filters.php" + "src/functions_include.php" ], "psr-4": { - "Http\\Message\\": "src/" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1501,54 +1369,105 @@ "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" + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", + "description": "Guzzle is a PHP HTTP client library", "keywords": [ + "client", + "curl", + "framework", "http", - "message", - "psr-7" + "http client", + "psr-18", + "psr-7", + "rest", + "web service" ], "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.7.1" }, - "time": "2023-05-17T06:43:38+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/guzzle", + "type": "tidelift" + } + ], + "time": "2023-08-27T10:02:06+00:00" }, { - "name": "php-http/promise", - "version": "1.1.0", + "name": "guzzlehttp/promises", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "url": "https://github.com/guzzle/promises.git", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.1-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Http\\Promise\\": "src/" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1557,51 +1476,92 @@ ], "authors": [ { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "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": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", + "description": "Guzzle promises library", "keywords": [ "promise" ], "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.0" }, - "time": "2020-07-07T09:29:14+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": "2023-05-21T13:50:22+00:00" }, { - "name": "psr/cache", - "version": "3.0.0", + "name": "guzzlehttp/psr7", + "version": "2.5.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + "url": "https://github.com/guzzle/psr7.git", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { - "php": ">=8.0.0" + "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.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1610,42 +1570,106 @@ ], "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" + "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.5.0" }, - "time": "2021-02-03T23:26:27+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/psr7", + "type": "tidelift" + } + ], + "time": "2023-04-17T16:11:26+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "hypernode/api-client", + "version": "0.4.1", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/ByteInternet/hypernode-api-php.git", + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", "shasum": "" }, "require": { - "php": ">=7.4.0" + "composer-runtime-api": "^2.0", + "ext-curl": "*", + "ext-json": "*", + "nesbot/carbon": "^2.0", + "php-http/client-common": "^2.5", + "php-http/discovery": "^1.14", + "psr/http-client-implementation": "^1.0", + "symfony/polyfill-php80": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^7.4", + "nikic/php-parser": "^4.14", + "phpunit/phpunit": "^9.5" }, "type": "library", "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Hypernode\\Api\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1654,104 +1678,92 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Hypernode" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], + "description": "Hypernode API Client for PHP", "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2023-04-05T07:29:39+00:00" }, { - "name": "psr/http-client", - "version": "1.0.2", + "name": "hypernode/deploy-configuration", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" + "deployer/deployer": "7.0 - 7.4", + "psr/log": "^1.0||^2.0||^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "conflict": { + "hipex/deploy-configuration": "*" }, + "type": "library", "autoload": { + "files": [ + "src/autoload.php", + "src/functions.php" + ], "psr-4": { - "Psr\\Http\\Client\\": "src/" + "Hypernode\\DeployConfiguration\\": "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" + "OSL-3.0" ], + "description": "Hypernode deploy configuration files", "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2024-10-02T11:40:49+00:00" }, { - "name": "psr/http-factory", - "version": "1.0.2", + "name": "justinrainbow/json-schema", + "version": "5.2.12", "source": { "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0 || ^2.0" + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" }, + "bin": [ + "bin/validate-json" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "5.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1760,52 +1772,66 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" + "json", + "schema" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { - "name": "psr/http-message", - "version": "1.1", + "name": "laravel/serializable-closure", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1814,51 +1840,83 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-01-30T18:31:20+00:00" }, { - "name": "psr/log", - "version": "1.1.4", + "name": "nesbot/carbon", + "version": "2.67.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", "shasum": "" }, "require": { - "php": ">=5.3.0" + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" }, + "bin": [ + "bin/carbon" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1867,324 +1925,323 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", "keywords": [ - "log", - "psr", - "psr-3" + "date", + "datetime", + "time" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" }, - "time": "2021-05-03T11:20:27+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2023-05-25T22:09:47+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "netresearch/jsonmapper", + "version": "v4.5.0", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" + "url": "https://github.com/cweiske/jsonmapper.git", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", + "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", "shasum": "" }, "require": { - "php": ">=5.6" + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=7.1" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" + "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", + "squizlabs/php_codesniffer": "~3.5" }, "type": "library", "autoload": { - "files": [ - "src/getallheaders.php" - ] + "psr-0": { + "JsonMapper": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "OSL-3.0" ], "authors": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" } ], - "description": "A polyfill for getallheaders.", + "description": "Map nested JSON structures onto PHP classes", "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "email": "cweiske@cweiske.de", + "issues": "https://github.com/cweiske/jsonmapper/issues", + "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2024-09-08T10:13:13+00:00" }, { - "name": "react/cache", - "version": "v1.2.0", + "name": "nikic/php-parser", + "version": "v5.4.0", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, "autoload": { "psr-4": { - "React\\Cache\\": "src/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Nikita Popov" } ], - "description": "Async, Promise-based cache interface for ReactPHP", + "description": "A PHP parser written in PHP", "keywords": [ - "cache", - "caching", - "promise", - "reactphp" + "parser", + "php" ], "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.2.0" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2022-11-30T15:59:55+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { - "name": "react/dns", - "version": "v1.11.0", + "name": "php-di/invoker", + "version": "2.3.3", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1" + "php": ">=7.3", + "psr/container": "^1.0|^2.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-timer": "^1.9" + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" }, "type": "library", "autoload": { "psr-4": { - "React\\Dns\\": "src/" + "Invoker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async DNS resolver for ReactPHP", + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" - ], + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.11.0" + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/mnapoli", + "type": "github" } ], - "time": "2023-06-02T12:45:26+00:00" + "time": "2021-12-13T09:22:56+00:00" }, { - "name": "react/event-loop", - "version": "v1.4.0", + "name": "php-di/php-di", + "version": "7.0.7", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", "shasum": "" }, "require": { - "php": ">=5.3.0" + "laravel/serializable-closure": "^1.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.6" }, "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "React\\EventLoop\\": "src/" + "DI\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", "keywords": [ - "asynchronous", - "event-loop" + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" ], "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" } ], - "time": "2023-05-05T10:11:24+00:00" + "time": "2024-07-21T15:55:45+00:00" }, { - "name": "react/http", - "version": "v1.9.0", + "name": "php-http/client-common", + "version": "2.7.0", "source": { "type": "git", - "url": "https://github.com/reactphp/http.git", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" + "url": "https://github.com/php-http/client-common.git", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "fig/http-message-util": "^1.1", - "php": ">=5.3.0", - "psr/http-message": "^1.0", - "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.3 || ^1.2.1", - "react/socket": "^1.12", - "react/stream": "^1.2", - "ringcentral/psr7": "^1.2" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" }, "require-dev": { - "clue/http-proxy-react": "^1.8", - "clue/reactphp-ssh-proxy": "^1.4", - "clue/socks-react": "^1.4", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", "autoload": { "psr-4": { - "React\\Http\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2193,80 +2250,73 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "async", "client", - "event-driven", + "common", "http", - "http client", - "http server", - "https", - "psr-7", - "reactphp", - "server", - "streaming" + "httplug" ], "support": { - "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.9.0" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.0" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-04-26T10:29:24+00:00" + "time": "2023-05-17T06:46:59+00:00" }, { - "name": "react/promise", - "version": "v2.10.0", + "name": "php-http/discovery", + "version": "1.19.0", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "url": "https://github.com/php-http/discovery.git", + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, - "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" - } + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2274,75 +2324,668 @@ ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.0" + }, + "time": "2023-06-19T08:45:36+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "promise", - "promises" + "client", + "http" ], "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" }, - "funding": [ + "time": "2023-04-14T15:10:03+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "time": "2023-05-02T15:15:43+00:00" + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.0" + }, + "time": "2023-05-17T06:43:38+00:00" }, { - "name": "react/socket", - "version": "v1.13.0", + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+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.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "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.2" + }, + "time": "2025-04-13T19:20:35+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "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.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "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.1.0" + }, + "time": "2025-02-19T13:28:12+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "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/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.11", - "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" - }, - "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "php": "^7.2 || ^8.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-4": { - "React\\Socket\\": "src" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2351,73 +2994,51 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.13.0" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-06-07T10:28:34+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { - "name": "react/stream", - "version": "v1.3.0", + "name": "psr/log", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "php": ">=5.3.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-4": { - "React\\Stream\\": "src/" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2426,86 +3047,48 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2023-06-16T10:52:11+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { - "name": "ringcentral/psr7", - "version": "1.3.0", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "files": [ - "src/functions_include.php" - ], - "psr-4": { - "RingCentral\\Psr7\\": "src/" - } + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2513,80 +3096,43 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" } ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], + "description": "A polyfill for getallheaders.", "support": { - "source": "https://github.com/ringcentral/psr7/tree/master" + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "time": "2018-05-29T20:21:04+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "symfony/console", - "version": "v5.4.24", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", - "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "React\\Cache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2594,72 +3140,75 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", + "description": "Async, Promise-based cache interface for ReactPHP", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "cache", + "caching", + "promise", + "reactphp" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.24" + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2023-05-26T05:13:16+00:00" + "time": "2022-11-30T15:59:55+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "name": "react/dns", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "url": "https://github.com/reactphp/dns.git", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.0 || ^2.7 || ^1.2.1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } + "require-dev": { + "phpunit/phpunit": "^9.5 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" }, + "type": "library", "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "React\\Dns\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2667,62 +3216,73 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.11.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-06-02T12:45:26+00:00" }, { - "name": "symfony/finder", - "version": "v5.4.21", + "name": "react/event-loop", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + "url": "https://github.com/reactphp/event-loop.git", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "React\\EventLoop\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2730,87 +3290,82 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2023-05-05T10:11:24+00:00" }, { - "name": "symfony/http-client", - "version": "v5.4.24", + "name": "react/http", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" + "url": "https://github.com/reactphp/http.git", + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-client-contracts": "^2.4", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.0|^2|^3" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.4" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "fig/http-message-util": "^1.1", + "php": ">=5.3.0", + "psr/http-message": "^1.0", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.3 || ^1.2.1", + "react/socket": "^1.12", + "react/stream": "^1.2", + "ringcentral/psr7": "^1.2" }, "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", - "php-http/message-factory": "^1.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0" + "clue/http-proxy-react": "^1.8", + "clue/reactphp-ssh-proxy": "^1.4", + "clue/socks-react": "^1.4", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "React\\Http\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2818,71 +3373,79 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", + "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP", "keywords": [ - "http" + "async", + "client", + "event-driven", + "http", + "http client", + "http server", + "https", + "psr-7", + "reactphp", + "server", + "streaming" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.24" + "issues": "https://github.com/reactphp/http/issues", + "source": "https://github.com/reactphp/http/tree/v1.9.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2023-05-07T13:11:28+00:00" + "time": "2023-04-26T10:29:24+00:00" }, { - "name": "symfony/http-client-contracts", - "version": "v2.5.2", + "name": "react/promise", + "version": "v2.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70" + "url": "https://github.com/reactphp/promise.git", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", - "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=5.4.0" }, - "suggest": { - "symfony/http-client-implementation": "" + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" + "React\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2891,69 +3454,76 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "promise", + "promises" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.2" + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v2.10.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-04-12T15:48:08+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { - "name": "symfony/options-resolver", - "version": "v6.3.0", + "name": "react/socket", + "version": "v1.13.0", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "url": "https://github.com/reactphp/socket.git", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.11", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "React\\Socket\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2961,79 +3531,73 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", "keywords": [ - "config", - "configuration", - "options" + "Connection", + "Socket", + "async", + "reactphp", + "stream" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.13.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2023-06-07T10:28:34+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "name": "react/stream", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "url": "https://github.com/reactphp/stream.git", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "React\\Stream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3042,77 +3606,81 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.3.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" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-06-16T10:52:11+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "name": "revolt/event-loop", + "version": "v1.0.7", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "1.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Revolt\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3121,83 +3689,75 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.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.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Christian Lück", + "email": "christian@clue.engineering" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "time": "2022-11-03T14:55:06+00:00" + "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.7" + }, + "time": "2025-01-25T19:27:39+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "name": "ringcentral/psr7", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "url": "https://github.com/ringcentral/psr7.git", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=5.3", + "psr/http-message": "~1.0" }, - "suggest": { - "ext-intl": "For best performance" + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "1.0-dev" } }, "autoload": { "files": [ - "bootstrap.php" + "src/functions_include.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "RingCentral\\Psr7\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3205,159 +3765,121 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", + "description": "PSR-7 message implementation", "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" + "http", + "message", + "stream", + "uri" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/ringcentral/psr7/tree/master" }, - "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": "2022-11-03T14:55:06+00:00" + "time": "2018-05-29T20:21:04+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "name": "sebastian/diff", + "version": "4.0.6", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=7.3" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-master": "4.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "name": "spatie/array-to-xml", + "version": "3.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", "shasum": "" }, "require": { - "php": ">=7.1" + "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": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "Spatie\\ArrayToXml\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3366,77 +3888,90 @@ ], "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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Convert an array to xml", + "homepage": "https://github.com/spatie/array-to-xml", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "array", + "convert", + "xml" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://spatie.be/open-source/support-us", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/spatie", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-12-16T12:45:15+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "name": "symfony/console", + "version": "v5.4.47", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Component\\Console\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3445,24 +3980,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "cli", + "command-line", + "console", + "terminal" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -3478,44 +4013,38 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3523,10 +4052,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -3536,16 +4061,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -3561,44 +4080,37 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "name": "symfony/filesystem", + "version": "v7.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "symfony/process": "^6.4|^7.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Component\\Filesystem\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3607,24 +4119,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/filesystem/tree/v7.2.0" }, "funding": [ { @@ -3640,30 +4146,31 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2024-10-25T15:15:23+00:00" }, { - "name": "symfony/process", - "version": "v5.4.24", + "name": "symfony/finder", + "version": "v5.4.21", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64" + "url": "https://github.com/symfony/finder.git", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/e3c46cc5689c8782944274bb30702106ecbe3b64", - "reference": "e3c46cc5689c8782944274bb30702106ecbe3b64", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3683,10 +4190,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Executes commands in sub-processes", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.24" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { @@ -3702,47 +4209,60 @@ "type": "tidelift" } ], - "time": "2023-05-17T11:26:05+00:00" + "time": "2023-02-16T09:33:00+00:00" }, { - "name": "symfony/service-contracts", - "version": "v2.5.2", + "name": "symfony/http-client", + "version": "v5.4.24", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "url": "https://github.com/symfony/http-client.git", + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-client-contracts": "^2.4", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.0|^2|^3" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.4" }, - "suggest": { - "symfony/service-implementation": "" + "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", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3758,18 +4278,13 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "http" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/http-client/tree/v5.4.24" }, "funding": [ { @@ -3785,50 +4300,42 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-05-07T13:11:28+00:00" }, { - "name": "symfony/string", - "version": "v6.3.0", + "name": "symfony/http-client-contracts", + "version": "v2.5.5", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "48ef1d0a082885877b664332b9427662065a360c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f2e190ee75ff0f5eced645ec0be5c66fac81f51f", - "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/48ef1d0a082885877b664332b9427662065a360c", + "reference": "48ef1d0a082885877b664332b9427662065a360c", "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" + "php": ">=7.2.5" }, - "conflict": { - "symfony/translation-contracts": "<2.5" + "suggest": { + "symfony/http-client-implementation": "" }, - "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } }, - "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Contracts\\HttpClient\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3844,18 +4351,18 @@ "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", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.5" }, "funding": [ { @@ -3871,62 +4378,30 @@ "type": "tidelift" } ], - "time": "2023-03-21T21:06:29+00:00" + "time": "2024-11-28T08:37:04+00:00" }, { - "name": "symfony/translation", + "name": "symfony/options-resolver", "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f72b2cba8f79dd9d536f534f76874b58ad37876f", - "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.13", - "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\Translation\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3946,10 +4421,15 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools to internationalize your application", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" }, "funding": [ { @@ -3965,42 +4445,45 @@ "type": "tidelift" } ], - "time": "2023-05-19T12:46:45+00:00" + "time": "2023-05-12T14:21:09+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.3.0", + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4008,26 +4491,24 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to translation", + "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "compatibility", + "ctype", + "polyfill", + "portable" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -4043,47 +4524,42 @@ "type": "tidelift" } ], - "time": "2023-05-30T17:17:10+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/yaml", - "version": "v5.4.23", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" - }, - "require-dev": { - "symfony/console": "^5.3|^6.0" + "php": ">=7.2" }, "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "ext-intl": "For best performance" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4091,18 +4567,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Loads and dumps YAML files", + "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/yaml/tree/v5.4.23" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -4118,122 +4602,125 @@ "type": "tidelift" } ], - "time": "2023-04-23T19:33:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "twig/twig", - "version": "v2.16.1", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.8" + "php": ">=7.2" }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "2.16-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-0": { - "Twig_": "lib/" - }, + "files": [ + "bootstrap.php" + ], "psr-4": { - "Twig\\": "src/" - } + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", "keywords": [ - "templating" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.16.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, { "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T17:53:56+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" + "php": ">=7.2" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "provide": { + "ext-mbstring": "*" }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Webmozart\\Assert\\": "src/" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4242,63 +4729,75 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Assertions to validate method input/output with nice error messages.", + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", "keywords": [ - "assert", - "check", - "validate" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, { - "name": "amphp/amp", - "version": "v2.6.2", + "name": "symfony/polyfill-php72", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "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" + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ - "lib/functions.php", - "lib/Internal/functions.php" + "bootstrap.php" ], "psr-4": { - "Amp\\": "lib" + "Symfony\\Polyfill\\Php72\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4307,87 +4806,75 @@ ], "authors": [ { - "name": "Daniel Lowrey", - "email": "rdlowrey@php.net" - }, - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Bob Weinand", - "email": "bobwei9@hotmail.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 non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "irc": "irc://irc.freenode.org/amphp", - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.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": "2022-02-20T17:52:18+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "amphp/byte-stream", - "version": "v1.8.1", + "name": "symfony/polyfill-php73", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "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" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { "files": [ - "lib/functions.php" + "bootstrap.php" ], "psr-4": { - "Amp\\ByteStream\\": "lib" - } + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4395,74 +4882,75 @@ ], "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 stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "amp", - "amphp", - "async", - "io", - "non-blocking", - "stream" + "compatibility", + "polyfill", + "portable", + "shim" ], "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" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.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": "2021-03-30T17:13:30+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.5", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "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" + "php": ">=7.2" }, - "type": "composer-plugin", + "type": "library", "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4470,67 +4958,82 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-01-17T14:14:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "composer/pcre", - "version": "3.1.0", + "name": "symfony/polyfill-php81", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.x-dev" + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Composer\\Pcre\\": "src" - } + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4538,69 +5041,67 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-11-17T09:50:14+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "composer/semver", - "version": "3.3.2", + "name": "symfony/process", + "version": "v5.4.47", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "url": "https://github.com/symfony/process.git", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\Semver\\": "src" - } + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4608,78 +5109,74 @@ ], "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": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2024-11-06T11:36:42+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.3", + "name": "symfony/service-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" - } + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4687,105 +5184,85 @@ ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Restarts a process without Xdebug.", + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", "keywords": [ - "Xdebug", - "performance" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "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" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", + "name": "symfony/string", + "version": "v6.4.15", "source": { "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + "url": "https://github.com/symfony/string.git", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "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/instantiator", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", - "shasum": "" + "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" }, - "require": { - "php": "^7.1 || ^8.0" + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" + "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": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4793,635 +5270,788 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "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": [ - "constructor", - "instantiate" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://github.com/fabpot", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-12-30T00:15:36+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", + "name": "symfony/translation", + "version": "v6.4.21", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + "url": "https://github.com/symfony/translation.git", + "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "url": "https://api.github.com/repos/symfony/translation/zipball/bb92ea5588396b319ba43283a5a3087a034cb29c", + "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c", "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": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" + "nikic/php-parser": "^4.18|^5.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/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "AdvancedJsonRpc\\": "lib/" - } + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A more advanced JSONRPC implementation", + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues", - "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1" + "source": "https://github.com/symfony/translation/tree/v6.4.21" }, - "time": "2021-06-11T22:34:44+00:00" + "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": "2025-04-07T19:02:30+00:00" }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.2", + "name": "symfony/translation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842", - "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "php": ">=8.1" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "3.5-dev" } }, "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" - } + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP classes for the Language Server Protocol", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "language", - "microsoft", - "php", - "server" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, - "time": "2022-03-02T22:36:06+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.11.1", + "name": "symfony/yaml", + "version": "v5.4.23", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "symfony/console": "<5.3" }, "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" + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "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": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/symfony/yaml/tree/v5.4.23" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "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-03-08T13:26:56+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { - "name": "netresearch/jsonmapper", - "version": "v4.2.0", + "name": "twig/twig", + "version": "v2.16.1", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956" + "url": "https://github.com/twigphp/Twig.git", + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956", - "reference": "f60565f8c0566a31acf06884cdaa591867ecc956", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", "shasum": "" }, "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.8" }, "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", - "squizlabs/php_codesniffer": "~3.5" + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.16-dev" + } + }, "autoload": { "psr-0": { - "JsonMapper": "src/" + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Map nested JSON structures onto PHP classes", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v2.16.1" }, - "time": "2023-04-09T17:37:40+00:00" + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2024-09-09T17:53:56+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.15.5", + "name": "vimeo/psalm", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e" + "url": "https://github.com/vimeo/psalm.git", + "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e", - "reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/b8e96bb617bf59382113b1b56cef751f648a7dc9", + "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9", "shasum": "" }, "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^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": "*", - "php": ">=7.0" + "felixfbecker/advanced-json-rpc": "^3.1", + "felixfbecker/language-server-protocol": "^1.5.3", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^5.0.0", + "php": "~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" + }, + "provide": { + "psalm/psalm": "self.version" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "amphp/phpunit-util": "^3", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "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", + "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": "^4.4 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-curl": "In order to send data to shepherd", + "ext-igbinary": "^2.0.5 is required, used to serialize caching data" }, "bin": [ - "bin/php-parse" + "psalm", + "psalm-language-server", + "psalm-plugin", + "psalm-refactor", + "psalter" ], - "type": "library", + "type": "project", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-1.x": "1.x-dev", + "dev-2.x": "2.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" } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Psalm\\": "src/Psalm/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Matthew Brown" } ], - "description": "A PHP parser written in PHP", + "description": "A static analysis tool for finding errors in PHP applications", "keywords": [ - "parser", - "php" + "code", + "inspection", + "php", + "static analysis" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5" + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" }, - "time": "2023-05-19T20:20:00+00:00" + "time": "2025-01-26T12:03:19+00:00" }, { - "name": "openlss/lib-array2xml", - "version": "1.0.0", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/nullivex/lib-array2xml.git", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", - "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=5.3.2" + "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-0": { - "LSS": "" + "psr-4": { + "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], "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" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Array2XML conversion library credit to lalit.org", - "homepage": "https://www.nullivex.com", + "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ - "array", - "array conversion", - "xml", - "xml conversion" + "assert", + "check", + "validate" ], "support": { - "issues": "https://github.com/nullivex/lib-array2xml/issues", - "source": "https://github.com/nullivex/lib-array2xml/tree/master" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2019-03-29T20:06:56+00:00" - }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ { - "name": "phar-io/manifest", - "version": "2.0.3", + "name": "doctrine/instantiator", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { - "ext-dom": "*", + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" + "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", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "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" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "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/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/" - ] + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "funding": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" }, { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" } ], - "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" + "time": "2022-12-30T00:23:10+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "myclabs/deep-copy", + "version": "1.13.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } + "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": { - "phpDocumentor\\Reflection\\": "src/" + "DeepCopy\\": "src/DeepCopy/" } }, "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", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, - "time": "2020-06-27T09:03:43+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-04-29T12:36:36+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "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" + "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": "5.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-10-19T17:43:47+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "1.7.2", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "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" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "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": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2023-05-30T18:13:47+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpro/grumphp-shim", @@ -5483,88 +6113,107 @@ "time": "2023-04-27T11:06:59+00:00" }, { - "name": "phpstan/phpdoc-parser", - "version": "1.22.0", + "name": "phpunit/php-code-coverage", + "version": "9.2.32", "source": { "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", - "reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "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": { - "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" + "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", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "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" ], - "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.22.0" + "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" }, - "time": "2023-06-01T12:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" }, { - "name": "phpunit/php-code-coverage", - "version": "7.0.15", + "name": "phpunit/php-file-iterator", + "version": "3.0.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "819f92bba8b001d4363065928088de22f25a3a48" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", - "reference": "819f92bba8b001d4363065928088de22f25a3a48", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -5583,16 +6232,15 @@ "role": "lead" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ - "coverage", - "testing", - "xunit" + "filesystem", + "iterator" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -5600,32 +6248,36 @@ "type": "github" } ], - "time": "2021-07-26T12:20:09+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -5644,15 +6296,14 @@ "role": "lead" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "filesystem", - "iterator" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { @@ -5660,26 +6311,34 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2020-09-28T05:58:55+00:00" }, { "name": "phpunit/php-text-template", - "version": "1.2.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -5703,34 +6362,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" }, { "name": "phpunit/php-timer", - "version": "2.1.3", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5756,7 +6421,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -5764,36 +6429,68 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "4.0.4", + "name": "phpunit/phpunit", + "version": "9.6.23", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" }, - "require-dev": { - "phpunit/phpunit": "^9.0" + "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": "4.0-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -5805,17 +6502,93 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "tokenizer" + "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.23" + }, + "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-05-02T06:40:34+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/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -5823,61 +6596,32 @@ "type": "github" } ], - "abandoned": true, - "time": "2020-08-04T08:28:15+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { - "name": "phpunit/phpunit", - "version": "8.5.33", + "name": "sebastian/code-unit", + "version": "1.0.8", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e", - "reference": "7d1ff0e8c6b35db78ff13e3e05517d7cbf7aa32e", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.2", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.4", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.5", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.5", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" + "php": ">=7.3" }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" + "require-dev": { + "phpunit/phpunit": "^9.3" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -5896,57 +6640,44 @@ "role": "lead" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.33" + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "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-02-27T13:04:50+00:00" + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -5968,7 +6699,7 @@ "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/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -5976,34 +6707,34 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.5", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", - "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -6042,7 +6773,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -6050,33 +6781,33 @@ "type": "github" } ], - "time": "2022-09-14T12:31:48+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { - "name": "sebastian/diff", - "version": "3.0.4", + "name": "sebastian/complexity", + "version": "2.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "php": ">=7.1" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -6091,24 +6822,15 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -6116,27 +6838,27 @@ "type": "github" } ], - "time": "2023-05-07T05:30:20+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -6144,7 +6866,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -6171,7 +6893,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -6179,34 +6901,34 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -6241,14 +6963,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "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/3.1.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -6256,30 +6978,30 @@ "type": "github" } ], - "time": "2022-09-14T06:00:17+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.2", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/de036ec91d55d2a9e0db2ba975b512cdb1c23921", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -6287,7 +7009,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -6312,7 +7034,64 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -6320,34 +7099,34 @@ "type": "github" } ], - "time": "2022-02-10T06:55:38+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -6369,7 +7148,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -6377,32 +7156,32 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -6424,7 +7203,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -6432,32 +7211,32 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -6484,10 +7263,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -6495,29 +7274,32 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6538,8 +7320,7 @@ "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/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -6547,32 +7328,32 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "1.1.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -6595,7 +7376,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -6603,29 +7384,29 @@ "type": "github" } ], - "time": "2020-11-30T07:25:11+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6648,9 +7429,15 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -6711,16 +7498,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -6749,7 +7536,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.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -6757,171 +7544,12 @@ "type": "github" } ], - "time": "2021-07-28T10:34: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-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/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" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6930,6 +7558,6 @@ "ext-zlib": "*", "composer-runtime-api": "^2" }, - "platform-dev": {}, + "platform-dev": [], "plugin-api-version": "2.6.0" } diff --git a/psalm.xml b/psalm.xml index 136b2eb..4961e8f 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,6 +1,6 @@ + + + + + + + + + diff --git a/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php b/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php index 3a09c28..5c608fb 100644 --- a/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php +++ b/src/Deployer/Task/PlatformConfiguration/CronSyncTask.php @@ -51,7 +51,7 @@ public function replaceExistingCronBlocks(string $newCronBlock): string return $newCrontab; } else { writeln("Replacing cron block for {{domain}}"); - return preg_replace('/^' . $beginOld . '$.*^' . $endOld . '$/ms', $newCronBlock, $currentCrontab); + return (string)preg_replace('/^' . $beginOld . '$.*^' . $endOld . '$/ms', $newCronBlock, $currentCrontab); } } From d24f5b7e33e19ebb0c5df47f5035646606574068 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 11:22:34 +0200 Subject: [PATCH 167/210] Escape php 8.0 version in gitlab actions --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2977b88..d145824 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.0, 8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. + php_version: ['8.0', 8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -34,7 +34,7 @@ jobs: code_quality: strategy: matrix: - php_version: [8.0, 8.1, 8.2, 8.3, 8.4] + php_version: ['8.0', 8.1, 8.2, 8.3, 8.4] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy From 0c34fe7cf5de4c5c34c37fac68d58bbdf17a1f48 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 11:26:39 +0200 Subject: [PATCH 168/210] Remove PHP 8.0 in tests --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d145824..4c40f5f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: ['8.0', 8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. + php_version: [8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -34,7 +34,7 @@ jobs: code_quality: strategy: matrix: - php_version: ['8.0', 8.1, 8.2, 8.3, 8.4] + php_version: [8.1, 8.2, 8.3, 8.4] runs-on: ubuntu-latest steps: - name: Checkout hypernode-deploy From 7843b4e545a7ad7515a1d1ccb14f9d328b55f6ff Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 11:32:59 +0200 Subject: [PATCH 169/210] Update integration test magento version to 2.4.8 --- ci/test/run-general.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index 7cb8dd6..53fa5f6 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -59,7 +59,7 @@ end_task begin_task "Setting Magento 2" # Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.6-p3 /data/web/magento2 +$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.8 /data/web/magento2 echo "Waiting for MySQL to be available on the Hypernode container" $HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" install_magento From dcc7d2911359ca6b4b13e3b9f24ef88f619240bb Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 11:39:02 +0200 Subject: [PATCH 170/210] Drop PHP8.1 from integration tests as Magento 2.4.8 dropped support for php 8.1 --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4c40f5f..743bc7a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.1, 8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. + php_version: [8.2, 8.3] # 8.4 is disabled for now, since Magento 2 does not support this yet. testsuite: [general, brancher] runs-on: ubuntu-latest steps: From ba61c17dd77c242cfa89a34d369b72e505de6a8f Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 14:08:40 +0200 Subject: [PATCH 171/210] Move Psalm to dev dependencies --- composer.json | 4 +- composer.lock | 6908 ++++++++++++++++++++++++------------------------- 2 files changed, 3456 insertions(+), 3456 deletions(-) diff --git a/composer.json b/composer.json index a991260..b115f8f 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,6 @@ "symfony/http-client": "^5.4", "symfony/process": "^5.4", "twig/twig": "^2.12", - "vimeo/psalm": "^6.0", "webmozart/assert": "^1.11" }, "autoload": { @@ -38,7 +37,8 @@ "require-dev": { "phpro/grumphp-shim": "^1.13", "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.7" + "squizlabs/php_codesniffer": "^3.7", + "vimeo/psalm": "^6.0" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index ebc726f..66fae29 100644 --- a/composer.lock +++ b/composer.lock @@ -4,40 +4,35 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "be2c8cf74f20db668442cbbc0d94622c", + "content-hash": "fd55e4ece35b5d67fe71fb3059b7bbe1", "packages": [ { - "name": "amphp/amp", - "version": "v3.1.0", + "name": "clue/stream-filter", + "version": "v1.6.0", "source": { "type": "git", - "url": "https://github.com/amphp/amp.git", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" + "url": "https://github.com/clue/stream-filter.git", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", + "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", "shasum": "" }, "require": { - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "php": ">=5.3" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23.1" + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { "files": [ - "src/functions.php", - "src/Future/functions.php", - "src/Internal/functions.php" + "src/functions_include.php" ], "psr-4": { - "Amp\\": "src" + "Clue\\StreamFilter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -46,148 +41,163 @@ ], "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" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "A non-blocking concurrency framework for PHP applications.", - "homepage": "https://amphp.org/amp", + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", "keywords": [ - "async", - "asynchronous", - "awaitable", - "concurrency", - "event", - "event-loop", - "future", - "non-blocking", - "promise" + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" ], "support": { - "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.0" + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.6.0" }, "funding": [ { - "url": "https://github.com/amphp", + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", "type": "github" } ], - "time": "2025-01-26T16:07:39+00:00" + "time": "2022-02-21T13:15:14+00:00" }, { - "name": "amphp/byte-stream", - "version": "v2.1.2", + "name": "deployer/deployer", + "version": "v7.4.0", "source": { "type": "git", - "url": "https://github.com/amphp/byte-stream.git", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" + "url": "https://github.com/ByteInternet/deployer.git", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", - "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "url": "https://api.github.com/repos/ByteInternet/deployer/zipball/a3bab59d448de84099e52fc5b6c652737a8c2942", + "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942", "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" + "ext-json": "*", + "justinrainbow/json-schema": "^5.2", + "php": "^8.0|^7.3", + "psr/http-message": "^1", + "react/http": "^1.5", + "symfony/console": "^5.4.9", + "symfony/polyfill-php80": "^1.22", + "symfony/polyfill-php81": "^1.26", + "symfony/process": "^5", + "symfony/yaml": "^5" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.22.1" + "pestphp/pest": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/php-code-coverage": "^9.2", + "phpunit/phpunit": "^9.3", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5" }, + "bin": [ + "bin/dep" + ], "type": "library", "autoload": { + "psr-4": { + "Deployer\\": "src/" + }, "files": [ - "src/functions.php", - "src/Internal/functions.php" + "src/Support/helpers.php", + "src/functions.php" + ] + }, + "scripts": { + "test": [ + "pest" ], - "psr-4": { - "Amp\\ByteStream\\": "src" - } + "test:e2e": [ + "pest --config tests/e2e/phpunit-e2e.xml" + ], + "phpcs": [ + "phpcs" + ], + "fix": [ + "phpcbf" + ], + "phpstan": [ + "phpstan analyse -c phpstan.neon" + ], + "phpstan:baseline": [ + "@phpstan --generate-baseline tests/phpstan-baseline.neon" + ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Anton Medvedev", + "email": "anton@medv.io" } ], - "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" - ], + "description": "Deployment Tool", + "homepage": "https://deployer.org", "support": { - "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" + "docs": "https://deployer.org/docs", + "source": "https://github.com/deployphp/deployer", + "issues": "https://github.com/deployphp/deployer/issues" }, "funding": [ { - "url": "https://github.com/amphp", - "type": "github" + "type": "github", + "url": "https://github.com/sponsors/antonmedv" } ], - "time": "2025-03-16T17:10:27+00:00" + "time": "2024-04-17T21:19:58+00:00" }, { - "name": "amphp/parser", - "version": "v1.1.1", + "name": "doctrine/annotations", + "version": "1.14.3", "source": { "type": "git", - "url": "https://github.com/amphp/parser.git", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + "url": "https://github.com/doctrine/annotations.git", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", - "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "shasum": "" }, "require": { - "php": ">=7.4" + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.4" + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^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": { - "Amp\\Parser\\": "src" + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -196,129 +206,116 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.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": "A generator parser to make streaming parsers simple.", - "homepage": "https://github.com/amphp/parser", + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ - "async", - "non-blocking", - "parser", - "stream" + "annotations", + "docblock", + "parser" ], "support": { - "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.1" + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.3" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-03-21T19:16:53+00:00" + "time": "2023-02-01T09:20:38+00:00" }, { - "name": "amphp/pipeline", - "version": "v1.2.3", + "name": "doctrine/deprecations", + "version": "1.1.5", "source": { "type": "git", - "url": "https://github.com/amphp/pipeline.git", - "reference": "7b52598c2e9105ebcddf247fc523161581930367" + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", - "reference": "7b52598c2e9105ebcddf247fc523161581930367", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { - "amphp/amp": "^3", - "php": ">=8.1", - "revolt/event-loop": "^1" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.18" + "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": { - "Amp\\Pipeline\\": "src" + "Doctrine\\Deprecations\\": "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" - ], + "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/amphp/pipeline/issues", - "source": "https://github.com/amphp/pipeline/tree/v1.2.3" + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2025-03-16T16:33:53+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { - "name": "amphp/serialization", - "version": "v1.0.0", + "name": "doctrine/lexer", + "version": "2.1.0", "source": { "type": "git", - "url": "https://github.com/amphp/serialization.git", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + "url": "https://github.com/doctrine/lexer.git", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", - "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "shasum": "" }, "require": { - "php": ">=7.1" + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "dev-master", - "phpunit/phpunit": "^9 || ^8 || ^7" + "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": { - "files": [ - "src/functions.php" - ], "psr-4": { - "Amp\\Serialization\\": "src" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -327,62 +324,71 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "Serialization tools for IPC and data storage in PHP.", - "homepage": "https://github.com/amphp/serialization", + "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": [ - "async", - "asynchronous", - "serialization", - "serialize" + "annotations", + "docblock", + "lexer", + "parser", + "php" ], "support": { - "issues": "https://github.com/amphp/serialization/issues", - "source": "https://github.com/amphp/serialization/tree/master" + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.0" }, - "time": "2020-03-25T21:39:07+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%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-14T08:49:07+00:00" }, { - "name": "amphp/sync", - "version": "v2.3.0", + "name": "evenement/evenement", + "version": "v3.0.1", "source": { "type": "git", - "url": "https://github.com/amphp/sync.git", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" + "url": "https://github.com/igorw/evenement.git", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", - "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", + "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/pipeline": "^1", - "amphp/serialization": "^1", - "php": ">=8.1", - "revolt/event-loop": "^1 || ^0.2" + "php": ">=7.0" }, "require-dev": { - "amphp/php-cs-fixer-config": "^2", - "amphp/phpunit-util": "^3", - "phpunit/phpunit": "^9", - "psalm/phar": "5.23" + "phpunit/phpunit": "^6.0" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Amp\\Sync\\": "src" + "psr-0": { + "Evenement": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -391,66 +397,50 @@ ], "authors": [ { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - }, - { - "name": "Stephen Coakley", - "email": "me@stephencoakley.com" + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" } ], - "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", - "homepage": "https://github.com/amphp/sync", + "description": "Événement is a very simple event dispatching library for PHP", "keywords": [ - "async", - "asynchronous", - "mutex", - "semaphore", - "synchronization" + "event-dispatcher", + "event-emitter" ], "support": { - "issues": "https://github.com/amphp/sync/issues", - "source": "https://github.com/amphp/sync/tree/v2.3.0" + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/master" }, - "funding": [ - { - "url": "https://github.com/amphp", - "type": "github" - } - ], - "time": "2024-08-03T19:31:26+00:00" + "time": "2017-07-23T21:35:13+00:00" }, { - "name": "clue/stream-filter", - "version": "v1.6.0", + "name": "fig/http-message-util", + "version": "1.1.5", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "url": "https://github.com/php-fig/http-message-util.git", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", + "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", "shasum": "" }, "require": { - "php": ">=5.3" + "php": "^5.3 || ^7.0 || ^8.0" }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "suggest": { + "psr/http-message": "The package containing the PSR-7 interfaces" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "Clue\\StreamFilter\\": "src/" + "Fig\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -459,76 +449,76 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "issues": "https://github.com/php-fig/http-message-util/issues", + "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2020-11-24T22:02:12+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "guzzlehttp/guzzle", + "version": "7.7.1", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", + "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, - "conflict": { - "phpstan/phpstan": "<1.11.10" + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "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": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Composer\\Pcre\\": "src" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -537,68 +527,104 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "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": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "Guzzle is a PHP HTTP client library", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.7.1" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "url": "https://github.com/composer", + "url": "https://github.com/Nyholm", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", "type": "tidelift" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2023-08-27T10:02:06+00:00" }, { - "name": "composer/semver", - "version": "3.4.3", + "name": "guzzlehttp/promises", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "url": "https://github.com/guzzle/promises.git", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Composer\\Semver\\": "src" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -607,77 +633,92 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "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": "Semver library that offers utilities, version constraint parsing and validation.", + "description": "Guzzle promises library", "keywords": [ - "semantic", - "semver", - "validation", - "versioning" + "promise" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "url": "https://github.com/composer", + "url": "https://github.com/Nyholm", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2023-05-21T13:50:22+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.5", + "name": "guzzlehttp/psr7", + "version": "2.5.0", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "url": "https://github.com/guzzle/psr7.git", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" + "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": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -686,199 +727,200 @@ ], "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": [ + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, { - "url": "https://packagist.com", - "type": "custom" + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" }, { - "url": "https://github.com/composer", + "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.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2023-04-17T16:11:26+00:00" }, { - "name": "deployer/deployer", - "version": "v7.4.0", + "name": "hypernode/api-client", + "version": "0.4.1", "source": { "type": "git", - "url": "https://github.com/ByteInternet/deployer.git", - "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942" + "url": "https://github.com/ByteInternet/hypernode-api-php.git", + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/deployer/zipball/a3bab59d448de84099e52fc5b6c652737a8c2942", - "reference": "a3bab59d448de84099e52fc5b6c652737a8c2942", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", + "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0", + "ext-curl": "*", "ext-json": "*", - "justinrainbow/json-schema": "^5.2", - "php": "^8.0|^7.3", - "psr/http-message": "^1", - "react/http": "^1.5", - "symfony/console": "^5.4.9", - "symfony/polyfill-php80": "^1.22", - "symfony/polyfill-php81": "^1.26", - "symfony/process": "^5", - "symfony/yaml": "^5" + "nesbot/carbon": "^2.0", + "php-http/client-common": "^2.5", + "php-http/discovery": "^1.14", + "psr/http-client-implementation": "^1.0", + "symfony/polyfill-php80": "^1.0" }, "require-dev": { - "pestphp/pest": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/php-code-coverage": "^9.2", - "phpunit/phpunit": "^9.3", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5" + "friendsofphp/php-cs-fixer": "^3.9", + "guzzlehttp/guzzle": "^7.4", + "nikic/php-parser": "^4.14", + "phpunit/phpunit": "^9.5" }, - "bin": [ - "bin/dep" - ], "type": "library", "autoload": { "psr-4": { - "Deployer\\": "src/" - }, - "files": [ - "src/Support/helpers.php", - "src/functions.php" - ] - }, - "scripts": { - "test": [ - "pest" - ], - "test:e2e": [ - "pest --config tests/e2e/phpunit-e2e.xml" - ], - "phpcs": [ - "phpcs" - ], - "fix": [ - "phpcbf" - ], - "phpstan": [ - "phpstan analyse -c phpstan.neon" - ], - "phpstan:baseline": [ - "@phpstan --generate-baseline tests/phpstan-baseline.neon" - ] + "Hypernode\\Api\\": "src/" + } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Anton Medvedev", - "email": "anton@medv.io" + "name": "Hypernode" } ], - "description": "Deployment Tool", - "homepage": "https://deployer.org", + "description": "Hypernode API Client for PHP", "support": { - "docs": "https://deployer.org/docs", - "source": "https://github.com/deployphp/deployer", - "issues": "https://github.com/deployphp/deployer/issues" + "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/antonmedv" - } - ], - "time": "2024-04-17T21:19:58+00:00" + "time": "2023-04-05T07:29:39+00:00" }, { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", + "name": "hypernode/deploy-configuration", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", + "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", "shasum": "" }, "require": { - "php": ">=5.3.2" + "deployer/deployer": "7.0 - 7.4", + "psr/log": "^1.0||^2.0||^3.0" }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + "conflict": { + "hipex/deploy-configuration": "*" }, "type": "library", "autoload": { + "files": [ + "src/autoload.php", + "src/functions.php" + ], "psr-4": { - "XdgBaseDir\\": "src/" + "Hypernode\\DeployConfiguration\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "OSL-3.0" ], - "description": "implementation of xdg base directory specification for php", + "description": "Hypernode deploy configuration files", "support": { - "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues", - "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1" + "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" }, - "time": "2019-12-04T15:06:13+00:00" + "time": "2024-10-02T11:40:49+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.3", + "name": "justinrainbow/json-schema", + "version": "5.2.12", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": ">=5.3.3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" }, + "bin": [ + "bin/validate-json" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", @@ -887,116 +929,151 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" }, { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" }, { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", "keywords": [ - "annotations", - "docblock", - "parser" + "json", + "schema" ], "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2023-02-01T09:20:38+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { - "name": "doctrine/deprecations", - "version": "1.1.5", + "name": "laravel/serializable-closure", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" - }, + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "php": "^7.3|^8.0" }, "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" + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "src" + "Laravel\\SerializableClosure\\": "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/", + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2023-01-30T18:31:20+00:00" }, { - "name": "doctrine/lexer", - "version": "2.1.0", + "name": "nesbot/carbon", + "version": "2.67.0", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", + "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.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" + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" }, + "bin": [ + "bin/carbon" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1005,228 +1082,289 @@ ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" } ], - "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", + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "date", + "datetime", + "time" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2023-05-25T22:09:47+00:00" }, { - "name": "evenement/evenement", - "version": "v3.0.1", + "name": "php-di/invoker", + "version": "2.3.3", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", + "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3", + "psr/container": "^1.0|^2.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "Invoker\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", "keywords": [ - "event-dispatcher", - "event-emitter" + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" ], "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" }, - "time": "2017-07-23T21:35:13+00:00" + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2021-12-13T09:22:56+00:00" }, { - "name": "felixfbecker/advanced-json-rpc", - "version": "v3.2.1", + "name": "php-di/php-di", + "version": "7.0.7", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", - "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", "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" + "laravel/serializable-closure": "^1.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0" + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.6" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "type": "library", "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "AdvancedJsonRpc\\": "lib/" + "DI\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" - ], - "authors": [ - { - "name": "Felix Becker", - "email": "felix.b@outlook.com" - } + "MIT" ], - "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" - }, + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2024-07-21T15:55:45+00:00" + }, { - "name": "felixfbecker/language-server-protocol", - "version": "v1.5.3", + "name": "php-http/client-common", + "version": "2.7.0", "source": { "type": "git", - "url": "https://github.com/felixfbecker/php-language-server-protocol.git", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" + "url": "https://github.com/php-http/client-common.git", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", - "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", + "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/polyfill-php80": "^1.17" }, "require-dev": { - "phpstan/phpstan": "*", - "squizlabs/php_codesniffer": "^3.1", - "vimeo/psalm": "^4.0" + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, + "type": "library", "autoload": { "psr-4": { - "LanguageServerProtocol\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "ISC" + "MIT" ], "authors": [ { - "name": "Felix Becker", - "email": "felix.b@outlook.com" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "PHP classes for the Language Server Protocol", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "language", - "microsoft", - "php", - "server" + "client", + "common", + "http", + "httplug" ], "support": { - "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", - "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.0" }, - "time": "2024-04-30T00:40:11+00:00" + "time": "2023-05-17T06:46:59+00:00" }, { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "name": "php-http/discovery", + "version": "1.19.0", "source": { "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "url": "https://github.com/php-http/discovery.git", + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" }, "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "symfony/phpunit-bridge": "^6.2" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true }, - "type": "library", "autoload": { "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" - } + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1234,56 +1372,56 @@ ], "authors": [ { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Tiny utility to get the number of CPU cores.", + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", "keywords": [ - "CPU", - "core" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" ], "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.19.0" }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2023-06-19T08:45:36+00:00" }, { - "name": "fig/http-message-util", - "version": "1.1.5", + "name": "php-http/httplug", + "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message-util.git", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" + "url": "https://github.com/php-http/httplug.git", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", + "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", + "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0 || ^8.0" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" }, - "suggest": { - "psr/http-message": "The package containing the PSR-7 interfaces" + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, "autoload": { "psr-4": { - "Fig\\Http\\Message\\": "src/" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1292,76 +1430,71 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "client", + "http" ], "support": { - "issues": "https://github.com/php-fig/http-message-util/issues", - "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.0" }, - "time": "2020-11-24T22:02:12+00:00" + "time": "2023-04-14T15:10:03+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "7.7.1", + "name": "php-http/message", + "version": "1.16.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" + "url": "https://github.com/php-http/message.git", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", + "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", "shasum": "" }, "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" }, "provide": { - "psr/http-client-implementation": "1.0" + "php-http/message-factory-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", - "psr/log": "^1.1 || ^2.0 || ^3.0" + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" }, "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, "autoload": { "files": [ - "src/functions_include.php" + "src/filters.php" ], "psr-4": { - "GuzzleHttp\\": "src/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1369,105 +1502,54 @@ "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" + "email": "mark.sagikazar@gmail.com" } ], - "description": "Guzzle is a PHP HTTP client library", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ - "client", - "curl", - "framework", "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" + "message", + "psr-7" ], "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.1" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.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": "2023-08-27T10:02:06+00:00" + "time": "2023-05-17T06:43:38+00:00" }, { - "name": "guzzlehttp/promises", - "version": "2.0.0", + "name": "php-http/promise", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "1.1-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" + "Http\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1476,92 +1558,51 @@ ], "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": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" }, { - "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" } ], - "description": "Guzzle promises library", + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", "keywords": [ "promise" ], "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.0" + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.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": "2023-05-21T13:50:22+00:00" + "time": "2020-07-07T09:29:14+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "2.5.0", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "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.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + "php": ">=8.0.0" }, "type": "library", "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false + "branch-alias": { + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1570,106 +1611,47 @@ ], "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": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "Common interface for caching libraries", "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" + "cache", + "psr", + "psr-6" ], "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/php-fig/cache/tree/3.0.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": "2023-04-17T16:11:26+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "hypernode/api-client", - "version": "0.4.1", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0", - "ext-curl": "*", - "ext-json": "*", - "nesbot/carbon": "^2.0", - "php-http/client-common": "^2.5", - "php-http/discovery": "^1.14", - "psr/http-client-implementation": "^1.0", - "symfony/polyfill-php80": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.9", - "guzzlehttp/guzzle": "^7.4", - "nikic/php-parser": "^4.14", - "phpunit/phpunit": "^9.5" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { - "Hypernode\\Api\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1678,92 +1660,104 @@ ], "authors": [ { - "name": "Hypernode" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Hypernode API Client for PHP", + "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/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2023-04-05T07:29:39+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "hypernode/deploy-configuration", - "version": "3.3.0", + "name": "psr/http-client", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf" + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/caede533b14bb3a658090b0cb73f1304386e9dbf", - "reference": "caede533b14bb3a658090b0cb73f1304386e9dbf", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", "shasum": "" }, "require": { - "deployer/deployer": "7.0 - 7.4", - "psr/log": "^1.0||^2.0||^3.0" - }, - "conflict": { - "hipex/deploy-configuration": "*" + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { - "files": [ - "src/autoload.php", - "src/functions.php" - ], "psr-4": { - "Hypernode\\DeployConfiguration\\": "src/" + "Psr\\Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "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" ], - "description": "Hypernode deploy configuration files", "support": { - "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.3.0" + "source": "https://github.com/php-fig/http-client/tree/1.0.2" }, - "time": "2024-10-02T11:40:49+00:00" + "time": "2023-04-10T20:12:12+00:00" }, { - "name": "justinrainbow/json-schema", - "version": "5.2.12", + "name": "psr/http-factory", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" }, - "bin": [ - "bin/validate-json" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "JsonSchema\\": "src/JsonSchema/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1772,66 +1766,52 @@ ], "authors": [ { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "json", - "schema" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "laravel/serializable-closure", - "version": "v1.3.0", + "name": "psr/http-message", + "version": "1.1", "source": { "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "nesbot/carbon": "^2.61", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Laravel\\SerializableClosure\\": "src/" + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1840,83 +1820,51 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "closure", - "laravel", - "serializable" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2023-01-30T18:31:20+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { - "name": "nesbot/carbon", - "version": "2.67.0", + "name": "psr/log", + "version": "1.1.4", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "php": ">=5.3.0" }, - "bin": [ - "bin/carbon" - ], "type": "library", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1925,323 +1873,324 @@ ], "authors": [ { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "date", - "datetime", - "time" + "log", + "psr", + "psr-3" ], "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "funding": [ - { - "url": "https://github.com/sponsors/kylekatarnls", - "type": "github" - }, - { - "url": "https://opencollective.com/Carbon#sponsor", - "type": "opencollective" - }, - { - "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", - "type": "tidelift" - } - ], - "time": "2023-05-25T22:09:47+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { - "name": "netresearch/jsonmapper", - "version": "v4.5.0", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/cweiske/jsonmapper.git", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5", - "reference": "8e76efb98ee8b6afc54687045e1b8dba55ac76e5", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=7.1" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", - "squizlabs/php_codesniffer": "~3.5" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { - "psr-0": { - "JsonMapper": "src/" - } + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "OSL-3.0" + "MIT" ], "authors": [ { - "name": "Christian Weiske", - "email": "cweiske@cweiske.de", - "homepage": "http://github.com/cweiske/jsonmapper/", - "role": "Developer" + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" } ], - "description": "Map nested JSON structures onto PHP classes", + "description": "A polyfill for getallheaders.", "support": { - "email": "cweiske@cweiske.de", - "issues": "https://github.com/cweiske/jsonmapper/issues", - "source": "https://github.com/cweiske/jsonmapper/tree/v4.5.0" + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" }, - "time": "2024-09-08T10:13:13+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { - "name": "nikic/php-parser", - "version": "v5.4.0", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, - "bin": [ - "bin/php-parse" - ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "React\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "A PHP parser written in PHP", + "description": "Async, Promise-based cache interface for ReactPHP", "keywords": [ - "parser", - "php" + "cache", + "caching", + "promise", + "reactphp" ], "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" }, - "time": "2024-12-30T11:07:19+00:00" + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" }, { - "name": "php-di/invoker", - "version": "2.3.3", + "name": "react/dns", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + "url": "https://github.com/reactphp/dns.git", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", "shasum": "" }, "require": { - "php": ">=7.3", - "psr/container": "^1.0|^2.0" + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.0 || ^2.7 || ^1.2.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.5 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "Invoker\\": "src/" + "React\\Dns\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Generic and extensible callable invoker", - "homepage": "https://github.com/PHP-DI/Invoker", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", "keywords": [ - "callable", - "dependency", - "dependency-injection", - "injection", - "invoke", - "invoker" + "async", + "dns", + "dns-resolver", + "reactphp" ], "support": { - "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.11.0" }, "funding": [ { - "url": "https://github.com/mnapoli", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-12-13T09:22:56+00:00" + "time": "2023-06-02T12:45:26+00:00" }, { - "name": "php-di/php-di", - "version": "7.0.7", + "name": "react/event-loop", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" + "url": "https://github.com/reactphp/event-loop.git", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", - "shasum": "" + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "shasum": "" }, "require": { - "laravel/serializable-closure": "^1.0", - "php": ">=8.0", - "php-di/invoker": "^2.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" + "php": ">=5.3.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "friendsofphp/proxy-manager-lts": "^1", - "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.6" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { - "DI\\": "src/" + "React\\EventLoop\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "The dependency injection container for humans", - "homepage": "https://php-di.org/", + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", "keywords": [ - "PSR-11", - "container", - "container-interop", - "dependency injection", - "di", - "ioc", - "psr11" + "asynchronous", + "event-loop" ], "support": { - "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" }, "funding": [ { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", - "type": "tidelift" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2024-07-21T15:55:45+00:00" + "time": "2023-05-05T10:11:24+00:00" }, { - "name": "php-http/client-common", - "version": "2.7.0", + "name": "react/http", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" + "url": "https://github.com/reactphp/http.git", + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", + "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", - "symfony/polyfill-php80": "^1.17" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "fig/http-message-util": "^1.1", + "php": ">=5.3.0", + "psr/http-message": "^1.0", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.3 || ^1.2.1", + "react/socket": "^1.12", + "react/stream": "^1.2", + "ringcentral/psr7": "^1.2" }, "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + "clue/http-proxy-react": "^1.8", + "clue/reactphp-ssh-proxy": "^1.4", + "clue/socks-react": "^1.4", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "Http\\Client\\Common\\": "src/" + "React\\Http\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2250,73 +2199,80 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", + "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP", "keywords": [ + "async", "client", - "common", + "event-driven", "http", - "httplug" + "http client", + "http server", + "https", + "psr-7", + "reactphp", + "server", + "streaming" ], "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.0" + "issues": "https://github.com/reactphp/http/issues", + "source": "https://github.com/reactphp/http/tree/v1.9.0" }, - "time": "2023-05-17T06:46:59+00:00" + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-04-26T10:29:24+00:00" }, { - "name": "php-http/discovery", - "version": "1.19.0", + "name": "react/promise", + "version": "v2.10.0", "source": { "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" + "url": "https://github.com/reactphp/promise.git", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" + "php": ">=5.4.0" }, "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, + "type": "library", "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] + "React\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2324,814 +2280,75 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" + "promise", + "promises" ], "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.0" + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v2.10.0" }, - "time": "2023-06-19T08:45:36+00:00" - }, - { - "name": "php-http/httplug", - "version": "2.4.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", - "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", - "keywords": [ - "client", - "http" - ], - "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" - }, - "time": "2023-04-14T15:10:03+00:00" - }, - { - "name": "php-http/message", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "shasum": "" - }, - "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" - }, - "type": "library", - "autoload": { - "files": [ - "src/filters.php" - ], - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", - "keywords": [ - "http", - "message", - "psr-7" - ], - "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" - }, - "time": "2023-05-17T06:43:38+00:00" - }, - { - "name": "php-http/promise", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" - }, - "time": "2020-07-07T09:29:14+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.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", - "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.2" - }, - "time": "2025-04-13T19:20:35+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "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.10.0" - }, - "time": "2024-11-09T15:12:26+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "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.1.0" - }, - "time": "2025-02-19T13:28:12+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "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/tree/1.0.2" - }, - "time": "2023-04-10T20:12:12+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" - }, - "time": "2023-04-04T09:50:52+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "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/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } - ], - "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" + ], + "time": "2023-05-02T15:15:43+00:00" }, { - "name": "react/cache", - "version": "v1.2.0", + "name": "react/socket", + "version": "v1.13.0", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + "url": "https://github.com/reactphp/socket.git", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", - "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", "shasum": "" }, "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" + "react/dns": "^1.11", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" }, "type": "library", "autoload": { "psr-4": { - "React\\Cache\\": "src/" + "React\\Socket\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3160,16 +2377,17 @@ "homepage": "https://cboden.dev/" } ], - "description": "Async, Promise-based cache interface for ReactPHP", + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", "keywords": [ - "cache", - "caching", - "promise", - "reactphp" + "Connection", + "Socket", + "async", + "reactphp", + "stream" ], "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.2.0" + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.13.0" }, "funding": [ { @@ -3177,37 +2395,35 @@ "type": "open_collective" } ], - "time": "2022-11-30T15:59:55+00:00" + "time": "2023-06-07T10:28:34+00:00" }, { - "name": "react/dns", - "version": "v1.11.0", + "name": "react/stream", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" + "url": "https://github.com/reactphp/stream.git", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-timer": "^1.9" + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", "autoload": { "psr-4": { - "React\\Dns\\": "src/" + "React\\Stream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3236,16 +2452,20 @@ "homepage": "https://cboden.dev/" } ], - "description": "Async DNS resolver for ReactPHP", + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" ], "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.11.0" + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.3.0" }, "funding": [ { @@ -3253,119 +2473,262 @@ "type": "open_collective" } ], - "time": "2023-06-02T12:45:26+00:00" + "time": "2023-06-16T10:52:11+00:00" }, { - "name": "react/event-loop", - "version": "v1.4.0", + "name": "ringcentral/psr7", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + "url": "https://github.com/ringcentral/psr7.git", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "RingCentral\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "support": { + "source": "https://github.com/ringcentral/psr7/tree/master" + }, + "time": "2018-05-29T20:21:04+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "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/v5.4.47" + }, + "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-11-06T11:30:55+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" - }, - "suggest": { - "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + "php": ">=8.1" }, "type": "library", - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src/" + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, + "autoload": { + "files": [ + "function.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-05-05T10:11:24+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "react/http", - "version": "v1.9.0", + "name": "symfony/finder", + "version": "v5.4.21", "source": { "type": "git", - "url": "https://github.com/reactphp/http.git", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" + "url": "https://github.com/symfony/finder.git", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", + "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "fig/http-message-util": "^1.1", - "php": ">=5.3.0", - "psr/http-message": "^1.0", - "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.3 || ^1.2.1", - "react/socket": "^1.12", - "react/stream": "^1.2", - "ringcentral/psr7": "^1.2" - }, - "require-dev": { - "clue/http-proxy-react": "^1.8", - "clue/reactphp-ssh-proxy": "^1.4", - "clue/socks-react": "^1.4", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { - "React\\Http\\": "src/" - } + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3373,80 +2736,87 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP", - "keywords": [ - "async", - "client", - "event-driven", - "http", - "http client", - "http server", - "https", - "psr-7", - "reactphp", - "server", - "streaming" - ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", "support": { - "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.9.0" + "source": "https://github.com/symfony/finder/tree/v5.4.21" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-04-26T10:29:24+00:00" + "time": "2023-02-16T09:33:00+00:00" }, { - "name": "react/promise", - "version": "v2.10.0", + "name": "symfony/http-client", + "version": "v5.4.24", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "url": "https://github.com/symfony/http-client.git", + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-client-contracts": "^2.4", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.0|^2|^3" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.4" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "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", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "React\\Promise\\": "src/" - } + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3454,75 +2824,71 @@ ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", "keywords": [ - "promise", - "promises" + "http" ], "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "source": "https://github.com/symfony/http-client/tree/v5.4.24" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-05-02T15:15:43+00:00" + "time": "2023-05-07T13:11:28+00:00" }, { - "name": "react/socket", - "version": "v1.13.0", + "name": "symfony/http-client-contracts", + "version": "v2.5.5", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "48ef1d0a082885877b664332b9427662065a360c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/48ef1d0a082885877b664332b9427662065a360c", + "reference": "48ef1d0a082885877b664332b9427662065a360c", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.11", - "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "php": ">=7.2.5" }, - "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "suggest": { + "symfony/http-client-implementation": "" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, "autoload": { "psr-4": { - "React\\Socket\\": "src" + "Symfony\\Contracts\\HttpClient\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3531,74 +2897,69 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.13.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.5" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-06-07T10:28:34+00:00" + "time": "2024-11-28T08:37:04+00:00" }, { - "name": "react/stream", - "version": "v1.3.0", + "name": "symfony/options-resolver", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", + "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src/" - } + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3606,81 +2967,76 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "config", + "configuration", + "options" ], "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" }, "funding": [ { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" + "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-06-16T10:52:11+00:00" + "time": "2023-05-12T14:21:09+00:00" }, { - "name": "revolt/event-loop", - "version": "v1.0.7", + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Revolt\\": "src" + "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3689,74 +3045,74 @@ ], "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": "Gert de Pagter", + "email": "BackEndTea@gmail.com" }, { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Rock-solid event loop for concurrent PHP applications.", + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" + "compatibility", + "ctype", + "polyfill", + "portable" ], "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, - "time": "2025-01-25T19:27:39+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "ringcentral/psr7", - "version": "1.3.0", + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "~4.0" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { "files": [ - "src/functions_include.php" + "bootstrap.php" ], "psr-4": { - "RingCentral\\Psr7\\": "src/" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3765,121 +3121,160 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PSR-7 message implementation", + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", "keywords": [ - "http", - "message", - "stream", - "uri" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/ringcentral/psr7/tree/master" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, - "time": "2018-05-29T20:21:04+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "sebastian/diff", - "version": "4.0.6", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=7.2" }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.0-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ - "src/" + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "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-02T06:30:58+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "spatie/array-to-xml", - "version": "3.4.0", + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/spatie/array-to-xml.git", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "ext-dom": "*", - "php": "^8.0" + "php": ">=7.2" }, - "require-dev": { - "mockery/mockery": "^1.2", - "pestphp/pest": "^1.21", - "spatie/pest-plugin-snapshots": "^1.1" + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Spatie\\ArrayToXml\\": "src" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3888,91 +3283,76 @@ ], "authors": [ { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://freek.dev", - "role": "Developer" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Convert an array to xml", - "homepage": "https://github.com/spatie/array-to-xml", + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", "keywords": [ - "array", - "convert", - "xml" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { - "url": "https://spatie.be/open-source/support-us", + "url": "https://symfony.com/sponsor", "type": "custom" }, { - "url": "https://github.com/spatie", + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-12-16T12:45:15+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/console", - "version": "v5.4.47", + "name": "symfony/polyfill-php72", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3980,24 +3360,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.47" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -4013,38 +3393,41 @@ "type": "tidelift" } ], - "time": "2024-11-06T11:30:55+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "name": "symfony/polyfill-php73", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { "files": [ - "function.php" + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4061,10 +3444,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A generic function and convention to trigger deprecation notices", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -4080,37 +3469,41 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/filesystem", - "version": "v7.2.0", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "require-dev": { - "symfony/process": "^6.4|^7.0" + "php": ">=7.2" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Filesystem\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4119,18 +3512,28 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides basic utilities for the filesystem", + "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/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -4146,34 +3549,44 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/finder", - "version": "v5.4.21", + "name": "symfony/polyfill-php81", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=7.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4182,18 +3595,24 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -4209,56 +3628,30 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "symfony/http-client", - "version": "v5.4.24", + "name": "symfony/process", + "version": "v5.4.47", "source": { "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" + "url": "https://github.com/symfony/process.git", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", + "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-client-contracts": "^2.4", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.0|^2|^3" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.4" - }, - "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", - "php-http/message-factory": "^1.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\HttpClient\\": "" + "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4270,21 +3663,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "http" - ], "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.24" + "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { @@ -4300,27 +3690,29 @@ "type": "tidelift" } ], - "time": "2023-05-07T13:11:28+00:00" + "time": "2024-11-06T11:36:42+00:00" }, { - "name": "symfony/http-client-contracts", - "version": "v2.5.5", + "name": "symfony/service-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "48ef1d0a082885877b664332b9427662065a360c" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/48ef1d0a082885877b664332b9427662065a360c", - "reference": "48ef1d0a082885877b664332b9427662065a360c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/http-client-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { @@ -4329,13 +3721,16 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.5-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4351,7 +3746,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to HTTP clients", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ "abstractions", @@ -4362,7 +3757,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.5" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -4378,30 +3773,46 @@ "type": "tidelift" } ], - "time": "2024-11-28T08:37:04+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/options-resolver", - "version": "v6.3.0", + "name": "symfony/string", + "version": "v6.4.15", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "url": "https://github.com/symfony/string.git", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" + "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\\OptionsResolver\\": "" + "Symfony\\Component\\String\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4413,23 +3824,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an improved replacement for the array_replace PHP function", + "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": [ - "config", - "configuration", - "options" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { @@ -4445,45 +3859,67 @@ "type": "tidelift" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "name": "symfony/translation", + "version": "v6.4.21", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/translation.git", + "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/translation/zipball/bb92ea5588396b319ba43283a5a3087a034cb29c", + "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "ext-ctype": "*" + "symfony/translation-implementation": "2.3|3.0" }, - "suggest": { - "ext-ctype": "For best performance" + "require-dev": { + "nikic/php-parser": "^4.18|^5.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/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { "files": [ - "bootstrap.php" + "Resources/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4491,24 +3927,18 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/translation/tree/v6.4.21" }, "funding": [ { @@ -4524,42 +3954,42 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-04-07T19:02:30+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "name": "symfony/translation-contracts", + "version": "v3.5.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" + "php": ">=8.1" }, "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4575,18 +4005,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -4602,44 +4032,46 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "name": "symfony/yaml", + "version": "v5.4.23", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" }, "suggest": { - "ext-intl": "For best performance" + "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Component\\Yaml\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4648,26 +4080,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/yaml/tree/v5.4.23" }, "funding": [ { @@ -4683,121 +4107,180 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "name": "twig/twig", + "version": "v2.16.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "url": "https://github.com/twigphp/Twig.git", + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", + "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", "shasum": "" }, "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.8" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "branch-alias": { + "dev-master": "2.16-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], + "psr-0": { + "Twig_": "lib/" + }, "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "templating" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v2.16.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", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-09T17:53:56+00:00" }, { - "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "name": "webmozart/assert", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": ">=7.1" + "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-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "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" + } + ], + "packages-dev": [ + { + "name": "amphp/amp", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "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": [ - "bootstrap.php" + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "Amp\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4806,75 +4289,85 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" } ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-01-26T16:07:39+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "name": "amphp/byte-stream", + "version": "v2.1.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/amphp/byte-stream.git", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46", + "reference": "55a6bd071aec26fa2a3e002618c20c35e3df1b46", "shasum": "" }, "require": { - "php": ">=7.2" + "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" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" }, + "type": "library", "autoload": { "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4882,75 +4375,63 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-03-16T17:10:27+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "name": "amphp/parser", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.4" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Amp\\Parser\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4958,82 +4439,64 @@ ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "async", + "non-blocking", + "parser", + "stream" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-03-21T19:16:53+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "name": "amphp/pipeline", + "version": "v1.2.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "url": "https://github.com/amphp/pipeline.git", + "reference": "7b52598c2e9105ebcddf247fc523161581930367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367", + "reference": "7b52598c2e9105ebcddf247fc523161581930367", "shasum": "" }, "require": { - "php": ">=7.1" + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] + "Amp\\Pipeline\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5041,67 +4504,65 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2025-03-16T16:33:53+00:00" }, { - "name": "symfony/process", - "version": "v5.4.47", + "name": "amphp/serialization", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "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": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Amp\\Serialization\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5109,74 +4570,63 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.47" - }, - "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" - } + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" ], - "time": "2024-11-06T11:36:42+00:00" + "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": "symfony/service-contracts", - "version": "v3.5.1", + "name": "amphp/sync", + "version": "v2.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "url": "https://github.com/amphp/sync.git", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1", + "reference": "217097b785130d77cfcc58ff583cf26cd1770bf1", "shasum": "" }, "require": { + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "revolt/event-loop": "^1 || ^0.2" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Amp\\Sync\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5184,85 +4634,79 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.3.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/amphp", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-08-03T19:31:26+00:00" }, { - "name": "symfony/string", - "version": "v6.4.15", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "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" + "php": "^7.4 || ^8.0" }, "conflict": { - "symfony/translation-contracts": "<2.5" + "phpstan/phpstan": "<1.11.10" }, "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" + "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": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Composer\\Pcre\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5270,102 +4714,69 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "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", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "symfony/translation", - "version": "v6.4.21", + "name": "composer/semver", + "version": "3.4.3", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c" + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bb92ea5588396b319ba43283a5a3087a034cb29c", - "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.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/finder": "^5.4|^6.0|^7.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Composer\\Semver\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5373,69 +4784,78 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "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": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.21" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2025-04-07T19:02:30+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.5.1", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "php": ">=8.1" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } + "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": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] + "Composer\\XdebugHandler\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5443,82 +4863,105 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", + "description": "Restarts a process without Xdebug.", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "Xdebug", + "performance" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "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://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "symfony/yaml", - "version": "v5.4.23", + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" + "php": ">=5.3.2" }, "require-dev": { - "symfony/console": "^5.3|^6.0" + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } }, - "bin": [ - "Resources/bin/yaml-lint" + "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/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": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5526,259 +4969,170 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "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": { - "source": "https://github.com/symfony/yaml/tree/v5.4.23" + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", "type": "tidelift" } ], - "time": "2023-04-23T19:33:36+00:00" + "time": "2022-12-30T00:23:10+00:00" }, { - "name": "twig/twig", - "version": "v2.16.1", + "name": "felixfbecker/advanced-json-rpc", + "version": "v3.2.1", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" + "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", + "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447", + "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.8" + "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": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "phpunit/phpunit": "^7.0 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.16-dev" - } - }, "autoload": { - "psr-0": { - "Twig_": "lib/" - }, "psr-4": { - "Twig\\": "src/" + "AdvancedJsonRpc\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "ISC" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], + "description": "A more advanced JSONRPC implementation", "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.16.1" + "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/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2024-09-09T17:53:56+00:00" + "time": "2021-06-11T22:34:44+00:00" }, { - "name": "vimeo/psalm", - "version": "6.0.0", + "name": "felixfbecker/language-server-protocol", + "version": "v1.5.3", "source": { "type": "git", - "url": "https://github.com/vimeo/psalm.git", - "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9" + "url": "https://github.com/felixfbecker/php-language-server-protocol.git", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/b8e96bb617bf59382113b1b56cef751f648a7dc9", - "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9", + "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9", + "reference": "a9e113dbc7d849e35b8776da39edaf4313b7b6c9", "shasum": "" }, "require": { - "amphp/amp": "^3", - "amphp/byte-stream": "^2", - "composer-runtime-api": "^2", - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^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.1", - "felixfbecker/language-server-protocol": "^1.5.3", - "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", - "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", - "nikic/php-parser": "^5.0.0", - "php": "~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "spatie/array-to-xml": "^2.17.0 || ^3.0", - "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" - }, - "provide": { - "psalm/psalm": "self.version" + "php": ">=7.1" }, "require-dev": { - "amphp/phpunit-util": "^3", - "bamarni/composer-bin-plugin": "^1.4", - "brianium/paratest": "^6.9", - "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", - "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": "^4.4 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "ext-curl": "In order to send data to shepherd", - "ext-igbinary": "^2.0.5 is required, used to serialize caching data" + "phpstan/phpstan": "*", + "squizlabs/php_codesniffer": "^3.1", + "vimeo/psalm": "^4.0" }, - "bin": [ - "psalm", - "psalm-language-server", - "psalm-plugin", - "psalm-refactor", - "psalter" - ], - "type": "project", + "type": "library", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev", - "dev-2.x": "2.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-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Psalm\\": "src/Psalm/" + "LanguageServerProtocol\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "ISC" ], "authors": [ { - "name": "Matthew Brown" + "name": "Felix Becker", + "email": "felix.b@outlook.com" } ], - "description": "A static analysis tool for finding errors in PHP applications", + "description": "PHP classes for the Language Server Protocol", "keywords": [ - "code", - "inspection", + "language", + "microsoft", "php", - "static analysis" + "server" ], "support": { - "docs": "https://psalm.dev/docs", - "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm" + "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues", + "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3" }, - "time": "2025-01-26T12:03:19+00:00" + "time": "2024-04-30T00:40:11+00:00" }, { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "fidry/cpu-core-counter", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "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" + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "psr-4": { - "Webmozart\\Assert\\": "src/" + "Fidry\\CpuCoreCounter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -5787,153 +5141,195 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" } ], - "description": "Assertions to validate method input/output with nice error messages.", + "description": "Tiny utility to get the number of CPU cores.", "keywords": [ - "assert", - "check", - "validate" + "CPU", + "core" ], "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, - "time": "2022-06-03T18:03:27+00:00" - } - ], - "packages-dev": [ + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, { - "name": "doctrine/instantiator", - "version": "2.0.0", + "name": "myclabs/deep-copy", + "version": "1.13.1", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "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" + "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": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "DeepCopy\\": "src/DeepCopy/" } }, "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", + "description": "Create deep copies (clones) of your objects", "keywords": [ - "constructor", - "instantiate" + "clone", + "copy", + "duplicate", + "object", + "object graph" ], "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-04-29T12:36:36+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/" + } }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" + "name": "Christian Weiske", + "email": "cweiske@cweiske.de", + "homepage": "http://github.com/cweiske/jsonmapper/", + "role": "Developer" } ], - "time": "2022-12-30T00:23:10+00:00" + "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": "myclabs/deep-copy", - "version": "1.13.1", + "name": "nikic/php-parser", + "version": "v5.4.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "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" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], "psr-4": { - "DeepCopy\\": "src/DeepCopy/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "parser", + "php" ], "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-04-29T12:36:36+00:00" + "time": "2024-12-30T11:07:19+00:00" }, { "name": "phar-io/manifest", @@ -6000,58 +5396,233 @@ "type": "github" } ], - "time": "2024-03-03T12:33:53+00:00" + "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.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "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.2" + }, + "time": "2025-04-13T19:20:35+00:00" }, { - "name": "phar-io/version", - "version": "3.2.1", + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "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": { - "classmap": [ - "src/" - ] + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "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" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" } ], - "description": "Library for handling version information and constraints", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" }, - "time": "2022-02-21T01:04:05+00:00" + "time": "2024-11-09T15:12:26+00:00" }, { "name": "phpro/grumphp-shim", @@ -6112,6 +5683,53 @@ }, "time": "2023-04-27T11:06:59+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "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.1.0" + }, + "time": "2025-02-19T13:28:12+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "9.2.32", @@ -6542,6 +6160,78 @@ ], "time": "2025-05-02T06:40:34+00:00" }, + { + "name": "revolt/event-loop", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "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.7" + }, + "time": "2025-01-25T19:27:39+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.2", @@ -6826,11 +6516,77 @@ "role": "lead" } ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", + "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/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -6838,7 +6594,7 @@ "type": "github" } ], - "time": "2023-12-22T06:19:30+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -7439,6 +7195,74 @@ ], "time": "2020-09-28T06:39:44+00:00" }, + { + "name": "spatie/array-to-xml", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/array-to-xml.git", + "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "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.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-12-16T12:45:15+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.7.2", @@ -7496,6 +7320,72 @@ }, "time": "2023-02-22T23:07:41+00:00" }, + { + "name": "symfony/filesystem", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "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/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:15:23+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.3", @@ -7545,6 +7435,116 @@ } ], "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "vimeo/psalm", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/vimeo/psalm.git", + "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/b8e96bb617bf59382113b1b56cef751f648a7dc9", + "reference": "b8e96bb617bf59382113b1b56cef751f648a7dc9", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "composer-runtime-api": "^2", + "composer/semver": "^1.4 || ^2.0 || ^3.0", + "composer/xdebug-handler": "^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.1", + "felixfbecker/language-server-protocol": "^1.5.3", + "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", + "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", + "nikic/php-parser": "^5.0.0", + "php": "~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "spatie/array-to-xml": "^2.17.0 || ^3.0", + "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0" + }, + "provide": { + "psalm/psalm": "self.version" + }, + "require-dev": { + "amphp/phpunit-util": "^3", + "bamarni/composer-bin-plugin": "^1.4", + "brianium/paratest": "^6.9", + "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", + "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": "^4.4 || ^5.0 || ^6.0 || ^7.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": "project", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev", + "dev-2.x": "2.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" + } + }, + "autoload": { + "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", + "static analysis" + ], + "support": { + "docs": "https://psalm.dev/docs", + "issues": "https://github.com/vimeo/psalm/issues", + "source": "https://github.com/vimeo/psalm" + }, + "time": "2025-01-26T12:03:19+00:00" } ], "aliases": [], From 6af723db75a954a0f1e19e5ea9198572ba3009b4 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 14:15:35 +0200 Subject: [PATCH 172/210] Remove 8.1 in tests again after merging with master --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a612d97..2744430 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.1, 8.2, 8.3] + php_version: [8.2, 8.3] testsuite: [general, brancher] runs-on: ubuntu-latest steps: From 2f23612c66886f91356ab5fa8748a911f7762646 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 2 May 2025 14:42:44 +0200 Subject: [PATCH 173/210] add 8.4 brancher pipeline for integration_test --- .github/workflows/test.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2744430..aaf60bf 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.2, 8.3] + php_version: [8.2, 8.3, 8.4] testsuite: [general, brancher] runs-on: ubuntu-latest steps: @@ -19,12 +19,12 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} - name: Start SSH agent for brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.4' }} uses: webfactory/ssh-agent@v0.5.4 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Run brancher testsuite - if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.3' }} + if: ${{ matrix.testsuite == 'brancher' && matrix.php_version == '8.4' }} run: ./runtests.sh brancher shell: bash env: From ac92ee8f82518b83963409a489ae033990537c51 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 7 May 2025 13:05:44 +0200 Subject: [PATCH 174/210] Use bookworm images for integration test --- docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 28cb9fb..f8ced02 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,7 +2,7 @@ version: "3" services: hypernode: container_name: hypernode - image: docker.hypernode.com/byteinternet/hypernode-buster-docker-php${PHP_VERSION_SHORT:-81}-mysql57 + image: docker.hypernode.com/byteinternet/hypernode-bookworm-docker-php${PHP_VERSION_SHORT:-81}-mysql80 volumes: - ./ci/test/.ssh:/root/.ssh ports: From e21a02e042de612d8a7e1e9ca5db161ad03e6ed7 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 7 May 2025 13:07:24 +0200 Subject: [PATCH 175/210] Add image_os to docker image to use --- ci/test/run-general.sh | 5 +++++ docker-compose.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index 53fa5f6..dc21cc2 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -4,6 +4,11 @@ set -e set -x export PHP_VERSION_SHORT=$(echo "${PHP_VERSION:-8.2}" | sed 's/\.//') +if [[ "${PHP_VERSION:-8.2}" == "8.4" ]]; then + export IMAGE_OS="bookworm" +else + export IMAGE_OS="buster" +fi # Handy aliases HN="docker-compose exec -T hypernode" diff --git a/docker-compose.yaml b/docker-compose.yaml index f8ced02..50add2d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,7 +2,7 @@ version: "3" services: hypernode: container_name: hypernode - image: docker.hypernode.com/byteinternet/hypernode-bookworm-docker-php${PHP_VERSION_SHORT:-81}-mysql80 + image: docker.hypernode.com/byteinternet/hypernode-${IMAGE_OS:buster}-docker-php${PHP_VERSION_SHORT:-81}-mysql57 volumes: - ./ci/test/.ssh:/root/.ssh ports: From ee61070e05b5096062d2b200371705e450f3c6b0 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 7 May 2025 13:09:07 +0200 Subject: [PATCH 176/210] Default docker image in docker-compose to buster --- docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 50add2d..75998b4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -2,7 +2,7 @@ version: "3" services: hypernode: container_name: hypernode - image: docker.hypernode.com/byteinternet/hypernode-${IMAGE_OS:buster}-docker-php${PHP_VERSION_SHORT:-81}-mysql57 + image: docker.hypernode.com/byteinternet/hypernode-${IMAGE_OS:-buster}-docker-php${PHP_VERSION_SHORT:-81}-mysql57 volumes: - ./ci/test/.ssh:/root/.ssh ports: From 4414068aa4be95c865b4f4ac7a604608116ace32 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 14:42:52 +0200 Subject: [PATCH 177/210] Add PHP8.0 through PHP8.4 to Integration tests, remove dev depedencies from build --- .github/workflows/test.yaml | 2 +- ci/build/Dockerfile | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index aaf60bf..fd4ebe2 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.2, 8.3, 8.4] + php_version: [8.0, 8.1, 8.2, 8.3, 8.4] testsuite: [general, brancher] runs-on: ubuntu-latest steps: diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 28b54e4..53cef46 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -94,8 +94,14 @@ COPY ./ci/build/files / RUN curl -sS https://getcomposer.org/installer | php \ && mv composer.phar /usr/local/bin/composer \ - && chmod +x /usr/local/bin/composer \ - && composer install --no-dev --optimize-autoloader --working-dir=/hypernode + && chmod +x /usr/local/bin/composer + +# Remove dev dependencies from composer.json +RUN cd /hypernode && \ + jq 'del(.["require-dev"])' composer.json > composer.tmp.json && \ + cp composer.tmp.json composer.json + +RUN composer install --no-dev --optimize-autoloader --working-dir=/hypernode --no-scripts --no-progress --no-interaction RUN bash /hypernode/ci/compile.sh From 0844a4a08af0a1a0ab506da46af7c63c14338a3e Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 14:45:21 +0200 Subject: [PATCH 178/210] Escape PHP 8.0 in integration test matrix item --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fd4ebe2..ae87705 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: [8.0, 8.1, 8.2, 8.3, 8.4] + php_version: ['8.0', 8.1, 8.2, 8.3, 8.4] testsuite: [general, brancher] runs-on: ubuntu-latest steps: From 6a95efafa1ea111828431ebbe4be893fc8f11d6c Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 15:04:13 +0200 Subject: [PATCH 179/210] Use seperate magento versions for php versions --- ci/test/run-general.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index dc21cc2..1df8caa 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -10,6 +10,12 @@ else export IMAGE_OS="buster" fi +if [[ "${PHP_VERSION:-8.2}" == "8.0" | "${PHP_VERSION:-8.2}" == "8.1" ]]; then + export MAGENTO_VERSION="2.4.6-p10" +else + export MAGENTO_VERSION="2.4.8" +fi + # Handy aliases HN="docker-compose exec -T hypernode" DP="docker-compose exec -e GITHUB_WORKFLOW -T deploy" @@ -64,7 +70,7 @@ end_task begin_task "Setting Magento 2" # Create working initial Magento install on the Hypernode container -$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:2.4.8 /data/web/magento2 +$HN composer create-project --repository=https://mirror.mage-os.org/ magento/project-community-edition:${MAGENTO_VERSION:-2.4.8} /data/web/magento2 echo "Waiting for MySQL to be available on the Hypernode container" $HN bash -c "until mysql -e 'select 1' ; do sleep 1; done" install_magento From 456dde34bc24f38db00eaaeb21fc90680f335d77 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 15:05:16 +0200 Subject: [PATCH 180/210] Fix syntax for switching magento versions to test --- ci/build/Dockerfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 53cef46..6129399 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -84,6 +84,13 @@ RUN apt-get install -y --no-install-recommends \ # Confirm NodeJS & NPM are installed RUN node -v && npm -v +COPY id_ed25519 /root/.ssh/id_rsa +RUN mkdir -p /root/.ssh \ + && chmod -vf 700 /root/.ssh \ + && (chmod -vf 600 /root/.ssh/* || true) \ + && chmod -vf 700 /etc/ssh \ + && chmod -vf 600 /etc/ssh/* + COPY ./.git /hypernode/.git COPY ./bin /hypernode/bin COPY ./ci /hypernode/ci From 68ece72b7f4176298f816abb8c00bf17a2641dfc Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 15:08:43 +0200 Subject: [PATCH 181/210] Fix syntax for switching magento versions to test --- ci/build/Dockerfile | 7 ------- ci/test/run-general.sh | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 6129399..53cef46 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -84,13 +84,6 @@ RUN apt-get install -y --no-install-recommends \ # Confirm NodeJS & NPM are installed RUN node -v && npm -v -COPY id_ed25519 /root/.ssh/id_rsa -RUN mkdir -p /root/.ssh \ - && chmod -vf 700 /root/.ssh \ - && (chmod -vf 600 /root/.ssh/* || true) \ - && chmod -vf 700 /etc/ssh \ - && chmod -vf 600 /etc/ssh/* - COPY ./.git /hypernode/.git COPY ./bin /hypernode/bin COPY ./ci /hypernode/ci diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index 1df8caa..fafa385 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -10,7 +10,7 @@ else export IMAGE_OS="buster" fi -if [[ "${PHP_VERSION:-8.2}" == "8.0" | "${PHP_VERSION:-8.2}" == "8.1" ]]; then +if [[ "${PHP_VERSION:-8.2}" == "8.0" || "${PHP_VERSION:-8.2}" == "8.1" ]]; then export MAGENTO_VERSION="2.4.6-p10" else export MAGENTO_VERSION="2.4.8" From 6bb9ec8285772a3740a7cbbcee1e714f77b3e1e4 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 12 May 2025 15:16:57 +0200 Subject: [PATCH 182/210] Remove php 8.0 from integration tests --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ae87705..8af02f0 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -6,7 +6,7 @@ jobs: integration_test: strategy: matrix: - php_version: ['8.0', 8.1, 8.2, 8.3, 8.4] + php_version: [8.1, 8.2, 8.3, 8.4] testsuite: [general, brancher] runs-on: ubuntu-latest steps: From 212e3ce1724c5132069602cd6b9003e163b27a84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:17:57 +0000 Subject: [PATCH 183/210] Bump hypernode/api-client from 0.4.1 to 0.5.0 Bumps [hypernode/api-client](https://github.com/ByteInternet/hypernode-api-php) from 0.4.1 to 0.5.0. - [Release notes](https://github.com/ByteInternet/hypernode-api-php/releases) - [Commits](https://github.com/ByteInternet/hypernode-api-php/compare/0.4.1...0.5.0) --- updated-dependencies: - dependency-name: hypernode/api-client dependency-version: 0.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- composer.json | 2 +- composer.lock | 526 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 398 insertions(+), 130 deletions(-) diff --git a/composer.json b/composer.json index deddd9b..5d183da 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "deployer/deployer": "v7.4.0", "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", - "hypernode/api-client": "^0.4", + "hypernode/api-client": "^0.5", "hypernode/deploy-configuration": "^3.4", "php-di/php-di": "^7.0", "psr/log": "^1.0", diff --git a/composer.lock b/composer.lock index 984cb52..001024b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,27 +4,96 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fd55e4ece35b5d67fe71fb3059b7bbe1", + "content-hash": "285bc7bf530ee96081c38ea51c71d1f6", "packages": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, { "name": "clue/stream-filter", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", "shasum": "" }, "require": { "php": ">=5.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -46,7 +115,7 @@ } ], "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "homepage": "https://github.com/clue/stream-filter", "keywords": [ "bucket brigade", "callback", @@ -58,7 +127,7 @@ ], "support": { "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" }, "funding": [ { @@ -70,7 +139,7 @@ "type": "github" } ], - "time": "2022-02-21T13:15:14+00:00" + "time": "2023-12-20T15:40:13+00:00" }, { "name": "deployer/deployer", @@ -795,23 +864,23 @@ }, { "name": "hypernode/api-client", - "version": "0.4.1", + "version": "0.5.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-api-php.git", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f" + "reference": "9ae1ef127fecac2212e7e7872f034c247c7e71fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/2c7a8210a155493ae3688deb87679672e5a8578f", - "reference": "2c7a8210a155493ae3688deb87679672e5a8578f", + "url": "https://api.github.com/repos/ByteInternet/hypernode-api-php/zipball/9ae1ef127fecac2212e7e7872f034c247c7e71fd", + "reference": "9ae1ef127fecac2212e7e7872f034c247c7e71fd", "shasum": "" }, "require": { "composer-runtime-api": "^2.0", "ext-curl": "*", "ext-json": "*", - "nesbot/carbon": "^2.0", + "nesbot/carbon": "^3.0", "php-http/client-common": "^2.5", "php-http/discovery": "^1.14", "psr/http-client-implementation": "^1.0", @@ -841,9 +910,9 @@ "description": "Hypernode API Client for PHP", "support": { "issues": "https://github.com/ByteInternet/hypernode-api-php/issues", - "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.4.1" + "source": "https://github.com/ByteInternet/hypernode-api-php/tree/0.5.0" }, - "time": "2023-04-05T07:29:39+00:00" + "time": "2025-06-02T09:05:59+00:00" }, { "name": "hypernode/deploy-configuration", @@ -1019,47 +1088,47 @@ }, { "name": "nesbot/carbon", - "version": "2.67.0", + "version": "3.9.1", "source": { "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8" + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "ced71f79398ece168e24f7f7710462f462310d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/c1001b3bc75039b07f38a79db5237c4c529e04c8", - "reference": "c1001b3bc75039b07f38a79db5237c4c529e04c8", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", + "reference": "ced71f79398ece168e24f7f7710462f462310d4d", "shasum": "" }, "require": { + "carbonphp/carbon-doctrine-types": "<100.0", "ext-json": "*", - "php": "^7.1.8 || ^8.0", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.1.4", - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "ondrejmirtes/better-reflection": "*", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.99 || ^1.7.14", - "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", - "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", - "squizlabs/php_codesniffer": "^3.4" + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" }, "bin": [ "bin/carbon" ], "type": "library", "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" @@ -1069,6 +1138,10 @@ "includes": [ "extension.neon" ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" } }, "autoload": { @@ -1100,8 +1173,8 @@ ], "support": { "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" }, "funding": [ { @@ -1117,7 +1190,7 @@ "type": "tidelift" } ], - "time": "2023-05-25T22:09:47+00:00" + "time": "2025-05-01T19:51:51+00:00" }, { "name": "php-di/invoker", @@ -1249,16 +1322,16 @@ }, { "name": "php-http/client-common", - "version": "2.7.0", + "version": "2.7.2", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b" + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b", - "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b", + "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46", + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46", "shasum": "" }, "require": { @@ -1268,7 +1341,7 @@ "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { @@ -1312,22 +1385,22 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.0" + "source": "https://github.com/php-http/client-common/tree/2.7.2" }, - "time": "2023-05-17T06:46:59+00:00" + "time": "2024-09-24T06:21:48+00:00" }, { "name": "php-http/discovery", - "version": "1.19.0", + "version": "1.20.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4" + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", - "reference": "1856a119a0b0ba8da8b5c33c080aa7af8fac25b4", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", "shasum": "" }, "require": { @@ -1351,7 +1424,8 @@ "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, "type": "composer-plugin", "extra": { @@ -1390,22 +1464,22 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.0" + "source": "https://github.com/php-http/discovery/tree/1.20.0" }, - "time": "2023-06-19T08:45:36+00:00" + "time": "2024-10-02T11:20:13+00:00" }, { "name": "php-http/httplug", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { @@ -1447,22 +1521,22 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2024-09-23T11:39:58+00:00" }, { "name": "php-http/message", - "version": "1.16.0", + "version": "1.16.2", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", "shasum": "" }, "require": { @@ -1516,37 +1590,32 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" + "source": "https://github.com/php-http/message/tree/1.16.2" }, - "time": "2023-05-17T06:43:38+00:00" + "time": "2024-10-02T11:34:13+00:00" }, { "name": "php-http/promise", - "version": "1.1.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { "Http\\Promise\\": "src/" @@ -1573,9 +1642,9 @@ ], "support": { "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" + "source": "https://github.com/php-http/promise/tree/1.3.1" }, - "time": "2020-07-07T09:29:14+00:00" + "time": "2024-03-15T13:55:21+00:00" }, { "name": "psr/cache", @@ -1626,6 +1695,54 @@ }, "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", @@ -1681,16 +1798,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -1727,9 +1844,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -2536,6 +2653,80 @@ }, "time": "2018-05-29T20:21:04+00:00" }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "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/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, { "name": "symfony/console", "version": "v5.4.47", @@ -2637,16 +2828,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -2659,7 +2850,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -2684,7 +2875,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -2700,7 +2891,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", @@ -2936,20 +3127,20 @@ }, { "name": "symfony/options-resolver", - "version": "v6.3.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -2983,7 +3174,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" }, "funding": [ { @@ -2999,7 +3190,7 @@ "type": "tidelift" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2025-04-04T13:12:05+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3241,19 +3432,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -3301,7 +3493,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -3317,7 +3509,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php72", @@ -3397,7 +3589,7 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -3453,7 +3645,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" }, "funding": [ { @@ -3473,16 +3665,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "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/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -3533,7 +3725,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -3549,7 +3741,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", @@ -3630,6 +3822,82 @@ ], "time": "2022-11-03T14:55:06+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "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.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/process", "version": "v5.4.47", @@ -3863,16 +4131,16 @@ }, { "name": "symfony/translation", - "version": "v6.4.21", + "version": "v6.4.22", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c" + "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bb92ea5588396b319ba43283a5a3087a034cb29c", - "reference": "bb92ea5588396b319ba43283a5a3087a034cb29c", + "url": "https://api.github.com/repos/symfony/translation/zipball/7e3b3b7146c6fab36ddff304a8041174bf6e17ad", + "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad", "shasum": "" }, "require": { @@ -3938,7 +4206,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.21" + "source": "https://github.com/symfony/translation/tree/v6.4.22" }, "funding": [ { @@ -3954,20 +4222,20 @@ "type": "tidelift" } ], - "time": "2025-04-07T19:02:30+00:00" + "time": "2025-05-29T07:06:44+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { @@ -3980,7 +4248,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -4016,7 +4284,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -4032,7 +4300,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/yaml", @@ -7559,5 +7827,5 @@ "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 456d1022e48f45650dbdf7089060919c747d2e53 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Sun, 6 Jul 2025 16:30:15 +0200 Subject: [PATCH 184/210] Check for multiple paths for SSH keys like ~/.ssh/id_ed25519 --- src/Deployer/Task/Common/PrepareSshTaskGlobal.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php index 3170bff..6c6ea8a 100644 --- a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php +++ b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php @@ -19,13 +19,22 @@ class PrepareSshTaskGlobal extends TaskBase { private const BITBUCKET_KEY_PATH = '/opt/atlassian/pipelines/agent/ssh/id_rsa'; + private const KEY_PATHS = [ + self::BITBUCKET_KEY_PATH, + '~/.ssh/id_rsa', + '~/.ssh/id_ed25519' + ]; + public function configure(Configuration $config): void { set('ssh_key_file', function () { - if (testLocally('[ -f ' . self::BITBUCKET_KEY_PATH . ' ]')) { - return self::BITBUCKET_KEY_PATH; + foreach (self::KEY_PATHS as $path) { + if (testLocally("[ -f $path ]")) { + return $path; + } } - return '~/.ssh/id_rsa'; + + return '~/.ssh/id_rsa'; // Fallback }); task('prepare:ssh', function () { From 1e9ab1e4e85404a80efb9a04bf1ec3e9bb11c392 Mon Sep 17 00:00:00 2001 From: Pascal Brouwers Date: Wed, 9 Jul 2025 09:46:18 +0200 Subject: [PATCH 185/210] fix: no cli input for deploy:hypernode:setting elasticsearch_enabled True --- .../Task/PlatformConfiguration/HypernodeSettingTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php b/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php index e9557e2..3f6775d 100644 --- a/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php +++ b/src/Deployer/Task/PlatformConfiguration/HypernodeSettingTask.php @@ -35,7 +35,7 @@ public function configureWithTaskConfig(TaskConfigurationInterface $config): ?Ta $value = $config->getValue(); $taskName = "deploy:hypernode:setting:$attribute"; $task = task($taskName, function () use ($attribute, $value) { - run("hypernode-systemctl settings $attribute $value --block"); + run("yes | hypernode-systemctl settings $attribute $value --block"); }); after('deploy:setup', $taskName); return $task; From 0c664c91c4fb7d5bffaac5ef7a9977a0d674ce9c Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 14 Jul 2025 11:19:42 +0200 Subject: [PATCH 186/210] Drop support for PHP 8.0 --- .github/workflows/publish.yaml | 3 +-- ci/test/run-general.sh | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 66b0d8a..380fb91 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -8,7 +8,6 @@ jobs: strategy: matrix: php_version: - - "8.0" - "8.1" - "8.2" - "8.3" @@ -22,7 +21,7 @@ jobs: env: PHP_VERSION: ${{ matrix.php_version }} NODE_VERSION: ${{ matrix.node_version }} - LATEST_PHP_VERSION: 8.3 + LATEST_PHP_VERSION: 8.4 LATEST_NODE_VERSION: 22 steps: - name: Checkout hypernode-deploy diff --git a/ci/test/run-general.sh b/ci/test/run-general.sh index fafa385..a82e1d0 100755 --- a/ci/test/run-general.sh +++ b/ci/test/run-general.sh @@ -10,7 +10,7 @@ else export IMAGE_OS="buster" fi -if [[ "${PHP_VERSION:-8.2}" == "8.0" || "${PHP_VERSION:-8.2}" == "8.1" ]]; then +if [[ "${PHP_VERSION:-8.2}" == "8.1" ]]; then export MAGENTO_VERSION="2.4.6-p10" else export MAGENTO_VERSION="2.4.8" From 7bfbaaa77e32fa30f0c83a66ea43ea22679f38ff Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 13 Aug 2025 12:05:49 +0200 Subject: [PATCH 187/210] Add 'tree' command to Hypernode Deploy to get overview and list of tasks for a stage --- src/Command/Tree.php | 40 ++++++++++++++++++++++++++++++++++++++++ src/DeployRunner.php | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/Command/Tree.php diff --git a/src/Command/Tree.php b/src/Command/Tree.php new file mode 100644 index 0000000..4e0bc6f --- /dev/null +++ b/src/Command/Tree.php @@ -0,0 +1,40 @@ +deployRunner = $deployRunner; + } + + protected function execute(Input $input, Output $output): int + { + try { + $this->deployRunner->prepare(true, true, $input->getArgument('task'), false); + } catch (InvalidConfigurationException | ValidationException $e) { + $output->write($e->getMessage()); + return 1; + } + $result = parent::execute($input, $output); + + return $result; + } +} diff --git a/src/DeployRunner.php b/src/DeployRunner.php index e9c7692..3688ae8 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -104,7 +104,7 @@ public function run( * @throws InvalidConfigurationException * @throws Throwable */ - private function prepare( + public function prepare( bool $configureBuildStage, bool $configureServers, string $stage, From 253c6835e7533de0f4accef8a1f04052da5022df Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 13 Aug 2025 15:14:58 +0200 Subject: [PATCH 188/210] Update src/Command/Tree.php Co-authored-by: Timon de Groot --- src/Command/Tree.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Command/Tree.php b/src/Command/Tree.php index 4e0bc6f..0a42772 100644 --- a/src/Command/Tree.php +++ b/src/Command/Tree.php @@ -1,5 +1,8 @@ Date: Wed, 13 Aug 2025 15:15:48 +0200 Subject: [PATCH 189/210] Remove single newline for formatting --- src/Command/Tree.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Command/Tree.php b/src/Command/Tree.php index 0a42772..f3cb121 100644 --- a/src/Command/Tree.php +++ b/src/Command/Tree.php @@ -2,7 +2,6 @@ declare(strict_types=1); - namespace Hypernode\Deploy\Command; use Deployer\Deployer; From f685bacaa96bcf57ccc34b403a647e78e53ca4bc Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Wed, 8 Oct 2025 16:57:46 +0200 Subject: [PATCH 190/210] Use debian-slim image for building hypernode deploy --- ci/build/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 53cef46..2a5f7c0 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bookworm +FROM debian:bookworm-slim ARG NODE_VERSION ARG PHP_VERSION From e20ca5b9e424834e5ae9047dac2787b457b1d972 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Tue, 9 Dec 2025 19:22:30 +0100 Subject: [PATCH 191/210] Create .ssh folder in home-directory when it doesnt exist as fallback import ssh --- src/Deployer/Task/Common/PrepareSshTaskGlobal.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php index 6c6ea8a..4ec74a8 100644 --- a/src/Deployer/Task/Common/PrepareSshTaskGlobal.php +++ b/src/Deployer/Task/Common/PrepareSshTaskGlobal.php @@ -34,7 +34,11 @@ public function configure(Configuration $config): void } } - return '~/.ssh/id_rsa'; // Fallback + $home = getenv('HOME'); + if (!is_dir($home . '/.ssh')) { + mkdir($home . '/.ssh', 0700, true); + } + return $home . '/.ssh/id_rsa'; // Fallback }); task('prepare:ssh', function () { From 6423f179fa7e53bbff574701723f6515a3370008 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Tue, 9 Dec 2025 19:37:55 +0100 Subject: [PATCH 192/210] Update php requirement to >=8.1 and upgrade twig/twig to ^3.11.2 --- composer.json | 3 +- composer.lock | 153 +++++++++++++++----------------------------------- 2 files changed, 48 insertions(+), 108 deletions(-) diff --git a/composer.json b/composer.json index 5d183da..aecf754 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "bin/hypernode-deploy" ], "require": { + "php": ">=8.1", "ext-json": "*", "ext-pcntl": "*", "ext-zlib": "*", @@ -23,7 +24,7 @@ "symfony/finder": "^5.4", "symfony/http-client": "^5.4", "symfony/process": "^5.4", - "twig/twig": "^2.12", + "twig/twig": "^3.11.2", "webmozart/assert": "^1.11" }, "autoload": { diff --git a/composer.lock b/composer.lock index 001024b..1b07bcf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "285bc7bf530ee96081c38ea51c71d1f6", + "content-hash": "e70658ac1afe9906a806562e6a300ed1", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -306,6 +306,7 @@ "issues": "https://github.com/doctrine/annotations/issues", "source": "https://github.com/doctrine/annotations/tree/1.14.3" }, + "abandoned": true, "time": "2023-02-01T09:20:38+00:00" }, { @@ -961,12 +962,12 @@ "version": "5.2.12", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", + "url": "https://github.com/jsonrainbow/json-schema.git", "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, @@ -1021,8 +1022,8 @@ "schema" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.2.12" }, "time": "2022-04-13T08:02:27+00:00" }, @@ -3511,82 +3512,6 @@ ], "time": "2024-12-23T08:48:59+00:00" }, - { - "name": "symfony/polyfill-php72", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "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 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.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": "2022-11-03T14:55:06+00:00" - }, { "name": "symfony/polyfill-php73", "version": "v1.32.0", @@ -3762,12 +3687,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, "branch-alias": { "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4379,38 +4304,37 @@ }, { "name": "twig/twig", - "version": "v2.16.1", + "version": "v3.22.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1" + "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/19185947ec75d433a3ac650af32fc05649b95ee1", - "reference": "19185947ec75d433a3ac650af32fc05649b95ee1", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", + "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.8" + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "phpstan/phpstan": "^2.0", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.16-dev" - } - }, "autoload": { - "psr-0": { - "Twig_": "lib/" - }, + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -4443,7 +4367,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.16.1" + "source": "https://github.com/twigphp/Twig/tree/v3.22.1" }, "funding": [ { @@ -4455,7 +4379,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T17:53:56+00:00" + "time": "2025-11-16T16:01:12+00:00" }, { "name": "webmozart/assert", @@ -7536,12 +7460,12 @@ "version": "3.7.2", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, @@ -7586,6 +7510,20 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], "time": "2023-02-22T23:07:41+00:00" }, { @@ -7821,11 +7759,12 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { + "php": ">=8.1", "ext-json": "*", "ext-pcntl": "*", "ext-zlib": "*", "composer-runtime-api": "^2" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 9de564e363d6d819ce588900a87eb0da2bb39ce7 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Tue, 9 Dec 2025 19:41:10 +0100 Subject: [PATCH 193/210] Remove version from docker-compose.yaml --- docker-compose.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 75998b4..0772eba 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,3 @@ -version: "3" services: hypernode: container_name: hypernode From 53a5e00f8873b4155e9965183c048863d2ffe318 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 15 Dec 2025 13:11:06 +0100 Subject: [PATCH 194/210] Upgrade hypernode/deploy-configuration to ^3.5 --- composer.json | 2 +- composer.lock | 353 +++++++++++++++++++++++--------------------------- 2 files changed, 161 insertions(+), 194 deletions(-) diff --git a/composer.json b/composer.json index aecf754..87c18cb 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.5", - "hypernode/deploy-configuration": "^3.4", + "hypernode/deploy-configuration": "^3.5", "php-di/php-di": "^7.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 1b07bcf..63e817f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e70658ac1afe9906a806562e6a300ed1", + "content-hash": "ac062b2d98f523024b86eb9b650ed881", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -437,28 +437,28 @@ }, { "name": "evenement/evenement", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9 || ^6" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -478,9 +478,9 @@ ], "support": { "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, - "time": "2017-07-23T21:35:13+00:00" + "time": "2023-08-08T05:53:35+00:00" }, { "name": "fig/http-message-util", @@ -917,21 +917,22 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "d999a767c53df06b59d93ada6af106e05af21736" + "reference": "c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/d999a767c53df06b59d93ada6af106e05af21736", - "reference": "d999a767c53df06b59d93ada6af106e05af21736", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9", + "reference": "c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9", "shasum": "" }, "require": { "deployer/deployer": "7.0 - 7.4", - "psr/log": "^1.0||^2.0||^3.0" + "psr/log": "^1.0||^2.0||^3.0", + "symfony/polyfill-php81": "^1.33" }, "conflict": { "hipex/deploy-configuration": "*" @@ -953,26 +954,26 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.4.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.5.0" }, - "time": "2025-03-24T13:35:29+00:00" + "time": "2025-12-15T11:56:28+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.12", + "version": "5.3.1", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + "reference": "b5a44b6391a3bbb75c9f2b73e1ef03d6045e1e20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/b5a44b6391a3bbb75c9f2b73e1ef03d6045e1e20", + "reference": "b5a44b6391a3bbb75c9f2b73e1ef03d6045e1e20", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", @@ -983,11 +984,6 @@ "bin/validate-json" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -1023,9 +1019,9 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.2.12" + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.1" }, - "time": "2022-04-13T08:02:27+00:00" + "time": "2025-12-12T08:56:22+00:00" }, { "name": "laravel/serializable-closure", @@ -2125,28 +2121,28 @@ }, { "name": "react/dns", - "version": "v1.11.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", - "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", "shasum": "" }, "require": { "php": ">=5.3.0", "react/cache": "^1.0 || ^0.6 || ^0.5", "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1" + "react/promise": "^3.2 || ^2.7 || ^1.2.1" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", - "react/promise-timer": "^1.9" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -2189,7 +2185,7 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.11.0" + "source": "https://github.com/reactphp/dns/tree/v1.14.0" }, "funding": [ { @@ -2197,20 +2193,20 @@ "type": "open_collective" } ], - "time": "2023-06-02T12:45:26+00:00" + "time": "2025-11-18T19:34:28+00:00" }, { "name": "react/event-loop", - "version": "v1.4.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", - "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { @@ -2261,7 +2257,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" }, "funding": [ { @@ -2269,20 +2265,20 @@ "type": "open_collective" } ], - "time": "2023-05-05T10:11:24+00:00" + "time": "2025-11-17T20:46:25+00:00" }, { "name": "react/http", - "version": "v1.9.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" + "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "url": "https://api.github.com/repos/reactphp/http/zipball/8db02de41dcca82037367f67a2d4be365b1c4db9", + "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9", "shasum": "" }, "require": { @@ -2291,19 +2287,18 @@ "php": ">=5.3.0", "psr/http-message": "^1.0", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.3 || ^1.2.1", - "react/socket": "^1.12", - "react/stream": "^1.2", - "ringcentral/psr7": "^1.2" + "react/promise": "^3.2 || ^2.3 || ^1.2.1", + "react/socket": "^1.16", + "react/stream": "^1.4" }, "require-dev": { "clue/http-proxy-react": "^1.8", "clue/reactphp-ssh-proxy": "^1.4", "clue/socks-react": "^1.4", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.2 || ^3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -2353,7 +2348,7 @@ ], "support": { "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.9.0" + "source": "https://github.com/reactphp/http/tree/v1.11.0" }, "funding": [ { @@ -2361,27 +2356,28 @@ "type": "open_collective" } ], - "time": "2023-04-26T10:29:24+00:00" + "time": "2024-11-20T15:24:08+00:00" }, { "name": "react/promise", - "version": "v2.10.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", "autoload": { @@ -2425,7 +2421,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -2433,40 +2429,40 @@ "type": "open_collective" } ], - "time": "2023-05-02T15:15:43+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "react/socket", - "version": "v1.13.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", - "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", - "react/async": "^4 || ^3 || ^2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.9" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { "psr-4": { - "React\\Socket\\": "src" + "React\\Socket\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2505,7 +2501,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.13.0" + "source": "https://github.com/reactphp/socket/tree/v1.17.0" }, "funding": [ { @@ -2513,20 +2509,20 @@ "type": "open_collective" } ], - "time": "2023-06-07T10:28:34+00:00" + "time": "2025-11-19T20:47:34+00:00" }, { "name": "react/stream", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", - "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { @@ -2536,7 +2532,7 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -2583,7 +2579,7 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.3.0" + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { @@ -2591,68 +2587,7 @@ "type": "open_collective" } ], - "time": "2023-06-16T10:52:11+00:00" - }, - { - "name": "ringcentral/psr7", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "RingCentral\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "support": { - "source": "https://github.com/ringcentral/psr7/tree/master" - }, - "time": "2018-05-29T20:21:04+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { "name": "symfony/clock", @@ -3195,7 +3130,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -3254,7 +3189,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -3265,6 +3200,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3274,16 +3213,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -3332,7 +3271,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -3343,16 +3282,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -3413,7 +3356,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -3424,6 +3367,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3433,7 +3380,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -3494,7 +3441,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -3505,6 +3452,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3514,7 +3465,7 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -3570,7 +3521,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -3581,6 +3532,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3590,7 +3545,7 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -3650,7 +3605,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -3661,6 +3616,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -3670,29 +3629,26 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" - }, - "branch-alias": { - "dev-main": "1.27-dev" } }, "autoload": { @@ -3729,7 +3685,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -3740,12 +3696,16 @@ "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": "2022-11-03T14:55:06+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", @@ -3887,16 +3847,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -3914,7 +3874,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -3950,7 +3910,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -3961,25 +3921,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v6.4.15", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", "shasum": "" }, "require": { @@ -3993,7 +3957,6 @@ "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", @@ -4036,7 +3999,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "source": "https://github.com/symfony/string/tree/v6.4.30" }, "funding": [ { @@ -4047,12 +4010,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2025-11-21T18:03:05+00:00" }, { "name": "symfony/translation", @@ -4229,16 +4196,16 @@ }, { "name": "symfony/yaml", - "version": "v5.4.23", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", - "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", "shasum": "" }, "require": { @@ -4284,7 +4251,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.23" + "source": "https://github.com/symfony/yaml/tree/v5.4.45" }, "funding": [ { @@ -4300,7 +4267,7 @@ "type": "tidelift" } ], - "time": "2023-04-23T19:33:36+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "twig/twig", From 54edc1fe6c41770aa4c301e55d7fecc8ecb47508 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 09:58:34 +0100 Subject: [PATCH 195/210] more robust waitForAvailability If the DNS change has not propagated yet to all nameservers, then it may be that the first reachability success goes through but a second one falis. in that case we are better off first trying for 'consecutive success' before we proceed with the deploy can be used in deploy.php like: ``` $testingStage->addBrancherServer("$APP_NAME") ->setLabels(['autodestroy=false', 'stage=acceptance', 'ci_ref=' . (\getenv('GITHUB_HEAD_REF') ?: 'none')]) ->setBrancherReachabilityCheckCount(6) // Amount of consecutive checks required ->setBrancherReachabilityCheckInterval(10); // Amount of seconds between checks ``` --- src/Brancher/BrancherHypernodeManager.php | 43 +++++++++++++++++++---- src/DeployRunner.php | 9 ++++- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index cb82ef2..9f96175 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -107,14 +107,20 @@ public function createForHypernode(string $hypernode, array $data = []): string * * @param string $brancherHypernode Name of the brancher Hypernode * @param int $timeout Maximum time to wait for availability + * @param int $reachabilityCheckCount Number of consecutive successful checks required + * @param int $reachabilityCheckInterval Seconds between reachability checks * @return void * @throws CreateBrancherHypernodeFailedException * @throws HypernodeApiClientException * @throws HypernodeApiServerException * @throws TimeoutException */ - public function waitForAvailability(string $brancherHypernode, int $timeout = 1500): void - { + public function waitForAvailability( + string $brancherHypernode, + int $timeout = 1500, + int $reachabilityCheckCount = 6, + int $reachabilityCheckInterval = 10 + ): void { $latest = microtime(true); $timeElapsed = 0; $resolved = false; @@ -175,7 +181,7 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 ); } - $resolved = false; + $consecutiveSuccesses = 0; while ($timeElapsed < $timeout) { $now = microtime(true); $timeElapsed += $now - $latest; @@ -184,12 +190,37 @@ public function waitForAvailability(string $brancherHypernode, int $timeout = 15 $connection = @fsockopen(sprintf("%s.hypernode.io", $brancherHypernode), 22); if ($connection) { fclose($connection); - $resolved = true; - break; + $consecutiveSuccesses++; + $this->log->info( + sprintf( + 'Brancher Hypernode %s reachability check %d/%d succeeded.', + $brancherHypernode, + $consecutiveSuccesses, + $reachabilityCheckCount + ) + ); + + if ($consecutiveSuccesses >= $reachabilityCheckCount) { + break; + } + sleep($reachabilityCheckInterval); + } else { + if ($consecutiveSuccesses > 0) { + $this->log->info( + sprintf( + 'Brancher Hypernode %s reachability check failed, resetting counter (was at %d/%d).', + $brancherHypernode, + $consecutiveSuccesses, + $reachabilityCheckCount + ) + ); + } + $consecutiveSuccesses = 0; + sleep($reachabilityCheckInterval); } } - if (!$resolved) { + if ($consecutiveSuccesses < $reachabilityCheckCount) { throw new TimeoutException( sprintf('Timed out waiting for brancher Hypernode %s to become reachable', $brancherHypernode) ); diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 3688ae8..294d8d0 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -274,6 +274,8 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche if ($isBrancher && $parentApp) { $settings = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; $labels = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; + $reachabilityCheckCount = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_COUNT] ?? 6; + $reachabilityCheckInterval = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_INTERVAL] ?? 10; $this->log->info(sprintf('Creating an brancher Hypernode based on %s.', $parentApp)); if ($settings) { @@ -299,7 +301,12 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche try { $this->log->info('Waiting for brancher Hypernode to become available...'); - $this->brancherHypernodeManager->waitForAvailability($brancherApp); + $this->brancherHypernodeManager->waitForAvailability( + $brancherApp, + 1500, + $reachabilityCheckCount, + $reachabilityCheckInterval + ); $this->log->info('Brancher Hypernode has become available!'); } catch (CreateBrancherHypernodeFailedException | TimeoutException $e) { if (in_array($brancherApp, $this->brancherHypernodesRegistered)) { From f06be7ff427d37daabd8f422a644a0ee118c324e Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 10:11:08 +0100 Subject: [PATCH 196/210] temp use hypernode-deploy-configuration branch so we can test both PRs without merging both: https://github.com/ByteInternet/hypernode-deploy-configuration/pull/55 https://github.com/ByteInternet/hypernode-deploy/pull/184 --- composer.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 87c18cb..0d83e3d 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.5", - "hypernode/deploy-configuration": "^3.5", + "hypernode/deploy-configuration": "dev-more-robust-dns-check as 3.5.99", "php-di/php-di": "^7.0", "psr/log": "^1.0", "symfony/console": "^5.4", @@ -55,6 +55,10 @@ "deployer-fork": { "type": "vcs", "url": "https://github.com/ByteInternet/deployer" + }, + "deploy-configuration": { + "type": "vcs", + "url": "https://github.com/ByteInternet/hypernode-deploy-configuration" } } } From 439dd2fbc8639c2bc291cf86245a643b117f2f28 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 10:21:44 +0100 Subject: [PATCH 197/210] add DEFAULT_BRANCHER_TIMEOUT --- src/DeployRunner.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/DeployRunner.php b/src/DeployRunner.php index 294d8d0..4bb2b15 100644 --- a/src/DeployRunner.php +++ b/src/DeployRunner.php @@ -35,6 +35,10 @@ class DeployRunner public const TASK_BUILD = 'build'; public const TASK_DEPLOY = 'deploy'; + public const DEFAULT_BRANCHER_TIMEOUT = 1500; + public const DEFAULT_BRANCHER_REACHABILITY_CHECK_COUNT = 6; + public const DEFAULT_BRANCHER_REACHABILITY_CHECK_INTERVAL = 10; + private TaskFactory $taskFactory; private InputInterface $input; private LoggerInterface $log; @@ -274,8 +278,9 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche if ($isBrancher && $parentApp) { $settings = $serverOptions[Server::OPTION_HN_BRANCHER_SETTINGS] ?? []; $labels = $serverOptions[Server::OPTION_HN_BRANCHER_LABELS] ?? []; - $reachabilityCheckCount = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_COUNT] ?? 6; - $reachabilityCheckInterval = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_INTERVAL] ?? 10; + $timeout = $serverOptions[Server::OPTION_HN_BRANCHER_TIMEOUT] ?? self::DEFAULT_BRANCHER_TIMEOUT; + $reachabilityCheckCount = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_COUNT] ?? self::DEFAULT_BRANCHER_REACHABILITY_CHECK_COUNT; + $reachabilityCheckInterval = $serverOptions[Server::OPTION_HN_BRANCHER_REACHABILITY_CHECK_INTERVAL] ?? self::DEFAULT_BRANCHER_REACHABILITY_CHECK_INTERVAL; $this->log->info(sprintf('Creating an brancher Hypernode based on %s.', $parentApp)); if ($settings) { @@ -303,7 +308,7 @@ private function maybeConfigureBrancherServer(Server $server, bool $reuseBranche $this->log->info('Waiting for brancher Hypernode to become available...'); $this->brancherHypernodeManager->waitForAvailability( $brancherApp, - 1500, + $timeout, $reachabilityCheckCount, $reachabilityCheckInterval ); From 49ab333c34eb06c06aad92f0b93b8bd4e79423f2 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 10:47:29 +0100 Subject: [PATCH 198/210] Revert "temp use hypernode-deploy-configuration branch" This reverts commit f06be7ff427d37daabd8f422a644a0ee118c324e. --- composer.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 0d83e3d..87c18cb 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.5", - "hypernode/deploy-configuration": "dev-more-robust-dns-check as 3.5.99", + "hypernode/deploy-configuration": "^3.5", "php-di/php-di": "^7.0", "psr/log": "^1.0", "symfony/console": "^5.4", @@ -55,10 +55,6 @@ "deployer-fork": { "type": "vcs", "url": "https://github.com/ByteInternet/deployer" - }, - "deploy-configuration": { - "type": "vcs", - "url": "https://github.com/ByteInternet/hypernode-deploy-configuration" } } } From af93a8ed808a77619b60639f916becf4d41f21f6 Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 10:55:37 +0100 Subject: [PATCH 199/210] use deploy-configuration 3.6 --- composer.json | 2 +- composer.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 87c18cb..48bb58f 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "doctrine/annotations": "^1.6", "guzzlehttp/guzzle": "^7.5", "hypernode/api-client": "^0.5", - "hypernode/deploy-configuration": "^3.5", + "hypernode/deploy-configuration": "^3.6", "php-di/php-di": "^7.0", "psr/log": "^1.0", "symfony/console": "^5.4", diff --git a/composer.lock b/composer.lock index 63e817f..17c2d5d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ac062b2d98f523024b86eb9b650ed881", + "content-hash": "060108911b9a3452b54a2d0704c7c549", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -917,16 +917,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9" + "reference": "7abbb530e95add7d64dd4312e12643f6fe7aeb0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9", - "reference": "c42b0e35237888b2a0afa2ed66a3e6ae49cdf3c9", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/7abbb530e95add7d64dd4312e12643f6fe7aeb0c", + "reference": "7abbb530e95add7d64dd4312e12643f6fe7aeb0c", "shasum": "" }, "require": { @@ -954,9 +954,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.5.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.6.0" }, - "time": "2025-12-15T11:56:28+00:00" + "time": "2025-12-24T09:41:44+00:00" }, { "name": "justinrainbow/json-schema", @@ -7722,7 +7722,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -7732,6 +7732,6 @@ "ext-zlib": "*", "composer-runtime-api": "^2" }, - "platform-dev": [], - "plugin-api-version": "2.6.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } From a05e355497684f6eb73ac4545e56d7b42be8575a Mon Sep 17 00:00:00 2001 From: Rick van de Loo Date: Wed, 24 Dec 2025 11:55:19 +0100 Subject: [PATCH 200/210] double brancher timeout in integration test --- ci/test/magento/deploy_brancher.php | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/test/magento/deploy_brancher.php b/ci/test/magento/deploy_brancher.php index 4399a7d..5d9d3bd 100644 --- a/ci/test/magento/deploy_brancher.php +++ b/ci/test/magento/deploy_brancher.php @@ -19,6 +19,7 @@ $productionStage = $configuration->addStage('test', 'banaan.store'); $productionStage->addBrancherServer('hndeployintegr8') + ->setBrancherTimeout(3000) ->setLabels(['gitref='. (\getenv('GITHUB_SHA') ?: 'unknown')]); return $configuration; From 60e2990fec0d105e9d58ede7d9df2aff4b9ff6d2 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Jan 2026 14:58:08 +0100 Subject: [PATCH 201/210] ComposerAuth: Handle non base64 contents By falling back to json verification and then using that contents, users can use both base64 and raw json for the auth env variable. This also introduces the first proper unit test, here's to an even brighter future! --- composer.json | 5 + composer.lock | 666 ++++++++++-------- grumphp.yml | 2 + phpunit.xml.dist | 20 + .../Task/Build/ComposerAuthTaskGlobal.php | 24 +- .../Task/Build/ComposerAuthTaskGlobalTest.php | 62 ++ 6 files changed, 479 insertions(+), 300 deletions(-) create mode 100644 phpunit.xml.dist create mode 100644 tests/Unit/Deployer/Task/Build/ComposerAuthTaskGlobalTest.php diff --git a/composer.json b/composer.json index 48bb58f..199284d 100644 --- a/composer.json +++ b/composer.json @@ -35,6 +35,11 @@ "src/Deployer/functions.php" ] }, + "autoload-dev": { + "psr-4": { + "Hypernode\\Deploy\\Tests\\": "tests/" + } + }, "require-dev": { "phpro/grumphp-shim": "^1.13", "phpunit/phpunit": "^9.5", diff --git a/composer.lock b/composer.lock index 17c2d5d..046b18f 100644 --- a/composer.lock +++ b/composer.lock @@ -234,16 +234,16 @@ }, { "name": "doctrine/annotations", - "version": "1.14.3", + "version": "1.14.4", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", "shasum": "" }, "require": { @@ -254,11 +254,11 @@ }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^4.4 || ^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" @@ -304,10 +304,10 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.3" + "source": "https://github.com/doctrine/annotations/tree/1.14.4" }, "abandoned": true, - "time": "2023-02-01T09:20:38+00:00" + "time": "2024-09-05T10:15:52+00:00" }, { "name": "doctrine/deprecations", @@ -359,16 +359,16 @@ }, { "name": "doctrine/lexer", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", - "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", "shasum": "" }, "require": { @@ -376,11 +376,11 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^10", + "doctrine/coding-standard": "^9 || ^12", "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.0" + "vimeo/psalm": "^4.11 || ^5.21" }, "type": "library", "autoload": { @@ -417,7 +417,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.0" + "source": "https://github.com/doctrine/lexer/tree/2.1.1" }, "funding": [ { @@ -433,7 +433,7 @@ "type": "tidelift" } ], - "time": "2022-12-14T08:49:07+00:00" + "time": "2024-02-05T11:35:39+00:00" }, { "name": "evenement/evenement", @@ -540,22 +540,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.7.1", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/085b026db54d4b5012f727c80c9958e8b8cbc454", - "reference": "085b026db54d4b5012f727c80c9958e8b8cbc454", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "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" @@ -564,11 +564,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -646,7 +646,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.1" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -662,28 +662,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:02:06+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "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.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -729,7 +729,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.0" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -745,20 +745,20 @@ "type": "tidelift" } ], - "time": "2023-05-21T13:50:22+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -772,9 +772,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "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" @@ -845,7 +845,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -861,7 +861,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "hypernode/api-client", @@ -1025,31 +1025,32 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.0", + "version": "v2.0.8", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37" + "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", - "reference": "f23fe9d4e95255dacee1bf3525e0810d1a1b0f37", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b", + "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^8.1" }, "require-dev": { - "nesbot/carbon": "^2.61", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -1081,20 +1082,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-01-30T18:31:20+00:00" + "time": "2026-01-08T16:22:46+00:00" }, { "name": "nesbot/carbon", - "version": "3.9.1", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d" + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", "shasum": "" }, "require": { @@ -1102,9 +1103,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -1112,14 +1113,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^v3.87.1", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" }, "bin": [ "bin/carbon" @@ -1187,20 +1187,20 @@ "type": "tidelift" } ], - "time": "2025-05-01T19:51:51+00:00" + "time": "2025-12-02T21:04:28+00:00" }, { "name": "php-di/invoker", - "version": "2.3.3", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1", + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1", "shasum": "" }, "require": { @@ -1210,7 +1210,7 @@ "require-dev": { "athletic/athletic": "~0.1.8", "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12" }, "type": "library", "autoload": { @@ -1234,7 +1234,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.7" }, "funding": [ { @@ -1242,24 +1242,24 @@ "type": "github" } ], - "time": "2021-12-13T09:22:56+00:00" + "time": "2025-08-30T10:22:22+00:00" }, { "name": "php-di/php-di", - "version": "7.0.7", + "version": "7.1.1", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1" + "reference": "f88054cc052e40dbe7b383c8817c19442d480352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", - "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352", + "reference": "f88054cc052e40dbe7b383c8817c19442d480352", "shasum": "" }, "require": { - "laravel/serializable-closure": "^1.0", + "laravel/serializable-closure": "^1.0 || ^2.0", "php": ">=8.0", "php-di/invoker": "^2.0", "psr/container": "^1.1 || ^2.0" @@ -1271,8 +1271,8 @@ "friendsofphp/php-cs-fixer": "^3", "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^4.6" + "phpunit/phpunit": "^9.6 || ^10 || ^11", + "vimeo/psalm": "^5|^6" }, "suggest": { "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" @@ -1303,7 +1303,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.1.1" }, "funding": [ { @@ -1315,20 +1315,20 @@ "type": "tidelift" } ], - "time": "2024-07-21T15:55:45+00:00" + "time": "2025-08-16T11:10:48+00:00" }, { "name": "php-http/client-common", - "version": "2.7.2", + "version": "2.7.3", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46" + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46", - "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46", + "url": "https://api.github.com/repos/php-http/client-common/zipball/dcc6de29c90dd74faab55f71b79d89409c4bf0c1", + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1", "shasum": "" }, "require": { @@ -1338,15 +1338,13 @@ "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.0 || ^2.0", - "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0 || ^8.0", "symfony/polyfill-php80": "^1.17" }, "require-dev": { "doctrine/instantiator": "^1.1", "guzzlehttp/psr7": "^1.4", "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "phpspec/prophecy": "^1.10.2", "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" }, "suggest": { @@ -1382,9 +1380,9 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.2" + "source": "https://github.com/php-http/client-common/tree/2.7.3" }, - "time": "2024-09-24T06:21:48+00:00" + "time": "2025-11-29T19:12:34+00:00" }, { "name": "php-http/discovery", @@ -2591,20 +2589,20 @@ }, { "name": "symfony/clock", - "version": "v7.3.0", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/symfony/clock/zipball/fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "psr/clock": "^1.0", "symfony/polyfill-php83": "^1.28" }, @@ -2645,7 +2643,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.3.0" + "source": "https://github.com/symfony/clock/tree/v6.4.30" }, "funding": [ { @@ -2656,12 +2654,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-11-11T21:24:34+00:00" }, { "name": "symfony/console", @@ -2831,16 +2833,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.21", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { @@ -2874,7 +2876,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -2890,27 +2892,27 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:33:00+00:00" + "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/http-client", - "version": "v5.4.24", + "version": "v5.4.49", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6" + "reference": "d77d8e212cde7b5c4a64142bf431522f19487c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", - "reference": "9e89ac4c9dfe29f4ed2b10a36e62720286632ad6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d77d8e212cde7b5c4a64142bf431522f19487c28", + "reference": "d77d8e212cde7b5c4a64142bf431522f19487c28", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-client-contracts": "^2.4", + "symfony/http-client-contracts": "^2.5.4", "symfony/polyfill-php73": "^1.11", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.0|^2|^3" @@ -2926,7 +2928,7 @@ "amphp/http-client": "^4.2.1", "amphp/http-tunnel": "^1.0", "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", + "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "php-http/message-factory": "^1.0", @@ -2965,7 +2967,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v5.4.24" + "source": "https://github.com/symfony/http-client/tree/v5.4.49" }, "funding": [ { @@ -2981,7 +2983,7 @@ "type": "tidelift" } ], - "time": "2023-05-07T13:11:28+00:00" + "time": "2024-11-28T08:37:04+00:00" }, { "name": "symfony/http-client-contracts", @@ -3063,20 +3065,20 @@ }, { "name": "symfony/options-resolver", - "version": "v7.3.0", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", + "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -3110,7 +3112,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" }, "funding": [ { @@ -3121,12 +3123,16 @@ "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-04-04T13:12:05+00:00" + "time": "2025-11-12T13:06:53+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3709,16 +3715,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -3765,7 +3771,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -3776,12 +3782,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { "name": "symfony/process", @@ -4023,16 +4033,16 @@ }, { "name": "symfony/translation", - "version": "v6.4.22", + "version": "v6.4.31", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad" + "reference": "81579408ecf7dc5aa2d8462a6d5c3a430a80e6f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/7e3b3b7146c6fab36ddff304a8041174bf6e17ad", - "reference": "7e3b3b7146c6fab36ddff304a8041174bf6e17ad", + "url": "https://api.github.com/repos/symfony/translation/zipball/81579408ecf7dc5aa2d8462a6d5c3a430a80e6f2", + "reference": "81579408ecf7dc5aa2d8462a6d5c3a430a80e6f2", "shasum": "" }, "require": { @@ -4098,7 +4108,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.22" + "source": "https://github.com/symfony/translation/tree/v6.4.31" }, "funding": [ { @@ -4109,25 +4119,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-29T07:06:44+00:00" + "time": "2025-12-18T11:37:55+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.0", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -4176,7 +4190,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -4187,12 +4201,16 @@ "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-27T08:32:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/yaml", @@ -4271,16 +4289,16 @@ }, { "name": "twig/twig", - "version": "v3.22.1", + "version": "v3.22.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3" + "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", - "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/946ddeafa3c9f4ce279d1f34051af041db0e16f2", + "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2", "shasum": "" }, "require": { @@ -4334,7 +4352,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.22.1" + "source": "https://github.com/twigphp/Twig/tree/v3.22.2" }, "funding": [ { @@ -4346,32 +4364,32 @@ "type": "tidelift" } ], - "time": "2025-11-16T16:01:12+00:00" + "time": "2025-12-14T11:28:47+00:00" }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "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" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { @@ -4402,24 +4420,24 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/1.12.1" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2025-10-29T15:56:20+00:00" } ], "packages-dev": [ { "name": "amphp/amp", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9" + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", - "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9", + "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", "shasum": "" }, "require": { @@ -4479,7 +4497,7 @@ ], "support": { "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.0" + "source": "https://github.com/amphp/amp/tree/v3.1.1" }, "funding": [ { @@ -4487,7 +4505,7 @@ "type": "github" } ], - "time": "2025-01-26T16:07:39+00:00" + "time": "2025-08-27T21:42:00+00:00" }, { "name": "amphp/byte-stream", @@ -4907,16 +4925,16 @@ }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -4968,7 +4986,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.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -4978,13 +4996,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/xdebug-handler", @@ -5262,16 +5276,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { @@ -5281,10 +5295,10 @@ "fidry/makefile": "^0.2.0", "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^8.5.31 || ^9.5.26", "webmozarts/strict-phpunit": "^7.5" }, @@ -5311,7 +5325,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { @@ -5319,20 +5333,20 @@ "type": "github" } ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.1", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -5371,7 +5385,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -5379,7 +5393,7 @@ "type": "tidelift" } ], - "time": "2025-04-29T12:36:36+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "netresearch/jsonmapper", @@ -5434,16 +5448,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -5462,7 +5476,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -5486,9 +5500,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -5663,16 +5677,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", + "version": "5.6.6", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8", + "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8", "shasum": "" }, "require": { @@ -5682,7 +5696,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", @@ -5721,22 +5735,22 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6" }, - "time": "2025-04-13T19:20:35+00:00" + "time": "2025-12-22T21:13:58+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.10.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195", + "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195", "shasum": "" }, "require": { @@ -5779,9 +5793,9 @@ "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.10.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0" }, - "time": "2024-11-09T15:12:26+00:00" + "time": "2025-11-21T15:09:14+00:00" }, { "name": "phpro/grumphp-shim", @@ -5844,16 +5858,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.1.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374", + "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374", "shasum": "" }, "require": { @@ -5885,9 +5899,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1" }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2026-01-12T11:33:04+00:00" }, { "name": "phpunit/php-code-coverage", @@ -6210,16 +6224,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.23", + "version": "9.6.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" + "reference": "945d0b7f346a084ce5549e95289962972c4272e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", - "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", + "reference": "945d0b7f346a084ce5549e95289962972c4272e5", "shasum": "" }, "require": { @@ -6230,7 +6244,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -6241,11 +6255,11 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.9", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", + "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", @@ -6293,7 +6307,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.23" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31" }, "funding": [ { @@ -6317,20 +6331,20 @@ "type": "tidelift" } ], - "time": "2025-05-02T06:40:34+00:00" + "time": "2025-12-06T07:45:52+00:00" }, { "name": "revolt/event-loop", - "version": "v1.0.7", + "version": "v1.0.8", "source": { "type": "git", "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", "shasum": "" }, "require": { @@ -6387,9 +6401,9 @@ ], "support": { "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" }, - "time": "2025-01-25T19:27:39+00:00" + "time": "2025-08-27T21:33:23+00:00" }, { "name": "sebastian/cli-parser", @@ -6560,16 +6574,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", "shasum": "" }, "require": { @@ -6622,15 +6636,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "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": "2022-09-14T12:41:17+00:00" + "time": "2025-08-10T06:51:50+00:00" }, { "name": "sebastian/complexity", @@ -6820,16 +6846,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { @@ -6885,28 +6911,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "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": "2024-03-02T06:33:00+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -6949,15 +6987,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "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": "2024-03-02T06:35:11+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", @@ -7130,16 +7180,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -7181,15 +7231,27 @@ "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" + "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": "2023-02-03T06:07:39+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", @@ -7356,16 +7418,16 @@ }, { "name": "spatie/array-to-xml", - "version": "3.4.0", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/spatie/array-to-xml.git", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67" + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", - "reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67", + "url": "https://api.github.com/repos/spatie/array-to-xml/zipball/88b2f3852a922dd73177a68938f8eb2ec70c7224", + "reference": "88b2f3852a922dd73177a68938f8eb2ec70c7224", "shasum": "" }, "require": { @@ -7408,7 +7470,7 @@ "xml" ], "support": { - "source": "https://github.com/spatie/array-to-xml/tree/3.4.0" + "source": "https://github.com/spatie/array-to-xml/tree/3.4.4" }, "funding": [ { @@ -7420,20 +7482,20 @@ "type": "github" } ], - "time": "2024-12-16T12:45:15+00:00" + "time": "2025-12-15T09:00:41+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.2", + "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -7443,18 +7505,13 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -7462,20 +7519,29 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { @@ -7489,31 +7555,35 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2023-02-22T23:07:41+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", + "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -7541,7 +7611,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.30" }, "funding": [ { @@ -7552,25 +7622,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-10-25T15:15:23+00:00" + "time": "2025-11-26T14:43:45+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -7599,7 +7673,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.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -7607,7 +7681,7 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "vimeo/psalm", diff --git a/grumphp.yml b/grumphp.yml index c4d07c9..a67c5db 100644 --- a/grumphp.yml +++ b/grumphp.yml @@ -11,3 +11,5 @@ grumphp: no_cache: true composer: file: ../composer.json + phpunit: + config_file: phpunit.xml.dist diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..3fd8d77 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,20 @@ + + + + + tests/Unit + + + + + src + + + diff --git a/src/Deployer/Task/Build/ComposerAuthTaskGlobal.php b/src/Deployer/Task/Build/ComposerAuthTaskGlobal.php index 0b3e15f..837e82b 100644 --- a/src/Deployer/Task/Build/ComposerAuthTaskGlobal.php +++ b/src/Deployer/Task/Build/ComposerAuthTaskGlobal.php @@ -12,13 +12,29 @@ class ComposerAuthTaskGlobal extends TaskBase { + public const ENV_COMPOSER_AUTH = 'DEPLOY_COMPOSER_AUTH'; + + public function getAuthContent(): string + { + // Env var fetched to ensure key value is set + $rawContents = \Hypernode\DeployConfiguration\getenv(self::ENV_COMPOSER_AUTH); + $auth = base64_decode($rawContents, true); + if ($auth === false) { + // If not base64 encoded, we try to parse it as json. If that + // fails as well, it will raise. Otherwise, we'll just set + // $auth to the raw content. + /** @psalm-suppress UnusedFunctionCall We only call json_decode for validation */ + json_decode($rawContents, true, flags: JSON_THROW_ON_ERROR); + $auth = $rawContents; + } + return $auth; + } + public function configure(Configuration $config): void { task('deploy:vendors:auth', function () { - if (test('[ ! -f auth.json ]') && \getenv('DEPLOY_COMPOSER_AUTH')) { - // Env var fetched to ensure key value is set - $auth = \Hypernode\DeployConfiguration\getenv('DEPLOY_COMPOSER_AUTH'); - $auth = base64_decode($auth); + if (test('[ ! -f auth.json ]') && \getenv(self::ENV_COMPOSER_AUTH)) { + $auth = $this->getAuthContent(); run(sprintf('echo %s > auth.json', escapeshellarg($auth))); } })->select("stage=build"); diff --git a/tests/Unit/Deployer/Task/Build/ComposerAuthTaskGlobalTest.php b/tests/Unit/Deployer/Task/Build/ComposerAuthTaskGlobalTest.php new file mode 100644 index 0000000..9d715b1 --- /dev/null +++ b/tests/Unit/Deployer/Task/Build/ComposerAuthTaskGlobalTest.php @@ -0,0 +1,62 @@ +getAuthContent(); + + $this->assertSame($jsonContent, $result); + } + + public function testGetAuthContentReturnsRawJsonWhenNotBase64Encoded(): void + { + $jsonContent = '{"http-basic":{"repo.example.com":{"username":"user","password":"pass"}}}'; + putenv(ComposerAuthTaskGlobal::ENV_COMPOSER_AUTH . '=' . $jsonContent); + + $task = new ComposerAuthTaskGlobal(); + $result = $task->getAuthContent(); + + $this->assertSame($jsonContent, $result); + } + + public function testGetAuthContentThrowsJsonExceptionForInvalidContent(): void + { + $invalidContent = 'this-is-not-valid-json-or-base64'; + putenv(ComposerAuthTaskGlobal::ENV_COMPOSER_AUTH . '=' . $invalidContent); + + $task = new ComposerAuthTaskGlobal(); + + $this->expectException(JsonException::class); + $task->getAuthContent(); + } + + public function testGetAuthContentThrowsExceptionWhenEnvVarNotSet(): void + { + putenv(ComposerAuthTaskGlobal::ENV_COMPOSER_AUTH); + + $task = new ComposerAuthTaskGlobal(); + + $this->expectException(EnvironmentVariableNotDefinedException::class); + $task->getAuthContent(); + } +} From d07dd8d4bef8b24aa598c6242b1a1379b8fcf748 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Mon, 19 Jan 2026 16:01:43 +0100 Subject: [PATCH 202/210] Brancher: ping host before logbook poll This makes it possible to reuse a brancher node that does not have any items in the logbook anymore, which typically happens on older Brancher nodes. Fixes #185 --- grumphp.yml | 1 + psalm.xml | 2 +- src/Brancher/BrancherHypernodeManager.php | 162 ++++++++--- src/Brancher/SshPoller.php | 44 +++ .../Brancher/BrancherHypernodeManagerTest.php | 261 ++++++++++++++++++ tests/Unit/Brancher/TestSshPoller.php | 73 +++++ 6 files changed, 507 insertions(+), 36 deletions(-) create mode 100644 src/Brancher/SshPoller.php create mode 100644 tests/Unit/Brancher/BrancherHypernodeManagerTest.php create mode 100644 tests/Unit/Brancher/TestSshPoller.php diff --git a/grumphp.yml b/grumphp.yml index a67c5db..820fad0 100644 --- a/grumphp.yml +++ b/grumphp.yml @@ -5,6 +5,7 @@ grumphp: warning_severity: 0 whitelist_patterns: - /^src\/(.*)/ + - /^tests\/(.*)/ triggered_by: [php] psalm: config: psalm.xml diff --git a/psalm.xml b/psalm.xml index 4961e8f..c5218c1 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,6 +1,6 @@ log = $log; - $this->hypernodeClient = HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); + $this->hypernodeClient = $hypernodeClient + ?? HypernodeClientFactory::create(getenv('HYPERNODE_API_TOKEN') ?: ''); + $this->sshPoller = $sshPoller ?? new SshPoller(); } /** @@ -105,6 +122,11 @@ public function createForHypernode(string $hypernode, array $data = []): string /** * Wait for brancher Hypernode to become available. * + * This method first attempts a quick SSH connectivity check. If the brancher is already + * reachable (e.g., when reusing an existing brancher), it returns early. Otherwise, it + * falls back to polling the API logbook for delivery status, then performs a final SSH + * reachability check. + * * @param string $brancherHypernode Name of the brancher Hypernode * @param int $timeout Maximum time to wait for availability * @param int $reachabilityCheckCount Number of consecutive successful checks required @@ -121,24 +143,58 @@ public function waitForAvailability( int $reachabilityCheckCount = 6, int $reachabilityCheckInterval = 10 ): void { - $latest = microtime(true); - $timeElapsed = 0; + $latest = $this->sshPoller->microtime(); + $timeElapsed = 0.0; + + // Phase 1: SSH-first check, early return for reused delivered branchers + $this->log->info( + sprintf('Attempting SSH connectivity check for brancher Hypernode %s...', $brancherHypernode) + ); + + $isReachable = $this->pollSshConnectivity( + $brancherHypernode, + self::PRE_POLL_SUCCESS_COUNT, + self::PRE_POLL_FAIL_COUNT, + $reachabilityCheckInterval, + $timeElapsed, + $latest, + $timeout + ); + if ($isReachable) { + $this->log->info( + sprintf('Brancher Hypernode %s is reachable!', $brancherHypernode) + ); + return; + } + + $this->log->info( + sprintf( + 'SSH check inconclusive for brancher Hypernode %s, falling back to delivery check...', + $brancherHypernode + ) + ); + + // Phase 2: Wait for delivery by polling the logbook $resolved = false; $interval = 3; $allowedErrorWindow = 3; + $logbookStartTime = $timeElapsed; while ($timeElapsed < $timeout) { - $now = microtime(true); + $now = $this->sshPoller->microtime(); $timeElapsed += $now - $latest; $latest = $now; try { $flows = $this->hypernodeClient->logbook->getList($brancherHypernode); - $relevantFlows = array_filter($flows, fn(Flow $flow) => in_array($flow->name, ["ensure_app", "ensure_copied_app"], true)); + $relevantFlows = array_filter( + $flows, + fn(Flow $flow) => in_array($flow->name, self::RELEVANT_FLOW_NAMES, true) + ); $failedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isReverted()); $completedFlows = array_filter($relevantFlows, fn(Flow $flow) => $flow->isComplete()); - if (count($failedFlows) === count($relevantFlows)) { + if (count($relevantFlows) > 0 && count($failedFlows) === count($relevantFlows)) { throw new CreateBrancherHypernodeFailedException(); } @@ -151,9 +207,9 @@ public function waitForAvailability( // Otherwise, there's an error, and it should be propagated. if ($e->getCode() !== 404) { throw $e; - } elseif ($timeElapsed < $allowedErrorWindow) { + } elseif (($timeElapsed - $logbookStartTime) < $allowedErrorWindow) { // Sometimes we get an error where the logbook is not yet available, but it will be soon. - // We allow a small window for this to happen, and then we throw an exception. + // We allow a small window for this to happen, and then we continue polling. $this->log->info( sprintf( 'Got an expected exception during the allowed error window of HTTP code %d, waiting for %s to become available.', @@ -161,11 +217,16 @@ public function waitForAvailability( $brancherHypernode ) ); - continue; } } - sleep($interval); + $this->sshPoller->sleep($interval); + } + + if (!$resolved) { + throw new TimeoutException( + sprintf('Timed out waiting for brancher Hypernode %s to be delivered', $brancherHypernode) + ); } $this->log->info( @@ -175,35 +236,75 @@ public function waitForAvailability( ) ); - if (!$resolved) { + // Phase 3: Final SSH reachability check + $isReachable = $this->pollSshConnectivity( + $brancherHypernode, + $reachabilityCheckCount, + 0, // No max failures, rely on timeout + $reachabilityCheckInterval, + $timeElapsed, + $latest, + $timeout + ); + if (!$isReachable) { throw new TimeoutException( - sprintf('Timed out waiting for brancher Hypernode %s to be delivered', $brancherHypernode) + sprintf('Timed out waiting for brancher Hypernode %s to become reachable', $brancherHypernode) ); } + $this->log->info( + sprintf('Brancher Hypernode %s became reachable!', $brancherHypernode) + ); + } + + /** + * Poll SSH connectivity until we get enough consecutive successes or hit a limit. + * + * @param string $brancherHypernode Hostname to check + * @param int $requiredConsecutiveSuccesses Number of consecutive successes required + * @param int $maxFailedAttempts Maximum failed attempts before giving up (0 = no limit, use timeout only) + * @param int $checkInterval Seconds between checks + * @param float $timeElapsed Reference to track elapsed time + * @param float $latest Reference to track latest timestamp + * @param int $timeout Maximum time allowed + * @return bool True if SSH check succeeded, false if we should fall back to other methods + */ + private function pollSshConnectivity( + string $brancherHypernode, + int $requiredConsecutiveSuccesses, + int $maxFailedAttempts, + int $checkInterval, + float &$timeElapsed, + float &$latest, + int $timeout + ): bool { $consecutiveSuccesses = 0; + $failedAttempts = 0; + while ($timeElapsed < $timeout) { - $now = microtime(true); + $now = $this->sshPoller->microtime(); $timeElapsed += $now - $latest; $latest = $now; - $connection = @fsockopen(sprintf("%s.hypernode.io", $brancherHypernode), 22); - if ($connection) { - fclose($connection); + // Check if we've hit the max failed attempts limit (0 = unlimited) + if ($maxFailedAttempts > 0 && $failedAttempts >= $maxFailedAttempts) { + return false; + } + + if ($this->sshPoller->poll($brancherHypernode)) { $consecutiveSuccesses++; $this->log->info( sprintf( 'Brancher Hypernode %s reachability check %d/%d succeeded.', $brancherHypernode, $consecutiveSuccesses, - $reachabilityCheckCount + $requiredConsecutiveSuccesses ) ); - if ($consecutiveSuccesses >= $reachabilityCheckCount) { - break; + if ($consecutiveSuccesses >= $requiredConsecutiveSuccesses) { + return true; } - sleep($reachabilityCheckInterval); } else { if ($consecutiveSuccesses > 0) { $this->log->info( @@ -211,27 +312,18 @@ public function waitForAvailability( 'Brancher Hypernode %s reachability check failed, resetting counter (was at %d/%d).', $brancherHypernode, $consecutiveSuccesses, - $reachabilityCheckCount + $requiredConsecutiveSuccesses ) ); } $consecutiveSuccesses = 0; - sleep($reachabilityCheckInterval); + $failedAttempts++; } - } - if ($consecutiveSuccesses < $reachabilityCheckCount) { - throw new TimeoutException( - sprintf('Timed out waiting for brancher Hypernode %s to become reachable', $brancherHypernode) - ); + $this->sshPoller->sleep($checkInterval); } - $this->log->info( - sprintf( - 'Brancher Hypernode %s became reachable!', - $brancherHypernode - ) - ); + return false; } /** diff --git a/src/Brancher/SshPoller.php b/src/Brancher/SshPoller.php new file mode 100644 index 0000000..33c4526 --- /dev/null +++ b/src/Brancher/SshPoller.php @@ -0,0 +1,44 @@ +logger = $this->createMock(LoggerInterface::class); + $this->hypernodeClient = $this->createMock(HypernodeClient::class); + $this->logbook = $this->createMock(Logbook::class); + $this->hypernodeClient->logbook = $this->logbook; + $this->sshPoller = new TestSshPoller(); + $this->sshPoller->setMicrotime(1000.0); + + $this->manager = new BrancherHypernodeManager( + $this->logger, + $this->hypernodeClient, + $this->sshPoller + ); + } + + public function testSshFirstCheckSucceedsReturnsEarly(): void + { + $this->sshPoller->pollResults = [true, true, true]; + + $this->logbook->expects($this->never())->method('getList'); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(3, $this->sshPoller->pollCount); + } + + public function testSshFirstCheckFailsFallsBackToLogbook(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $flow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $this->logbook->expects($this->once()) + ->method('getList') + ->with('test-brancher') + ->willReturn([$flow]); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + public function testLogbookAllFlowsRevertedThrowsException(): void + { + $this->sshPoller->pollResults = array_fill(0, 5, false); + + $flow = $this->createFlow('ensure_app', Flow::STATE_REVERTED); + $this->logbook->expects($this->once()) + ->method('getList') + ->with('test-brancher') + ->willReturn([$flow]); + + $this->expectException(CreateBrancherHypernodeFailedException::class); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + } + + public function testTimeoutDuringDeliveryThrowsException(): void + { + $this->sshPoller->pollResults = array_fill(0, 5, false); + $this->sshPoller->sleepTimeAdvance = 10; + + $flow = $this->createFlow('ensure_app', Flow::STATE_RUNNING); + $this->logbook->method('getList') + ->with('test-brancher') + ->willReturn([$flow]); + + $this->expectException(TimeoutException::class); + $this->expectExceptionMessage('Timed out waiting for brancher Hypernode test-brancher to be delivered'); + + $this->manager->waitForAvailability('test-brancher', 30, 6, 10); + } + + public function testTimeoutDuringReachabilityThrowsException(): void + { + $this->sshPoller->pollResults = array_fill(0, 100, false); + $this->sshPoller->sleepTimeAdvance = 10; + + $flow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $this->logbook->method('getList') + ->with('test-brancher') + ->willReturn([$flow]); + + $this->expectException(TimeoutException::class); + $this->expectExceptionMessage('Timed out waiting for brancher Hypernode test-brancher to become reachable'); + + $this->manager->waitForAvailability('test-brancher', 100, 6, 10); + } + + public function testLogbook404DuringAllowedWindowContinuesPolling(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(404); + $response->method('getBody')->willReturn('Not Found'); + $exception404 = new HypernodeApiClientException($response); + + $flow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $this->logbook->expects($this->exactly(2)) + ->method('getList') + ->with('test-brancher') + ->willReturnOnConsecutiveCalls( + $this->throwException($exception404), + [$flow] + ); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + public function testLogbookNon404ErrorPropagates(): void + { + $this->sshPoller->pollResults = array_fill(0, 5, false); + + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(500); + $response->method('getBody')->willReturn('Internal Server Error'); + $exception500 = new HypernodeApiClientException($response); + + $this->logbook->expects($this->once()) + ->method('getList') + ->with('test-brancher') + ->willThrowException($exception500); + + $this->expectException(HypernodeApiClientException::class); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + } + + public function testSshFirstCheckIntermittentFailuresResetCounter(): void + { + $this->sshPoller->pollResults = [true, true, false, true, true, true]; + + $this->logbook->expects($this->never())->method('getList'); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(6, $this->sshPoller->pollCount); + } + + public function testSshFirstCheckExhaustsMaxFailuresBeforeFallback(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $flow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $this->logbook->expects($this->once()) + ->method('getList') + ->willReturn([$flow]); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + public function testMultipleFlowsAllMustComplete(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $flowComplete = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $flowRunning = $this->createFlow('ensure_copied_app', Flow::STATE_RUNNING); + $flowComplete2 = $this->createFlow('ensure_copied_app', Flow::STATE_SUCCESS); + + $this->logbook->expects($this->exactly(2)) + ->method('getList') + ->willReturnOnConsecutiveCalls( + [$flowComplete, $flowRunning], + [$flowComplete, $flowComplete2] + ); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + public function testEmptyLogbookContinuesPolling(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $flow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + $this->logbook->expects($this->exactly(2)) + ->method('getList') + ->willReturnOnConsecutiveCalls([], [$flow]); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + public function testIrrelevantFlowsAreIgnored(): void + { + $this->sshPoller->pollResults = array_merge( + array_fill(0, 5, false), + array_fill(0, 6, true) + ); + + $irrelevantFlow = $this->createFlow('some_other_flow', Flow::STATE_RUNNING); + $relevantFlow = $this->createFlow('ensure_app', Flow::STATE_SUCCESS); + + $this->logbook->expects($this->exactly(2)) + ->method('getList') + ->willReturnOnConsecutiveCalls( + [$irrelevantFlow], + [$relevantFlow, $irrelevantFlow] + ); + + $this->manager->waitForAvailability('test-brancher', 1500, 6, 10); + + $this->assertSame(11, $this->sshPoller->pollCount); + } + + private function createFlow(string $name, string $state): Flow + { + return new Flow([ + 'name' => $name, + 'state' => $state, + ]); + } +} diff --git a/tests/Unit/Brancher/TestSshPoller.php b/tests/Unit/Brancher/TestSshPoller.php new file mode 100644 index 0000000..11c084b --- /dev/null +++ b/tests/Unit/Brancher/TestSshPoller.php @@ -0,0 +1,73 @@ +currentMicrotime = $time; + } + + /** + * Advance microtime by a specific amount + */ + public function advanceMicrotime(float $seconds): void + { + $this->currentMicrotime += $seconds; + } + + public function poll(string $hostname): bool + { + $this->pollCount++; + if ($this->pollIndex >= count($this->pollResults)) { + return false; // Default to false if we run out of results + } + return $this->pollResults[$this->pollIndex++]; + } + + public function sleep(int $seconds): void + { + $this->sleepCount++; + $this->sleepCalls[] = $seconds; + + // Advance simulated time + if ($this->sleepTimeAdvance > 0) { + $this->currentMicrotime += $this->sleepTimeAdvance; + } else { + $this->currentMicrotime += $seconds; + } + // Don't actually sleep in tests + } + + public function microtime(): float + { + return $this->currentMicrotime; + } +} From 146b862a3dd9a1e1f6e089cc34d15364fddd021a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Jan 2026 14:32:23 +0100 Subject: [PATCH 203/210] Brancher: Handle already cancelled error It doesn't make any sense to fail on brancher already being cancelled or not existing. --- src/Brancher/BrancherHypernodeManager.php | 15 +++- .../Brancher/BrancherHypernodeManagerTest.php | 88 +++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/src/Brancher/BrancherHypernodeManager.php b/src/Brancher/BrancherHypernodeManager.php index dc93ad8..394c34e 100644 --- a/src/Brancher/BrancherHypernodeManager.php +++ b/src/Brancher/BrancherHypernodeManager.php @@ -337,7 +337,20 @@ public function cancel(string ...$brancherHypernodes): void { foreach ($brancherHypernodes as $brancherHypernode) { $this->log->info(sprintf('Stopping brancher Hypernode %s...', $brancherHypernode)); - $this->hypernodeClient->brancherApp->cancel($brancherHypernode); + try { + $this->hypernodeClient->brancherApp->cancel($brancherHypernode); + } catch (HypernodeApiClientException $e) { + // If the brancher is already cancelled or not found, that's fine - + // our goal was to cancel it anyway + if ($e->getCode() === 404 || str_contains($e->getMessage(), 'has already been cancelled')) { + $this->log->info(sprintf( + 'Brancher Hypernode %s was already cancelled or not found, skipping.', + $brancherHypernode + )); + continue; + } + throw $e; + } } } } diff --git a/tests/Unit/Brancher/BrancherHypernodeManagerTest.php b/tests/Unit/Brancher/BrancherHypernodeManagerTest.php index 719372b..e226410 100644 --- a/tests/Unit/Brancher/BrancherHypernodeManagerTest.php +++ b/tests/Unit/Brancher/BrancherHypernodeManagerTest.php @@ -7,6 +7,7 @@ use Hypernode\Api\Exception\HypernodeApiClientException; use Hypernode\Api\HypernodeClient; use Hypernode\Api\Resource\Logbook\Flow; +use Hypernode\Api\Service\BrancherApp; use Hypernode\Api\Service\Logbook; use Hypernode\Deploy\Brancher\BrancherHypernodeManager; use Hypernode\Deploy\Exception\CreateBrancherHypernodeFailedException; @@ -20,6 +21,7 @@ class BrancherHypernodeManagerTest extends TestCase { private LoggerInterface&MockObject $logger; private HypernodeClient&MockObject $hypernodeClient; + private BrancherApp&MockObject $brancherApp; private Logbook&MockObject $logbook; private TestSshPoller $sshPoller; private BrancherHypernodeManager $manager; @@ -28,7 +30,9 @@ protected function setUp(): void { $this->logger = $this->createMock(LoggerInterface::class); $this->hypernodeClient = $this->createMock(HypernodeClient::class); + $this->brancherApp = $this->createMock(BrancherApp::class); $this->logbook = $this->createMock(Logbook::class); + $this->hypernodeClient->brancherApp = $this->brancherApp; $this->hypernodeClient->logbook = $this->logbook; $this->sshPoller = new TestSshPoller(); $this->sshPoller->setMicrotime(1000.0); @@ -258,4 +262,88 @@ private function createFlow(string $name, string $state): Flow 'state' => $state, ]); } + + public function testCancelSucceeds(): void + { + $this->brancherApp->expects($this->once()) + ->method('cancel') + ->with('test-brancher'); + + $this->manager->cancel('test-brancher'); + } + + public function testCancelAlreadyCancelledBrancherContinues(): void + { + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(400); + $response->method('getBody')->willReturn('["Brancher app test-brancher has already been cancelled."]'); + $exception = new HypernodeApiClientException($response); + + $this->brancherApp->expects($this->once()) + ->method('cancel') + ->with('test-brancher') + ->willThrowException($exception); + + $this->logger->expects($this->exactly(2)) + ->method('info'); + + // Should not throw + $this->manager->cancel('test-brancher'); + } + + public function testCancelNotFoundBrancherContinues(): void + { + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(404); + $response->method('getBody')->willReturn('Not Found'); + $exception = new HypernodeApiClientException($response); + + $this->brancherApp->expects($this->once()) + ->method('cancel') + ->with('test-brancher') + ->willThrowException($exception); + + $this->logger->expects($this->exactly(2)) + ->method('info'); + + // Should not throw + $this->manager->cancel('test-brancher'); + } + + public function testCancelOtherClientErrorPropagates(): void + { + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(403); + $response->method('getBody')->willReturn('Forbidden'); + $exception = new HypernodeApiClientException($response); + + $this->brancherApp->expects($this->once()) + ->method('cancel') + ->with('test-brancher') + ->willThrowException($exception); + + $this->expectException(HypernodeApiClientException::class); + + $this->manager->cancel('test-brancher'); + } + + public function testCancelMultipleBranchersPartialFailure(): void + { + $response = $this->createMock(ResponseInterface::class); + $response->method('getStatusCode')->willReturn(400); + $response->method('getBody')->willReturn('["Brancher app brancher-1 has already been cancelled."]'); + $exception = new HypernodeApiClientException($response); + + $this->brancherApp->expects($this->exactly(2)) + ->method('cancel') + ->willReturnCallback(function (string $name) use ($exception) { + if ($name === 'brancher-1') { + throw $exception; + } + // brancher-2 succeeds + }); + + // Should not throw, should continue to second brancher + $this->manager->cancel('brancher-1', 'brancher-2'); + } } From f5e84f848299295c8bfcf9746ed8a9bb2ee400aa Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Jan 2026 14:18:03 +0100 Subject: [PATCH 204/210] Add unit tests for basic classes These unit tests have been written for classes that required little to no changes in the source files to be testable. --- .gitignore | 3 + src/Report/ReportLoader.php | 13 +- src/Report/ReportWriter.php | 9 +- .../Unit/Console/Output/ConsoleLoggerTest.php | 305 ++++++++++++++++++ .../Unit/Console/Output/OutputWatcherTest.php | 185 +++++++++++ tests/Unit/Deployer/FunctionsTest.php | 96 ++++++ .../Task/IncrementedTaskTraitTest.php | 75 +++++ .../Deployer/Task/TestIncrementedTask.php | 23 ++ .../Printer/GithubWorkflowPrinterTest.php | 201 ++++++++++++ tests/Unit/Report/ReportLoaderTest.php | 126 ++++++++ tests/Unit/Report/ReportTest.php | 88 +++++ tests/Unit/Report/ReportWriterTest.php | 107 ++++++ tests/Unit/Stdlib/RevisionFinderTest.php | 48 +++ 13 files changed, 1275 insertions(+), 4 deletions(-) create mode 100644 tests/Unit/Console/Output/ConsoleLoggerTest.php create mode 100644 tests/Unit/Console/Output/OutputWatcherTest.php create mode 100644 tests/Unit/Deployer/FunctionsTest.php create mode 100644 tests/Unit/Deployer/Task/IncrementedTaskTraitTest.php create mode 100644 tests/Unit/Deployer/Task/TestIncrementedTask.php create mode 100644 tests/Unit/Printer/GithubWorkflowPrinterTest.php create mode 100644 tests/Unit/Report/ReportLoaderTest.php create mode 100644 tests/Unit/Report/ReportTest.php create mode 100644 tests/Unit/Report/ReportWriterTest.php create mode 100644 tests/Unit/Stdlib/RevisionFinderTest.php diff --git a/.gitignore b/.gitignore index 8044a40..2bd424f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ *.iml *.local.* *.swp + +# Tests +.phpunit.result.cache diff --git a/src/Report/ReportLoader.php b/src/Report/ReportLoader.php index b4b6e26..77c401e 100644 --- a/src/Report/ReportLoader.php +++ b/src/Report/ReportLoader.php @@ -8,11 +8,18 @@ class ReportLoader { + private string $reportPath; + + public function __construct(string $reportPath = Report::REPORT_FILENAME) + { + $this->reportPath = $reportPath; + } + public function loadReport(): ?Report { - if (file_exists(Report::REPORT_FILENAME)) { - $contents = file_get_contents(Report::REPORT_FILENAME); - $data = json_decode($contents, true, JSON_THROW_ON_ERROR); + if (file_exists($this->reportPath)) { + $contents = file_get_contents($this->reportPath); + $data = json_decode($contents, true, flags: JSON_THROW_ON_ERROR); Assert::isArray($data); return Report::fromArray($data); } diff --git a/src/Report/ReportWriter.php b/src/Report/ReportWriter.php index e02a591..d4aca84 100644 --- a/src/Report/ReportWriter.php +++ b/src/Report/ReportWriter.php @@ -6,8 +6,15 @@ class ReportWriter { + private string $reportPath; + + public function __construct(string $reportPath = Report::REPORT_FILENAME) + { + $this->reportPath = $reportPath; + } + public function write(Report $report): void { - file_put_contents(Report::REPORT_FILENAME, json_encode($report->toArray())); + file_put_contents($this->reportPath, json_encode($report->toArray())); } } diff --git a/tests/Unit/Console/Output/ConsoleLoggerTest.php b/tests/Unit/Console/Output/ConsoleLoggerTest.php new file mode 100644 index 0000000..7bde375 --- /dev/null +++ b/tests/Unit/Console/Output/ConsoleLoggerTest.php @@ -0,0 +1,305 @@ +output = $this->createMock(OutputInterface::class); + $this->output->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $this->logger = new ConsoleLogger($this->output); + } + + public function testLogInterpolatesStringPlaceholder(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Hello World'), + $this->anything() + ); + + $this->logger->info('Hello {name}', ['name' => 'World']); + } + + public function testLogInterpolatesIntegerPlaceholder(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Count: 42'), + $this->anything() + ); + + $this->logger->info('Count: {count}', ['count' => 42]); + } + + public function testLogInterpolatesFloatPlaceholder(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Value: 3.14'), + $this->anything() + ); + + $this->logger->info('Value: {value}', ['value' => 3.14]); + } + + public function testLogInterpolatesBooleanPlaceholder(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Active: 1'), + $this->anything() + ); + + $this->logger->info('Active: {active}', ['active' => true]); + } + + public function testLogInterpolatesObjectWithToString(): void + { + $object = new class { + public function __toString(): string + { + return 'StringableObject'; + } + }; + + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Object: StringableObject'), + $this->anything() + ); + + $this->logger->info('Object: {obj}', ['obj' => $object]); + } + + public function testLogInterpolatesDateTimeInterface(): void + { + $date = new DateTime('2024-01-15T10:30:00+00:00'); + + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Date: 2024-01-15T10:30:00+00:00'), + $this->anything() + ); + + $this->logger->info('Date: {date}', ['date' => $date]); + } + + public function testLogInterpolatesObjectWithoutToStringAsClassName(): void + { + $object = new \stdClass(); + + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('[object stdClass]'), + $this->anything() + ); + + $this->logger->info('Object: {obj}', ['obj' => $object]); + } + + public function testLogInterpolatesArrayAsArrayType(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('[array]'), + $this->anything() + ); + + $this->logger->info('Data: {data}', ['data' => ['foo', 'bar']]); + } + + public function testLogInterpolatesNullAsEmpty(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Value: '), + $this->anything() + ); + + $this->logger->info('Value: {value}', ['value' => null]); + } + + public function testLogWithoutPlaceholdersReturnsMessageUnchanged(): void + { + $this->output->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('Simple message'), + $this->anything() + ); + + $this->logger->info('Simple message'); + } + + public function testLogThrowsExceptionForInvalidLevel(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('The log level "invalid" does not exist.'); + + $this->logger->log('invalid', 'test message'); + } + + public function testHasErroredReturnsFalseInitially(): void + { + $this->assertSame(false, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsTrueAfterErrorLog(): void + { + $this->logger->error('An error occurred'); + + $this->assertSame(true, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsTrueAfterCriticalLog(): void + { + $this->logger->critical('Critical error'); + + $this->assertSame(true, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsFalseAfterInfoLog(): void + { + $this->logger->info('Info message'); + + $this->assertSame(false, $this->logger->hasErrored()); + } + + public function testErrorLevelWritesToErrorOutput(): void + { + $errorOutput = $this->createMock(OutputInterface::class); + $errorOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $errorOutput->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('error message'), + $this->anything() + ); + + $consoleOutput = $this->createMock(ConsoleOutputInterface::class); + $consoleOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $consoleOutput->method('getErrorOutput')->willReturn($errorOutput); + + $logger = new ConsoleLogger($consoleOutput); + $logger->error('error message'); + } + + public function testDebugLevelNotWrittenAtNormalVerbosity(): void + { + $this->output->expects($this->never())->method('writeln'); + + $this->logger->debug('debug message'); + } + + public function testDebugLevelWrittenAtVerboseLevel(): void + { + $verboseOutput = $this->createMock(OutputInterface::class); + $verboseOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_VERBOSE); + $verboseOutput->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('debug message'), + $this->anything() + ); + + $logger = new ConsoleLogger($verboseOutput); + $logger->debug('debug message'); + } + + // Additional log level tests + + public function testHasErroredReturnsTrueAfterEmergencyLog(): void + { + $this->logger->emergency('Emergency error'); + + $this->assertSame(true, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsTrueAfterAlertLog(): void + { + $this->logger->alert('Alert error'); + + $this->assertSame(true, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsFalseAfterWarningLog(): void + { + $this->logger->warning('Warning message'); + + $this->assertSame(false, $this->logger->hasErrored()); + } + + public function testHasErroredReturnsFalseAfterNoticeLog(): void + { + $this->logger->notice('Notice message'); + + $this->assertSame(false, $this->logger->hasErrored()); + } + + public function testCustomVerbosityLevelMapIsUsed(): void + { + // Create custom map where info requires verbose + $customVerbosityMap = [ + LogLevel::INFO => OutputInterface::VERBOSITY_VERBOSE, + ]; + + $normalOutput = $this->createMock(OutputInterface::class); + $normalOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $normalOutput->expects($this->never())->method('writeln'); + + $logger = new ConsoleLogger($normalOutput, $customVerbosityMap); + $logger->info('This should not be written at normal verbosity'); + } + + public function testCustomFormatLevelMapIsUsed(): void + { + // Create custom map where warning is treated as error (writes to error output) + $customFormatMap = [ + LogLevel::WARNING => ConsoleLogger::ERROR, + ]; + + $errorOutput = $this->createMock(OutputInterface::class); + $errorOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $errorOutput->expects($this->once()) + ->method('writeln') + ->with( + $this->stringContains('warning treated as error'), + $this->anything() + ); + + $consoleOutput = $this->createMock(ConsoleOutputInterface::class); + $consoleOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $consoleOutput->method('getErrorOutput')->willReturn($errorOutput); + + $logger = new ConsoleLogger($consoleOutput, [], $customFormatMap); + $logger->warning('warning treated as error'); + + // Warning with custom format map should set errored flag + $this->assertSame(true, $logger->hasErrored()); + } +} diff --git a/tests/Unit/Console/Output/OutputWatcherTest.php b/tests/Unit/Console/Output/OutputWatcherTest.php new file mode 100644 index 0000000..ea9df1b --- /dev/null +++ b/tests/Unit/Console/Output/OutputWatcherTest.php @@ -0,0 +1,185 @@ +wrappedOutput = $this->createMock(OutputInterface::class); + $this->wrappedOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_NORMAL); + $this->watcher = new OutputWatcher($this->wrappedOutput); + } + + public function testGetWasWrittenReturnsFalseInitially(): void + { + $this->assertSame(false, $this->watcher->getWasWritten()); + } + + public function testWriteSetsWasWrittenToTrue(): void + { + $this->watcher->write('test message'); + + $this->assertSame(true, $this->watcher->getWasWritten()); + } + + public function testWritelnSetsWasWrittenToTrue(): void + { + $this->watcher->writeln('test message'); + + $this->assertSame(true, $this->watcher->getWasWritten()); + } + + public function testSetWasWrittenCanResetFlag(): void + { + $this->watcher->write('test'); + $this->assertSame(true, $this->watcher->getWasWritten()); + + $this->watcher->setWasWritten(false); + $this->assertSame(false, $this->watcher->getWasWritten()); + } + + public function testSetWasWrittenCanSetFlagDirectly(): void + { + $this->watcher->setWasWritten(true); + $this->assertSame(true, $this->watcher->getWasWritten()); + } + + public function testWriteDelegatesToWrappedOutput(): void + { + $this->wrappedOutput->expects($this->once()) + ->method('write') + ->with('test message', false, OutputInterface::OUTPUT_NORMAL); + + $this->watcher->write('test message'); + } + + public function testWritelnDelegatesToWrappedOutputWithNewline(): void + { + $this->wrappedOutput->expects($this->once()) + ->method('write') + ->with('test message', true, OutputInterface::OUTPUT_NORMAL); + + $this->watcher->writeln('test message'); + } + + public function testGetVerbosityDelegatesToWrappedOutput(): void + { + $verboseOutput = $this->createMock(OutputInterface::class); + $verboseOutput->expects($this->atLeastOnce()) + ->method('getVerbosity') + ->willReturn(OutputInterface::VERBOSITY_VERBOSE); + + $watcher = new OutputWatcher($verboseOutput); + + $this->assertSame(OutputInterface::VERBOSITY_VERBOSE, $watcher->getVerbosity()); + } + + public function testSetVerbosityDelegatesToWrappedOutput(): void + { + $this->wrappedOutput->expects($this->once()) + ->method('setVerbosity') + ->with(OutputInterface::VERBOSITY_DEBUG); + + $this->watcher->setVerbosity(OutputInterface::VERBOSITY_DEBUG); + } + + public function testIsQuietReturnsTrueWhenVerbosityIsQuiet(): void + { + $quietOutput = $this->createMock(OutputInterface::class); + $quietOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_QUIET); + + $watcher = new OutputWatcher($quietOutput); + + $this->assertSame(true, $watcher->isQuiet()); + } + + public function testIsQuietReturnsFalseWhenVerbosityIsNormal(): void + { + $this->assertSame(false, $this->watcher->isQuiet()); + } + + public function testIsVerboseReturnsTrueWhenVerbosityIsVerbose(): void + { + $verboseOutput = $this->createMock(OutputInterface::class); + $verboseOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_VERBOSE); + + $watcher = new OutputWatcher($verboseOutput); + + $this->assertSame(true, $watcher->isVerbose()); + } + + public function testIsVerboseReturnsFalseWhenVerbosityIsNormal(): void + { + $this->assertSame(false, $this->watcher->isVerbose()); + } + + public function testIsVeryVerboseReturnsTrueWhenVerbosityIsVeryVerbose(): void + { + $veryVerboseOutput = $this->createMock(OutputInterface::class); + $veryVerboseOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_VERY_VERBOSE); + + $watcher = new OutputWatcher($veryVerboseOutput); + + $this->assertSame(true, $watcher->isVeryVerbose()); + } + + public function testIsDebugReturnsTrueWhenVerbosityIsDebug(): void + { + $debugOutput = $this->createMock(OutputInterface::class); + $debugOutput->method('getVerbosity')->willReturn(OutputInterface::VERBOSITY_DEBUG); + + $watcher = new OutputWatcher($debugOutput); + + $this->assertSame(true, $watcher->isDebug()); + } + + public function testIsDecoratedDelegatesToWrappedOutput(): void + { + $this->wrappedOutput->expects($this->once()) + ->method('isDecorated') + ->willReturn(true); + + $this->assertSame(true, $this->watcher->isDecorated()); + } + + public function testSetDecoratedDelegatesToWrappedOutput(): void + { + $this->wrappedOutput->expects($this->once()) + ->method('setDecorated') + ->with(true); + + $this->watcher->setDecorated(true); + } + + public function testGetFormatterDelegatesToWrappedOutput(): void + { + $formatter = $this->createMock(OutputFormatterInterface::class); + $this->wrappedOutput->expects($this->once()) + ->method('getFormatter') + ->willReturn($formatter); + + $this->assertSame($formatter, $this->watcher->getFormatter()); + } + + public function testSetFormatterDelegatesToWrappedOutput(): void + { + $formatter = $this->createMock(OutputFormatterInterface::class); + $this->wrappedOutput->expects($this->once()) + ->method('setFormatter') + ->with($formatter); + + $this->watcher->setFormatter($formatter); + } +} diff --git a/tests/Unit/Deployer/FunctionsTest.php b/tests/Unit/Deployer/FunctionsTest.php new file mode 100644 index 0000000..2285508 --- /dev/null +++ b/tests/Unit/Deployer/FunctionsTest.php @@ -0,0 +1,96 @@ +assertSame('first_value', $result); + } + + public function testGetenvFallbackReturnsSecondWhenFirstNotSet(): void + { + putenv(self::ENV_VAR_1); + putenv(self::ENV_VAR_2 . '=second_value'); + + $result = getenvFallback([self::ENV_VAR_1, self::ENV_VAR_2]); + + $this->assertSame('second_value', $result); + } + + public function testGetenvFallbackReturnsThirdWhenFirstTwoNotSet(): void + { + putenv(self::ENV_VAR_1); + putenv(self::ENV_VAR_2); + putenv(self::ENV_VAR_3 . '=third_value'); + + $result = getenvFallback([self::ENV_VAR_1, self::ENV_VAR_2, self::ENV_VAR_3]); + + $this->assertSame('third_value', $result); + } + + public function testGetenvFallbackThrowsExceptionWhenNoneSet(): void + { + putenv(self::ENV_VAR_1); + putenv(self::ENV_VAR_2); + + $this->expectException(EnvironmentVariableNotDefinedException::class); + $this->expectExceptionMessage( + 'None of the requested environment variables ' . self::ENV_VAR_1 . ', ' . self::ENV_VAR_2 . ' is defined' + ); + + getenvFallback([self::ENV_VAR_1, self::ENV_VAR_2]); + } + + public function testGetenvFallbackWithEmptyArrayThrowsException(): void + { + $this->expectException(EnvironmentVariableNotDefinedException::class); + $this->expectExceptionMessage('None of the requested environment variables is defined'); + + getenvFallback([]); + } + + // Tests for noop() function + + public function testNoopReturnsCallable(): void + { + $result = noop(); + + $this->assertInstanceOf(\Closure::class, $result); + } + + public function testNoopReturnedClosureDoesNothing(): void + { + $closure = noop(); + + // Should execute without error and return nothing + $result = $closure(); + + $this->assertNull($result); + } +} diff --git a/tests/Unit/Deployer/Task/IncrementedTaskTraitTest.php b/tests/Unit/Deployer/Task/IncrementedTaskTraitTest.php new file mode 100644 index 0000000..37f1bad --- /dev/null +++ b/tests/Unit/Deployer/Task/IncrementedTaskTraitTest.php @@ -0,0 +1,75 @@ +assertSame('test:task:0', $task->getTaskName()); + $this->assertSame('test:task:1', $task->getTaskName()); + $this->assertSame('test:task:2', $task->getTaskName()); + } + + public function testGetTaskNameWithIdentifierIncludesIdentifier(): void + { + $task = new TestIncrementedTask(); + + $result = $task->getTaskName('foo'); + + $this->assertSame('test:task:foo:0', $result); + } + + public function testGetTaskNameWithIdentifierIncrementsCounter(): void + { + $task = new TestIncrementedTask(); + + $this->assertSame('test:task:foo:0', $task->getTaskName('foo')); + $this->assertSame('test:task:bar:1', $task->getTaskName('bar')); + $this->assertSame('test:task:foo:2', $task->getTaskName('foo')); + } + + public function testGetTaskNameMixedWithAndWithoutIdentifier(): void + { + $task = new TestIncrementedTask(); + + $this->assertSame('test:task:0', $task->getTaskName()); + $this->assertSame('test:task:foo:1', $task->getTaskName('foo')); + $this->assertSame('test:task:2', $task->getTaskName()); + } + + public function testGetRegisteredTasksReturnsAllGeneratedNames(): void + { + $task = new TestIncrementedTask(); + + $task->getTaskName(); + $task->getTaskName('foo'); + $task->getTaskName(); + + $this->assertSame( + ['test:task:0', 'test:task:foo:1', 'test:task:2'], + $task->getRegisteredTasks() + ); + } + + public function testGetRegisteredTasksReturnsEmptyArrayInitially(): void + { + $task = new TestIncrementedTask(); + + $this->assertSame([], $task->getRegisteredTasks()); + } + + public function testGetTaskNameWithEmptyIdentifierTreatedAsNoIdentifier(): void + { + $task = new TestIncrementedTask(); + + // Empty string should be treated same as no identifier due to !empty() check + $this->assertSame('test:task:0', $task->getTaskName('')); + } +} diff --git a/tests/Unit/Deployer/Task/TestIncrementedTask.php b/tests/Unit/Deployer/Task/TestIncrementedTask.php new file mode 100644 index 0000000..ad6c3e1 --- /dev/null +++ b/tests/Unit/Deployer/Task/TestIncrementedTask.php @@ -0,0 +1,23 @@ +output = $this->createMock(OutputInterface::class); + $this->printer = new GithubWorkflowPrinter($this->output); + } + + public function testContentHasWorkflowCommandReturnsTrueForWarningCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::warning::some message')); + } + + public function testContentHasWorkflowCommandReturnsTrueForErrorCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::error::something went wrong')); + } + + public function testContentHasWorkflowCommandReturnsTrueForSetOutputCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::set-output name=foo::bar')); + } + + public function testContentHasWorkflowCommandReturnsTrueForDebugCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::debug::debug info')); + } + + public function testContentHasWorkflowCommandReturnsTrueForGroupCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::group::My Group')); + } + + public function testContentHasWorkflowCommandReturnsTrueForEndGroupCommand(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::endgroup::')); + } + + public function testContentHasWorkflowCommandReturnsFalseForRegularText(): void + { + $this->assertSame(false, $this->printer->contentHasWorkflowCommand('Hello world')); + } + + public function testContentHasWorkflowCommandReturnsFalseForEmptyString(): void + { + $this->assertSame(false, $this->printer->contentHasWorkflowCommand('')); + } + + public function testContentHasWorkflowCommandReturnsFalseForPartialCommand(): void + { + $this->assertSame(false, $this->printer->contentHasWorkflowCommand('::invalid')); + } + + public function testContentHasWorkflowCommandReturnsFalseForColonsWithoutCommand(): void + { + $this->assertSame(false, $this->printer->contentHasWorkflowCommand(':: ::')); + } + + public function testContentHasWorkflowCommandReturnsTrueForCommandInMultilineContent(): void + { + $content = "Some regular output\n::warning::a warning message\nMore output"; + $this->assertSame(true, $this->printer->contentHasWorkflowCommand($content)); + } + + public function testContentHasWorkflowCommandReturnsTrueForCommandWithFileAndLine(): void + { + $this->assertSame(true, $this->printer->contentHasWorkflowCommand('::error file=app.js,line=10::error message')); + } + + // Tests for writeln() method + + public function testWritelnOutputsWorkflowCommandDirectlyForStdout(): void + { + $host = $this->createMock(Host::class); + + $this->output->expects($this->once()) + ->method('writeln') + ->with('::warning::test message'); + + $this->printer->writeln(Process::OUT, $host, '::warning::test message'); + } + + public function testWritelnDoesNotOutputEmptyLine(): void + { + $host = $this->createMock(Host::class); + + $this->output->expects($this->never()) + ->method('writeln'); + + $this->printer->writeln(Process::OUT, $host, ''); + } + + public function testWritelnDelegatesToParentForNonWorkflowStdout(): void + { + $host = $this->createMock(Host::class); + $host->method('__toString')->willReturn('test-host'); + + // Parent's writeln will be called which writes "[host] line" format + $this->output->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('regular output')); + + $this->printer->writeln(Process::OUT, $host, 'regular output'); + } + + public function testWritelnDelegatesToParentForStderr(): void + { + $host = $this->createMock(Host::class); + $host->method('__toString')->willReturn('test-host'); + + // Even workflow commands on stderr should go through parent + $this->output->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('::warning::')); + + $this->printer->writeln(Process::ERR, $host, '::warning::error stream message'); + } + + // Tests for callback() method + + public function testCallbackPrintsWhenForceOutputIsTrue(): void + { + $host = $this->createMock(Host::class); + $host->method('__toString')->willReturn('test-host'); + + $this->output->method('isVerbose')->willReturn(false); + $this->output->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('forced output')); + + $callback = $this->printer->callback($host, true); + $callback(Process::OUT, 'forced output'); + } + + public function testCallbackPrintsWhenVerbose(): void + { + $host = $this->createMock(Host::class); + $host->method('__toString')->willReturn('test-host'); + + $this->output->method('isVerbose')->willReturn(true); + $this->output->expects($this->once()) + ->method('writeln') + ->with($this->stringContains('verbose output')); + + $callback = $this->printer->callback($host, false); + $callback(Process::OUT, 'verbose output'); + } + + public function testCallbackPrintsWorkflowCommandOnStdoutEvenWhenNotVerbose(): void + { + $host = $this->createMock(Host::class); + + $this->output->method('isVerbose')->willReturn(false); + $this->output->expects($this->once()) + ->method('writeln') + ->with('::warning::workflow command'); + + $callback = $this->printer->callback($host, false); + $callback(Process::OUT, '::warning::workflow command'); + } + + public function testCallbackDoesNotPrintRegularOutputWhenNotVerboseAndNotForced(): void + { + $host = $this->createMock(Host::class); + + $this->output->method('isVerbose')->willReturn(false); + $this->output->expects($this->never())->method('writeln'); + + $callback = $this->printer->callback($host, false); + $callback(Process::OUT, 'regular output that should be suppressed'); + } + + public function testCallbackDoesNotPrintWorkflowCommandOnStderrWhenNotVerbose(): void + { + $host = $this->createMock(Host::class); + + $this->output->method('isVerbose')->willReturn(false); + // Workflow command on stderr should NOT be printed when not verbose/forced + // because the condition checks $type == Process::OUT + $this->output->expects($this->never())->method('writeln'); + + $callback = $this->printer->callback($host, false); + $callback(Process::ERR, '::warning::workflow on stderr'); + } +} diff --git a/tests/Unit/Report/ReportLoaderTest.php b/tests/Unit/Report/ReportLoaderTest.php new file mode 100644 index 0000000..dbb7455 --- /dev/null +++ b/tests/Unit/Report/ReportLoaderTest.php @@ -0,0 +1,126 @@ +tempDir = sys_get_temp_dir() . '/hypernode-deploy-test-' . uniqid(); + mkdir($this->tempDir, 0777, true); + $this->reportPath = $this->tempDir . '/' . Report::REPORT_FILENAME; + } + + protected function tearDown(): void + { + if (file_exists($this->reportPath)) { + unlink($this->reportPath); + } + if (is_dir($this->tempDir)) { + rmdir($this->tempDir); + } + } + + public function testLoadReportReturnsNullWhenFileDoesNotExist(): void + { + $loader = new ReportLoader($this->reportPath); + + $result = $loader->loadReport(); + + $this->assertNull($result); + } + + public function testLoadReportReturnsReportWhenFileExists(): void + { + $data = [ + 'version' => 'v1', + 'stage' => 'production', + 'hostnames' => ['app.hypernode.io'], + 'brancher_hypernodes' => ['app-ephabc123.hypernode.io'], + ]; + file_put_contents($this->reportPath, json_encode($data)); + + $loader = new ReportLoader($this->reportPath); + + $result = $loader->loadReport(); + + $this->assertInstanceOf(Report::class, $result); + } + + public function testLoadReportParsesJsonCorrectly(): void + { + $data = [ + 'version' => 'v1', + 'stage' => 'staging', + 'hostnames' => ['staging.hypernode.io', 'staging2.hypernode.io'], + 'brancher_hypernodes' => ['staging-ephabc123.hypernode.io'], + ]; + file_put_contents($this->reportPath, json_encode($data)); + + $loader = new ReportLoader($this->reportPath); + + $result = $loader->loadReport(); + + $this->assertSame('v1', $result->getVersion()); + $this->assertSame('staging', $result->getStage()); + $this->assertSame(['staging.hypernode.io', 'staging2.hypernode.io'], $result->getHostnames()); + $this->assertSame(['staging-ephabc123.hypernode.io'], $result->getBrancherHypernodes()); + } + + public function testLoadReportThrowsExceptionForInvalidJson(): void + { + file_put_contents($this->reportPath, 'this is not valid json'); + + $loader = new ReportLoader($this->reportPath); + + $this->expectException(JsonException::class); + + $loader->loadReport(); + } + + public function testLoadReportHandlesEmptyArrays(): void + { + $data = [ + 'version' => 'v1', + 'stage' => 'test', + 'hostnames' => [], + 'brancher_hypernodes' => [], + ]; + file_put_contents($this->reportPath, json_encode($data)); + + $loader = new ReportLoader($this->reportPath); + + $result = $loader->loadReport(); + + $this->assertSame([], $result->getHostnames()); + $this->assertSame([], $result->getBrancherHypernodes()); + } + + public function testLoadReportRoundTripWithWriter(): void + { + $originalReport = new Report( + 'production', + ['app.hypernode.io', 'app2.hypernode.io'], + ['app-ephabc123.hypernode.io'], + 'v1' + ); + + file_put_contents($this->reportPath, json_encode($originalReport->toArray())); + + $loader = new ReportLoader($this->reportPath); + + $loadedReport = $loader->loadReport(); + + $this->assertSame($originalReport->toArray(), $loadedReport->toArray()); + } +} diff --git a/tests/Unit/Report/ReportTest.php b/tests/Unit/Report/ReportTest.php new file mode 100644 index 0000000..b7a44d6 --- /dev/null +++ b/tests/Unit/Report/ReportTest.php @@ -0,0 +1,88 @@ +toArray(); + + $this->assertSame('v1', $result['version']); + $this->assertSame('production', $result['stage']); + $this->assertSame(['app1.hypernode.io', 'app2.hypernode.io'], $result['hostnames']); + $this->assertSame(['app1-ephabc123.hypernode.io'], $result['brancher_hypernodes']); + } + + public function testFromArrayCreatesReportWithCorrectValues(): void + { + $data = [ + 'version' => 'v1', + 'stage' => 'staging', + 'hostnames' => ['staging.hypernode.io'], + 'brancher_hypernodes' => ['staging-ephabc123.hypernode.io'], + ]; + + $report = Report::fromArray($data); + + $this->assertSame('v1', $report->getVersion()); + $this->assertSame('staging', $report->getStage()); + $this->assertSame(['staging.hypernode.io'], $report->getHostnames()); + $this->assertSame(['staging-ephabc123.hypernode.io'], $report->getBrancherHypernodes()); + } + + public function testToArrayFromArrayRoundTripProducesEqualData(): void + { + $originalData = [ + 'version' => 'v1', + 'stage' => 'production', + 'hostnames' => ['app.hypernode.io'], + 'brancher_hypernodes' => ['app-ephabc123.hypernode.io'], + ]; + + $report = Report::fromArray($originalData); + $resultData = $report->toArray(); + + $this->assertSame($originalData, $resultData); + } + + public function testDefaultVersionIsV1(): void + { + $report = new Report( + 'production', + ['app.hypernode.io'], + ['app-ephabc123.hypernode.io'] + ); + + $this->assertSame(Report::REPORT_VERSION, $report->getVersion()); + $this->assertSame('v1', $report->getVersion()); + } + + public function testEmptyHostnamesArrayIsHandled(): void + { + $report = new Report('production', [], ['app-ephabc123.hypernode.io']); + + $this->assertSame([], $report->getHostnames()); + $this->assertSame([], $report->toArray()['hostnames']); + } + + public function testEmptyBrancherHypernodesArrayIsHandled(): void + { + $report = new Report('production', ['app.hypernode.io'], []); + + $this->assertSame([], $report->getBrancherHypernodes()); + $this->assertSame([], $report->toArray()['brancher_hypernodes']); + } +} diff --git a/tests/Unit/Report/ReportWriterTest.php b/tests/Unit/Report/ReportWriterTest.php new file mode 100644 index 0000000..b5e580e --- /dev/null +++ b/tests/Unit/Report/ReportWriterTest.php @@ -0,0 +1,107 @@ +tempDir = sys_get_temp_dir() . '/hypernode-deploy-test-' . uniqid(); + mkdir($this->tempDir, 0777, true); + $this->reportPath = $this->tempDir . '/' . Report::REPORT_FILENAME; + } + + protected function tearDown(): void + { + if (file_exists($this->reportPath)) { + unlink($this->reportPath); + } + if (is_dir($this->tempDir)) { + rmdir($this->tempDir); + } + } + + public function testWriteCreatesJsonFile(): void + { + $report = new Report('production', ['app.hypernode.io'], ['app-ephabc123.hypernode.io']); + + $writer = new ReportWriter($this->reportPath); + $writer->write($report); + + $this->assertFileExists($this->reportPath); + } + + public function testWriteCreatesValidJson(): void + { + $report = new Report('production', ['app.hypernode.io'], ['app-ephabc123.hypernode.io']); + + $writer = new ReportWriter($this->reportPath); + $writer->write($report); + + $contents = file_get_contents($this->reportPath); + $decoded = json_decode($contents, true); + + $this->assertNotNull($decoded); + $this->assertIsArray($decoded); + } + + public function testWriteContainsCorrectData(): void + { + $report = new Report( + 'staging', + ['staging.hypernode.io', 'staging2.hypernode.io'], + ['staging-ephabc123.hypernode.io'], + 'v1' + ); + + $writer = new ReportWriter($this->reportPath); + $writer->write($report); + + $contents = file_get_contents($this->reportPath); + $decoded = json_decode($contents, true); + + $this->assertSame('v1', $decoded['version']); + $this->assertSame('staging', $decoded['stage']); + $this->assertSame(['staging.hypernode.io', 'staging2.hypernode.io'], $decoded['hostnames']); + $this->assertSame(['staging-ephabc123.hypernode.io'], $decoded['brancher_hypernodes']); + } + + public function testWriteOverwritesExistingFile(): void + { + file_put_contents($this->reportPath, '{"old": "data"}'); + + $report = new Report('production', ['new.hypernode.io'], []); + + $writer = new ReportWriter($this->reportPath); + $writer->write($report); + + $contents = file_get_contents($this->reportPath); + $decoded = json_decode($contents, true); + + $this->assertSame('production', $decoded['stage']); + $this->assertArrayNotHasKey('old', $decoded); + } + + public function testWriteWithEmptyArrays(): void + { + $report = new Report('test', [], []); + + $writer = new ReportWriter($this->reportPath); + $writer->write($report); + + $contents = file_get_contents($this->reportPath); + $decoded = json_decode($contents, true); + + $this->assertSame([], $decoded['hostnames']); + $this->assertSame([], $decoded['brancher_hypernodes']); + } +} diff --git a/tests/Unit/Stdlib/RevisionFinderTest.php b/tests/Unit/Stdlib/RevisionFinderTest.php new file mode 100644 index 0000000..62bf52f --- /dev/null +++ b/tests/Unit/Stdlib/RevisionFinderTest.php @@ -0,0 +1,48 @@ +getRevision(); + + $this->assertSame('abc123def456', $result); + } + + public function testGetRevisionReturnsMasterWhenEnvVarIsNotSet(): void + { + putenv(self::ENV_VAR); + + $finder = new RevisionFinder(); + $result = $finder->getRevision(); + + $this->assertSame('master', $result); + } + + public function testGetRevisionReturnsMasterWhenEnvVarIsEmptyString(): void + { + putenv(self::ENV_VAR . '='); + + $finder = new RevisionFinder(); + $result = $finder->getRevision(); + + $this->assertSame('master', $result); + } +} From 5554806e338a9d867dd9e2f9d49ff0424eff1b41 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Jan 2026 12:28:08 +0100 Subject: [PATCH 205/210] deps: Update deploy-configuration to 3.6.1 Release notes: https://github.com/ByteInternet/hypernode-deploy-configuration/releases/tag/3.6.1 --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 046b18f..651e2fe 100644 --- a/composer.lock +++ b/composer.lock @@ -917,16 +917,16 @@ }, { "name": "hypernode/deploy-configuration", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/ByteInternet/hypernode-deploy-configuration.git", - "reference": "7abbb530e95add7d64dd4312e12643f6fe7aeb0c" + "reference": "9925cffca3d028044f39b9d081a288fd07dd67aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/7abbb530e95add7d64dd4312e12643f6fe7aeb0c", - "reference": "7abbb530e95add7d64dd4312e12643f6fe7aeb0c", + "url": "https://api.github.com/repos/ByteInternet/hypernode-deploy-configuration/zipball/9925cffca3d028044f39b9d081a288fd07dd67aa", + "reference": "9925cffca3d028044f39b9d081a288fd07dd67aa", "shasum": "" }, "require": { @@ -954,9 +954,9 @@ "description": "Hypernode deploy configuration files", "support": { "issues": "https://github.com/ByteInternet/hypernode-deploy-configuration/issues", - "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.6.0" + "source": "https://github.com/ByteInternet/hypernode-deploy-configuration/tree/3.6.1" }, - "time": "2025-12-24T09:41:44+00:00" + "time": "2026-01-19T14:43:33+00:00" }, { "name": "justinrainbow/json-schema", From 7e54d67d7659d7569c00b747aad7ea48acf9556a Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Jan 2026 15:31:04 +0100 Subject: [PATCH 206/210] Cachetool: Update binary version mapping --- src/Deployer/Task/After/CachetoolTask.php | 34 +++++--- .../Deployer/Task/After/CachetoolTaskTest.php | 85 +++++++++++++++++++ 2 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 tests/Unit/Deployer/Task/After/CachetoolTaskTest.php diff --git a/src/Deployer/Task/After/CachetoolTask.php b/src/Deployer/Task/After/CachetoolTask.php index 2f097e6..69c6c4e 100644 --- a/src/Deployer/Task/After/CachetoolTask.php +++ b/src/Deployer/Task/After/CachetoolTask.php @@ -19,6 +19,7 @@ class CachetoolTask extends TaskBase /** * @var string[] * + * CacheTool 9.x/10.x works with PHP >=8.1 * CacheTool 8.x works with PHP >=8.0 * CacheTool 7.x works with PHP >=7.3 * CacheTool 6.x works with PHP >=7.3 @@ -26,7 +27,8 @@ class CachetoolTask extends TaskBase * CacheTool 4.x works with PHP >=7.1 */ private $versionBinaryMapping = [ - 8 => 'https://github.com/gordalina/cachetool/releases/download/8.4.0/cachetool.phar', + 10 => 'https://github.com/gordalina/cachetool/releases/download/10.0.0/cachetool.phar', + 8 => 'https://github.com/gordalina/cachetool/releases/download/8.6.1/cachetool.phar', 7 => 'https://github.com/gordalina/cachetool/releases/download/7.1.0/cachetool.phar', 6 => 'https://github.com/gordalina/cachetool/releases/download/6.6.0/cachetool.phar', 5 => 'https://github.com/gordalina/cachetool/releases/download/5.1.3/cachetool.phar', @@ -52,10 +54,10 @@ public function configure(Configuration $config): void $cachetoolBinary = get('cachetool_binary'); within('{{release_path}}', function () { - run('curl -L -o cachetool.phar ' . $this->getCachetoolUrl()); + $phpVersion = $this->getPhpVersion(); $cachetoolBinary = '{{release_path}}/cachetool.phar'; - - writeln(sprintf("Downloaded cachetool %s for PHP %f", $cachetoolBinary, $this->getPhpVersion())); + run('curl -L -o cachetool.phar ' . $this->getCachetoolUrl($phpVersion)); + writeln(sprintf("Downloaded cachetool %s for PHP %s", $cachetoolBinary, $phpVersion)); return $cachetoolBinary; }); return $cachetoolBinary; @@ -103,30 +105,36 @@ public function configure(Configuration $config): void }); } - protected function getPhpVersion(): float + protected function getPhpVersion(): string { - return (float) run('{{bin/php}} -r "echo PHP_VERSION . \" - \" . PHP_VERSION_ID;"'); + return run('{{bin/php}} -r "echo PHP_VERSION;"'); } - public function getCachetoolUrl(): string + public function getCachetoolUrl(?string $phpVersion = null): string { - $phpVersion = $this->getPhpVersion(); - if ($phpVersion >= 8.0) { + $phpVersion = $phpVersion ?? $this->getPhpVersion(); + + if (version_compare($phpVersion, '8.1.0', '>=')) { + return $this->versionBinaryMapping[10]; + } + + if (version_compare($phpVersion, '8.0.0', '>=')) { return $this->versionBinaryMapping[8]; } - if ($phpVersion >= 7.3) { + if (version_compare($phpVersion, '7.3.0', '>=')) { return $this->versionBinaryMapping[7]; } - if ($phpVersion >= 7.2) { + if (version_compare($phpVersion, '7.2.0', '>=')) { return $this->versionBinaryMapping[5]; } - if ($phpVersion >= 7.1) { + if (version_compare($phpVersion, '7.1.0', '>=')) { return $this->versionBinaryMapping[4]; } - return $this->versionBinaryMapping[8]; + // Default to latest for unknown/newer PHP versions + return $this->versionBinaryMapping[10]; } } diff --git a/tests/Unit/Deployer/Task/After/CachetoolTaskTest.php b/tests/Unit/Deployer/Task/After/CachetoolTaskTest.php new file mode 100644 index 0000000..4c07ae7 --- /dev/null +++ b/tests/Unit/Deployer/Task/After/CachetoolTaskTest.php @@ -0,0 +1,85 @@ +task = new CachetoolTask(); + } + + /** + * @dataProvider phpVersionToCachetoolUrlProvider + */ + public function testGetCachetoolUrlReturnsCorrectVersionForPhpVersion( + string $phpVersion, + string $expectedUrlPart + ): void { + $result = $this->task->getCachetoolUrl($phpVersion); + + $this->assertStringContainsString($expectedUrlPart, $result); + } + + /** + * @return array + */ + public static function phpVersionToCachetoolUrlProvider(): array + { + return [ + // PHP 8.1+ should get cachetool 10.x + 'PHP 8.3.15 gets cachetool 10' => ['8.3.15', '10.0.0'], + 'PHP 8.2.0 gets cachetool 10' => ['8.2.0', '10.0.0'], + 'PHP 8.1.0 gets cachetool 10' => ['8.1.0', '10.0.0'], + 'PHP 8.1.27 gets cachetool 10' => ['8.1.27', '10.0.0'], + + // PHP 8.0.x should get cachetool 8.x + 'PHP 8.0.0 gets cachetool 8' => ['8.0.0', '8.6.1'], + 'PHP 8.0.30 gets cachetool 8' => ['8.0.30', '8.6.1'], + + // PHP 7.3+ should get cachetool 7.x + 'PHP 7.4.33 gets cachetool 7' => ['7.4.33', '7.1.0'], + 'PHP 7.3.0 gets cachetool 7' => ['7.3.0', '7.1.0'], + 'PHP 7.3.33 gets cachetool 7' => ['7.3.33', '7.1.0'], + + // PHP 7.2.x should get cachetool 5.x + 'PHP 7.2.0 gets cachetool 5' => ['7.2.0', '5.1.3'], + 'PHP 7.2.34 gets cachetool 5' => ['7.2.34', '5.1.3'], + + // PHP 7.1.x should get cachetool 4.x + 'PHP 7.1.0 gets cachetool 4' => ['7.1.0', '4.1.1'], + 'PHP 7.1.33 gets cachetool 4' => ['7.1.33', '4.1.1'], + + // Unsupported/old PHP versions fall back to latest (10.x) + 'PHP 7.0.33 falls back to cachetool 10' => ['7.0.33', '10.0.0'], + 'PHP 5.6.40 falls back to cachetool 10' => ['5.6.40', '10.0.0'], + + // Future PHP versions should get latest (10.x) + 'PHP 9.0.0 gets cachetool 10' => ['9.0.0', '10.0.0'], + 'PHP 8.4.0 gets cachetool 10' => ['8.4.0', '10.0.0'], + ]; + } + + public function testGetCachetoolUrlReturnsFullGithubUrl(): void + { + $result = $this->task->getCachetoolUrl('8.2.0'); + + $this->assertStringStartsWith('https://github.com/gordalina/cachetool/releases/download/', $result); + $this->assertStringEndsWith('/cachetool.phar', $result); + } + + public function testGetCachetoolUrlForPhp71ReturnsLegacyUrl(): void + { + $result = $this->task->getCachetoolUrl('7.1.0'); + + // Cachetool 4.x uses a different URL format (gordalina.github.io) + $this->assertStringStartsWith('https://gordalina.github.io/cachetool/downloads/', $result); + } +} From afafd29bd58c6abffc2d914e0d93f116f3b33032 Mon Sep 17 00:00:00 2001 From: Timon de Groot Date: Tue, 20 Jan 2026 15:33:17 +0100 Subject: [PATCH 207/210] Cachetool: Don't run by default On the Hypernode platform, we have validate_timestamps enabled by default, so we don't have to manually clear the opcache. People can still enable this by configuring `after('deploy:symlink', 'cachetool:clear:opcache');`. --- src/Deployer/Task/After/CachetoolTask.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Deployer/Task/After/CachetoolTask.php b/src/Deployer/Task/After/CachetoolTask.php index 69c6c4e..c522224 100644 --- a/src/Deployer/Task/After/CachetoolTask.php +++ b/src/Deployer/Task/After/CachetoolTask.php @@ -37,7 +37,6 @@ class CachetoolTask extends TaskBase public function register(): void { - after('deploy:symlink', 'cachetool:clear:opcache'); after('cachetool:clear:opcache', 'cachetool:cleanup'); } From f1cf00853fa8cdf41e57dce2f92d708c3c4fc557 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 2 Feb 2026 18:01:05 +0100 Subject: [PATCH 208/210] Add high-performance static content deployment task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Integrate elgentos/magento2-static-deploy Go binary for 230-380x faster static content deployment. The task overrides magento:deploy:assets when enabled via enableHighPerformanceStaticDeploy() in the configuration. Features: - Downloads Go binary from GitHub releases (supports 'latest' or specific version) - Deploys both frontend and adminhtml areas - Uses Deployer variables: magento_themes, static_content_locales, content_version - Auto-detects Hyvä vs Luma themes (Luma dispatched to bin/magento) --- .../Build/HighPerformanceStaticDeployTask.php | 87 ++++++++++ .../HighPerformanceStaticDeployTaskTest.php | 152 ++++++++++++++++++ 2 files changed, 239 insertions(+) create mode 100644 src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php create mode 100644 tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php diff --git a/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php b/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php new file mode 100644 index 0000000..0349c1e --- /dev/null +++ b/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php @@ -0,0 +1,87 @@ +isEnabled($config)) { + return; + } + + $version = $this->getVersion($config); + + task('magento:deploy:assets', function () use ($version) { + within('{{release_or_current_path}}', function () use ($version) { + run(sprintf('curl -sL -o /tmp/magento2-static-deploy %s', $this->getBinaryUrl($version))); + run('chmod +x /tmp/magento2-static-deploy'); + }); + + $themes = get('magento_themes', []); + $themeArgs = $this->buildThemeArgs($themes); + $locales = get('static_content_locales', 'en_US'); + $contentVersion = get('content_version', time()); + + within('{{release_or_current_path}}', function () use ($themeArgs, $locales, $contentVersion) { + run("/tmp/magento2-static-deploy --force --area=frontend --area=adminhtml $themeArgs --content-version=$contentVersion --verbose $locales"); + }); + })->select('stage=build'); + } + + public function isEnabled(Configuration $config): bool + { + $variables = $config->getVariables(); + $buildVariables = $config->getVariables('build'); + + return $variables['high_performance_static_deploy'] + ?? $buildVariables['high_performance_static_deploy'] + ?? false; + } + + public function getVersion(Configuration $config): string + { + $variables = $config->getVariables(); + $buildVariables = $config->getVariables('build'); + + return $variables['high_performance_static_deploy_version'] + ?? $buildVariables['high_performance_static_deploy_version'] + ?? self::DEFAULT_VERSION; + } + + public function getBinaryUrl(string $version): string + { + if ($version === 'latest') { + return self::BINARY_URL_LATEST; + } + + return sprintf(self::BINARY_URL_VERSIONED, $version); + } + + /** + * @param array $themes + */ + public function buildThemeArgs(array $themes): string + { + return implode(' ', array_map(fn($t) => "--theme=$t", array_keys($themes))); + } +} diff --git a/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php b/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php new file mode 100644 index 0000000..35521ad --- /dev/null +++ b/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php @@ -0,0 +1,152 @@ +task = new HighPerformanceStaticDeployTask(); + } + + public function testIsEnabledReturnsFalseWhenNotConfigured(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables')->willReturn([]); + + $this->assertFalse($this->task->isEnabled($config)); + } + + public function testIsEnabledReturnsTrueWhenEnabledInVariables(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables') + ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { + 'all' => ['high_performance_static_deploy' => true], + default => [], + }); + + $this->assertTrue($this->task->isEnabled($config)); + } + + public function testIsEnabledReturnsTrueWhenEnabledInBuildVariables(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables') + ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { + 'build' => ['high_performance_static_deploy' => true], + default => [], + }); + + $this->assertTrue($this->task->isEnabled($config)); + } + + public function testIsEnabledReturnsFalseWhenExplicitlyDisabled(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables') + ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { + 'all' => ['high_performance_static_deploy' => false], + default => [], + }); + + $this->assertFalse($this->task->isEnabled($config)); + } + + public function testGetVersionReturnsDefaultWhenNotConfigured(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables')->willReturn([]); + + $this->assertSame('latest', $this->task->getVersion($config)); + } + + public function testGetVersionReturnsConfiguredVersion(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables') + ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { + 'all' => ['high_performance_static_deploy_version' => '1.0.0'], + default => [], + }); + + $this->assertSame('1.0.0', $this->task->getVersion($config)); + } + + public function testGetVersionReturnsBuildVersionWhenNotInAllVariables(): void + { + $config = $this->createMock(Configuration::class); + $config->method('getVariables') + ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { + 'build' => ['high_performance_static_deploy_version' => '2.0.0'], + default => [], + }); + + $this->assertSame('2.0.0', $this->task->getVersion($config)); + } + + public function testGetBinaryUrlReturnsLatestUrl(): void + { + $result = $this->task->getBinaryUrl('latest'); + + $this->assertSame( + 'https://github.com/elgentos/magento2-static-deploy/releases/latest/download/magento2-static-deploy-linux-amd64', + $result + ); + } + + public function testGetBinaryUrlReturnsVersionedUrl(): void + { + $result = $this->task->getBinaryUrl('0.0.8'); + + $this->assertSame( + 'https://github.com/elgentos/magento2-static-deploy/releases/download/0.0.8/magento2-static-deploy-linux-amd64', + $result + ); + } + + public function testGetBinaryUrlWithDifferentVersion(): void + { + $result = $this->task->getBinaryUrl('1.2.3'); + + $this->assertStringContainsString('1.2.3', $result); + $this->assertStringContainsString('magento2-static-deploy-linux-amd64', $result); + } + + public function testBuildThemeArgsWithSingleTheme(): void + { + $themes = ['Vendor/theme' => 'nl_NL en_US']; + + $result = $this->task->buildThemeArgs($themes); + + $this->assertSame('--theme=Vendor/theme', $result); + } + + public function testBuildThemeArgsWithMultipleThemes(): void + { + $themes = [ + 'Vendor/theme1' => 'nl_NL', + 'Vendor/theme2' => 'en_US', + 'Vendor/theme3' => 'de_DE', + ]; + + $result = $this->task->buildThemeArgs($themes); + + $this->assertSame('--theme=Vendor/theme1 --theme=Vendor/theme2 --theme=Vendor/theme3', $result); + } + + public function testBuildThemeArgsWithEmptyArray(): void + { + $result = $this->task->buildThemeArgs([]); + + $this->assertSame('', $result); + } +} From 4af95c9aa5f8a9e41dbea4366bde54715894db32 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Fri, 27 Feb 2026 12:15:25 +0100 Subject: [PATCH 209/210] Add support for NodeJS 24 --- .github/workflows/publish.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 380fb91..5e21b91 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -17,12 +17,13 @@ jobs: - 18 - 20 - 22 + - 24 runs-on: ubuntu-latest env: PHP_VERSION: ${{ matrix.php_version }} NODE_VERSION: ${{ matrix.node_version }} LATEST_PHP_VERSION: 8.4 - LATEST_NODE_VERSION: 22 + LATEST_NODE_VERSION: 24 steps: - name: Checkout hypernode-deploy uses: actions/checkout@v3 From b4a0f296e262bc8953f3c1c1afb6a04d2fde59c8 Mon Sep 17 00:00:00 2001 From: Jonathan Visser Date: Mon, 9 Mar 2026 15:11:31 +0100 Subject: [PATCH 210/210] Pre-install magento2-static-deploy binary in Docker image - Add elgentos/magento2-static-deploy binary to /opt in Dockerfile - Simplify HighPerformanceStaticDeployTask to use pre-installed binary - Remove version configuration and runtime download logic - Update tests to reflect simplified implementation --- ci/build/Dockerfile | 5 ++ .../Build/HighPerformanceStaticDeployTask.php | 34 +---------- .../HighPerformanceStaticDeployTaskTest.php | 60 ------------------- 3 files changed, 8 insertions(+), 91 deletions(-) diff --git a/ci/build/Dockerfile b/ci/build/Dockerfile index 2a5f7c0..d870d20 100644 --- a/ci/build/Dockerfile +++ b/ci/build/Dockerfile @@ -117,6 +117,11 @@ RUN curl -sS https://getcomposer.org/installer | php -- --2.2 --filename=compose # Use version 1 for main composer binary RUN rm -f /usr/local/bin/composer; ln -s /usr/local/bin/composer2 /usr/local/bin/composer +# Install elgentos magento2-static-deploy binary for high-performance static content deployment +RUN curl -sL -o /opt/magento2-static-deploy \ + https://github.com/elgentos/magento2-static-deploy/releases/latest/download/magento2-static-deploy-linux-amd64 \ + && chmod +x /opt/magento2-static-deploy + # Set python3 as default python executable RUN ln -s /usr/bin/python3 /usr/local/bin/python diff --git a/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php b/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php index 0349c1e..bd2a7ff 100644 --- a/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php +++ b/src/Deployer/Task/Build/HighPerformanceStaticDeployTask.php @@ -19,9 +19,7 @@ */ class HighPerformanceStaticDeployTask extends TaskBase { - private const BINARY_URL_VERSIONED = 'https://github.com/elgentos/magento2-static-deploy/releases/download/%s/magento2-static-deploy-linux-amd64'; - private const BINARY_URL_LATEST = 'https://github.com/elgentos/magento2-static-deploy/releases/latest/download/magento2-static-deploy-linux-amd64'; - private const DEFAULT_VERSION = 'latest'; + private const BINARY_PATH = '/opt/magento2-static-deploy'; public function configure(Configuration $config): void { @@ -29,21 +27,14 @@ public function configure(Configuration $config): void return; } - $version = $this->getVersion($config); - - task('magento:deploy:assets', function () use ($version) { - within('{{release_or_current_path}}', function () use ($version) { - run(sprintf('curl -sL -o /tmp/magento2-static-deploy %s', $this->getBinaryUrl($version))); - run('chmod +x /tmp/magento2-static-deploy'); - }); - + task('magento:deploy:assets', function () { $themes = get('magento_themes', []); $themeArgs = $this->buildThemeArgs($themes); $locales = get('static_content_locales', 'en_US'); $contentVersion = get('content_version', time()); within('{{release_or_current_path}}', function () use ($themeArgs, $locales, $contentVersion) { - run("/tmp/magento2-static-deploy --force --area=frontend --area=adminhtml $themeArgs --content-version=$contentVersion --verbose $locales"); + run(self::BINARY_PATH . " --force --area=frontend --area=adminhtml $themeArgs --content-version=$contentVersion --verbose $locales"); }); })->select('stage=build'); } @@ -58,25 +49,6 @@ public function isEnabled(Configuration $config): bool ?? false; } - public function getVersion(Configuration $config): string - { - $variables = $config->getVariables(); - $buildVariables = $config->getVariables('build'); - - return $variables['high_performance_static_deploy_version'] - ?? $buildVariables['high_performance_static_deploy_version'] - ?? self::DEFAULT_VERSION; - } - - public function getBinaryUrl(string $version): string - { - if ($version === 'latest') { - return self::BINARY_URL_LATEST; - } - - return sprintf(self::BINARY_URL_VERSIONED, $version); - } - /** * @param array $themes */ diff --git a/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php b/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php index 35521ad..5769c76 100644 --- a/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php +++ b/tests/Unit/Deployer/Task/Build/HighPerformanceStaticDeployTaskTest.php @@ -61,66 +61,6 @@ public function testIsEnabledReturnsFalseWhenExplicitlyDisabled(): void $this->assertFalse($this->task->isEnabled($config)); } - public function testGetVersionReturnsDefaultWhenNotConfigured(): void - { - $config = $this->createMock(Configuration::class); - $config->method('getVariables')->willReturn([]); - - $this->assertSame('latest', $this->task->getVersion($config)); - } - - public function testGetVersionReturnsConfiguredVersion(): void - { - $config = $this->createMock(Configuration::class); - $config->method('getVariables') - ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { - 'all' => ['high_performance_static_deploy_version' => '1.0.0'], - default => [], - }); - - $this->assertSame('1.0.0', $this->task->getVersion($config)); - } - - public function testGetVersionReturnsBuildVersionWhenNotInAllVariables(): void - { - $config = $this->createMock(Configuration::class); - $config->method('getVariables') - ->willReturnCallback(fn(string $stage = 'all') => match ($stage) { - 'build' => ['high_performance_static_deploy_version' => '2.0.0'], - default => [], - }); - - $this->assertSame('2.0.0', $this->task->getVersion($config)); - } - - public function testGetBinaryUrlReturnsLatestUrl(): void - { - $result = $this->task->getBinaryUrl('latest'); - - $this->assertSame( - 'https://github.com/elgentos/magento2-static-deploy/releases/latest/download/magento2-static-deploy-linux-amd64', - $result - ); - } - - public function testGetBinaryUrlReturnsVersionedUrl(): void - { - $result = $this->task->getBinaryUrl('0.0.8'); - - $this->assertSame( - 'https://github.com/elgentos/magento2-static-deploy/releases/download/0.0.8/magento2-static-deploy-linux-amd64', - $result - ); - } - - public function testGetBinaryUrlWithDifferentVersion(): void - { - $result = $this->task->getBinaryUrl('1.2.3'); - - $this->assertStringContainsString('1.2.3', $result); - $this->assertStringContainsString('magento2-static-deploy-linux-amd64', $result); - } - public function testBuildThemeArgsWithSingleTheme(): void { $themes = ['Vendor/theme' => 'nl_NL en_US'];