├── cache └── .gitkeep ├── composer.phar ├── scripts ├── splitsh-lite ├── setup_git.sh ├── split_repo.sh └── update_tags.sh ├── .gitignore ├── config └── parameters.php.sample ├── tests ├── TestCase.php ├── GithubClientMock.php ├── LabelsMock.php ├── GithubLabelsTest.php ├── KernelTest.php └── PullRequestJiraTicketTest.php ├── src ├── Listener │ ├── Listener.php │ ├── AddTagSplit.php │ ├── PushSplitRepo.php │ ├── PullRequestJiraTicket.php │ └── IssueCommentGithubLabels.php ├── Helper │ └── GithubHelper.php ├── Kernel.php └── ContainerBuilder.php ├── web └── index.php ├── .travis.yml ├── phpunit.xml.dist ├── composer.json ├── .github └── workflows │ └── tests.yml └── composer.lock /cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /composer.phar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/dev-hooks/master/composer.phar -------------------------------------------------------------------------------- /scripts/splitsh-lite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/phpbb/dev-hooks/master/scripts/splitsh-lite -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /config/parameters.php 3 | /cache/* 4 | !/cache/.git-keep 5 | /scripts/phpbb 6 | /scripts/phpbb-app 7 | /scripts/phpbb-core 8 | -------------------------------------------------------------------------------- /config/parameters.php.sample: -------------------------------------------------------------------------------- 1 | '', 3 | 'github_webhooks_secret' => '', 4 | 'jira_username' => '', 5 | 'jira_password' => '', 6 | ]; 7 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | class TestCase extends \PHPUnit\Framework\TestCase 11 | { 12 | } 13 | -------------------------------------------------------------------------------- /src/Listener/Listener.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Listener; 9 | 10 | interface Listener 11 | { 12 | public function handle(array $data); 13 | } 14 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | require __DIR__.'/../vendor/autoload.php'; 9 | 10 | (new Phpbb\DevHooks\ContainerBuilder) 11 | ->build()['kernel'] 12 | ->handle(file_get_contents('php://input'), $_SERVER); 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.6 5 | 6 | ## Run on container environment 7 | sudo: false 8 | 9 | ## Cache composer bits 10 | cache: 11 | directories: 12 | - vendor 13 | - $HOME/.composer/cache 14 | 15 | install: 16 | - composer install 17 | 18 | script: 19 | - vendor/bin/phpunit 20 | - vendor/bin/phpcs --standard=PSR2 --extensions=php -s src/ tests/ 21 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./src/ 6 | 7 | 8 | 9 | 10 | ./tests/ 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /scripts/setup_git.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Clone phpBB repo 4 | git clone git@github.com:phpbb/phpbb.git 5 | git clone git@github.com:phpbb/phpbb-app.git 6 | git clone git@github.com:phpbb/phpbb-core.git 7 | cd phpbb 8 | git remote add phpbb-app git@github.com:phpbb/phpbb-app.git 9 | git remote add phpbb-core git@github.com:phpbb/phpbb-core.git 10 | git fetch phpbb-app 11 | git fetch phpbb-core 12 | # Set up branches that are needed by the splitter 13 | git checkout -b 3.0.x origin/3.0.x 14 | git checkout -b 3.1.x origin/3.1.x 15 | git checkout -b 3.2.x origin/3.2.x 16 | -------------------------------------------------------------------------------- /tests/GithubClientMock.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use Github\Api\AbstractApi; 11 | use Github\Api\Issue; 12 | 13 | class GithubClientMock extends \Github\Client 14 | { 15 | public $labels; 16 | 17 | public AbstractApi $apiMock; 18 | 19 | public function __construct() 20 | { 21 | parent::__construct(); 22 | $this->labels = new LabelsMock(); 23 | } 24 | 25 | public function api($name): AbstractApi 26 | { 27 | return $this->apiMock; 28 | } 29 | 30 | public function labels() 31 | { 32 | return $this->labels; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoload": { 3 | "psr-4": { 4 | "Phpbb\\DevHooks\\": "src/" 5 | } 6 | }, 7 | "autoload-dev": { 8 | "psr-4": { 9 | "Phpbb\\DevHooks\\": "tests/" 10 | } 11 | }, 12 | "require": { 13 | "php": ">=8.1.0", 14 | "ext-curl": "*", 15 | "chobie/jira-api-restclient": "2.0.*@dev", 16 | "knplabs/github-api": "^3.13", 17 | "pimple/pimple": "^3.5", 18 | "guzzlehttp/guzzle": "^7.0.1", 19 | "http-interop/http-factory-guzzle": "^1.0" 20 | }, 21 | "require-dev": { 22 | "phpunit/phpunit": "^9.6", 23 | "squizlabs/php_codesniffer": "^3.7" 24 | }, 25 | "config": { 26 | "allow-plugins": { 27 | "php-http/discovery": true 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Listener/AddTagSplit.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Listener; 9 | 10 | class AddTagSplit implements Listener 11 | { 12 | protected $cacheDir; 13 | 14 | public function __construct($cacheDir) 15 | { 16 | $this->cacheDir = $cacheDir; 17 | } 18 | 19 | public function handle(array $data) 20 | { 21 | if (isset($data['ref_type']) && $data['ref_type'] === 'tag') { 22 | if (!file_exists($this->cacheDir . '.split_tags')) { 23 | $fp = fopen($this->cacheDir . '.split_tags', 'wb'); 24 | fwrite($fp, sha1($data['ref'])); 25 | fclose($fp); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Helper/GithubHelper.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Helper; 9 | 10 | use Github\AuthMethod; 11 | use Github\Client; 12 | 13 | class GithubHelper 14 | { 15 | protected Client $client; 16 | protected string $apiToken; 17 | protected bool $authed = false; 18 | 19 | public function __construct(Client $client, string $apiToken) 20 | { 21 | $this->client = $client; 22 | $this->apiToken = $apiToken; 23 | } 24 | 25 | public function getClient(): Client 26 | { 27 | return $this->client; 28 | } 29 | 30 | public function getAuthenticatedClient(): Client 31 | { 32 | if (!$this->authed) { 33 | $this->client->authenticate( 34 | $this->apiToken, 35 | AuthMethod::ACCESS_TOKEN 36 | ); 37 | } 38 | return $this->client; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - update/symfony_6.4 8 | pull_request: 9 | branches: 10 | - master 11 | 12 | jobs: 13 | tests: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | include: 18 | - php: '8.1' 19 | - php: '8.2' 20 | - php: '8.3' 21 | 22 | name: PHP ${{ matrix.php }} 23 | 24 | steps: 25 | - name: Checkout repository 26 | uses: actions/checkout@v3 27 | with: 28 | fetch-depth: 100 29 | 30 | - name: Setup PHP 31 | uses: shivammathur/setup-php@v2 32 | with: 33 | php-version: ${{ matrix.php }} 34 | extensions: dom, curl, libxml, mbstring, zip, pcntl, intl, gd, exif, iconv 35 | coverage: none 36 | 37 | - name: Setup environment for dev-hooks 38 | env: 39 | PHP_VERSION: ${{ matrix.php }} 40 | run: | 41 | php composer.phar install --no-interaction 42 | 43 | - name: Run unit tests 44 | run: | 45 | php vendor/bin/phpunit --verbose --stop-on-error 46 | -------------------------------------------------------------------------------- /src/Listener/PushSplitRepo.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Listener; 9 | 10 | class PushSplitRepo implements Listener 11 | { 12 | protected $cacheDir; 13 | 14 | protected $supportedRefs = [ 15 | '3.0.x', 16 | '3.1.x', 17 | '3.2.x', 18 | '3.3.x', 19 | 'master', 20 | ]; 21 | 22 | public function __construct($cacheDir) 23 | { 24 | $this->cacheDir = $cacheDir; 25 | } 26 | 27 | public function handle(array $data) 28 | { 29 | $cleanedRef = str_replace('refs/heads/', '', $data['ref']); 30 | 31 | // Create file for updating ref and let cron script handle the actual splitting 32 | if (in_array($cleanedRef, $this->supportedRefs)) { 33 | if (!file_exists($this->cacheDir . '.split_' . $cleanedRef)) { 34 | $fp = fopen($this->cacheDir . '.split_' . $cleanedRef, 'wb'); 35 | fwrite($fp, sha1($cleanedRef)); 36 | fclose($fp); 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/LabelsMock.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | class LabelsMock 11 | { 12 | public $addList = []; 13 | public $removeList = []; 14 | 15 | public function all($repoOwner, $repository) 16 | { 17 | return [ 18 | ['name' => '3.0 (Olympus)'], 19 | ['name' => '3.1 (Ascraeus)'], 20 | ['name' => '3.2 (Rhea)'], 21 | ['name' => '3.3 (Proteus)'], 22 | ['name' => 'Blocker :warning:'], 23 | ['name' => 'Event'], 24 | ['name' => 'Abandoned by Author 🏚️'], 25 | ['name' => 'Do not merge :hand:'], 26 | ['name' => 'GSOC 🎓'], 27 | ['name' => 'JS :scroll:'], 28 | ['name' => 'Missing Tests'], 29 | ['name' => 'Pending Closure'], 30 | ['name' => 'RFC Under Discussion'], 31 | ['name' => 'Styles 🎨'], 32 | ['name' => 'WIP :construction:'], 33 | ]; 34 | } 35 | 36 | public function add($owner, $name, $issueNumber, $label) 37 | { 38 | $this->addList[] = $label; 39 | } 40 | 41 | public function remove($owner, $name, $issueNumber, $label) 42 | { 43 | $this->removeList[] = $label; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use Pimple\Container; 11 | 12 | class Kernel 13 | { 14 | protected $githubWebhooksSecret; 15 | protected $container; 16 | 17 | public function __construct($githubWebhooksSecret, Container $container) 18 | { 19 | $this->githubWebhooksSecret = (string) $githubWebhooksSecret; 20 | $this->container = $container; 21 | } 22 | 23 | public function handle($body, array $server) 24 | { 25 | if (!isset($server['HTTP_X_GITHUB_EVENT'])) { 26 | throw new \UnexpectedValueException('Missing X-Github-Event header.'); 27 | } 28 | $this->checkMessageAuthentication($body, $server); 29 | $payload = json_decode($body, true); 30 | if (!is_array($payload)) { 31 | throw new \UnexpectedValueException('Expected payload to be array.'); 32 | } 33 | 34 | // Note: headers are not under the Message Authentication Code (MAC) 35 | // Also see https://github.com/github/github-services/issues/499 36 | $servicePrefix = sprintf('listener.%s.', $server['HTTP_X_GITHUB_EVENT']); 37 | foreach ($this->container->keys() as $serviceName) { 38 | if (strpos($serviceName, $servicePrefix) === 0) { 39 | $this->container[$serviceName]->handle($payload); 40 | } 41 | } 42 | } 43 | 44 | protected function checkMessageAuthentication($body, array $server) 45 | { 46 | if (!isset($server['HTTP_X_HUB_SIGNATURE'])) { 47 | throw new \UnexpectedValueException('Missing X-Hub-Signature header'); 48 | } 49 | $theirs = strtolower($server['HTTP_X_HUB_SIGNATURE']); 50 | $ours = 'sha1='.hash_hmac('sha1', $body, $this->githubWebhooksSecret); 51 | if (!hash_equals($ours, $theirs)) { 52 | throw new \UnexpectedValueException('Incorrect X-Hub-Signature header'); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /scripts/split_repo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Check if file for updating tags exists 4 | if [ -f "$PWD/../cache/.split_3.0.x" ] && [ ! -f "$PWD/../cache/.split_3.0.x.lock" ]; then 5 | target_branch="3.0.x" 6 | elif [ -f "$PWD/../cache/.split_3.1.x" ] && [ ! -f "$PWD/../cache/.split_3.1.x.lock" ]; then 7 | target_branch="3.1.x" 8 | elif [ -f "$PWD/../cache/.split_3.2.x" ] && [ ! -f "$PWD/../cache/.split_3.2.x.lock" ]; then 9 | target_branch="3.2.x" 10 | elif [ -f "$PWD/../cache/.split_3.3.x" ] && [ ! -f "$PWD/../cache/.split_3.3.x.lock" ]; then 11 | target_branch="3.3.x" 12 | elif [ -f "$PWD/../cache/.split_master" ] && [ ! -f "$PWD/../cache/.split_master.lock" ]; then 13 | target_branch="master" 14 | fi 15 | 16 | # Exit if we don't have a target branch 17 | if [ -z ${target_branch} ]; then 18 | exit 0 19 | fi 20 | 21 | phpbb_repo_exists=true 22 | phpbb_app_exists=true 23 | phpbb_core_exists=true 24 | # Check if phpBB repo exists 25 | if [ ! -d "$PWD/phpbb/.git" ]; then 26 | echo "phpBB repo has not been set up in phpbb subfolder." 27 | phpbb_repo_exists=false 28 | fi 29 | 30 | # Check if phpBB app repo exists 31 | if [ ! -d "$PWD/phpbb-app/.git" ]; then 32 | echo "phpBB app repo has not been set up in phpbb subfolder." 33 | phpbb_app_exists=false 34 | fi 35 | # Check if phpBB core repo exists 36 | if [ ! -d "$PWD/phpbb-core/.git" ]; then 37 | echo "phpBB core repo has not been set up in phpbb subfolder." 38 | phpbb_core_exists=false 39 | fi 40 | 41 | if [ "$phpbb_repo_exists" = false ] || [ "$phpbb_app_exists" = false ] || [ "$phpbb_core_exists" = false ] ; then 42 | exit 1 43 | fi 44 | 45 | # Create lock file 46 | touch "$PWD/../cache/.split_${target_branch}.lock" 47 | 48 | # Run splitter for splitting to phpbb-app 49 | $PWD/splitsh-lite --prefix=phpBB/ --origin=origin/${target_branch} --target=phpbb-app/${target_branch} --path=phpbb/ --git="<1.8.2" 50 | 51 | # Run splitter for splitting to phpbb-core 52 | if [ "$target_branch" = "3.1.x" ] || [ "$target_branch" = "3.2.x" ] || [ "$target_branch" = "3.3.x" ] || [ "$target_branch" = "master" ]; then 53 | $PWD/splitsh-lite --prefix=phpBB/phpbb --origin=origin/${target_branch} --target=phpbb-core/${target_branch} --path=phpbb/ --git="<1.8.2" 54 | fi 55 | 56 | # Push tags 57 | cd phpbb 58 | git fetch 59 | git reset --hard && git checkout ${target_branch} && git reset --hard phpbb-app/${target_branch} && git push phpbb-app ${target_branch} 60 | if [ "$target_branch" = "3.1.x" ] || [ "$target_branch" = "3.2.x" ] || [ "$target_branch" = "3.3.x" ] || [ "$target_branch" = "master" ]; then 61 | git checkout ${target_branch} && git reset --hard phpbb-core/${target_branch} && git push phpbb-core ${target_branch} 62 | fi 63 | cd .. 64 | 65 | # Delete lock file and split file 66 | rm "$PWD/../cache/.split_${target_branch}.lock" 67 | rm "$PWD/../cache/.split_${target_branch}" 68 | -------------------------------------------------------------------------------- /src/ContainerBuilder.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use Pimple\Container; 11 | 12 | class ContainerBuilder 13 | { 14 | /** @return \ArrayAccess */ 15 | public function build() 16 | { 17 | $values = [ 18 | // Parameters 19 | 'jira_url' => 'https://tracker.phpbb.com', 20 | 'cache_dir' => __DIR__ . '/../cache/', 21 | 22 | // Services 23 | 'github_client' => function ($c) { 24 | return new \Github\Client; 25 | }, 26 | 'github_helper' => function ($c) { 27 | return new Helper\GithubHelper( 28 | $c['github_client'], 29 | $c['github_api_token'] 30 | ); 31 | }, 32 | 'jira_client' => function ($c) { 33 | return new \chobie\Jira\Api( 34 | $c['jira_url'], 35 | new \chobie\Jira\Api\Authentication\Basic( 36 | $c['jira_username'], 37 | $c['jira_password'] 38 | ) 39 | ); 40 | }, 41 | 'kernel' => function ($c) { 42 | return new Kernel( 43 | $c['github_webhooks_secret'], 44 | $c 45 | ); 46 | }, 47 | 'listener.issue_comment.github_labels' => function ($c) { 48 | return new Listener\IssueCommentGithubLabels( 49 | $c['github_helper'] 50 | ); 51 | }, 52 | 'listener.pull_request.jira_ticket' => function ($c) { 53 | return new Listener\PullRequestJiraTicket( 54 | $c['github_helper'], 55 | $c['jira_client'] 56 | ); 57 | }, 58 | 'listener.push.split_repo' => function ($c) { 59 | return new Listener\PushSplitRepo( 60 | $c['cache_dir'] 61 | ); 62 | }, 63 | 'listener.push.add_tag' => function ($c) { 64 | return new Listener\AddTagSplit( 65 | $c['cache_dir'] 66 | ); 67 | }, 68 | 'listener.create.add_tag' => function ($c) { 69 | return new Listener\AddTagSplit( 70 | $c['cache_dir'] 71 | ); 72 | } 73 | ]; 74 | 75 | $secretsFile = __DIR__.'/../config/parameters.php'; 76 | if (file_exists($secretsFile)) { 77 | $secrets = require $secretsFile; 78 | if (is_array($secrets)) { 79 | $values = array_merge($values, $secrets); 80 | } 81 | } 82 | 83 | return new Container($values); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /scripts/update_tags.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Check if file for updating tags exists 4 | if [ ! -f "$PWD/../cache/.split_tags" ] || [ -f "$PWD/../cache/.split_tags.lock" ]; then 5 | exit 0 6 | fi 7 | 8 | phpbb_repo_exists=true 9 | phpbb_app_exists=true 10 | phpbb_core_exists=true 11 | # Check if phpBB repo exists 12 | if [ ! -d "$PWD/phpbb/.git" ]; then 13 | echo "phpBB repo has not been set up in phpbb subfolder." 14 | phpbb_repo_exists=false 15 | fi 16 | 17 | # Check if phpBB app repo exists 18 | if [ ! -d "$PWD/phpbb-app/.git" ]; then 19 | echo "phpBB app repo has not been set up in phpbb subfolder." 20 | phpbb_app_exists=false 21 | fi 22 | # Check if phpBB core repo exists 23 | if [ ! -d "$PWD/phpbb-core/.git" ]; then 24 | echo "phpBB core repo has not been set up in phpbb subfolder." 25 | phpbb_core_exists=false 26 | fi 27 | 28 | if [ "$phpbb_repo_exists" = false ] || [ "$phpbb_app_exists" = false ] || [ "$phpbb_core_exists" = false ] ; then 29 | exit 1 30 | fi 31 | 32 | # Create lock file 33 | touch "$PWD/../cache/.split_tags.lock" 34 | 35 | # Get phpBB tag list 36 | cd phpbb 37 | git fetch 38 | mapfile -t phpbb_tags < <(git tag -l "release-*") 39 | 40 | # Get phpbb-apps tag list 41 | cd ../phpbb-app 42 | git fetch 43 | mapfile -t phpbb_app_tags < <(git tag -l "release-*") 44 | 45 | # Get phpbb-core tag list 46 | cd ../phpbb-core 47 | git fetch 48 | mapfile -t phpbb_core_tags < <(git tag -l "release-*") 49 | cd .. 50 | 51 | # Loop through tags and check if any are missing in app or core 52 | for tag in "${phpbb_tags[@]}" 53 | do 54 | if [[ ! " ${phpbb_app_tags[@]} " =~ " ${tag} " ]]; then 55 | # Skip unsupported tags 56 | if [[ "$tag" =~ ^release-2 ]]; then 57 | continue 58 | fi 59 | tag_commit=`$PWD/splitsh-lite --prefix=phpBB/ --origin=refs/tags/${tag} --path=phpbb/ --git="<1.8.2" 2> /dev/null` 60 | tag_msg=`cd phpbb && git for-each-ref refs/tags/${tag} --format='%(contents)' && cd ..` 61 | cd phpbb-app 62 | if git cat-file -e ${tag_commit}^{commit} 2> /dev/null; then 63 | git tag -a ${tag} ${tag_commit} -m "${tag_msg}" 64 | fi 65 | cd .. 66 | fi 67 | 68 | if [[ ! " ${phpbb_core_tags[@]} " =~ " ${tag} " ]]; then 69 | # Skip unsupported tags 70 | if [[ "$tag" =~ ^release-2|^release-3\.0 ]]; then 71 | continue 72 | fi 73 | tag_commit=`$PWD/splitsh-lite --prefix=phpBB/phpbb --origin=refs/tags/${tag} --path=phpbb/ --git="<1.8.2" 2> /dev/null` 74 | tag_msg=`cd phpbb && git for-each-ref refs/tags/${tag} --format='%(contents)' && cd ..` 75 | cd phpbb-core 76 | if git cat-file -e ${tag_commit}^{commit} 2> /dev/null; then 77 | git tag -a ${tag} ${tag_commit} -m "${tag_msg}" 78 | fi 79 | cd .. 80 | fi 81 | done 82 | 83 | # Push tags 84 | cd phpbb-app && git push origin --tags && cd .. 85 | cd phpbb-core && git push origin --tags && cd .. 86 | 87 | # Delete lock file and split file 88 | rm "$PWD/../cache/.split_tags.lock" 89 | rm "$PWD/../cache/.split_tags" 90 | -------------------------------------------------------------------------------- /src/Listener/PullRequestJiraTicket.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Listener; 9 | 10 | use chobie\Jira\Api as JiraClient; 11 | use Phpbb\DevHooks\Helper\GithubHelper; 12 | 13 | class PullRequestJiraTicket implements Listener 14 | { 15 | /** @var int Issue type bug */ 16 | protected const ISSUE_TYPE_BUG = 1; 17 | 18 | protected $githubHelper; 19 | protected $jiraClient; 20 | 21 | public function __construct(GithubHelper $github, JiraClient $jira) 22 | { 23 | $this->githubHelper = $github; 24 | $this->jiraClient = $jira; 25 | } 26 | 27 | public function handle(array $data) 28 | { 29 | if ($data['action'] === 'opened' || $data['action'] === 'reopened') { 30 | $title = $data['pull_request']['title']; 31 | $body = $data['pull_request']['body']; 32 | 33 | if ($this->containsJiraKey($title) || $this->containsJiraKey($body)) { 34 | return; 35 | } 36 | 37 | if ($this->containsJiraKey($data['pull_request']['head']['ref'])) { 38 | return; 39 | } 40 | 41 | $commits = $this->githubHelper 42 | ->getAuthenticatedClient() 43 | ->api('pull_request') 44 | ->commits( 45 | $data['repository']['owner']['login'], 46 | $data['repository']['name'], 47 | $data['pull_request']['number'] 48 | ) 49 | ; 50 | 51 | if ($this->containsJiraKey($commits[0]['commit']['message'])) { 52 | return; 53 | } 54 | 55 | echo "No issue key found, creating ticket\n"; 56 | 57 | $ticketId = $this->createJiraTicket($data); 58 | 59 | if ($ticketId) { 60 | $ticketLink = 'https://tracker.phpbb.com/browse/'.$ticketId; 61 | } else { 62 | $ticketLink = 'Could not automatically create an issue. ' . 63 | 'Please create one on https://tracker.phpbb.com/ and ' . 64 | 'replace this text with a link to it.'; 65 | } 66 | 67 | $newBody = $body ? "$body\n\n$ticketLink" : $ticketLink; 68 | 69 | $this->githubHelper 70 | ->getAuthenticatedClient() 71 | ->api('pull_request') 72 | ->update( 73 | $data['repository']['owner']['login'], 74 | $data['repository']['name'], 75 | $data['pull_request']['number'], 76 | ['title' => $title, 'body' => $newBody] 77 | ) 78 | ; 79 | } 80 | } 81 | 82 | protected function containsJiraKey($message) 83 | { 84 | return preg_match('#(PHPBB3?|SECURITY)-(\d+)#', $message) || preg_match('#ticket/(\d+)#', $message); 85 | } 86 | 87 | protected function createJiraTicket($data) 88 | { 89 | $options = []; 90 | 91 | if ($data['pull_request']['body']) { 92 | $options['description'] = $data['pull_request']['body']; 93 | } 94 | 95 | $result = $this->jiraClient->createIssue( 96 | 'PHPBB', 97 | $data['pull_request']['title'], 98 | self::ISSUE_TYPE_BUG, 99 | $options 100 | )->getResult(); 101 | 102 | return $result['key']; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /tests/GithubLabelsTest.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use Phpbb\DevHooks\Listener\IssueCommentGithubLabels; 11 | 12 | class GithubLabelsTest extends TestCase 13 | { 14 | /** @var IssueCommentGithubLabels */ 15 | protected $githubLabels; 16 | 17 | /** @var GithubClientMock */ 18 | protected $mockClient; 19 | 20 | public function setUp(): void 21 | { 22 | $githubHelperMock = $this->getMockBuilder('Phpbb\DevHooks\Helper\GithubHelper') 23 | ->disableOriginalConstructor() 24 | ->getMock(); 25 | 26 | $this->mockClient = new GithubClientMock(); 27 | 28 | $apiMock = $this->getMockBuilder('Github\Api\AbstractApi') 29 | ->disableOriginalConstructor() 30 | ->addMethods(['labels']) 31 | ->getMock(); 32 | $apiMock->method('labels') 33 | ->willReturn($this->mockClient->labels()); 34 | $this->mockClient->apiMock = $apiMock; 35 | 36 | $githubHelperMock->method('getClient') 37 | ->willReturn($this->mockClient); 38 | $githubHelperMock->method('getAuthenticatedClient') 39 | ->willReturn($this->mockClient); 40 | $this->githubLabels = new IssueCommentGithubLabels($githubHelperMock); 41 | } 42 | 43 | public function dataHandleEmpty(): array 44 | { 45 | return [ 46 | ['!set 3.0 (Olympus)', [], []], // Protected label 47 | ['!set 3.1 (Ascraeus)', [], []], // Protected label 48 | ['!set 3.2 (Rhea)', [], []], // Protected label 49 | ['!set 3.3 (Proteus)', [], []], // Protected label 50 | ['!set Blocker :warning:', [], []], // Protected label 51 | ['!set Blocker', [], []], // Protected label 52 | ['!set Event', ['Event'], []], 53 | ['!set WIP', ['WIP :construction:'], []], 54 | ['!set Do not merge', ['Do not merge :hand:'], []], 55 | ['!set GSOC 🎓', ['GSOC 🎓'], []], 56 | ['!set GSOC', ['GSOC 🎓'], []], 57 | ['!unset 3.0 (Olympus)', [], []], // Protected label 58 | ['!unset 3.1 (Ascraeus)', [], []], // Protected label 59 | ['!unset 3.2 (Rhea)', [], []], // Protected label 60 | ['!unset 3.3 (Proteus)', [], []], // Protected label 61 | ['!unset Blocker', [], []], // Protected label 62 | ['!unset Blocker :warning:', [], []], // Protected label 63 | ['!unset Event', [], ['Event']], 64 | ['!unset GSOC 🎓', [], ['GSOC 🎓']], 65 | ['!unset GSOC', [], ['GSOC 🎓']], 66 | ['!unset LOL', [], []], // Label does not exist 67 | ]; 68 | } 69 | 70 | /** 71 | * @dataProvider dataHandleEmpty 72 | */ 73 | public function testHandleEmpty($comment, $expectedAdded = [], $expectedRemoved = []) 74 | { 75 | $handleData = [ 76 | 'issue' => [ 77 | 'user' => ['id' => 1], 78 | 'number' => 5, 79 | ], 80 | 'comment' => [ 81 | 'body' => $comment, 82 | 'user' => ['id' => 1] 83 | ], 84 | 'repository' => [ 85 | 'owner' => ['login' => 'foo'], 86 | 'name' => 'foo', 87 | ] 88 | ]; 89 | $this->githubLabels->handle($handleData); 90 | 91 | $this->assertEquals($expectedAdded, $this->mockClient->labels()->addList); 92 | $this->assertEquals($expectedRemoved, $this->mockClient->labels()->removeList); 93 | 94 | // Reset data 95 | $this->mockClient->labels()->addList = []; 96 | $this->mockClient->labels()->removeList = []; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/Listener/IssueCommentGithubLabels.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks\Listener; 9 | 10 | use Phpbb\DevHooks\Helper\GithubHelper; 11 | 12 | class IssueCommentGithubLabels implements Listener 13 | { 14 | protected $protectedLabels = [ 15 | '3.0 (Olympus)', 16 | '3.1 (Ascraeus)', 17 | '3.2 (Rhea)', 18 | '3.3 (Proteus)', 19 | 'Blocker :warning:', 20 | ]; 21 | 22 | public function __construct(protected GithubHelper $githubHelper) 23 | { 24 | } 25 | 26 | public function handle(array $data) 27 | { 28 | if ($data['issue']['user']['id'] === $data['comment']['user']['id']) { 29 | $lines = explode( 30 | "\n", 31 | str_replace("\r\n", "\n", $data['comment']['body']) 32 | ); 33 | foreach ($lines as $line) { 34 | $messageParts = explode(' ', $line); 35 | $action = array_shift($messageParts); 36 | $label = implode(' ', $messageParts); 37 | $exists = $this->labelExists( 38 | $data['repository']['owner']['login'], 39 | $data['repository']['name'], 40 | $label 41 | ); 42 | if (!in_array($label, $this->protectedLabels)) { 43 | if ($exists) { 44 | if ($action === '!set') { 45 | $this->githubHelper 46 | ->getAuthenticatedClient() 47 | ->api('issue') 48 | ->labels() 49 | ->add( 50 | $data['repository']['owner']['login'], 51 | $data['repository']['name'], 52 | $data['issue']['number'], 53 | $label 54 | ); 55 | echo "$label set for issue " . $data['issue']['number'] . "\n"; 56 | } elseif ($action === '!unset') { 57 | $this->githubHelper 58 | ->getAuthenticatedClient() 59 | ->api('issue') 60 | ->labels() 61 | ->remove( 62 | $data['repository']['owner']['login'], 63 | $data['repository']['name'], 64 | $data['issue']['number'], 65 | $label 66 | ); 67 | echo "$label removed for issue " . $data['issue']['number'] . "\n"; 68 | } else { 69 | echo "Unsupported action $action for label $label.\n"; 70 | } 71 | } 72 | } else { 73 | echo "Protected label $label.\n"; 74 | } 75 | } 76 | } 77 | } 78 | 79 | protected function labelExists($repo_owner, $repository, &$label) 80 | { 81 | $labels = $this->githubHelper 82 | ->getClient() 83 | ->api('issues') 84 | ->labels() 85 | ->all($repo_owner, $repository) 86 | ; 87 | foreach ($labels as $label_data) { 88 | if ($label_data['name'] === $label) { 89 | return true; 90 | } elseif (stripos($label_data['name'], $label) === 0) { 91 | $label = $label_data['name']; 92 | return true; 93 | } 94 | } 95 | return false; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /tests/KernelTest.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use Pimple\Container; 11 | 12 | class KernelTest extends TestCase 13 | { 14 | protected $container; 15 | protected $kernel; 16 | protected $hmacKey = '0123456789'; 17 | 18 | public function setUp(): void 19 | { 20 | $this->container = new Container([ 21 | 'github_webhooks_secret' => $this->hmacKey, 22 | ]); 23 | $this->kernel = new Kernel( 24 | $this->hmacKey, 25 | $this->container 26 | ); 27 | } 28 | 29 | public function testHandle() 30 | { 31 | $payload = []; 32 | $body = json_encode($payload); 33 | $server = [ 34 | 'HTTP_X_HUB_SIGNATURE' => 'sha1='.hash_hmac('sha1', $body, $this->hmacKey), 35 | 'HTTP_X_GITHUB_EVENT' => 'test_event', 36 | ]; 37 | $listenerStub = $this->createMock('Phpbb\DevHooks\Listener\Listener'); 38 | $listenerStub 39 | ->expects($this->once()) 40 | ->method('handle') 41 | ->with($this->equalTo($payload)) 42 | ; 43 | 44 | $this->container['listener.test_event.test'] = $listenerStub; 45 | 46 | $this->kernel->handle($body, $server); 47 | } 48 | 49 | public function testMissingEventHeader() 50 | { 51 | $payload = []; 52 | $body = json_encode($payload); 53 | $server = [ 54 | 'HTTP_X_HUB_SIGNATURE' => 'sha1='.hash_hmac('sha1', $body, $this->hmacKey), 55 | ]; 56 | $listenerStub = $this->createMock('Phpbb\DevHooks\Listener\Listener'); 57 | $listenerStub 58 | ->expects($this->never()) 59 | ->method('handle') 60 | ; 61 | 62 | $this->container['listener.test_event.test'] = $listenerStub; 63 | 64 | $this->expectException(\UnexpectedValueException::class); 65 | $this->expectExceptionMessage('Missing X-Github-Event header.'); 66 | $this->kernel->handle($body, $server); 67 | } 68 | 69 | public function testMissingSignature() 70 | { 71 | $body = ''; 72 | $server = [ 73 | 'HTTP_X_GITHUB_EVENT' => 'test_event', 74 | ]; 75 | $listenerStub = $this->createMock('Phpbb\DevHooks\Listener\Listener'); 76 | $listenerStub 77 | ->expects($this->never()) 78 | ->method('handle') 79 | ; 80 | 81 | $this->container['listener.test_event.test'] = $listenerStub; 82 | 83 | $this->expectException(\UnexpectedValueException::class); 84 | $this->expectExceptionMessage('Missing X-Hub-Signature header'); 85 | $this->kernel->handle($body, $server); 86 | } 87 | 88 | public function testInvalidSignature() 89 | { 90 | $body = ''; 91 | $server = [ 92 | 'HTTP_X_HUB_SIGNATURE' => 'sha1=invalid', 93 | 'HTTP_X_GITHUB_EVENT' => 'test_event', 94 | ]; 95 | $listenerStub = $this->createMock('Phpbb\DevHooks\Listener\Listener'); 96 | $listenerStub 97 | ->expects($this->never()) 98 | ->method('handle') 99 | ; 100 | 101 | $this->container['listener.test_event.test'] = $listenerStub; 102 | 103 | $this->expectException(\UnexpectedValueException::class); 104 | $this->expectExceptionMessage('Incorrect X-Hub-Signature header'); 105 | $this->kernel->handle($body, $server); 106 | } 107 | 108 | public function testEmptyPayload() 109 | { 110 | $body = ''; 111 | $server = [ 112 | 'HTTP_X_HUB_SIGNATURE' => 'sha1='.hash_hmac('sha1', $body, $this->hmacKey), 113 | 'HTTP_X_GITHUB_EVENT' => 'test_event', 114 | ]; 115 | $listenerStub = $this->createMock('Phpbb\DevHooks\Listener\Listener'); 116 | $listenerStub 117 | ->expects($this->never()) 118 | ->method('handle') 119 | ; 120 | 121 | $this->container['listener.test_event.test'] = $listenerStub; 122 | 123 | $this->expectException(\UnexpectedValueException::class); 124 | $this->expectExceptionMessage('Expected payload to be array.'); 125 | $this->kernel->handle($body, $server); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /tests/PullRequestJiraTicketTest.php: -------------------------------------------------------------------------------- 1 | 5 | * @license GNU General Public License, version 2 (GPL-2.0) 6 | */ 7 | 8 | namespace Phpbb\DevHooks; 9 | 10 | use chobie\Jira\Api as JiraClient; 11 | use Phpbb\DevHooks\Helper\GithubHelper; 12 | use Phpbb\DevHooks\Listener\IssueCommentGithubLabels; 13 | use Phpbb\DevHooks\Listener\PullRequestJiraTicket; 14 | 15 | class PullRequestJiraTicketTest extends TestCase 16 | { 17 | /** @var IssueCommentGithubLabels */ 18 | protected $githubLabels; 19 | 20 | /** @var PullRequestJiraTicket */ 21 | protected $prJiraTicket; 22 | 23 | /** @var JiraClient */ 24 | protected $jiraClientMock; 25 | 26 | /** @var array Commit data for testing */ 27 | protected $commitData = []; 28 | 29 | /** @var array Expected issue data */ 30 | protected $expectedIssueData = []; 31 | 32 | /** @var array Ticket return data */ 33 | protected $ticketReturn = []; 34 | 35 | /** @var array Expected updated PR data */ 36 | protected $expectedUpdatedPrData = []; 37 | 38 | protected function setUp(): void 39 | { 40 | $abstractApiMock = $this->getMockBuilder(\Github\Api\AbstractApi::class) 41 | ->disableOriginalConstructor() 42 | ->addMethods(['commits', 'update']) 43 | ->getMockForAbstractClass(); 44 | $abstractApiMock->method('commits') 45 | ->willReturnCallback([$this, 'getCommitData']); 46 | $abstractApiMock->method('update') 47 | ->willReturnCallback([$this, 'updatePr']); 48 | 49 | $githubClientMock = $this->getMockBuilder(\Github\Client::class) 50 | ->disableOriginalConstructor() 51 | ->onlyMethods(['api']) 52 | ->getMock(); 53 | 54 | $githubClientMock->method('api')->willReturn($abstractApiMock); 55 | 56 | $githubHelperMock = $this->getMockBuilder(GithubHelper::class) 57 | ->disableOriginalConstructor() 58 | ->onlyMethods(['getAuthenticatedClient']) 59 | ->addMethods(['update']) 60 | ->getMock(); 61 | 62 | $githubHelperMock->method('getAuthenticatedClient') 63 | ->willReturn($githubClientMock); 64 | 65 | $this->jiraClientMock = $this->getMockBuilder(JiraClient::class) 66 | ->disableOriginalConstructor() 67 | ->onlyMethods(['createIssue']) 68 | ->addMethods(['getResult']) 69 | ->getMock(); 70 | $this->jiraClientMock->method('createIssue')->willReturnCallback([$this, 'createIssue']); 71 | $this->jiraClientMock->method('getResult')->willReturnCallback(function() { return $this->ticketReturn; }); 72 | 73 | $this->prJiraTicket = new PullRequestJiraTicket($githubHelperMock, $this->jiraClientMock); 74 | } 75 | 76 | /** 77 | * Creates a mocked issue. 78 | * 79 | * @param string $project_key Project key. 80 | * @param string $summary Summary. 81 | * @param string $issue_type Issue type. 82 | * @param array $options Options. 83 | */ 84 | public function createIssue($project_key, $summary, $issue_type, array $options = array()) 85 | { 86 | $this->assertEquals( 87 | [ 88 | $project_key, 89 | $summary, 90 | $issue_type, 91 | $options 92 | ], 93 | $this->expectedIssueData 94 | ); 95 | 96 | return $this->jiraClientMock; 97 | } 98 | 99 | public function updatePr($ownerLogin, $repoName, $prNumber, $data) 100 | { 101 | $this->assertEquals( 102 | [ 103 | $ownerLogin, 104 | $repoName, 105 | $prNumber, 106 | $data 107 | ], 108 | $this->expectedUpdatedPrData 109 | ); 110 | } 111 | 112 | public function getCommitData($login, $name, $number) 113 | { 114 | return $this->commitData; 115 | } 116 | 117 | public function dataHandle() 118 | { 119 | return [ 120 | [ 121 | // Issue key already in PR body, opened PR 122 | [ 123 | 'action' => 'opened', 124 | 'pull_request' => [ 125 | 'title' => 'Test PR', 126 | 'body' => 'PHPBB3-12345', 127 | ] 128 | ], 129 | '', 130 | ], 131 | [ 132 | // ticket style info already in PR body, opened PR 133 | [ 134 | 'action' => 'opened', 135 | 'pull_request' => [ 136 | 'title' => 'Test PR', 137 | 'body' => 'ticket/12345', 138 | ] 139 | ], 140 | '', 141 | ], 142 | [ 143 | // Issue key already in title, opened PR 144 | [ 145 | 'action' => 'opened', 146 | 'pull_request' => [ 147 | 'title' => 'Test PR PHPBB3-12345', 148 | 'body' => 'Something', 149 | ] 150 | ], 151 | '', 152 | ], 153 | [ 154 | // Issue key already in PR body, reopened PR 155 | [ 156 | 'action' => 'reopened', 157 | 'pull_request' => [ 158 | 'title' => 'Test PR', 159 | 'body' => 'PHPBB3-12345', 160 | ] 161 | ], 162 | '', 163 | ], 164 | [ 165 | // Issue key already in title, reopened PR with PHPBB key 166 | [ 167 | 'action' => 'reopened', 168 | 'pull_request' => [ 169 | 'title' => 'Test PR PHPBB-12345', 170 | 'body' => 'Something', 171 | ] 172 | ], 173 | '', 174 | ], 175 | [ 176 | // Issue key already in title, reopened PR with SECURITY key 177 | [ 178 | 'action' => 'reopened', 179 | 'pull_request' => [ 180 | 'title' => 'Test PR SECURITY-12345', 181 | 'body' => 'Something', 182 | ] 183 | ], 184 | '', 185 | ], 186 | [ 187 | // Issue key in head ref, opened PR 188 | [ 189 | 'action' => 'opened', 190 | 'pull_request' => [ 191 | 'title' => 'Test PR', 192 | 'body' => 'Something', 193 | 'head' => [ 194 | 'ref' => 'PHPBB-12345', 195 | ] 196 | ] 197 | ], 198 | '', 199 | ], 200 | [ 201 | // Issue key in head ref, opened PR 202 | [ 203 | 'action' => 'opened', 204 | 'pull_request' => [ 205 | 'title' => 'Test PR', 206 | 'body' => 'Something', 207 | 'head' => [ 208 | 'ref' => 'ddfdf', 209 | ], 210 | 'number' => 1234, 211 | ], 212 | 'repository' => [ 213 | 'owner' => [ 214 | 'login' => 'foo', 215 | ], 216 | 'name' => 'test', 217 | ], 218 | ], 219 | '', 220 | [ 221 | [ 222 | 'commit' => [ 223 | 'message' => 'PHPBB-1234', 224 | ], 225 | ], 226 | ] 227 | ], 228 | [ 229 | // Opened PR, no issue key 230 | [ 231 | 'action' => 'opened', 232 | 'pull_request' => [ 233 | 'title' => 'Test PR', 234 | 'body' => 'Something', 235 | 'head' => [ 236 | 'ref' => 'ddfdf', 237 | ], 238 | 'number' => 1234, 239 | ], 240 | 'repository' => [ 241 | 'owner' => [ 242 | 'login' => 'foo', 243 | ], 244 | 'name' => 'test', 245 | ], 246 | ], 247 | "No issue key found, creating ticket\n", 248 | [ 249 | [ 250 | 'commit' => [ 251 | 'message' => 'Nope', 252 | ], 253 | ], 254 | ], 255 | [ 256 | 'PHPBB', 257 | 'Test PR', 258 | 1, // Issue type bug 259 | [ 260 | 'description' => 'Something', 261 | ], 262 | ], 263 | ['key' => 'PHPBB-12345'], 264 | [ 265 | 'foo', 266 | 'test', 267 | 1234, 268 | [ 269 | 'title' => 'Test PR', 270 | 'body' => "Something\n\nhttps://tracker.phpbb.com/browse/PHPBB-12345", 271 | ], 272 | ], 273 | ], 274 | [ 275 | // Opened PR, no issue key and can't create ticket 276 | [ 277 | 'action' => 'opened', 278 | 'pull_request' => [ 279 | 'title' => 'Test PR', 280 | 'body' => 'Something', 281 | 'head' => [ 282 | 'ref' => 'ddfdf', 283 | ], 284 | 'number' => 1234, 285 | ], 286 | 'repository' => [ 287 | 'owner' => [ 288 | 'login' => 'foo', 289 | ], 290 | 'name' => 'test', 291 | ], 292 | ], 293 | "No issue key found, creating ticket\n", 294 | [ 295 | [ 296 | 'commit' => [ 297 | 'message' => 'Nope', 298 | ], 299 | ], 300 | ], 301 | [ 302 | 'PHPBB', 303 | 'Test PR', 304 | 1, // Issue type bug 305 | [ 306 | 'description' => 'Something', 307 | ], 308 | ], 309 | ['key' => ''], 310 | [ 311 | 'foo', 312 | 'test', 313 | 1234, 314 | [ 315 | 'title' => 'Test PR', 316 | 'body' => "Something\n\nCould not automatically create an issue. " . 317 | 'Please create one on https://tracker.phpbb.com/ and replace this text with a link to it.', 318 | ], 319 | ], 320 | ], 321 | ]; 322 | } 323 | 324 | /** 325 | * @dataProvider dataHandle 326 | */ 327 | public function testHandle($inputData, $expectedOutput, $commitData = [], $expectedIssueData = [], $ticketReturn = [], $expectedUpdatedPrData = []) 328 | { 329 | $this->expectOutputString($expectedOutput); 330 | $this->commitData = $commitData; 331 | $this->expectedIssueData = $expectedIssueData; 332 | $this->ticketReturn = $ticketReturn; 333 | $this->expectedUpdatedPrData = $expectedUpdatedPrData; 334 | $this->prJiraTicket->handle($inputData); 335 | } 336 | } 337 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "0adad33b7352fd8cf02edcf925fb8a9a", 8 | "packages": [ 9 | { 10 | "name": "chobie/jira-api-restclient", 11 | "version": "dev-master", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/chobie/jira-api-restclient.git", 15 | "reference": "f9e3b672795ee055fb772fe0d10141a14fd8509a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/chobie/jira-api-restclient/zipball/f9e3b672795ee055fb772fe0d10141a14fd8509a", 20 | "reference": "f9e3b672795ee055fb772fe0d10141a14fd8509a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.6.0" 25 | }, 26 | "require-dev": { 27 | "aik099/coding-standard": "dev-master", 28 | "phpspec/prophecy": "^1.10", 29 | "squizlabs/php_codesniffer": "^2.6", 30 | "yoast/phpunit-polyfills": "^1.0" 31 | }, 32 | "default-branch": true, 33 | "type": "library", 34 | "extra": { 35 | "branch-alias": { 36 | "dev-master": "2.0-dev" 37 | } 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "chobie\\": "src" 42 | } 43 | }, 44 | "notification-url": "https://packagist.org/downloads/", 45 | "license": [ 46 | "MIT" 47 | ], 48 | "authors": [ 49 | { 50 | "name": "Shuhei Tanuma", 51 | "email": "chobieeee@php.net", 52 | "homepage": "http://chobie.github.io/" 53 | } 54 | ], 55 | "description": "JIRA REST API Client", 56 | "keywords": [ 57 | "api", 58 | "jira", 59 | "rest" 60 | ], 61 | "support": { 62 | "issues": "https://github.com/chobie/jira-api-restclient/issues", 63 | "source": "https://github.com/chobie/jira-api-restclient/tree/master" 64 | }, 65 | "time": "2024-10-29T19:37:30+00:00" 66 | }, 67 | { 68 | "name": "clue/stream-filter", 69 | "version": "v1.7.0", 70 | "source": { 71 | "type": "git", 72 | "url": "https://github.com/clue/stream-filter.git", 73 | "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" 74 | }, 75 | "dist": { 76 | "type": "zip", 77 | "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", 78 | "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", 79 | "shasum": "" 80 | }, 81 | "require": { 82 | "php": ">=5.3" 83 | }, 84 | "require-dev": { 85 | "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" 86 | }, 87 | "type": "library", 88 | "autoload": { 89 | "files": [ 90 | "src/functions_include.php" 91 | ], 92 | "psr-4": { 93 | "Clue\\StreamFilter\\": "src/" 94 | } 95 | }, 96 | "notification-url": "https://packagist.org/downloads/", 97 | "license": [ 98 | "MIT" 99 | ], 100 | "authors": [ 101 | { 102 | "name": "Christian Lück", 103 | "email": "christian@clue.engineering" 104 | } 105 | ], 106 | "description": "A simple and modern approach to stream filtering in PHP", 107 | "homepage": "https://github.com/clue/stream-filter", 108 | "keywords": [ 109 | "bucket brigade", 110 | "callback", 111 | "filter", 112 | "php_user_filter", 113 | "stream", 114 | "stream_filter_append", 115 | "stream_filter_register" 116 | ], 117 | "support": { 118 | "issues": "https://github.com/clue/stream-filter/issues", 119 | "source": "https://github.com/clue/stream-filter/tree/v1.7.0" 120 | }, 121 | "funding": [ 122 | { 123 | "url": "https://clue.engineering/support", 124 | "type": "custom" 125 | }, 126 | { 127 | "url": "https://github.com/clue", 128 | "type": "github" 129 | } 130 | ], 131 | "time": "2023-12-20T15:40:13+00:00" 132 | }, 133 | { 134 | "name": "guzzlehttp/guzzle", 135 | "version": "7.9.2", 136 | "source": { 137 | "type": "git", 138 | "url": "https://github.com/guzzle/guzzle.git", 139 | "reference": "d281ed313b989f213357e3be1a179f02196ac99b" 140 | }, 141 | "dist": { 142 | "type": "zip", 143 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", 144 | "reference": "d281ed313b989f213357e3be1a179f02196ac99b", 145 | "shasum": "" 146 | }, 147 | "require": { 148 | "ext-json": "*", 149 | "guzzlehttp/promises": "^1.5.3 || ^2.0.3", 150 | "guzzlehttp/psr7": "^2.7.0", 151 | "php": "^7.2.5 || ^8.0", 152 | "psr/http-client": "^1.0", 153 | "symfony/deprecation-contracts": "^2.2 || ^3.0" 154 | }, 155 | "provide": { 156 | "psr/http-client-implementation": "1.0" 157 | }, 158 | "require-dev": { 159 | "bamarni/composer-bin-plugin": "^1.8.2", 160 | "ext-curl": "*", 161 | "guzzle/client-integration-tests": "3.0.2", 162 | "php-http/message-factory": "^1.1", 163 | "phpunit/phpunit": "^8.5.39 || ^9.6.20", 164 | "psr/log": "^1.1 || ^2.0 || ^3.0" 165 | }, 166 | "suggest": { 167 | "ext-curl": "Required for CURL handler support", 168 | "ext-intl": "Required for Internationalized Domain Name (IDN) support", 169 | "psr/log": "Required for using the Log middleware" 170 | }, 171 | "type": "library", 172 | "extra": { 173 | "bamarni-bin": { 174 | "bin-links": true, 175 | "forward-command": false 176 | } 177 | }, 178 | "autoload": { 179 | "files": [ 180 | "src/functions_include.php" 181 | ], 182 | "psr-4": { 183 | "GuzzleHttp\\": "src/" 184 | } 185 | }, 186 | "notification-url": "https://packagist.org/downloads/", 187 | "license": [ 188 | "MIT" 189 | ], 190 | "authors": [ 191 | { 192 | "name": "Graham Campbell", 193 | "email": "hello@gjcampbell.co.uk", 194 | "homepage": "https://github.com/GrahamCampbell" 195 | }, 196 | { 197 | "name": "Michael Dowling", 198 | "email": "mtdowling@gmail.com", 199 | "homepage": "https://github.com/mtdowling" 200 | }, 201 | { 202 | "name": "Jeremy Lindblom", 203 | "email": "jeremeamia@gmail.com", 204 | "homepage": "https://github.com/jeremeamia" 205 | }, 206 | { 207 | "name": "George Mponos", 208 | "email": "gmponos@gmail.com", 209 | "homepage": "https://github.com/gmponos" 210 | }, 211 | { 212 | "name": "Tobias Nyholm", 213 | "email": "tobias.nyholm@gmail.com", 214 | "homepage": "https://github.com/Nyholm" 215 | }, 216 | { 217 | "name": "Márk Sági-Kazár", 218 | "email": "mark.sagikazar@gmail.com", 219 | "homepage": "https://github.com/sagikazarmark" 220 | }, 221 | { 222 | "name": "Tobias Schultze", 223 | "email": "webmaster@tubo-world.de", 224 | "homepage": "https://github.com/Tobion" 225 | } 226 | ], 227 | "description": "Guzzle is a PHP HTTP client library", 228 | "keywords": [ 229 | "client", 230 | "curl", 231 | "framework", 232 | "http", 233 | "http client", 234 | "psr-18", 235 | "psr-7", 236 | "rest", 237 | "web service" 238 | ], 239 | "support": { 240 | "issues": "https://github.com/guzzle/guzzle/issues", 241 | "source": "https://github.com/guzzle/guzzle/tree/7.9.2" 242 | }, 243 | "funding": [ 244 | { 245 | "url": "https://github.com/GrahamCampbell", 246 | "type": "github" 247 | }, 248 | { 249 | "url": "https://github.com/Nyholm", 250 | "type": "github" 251 | }, 252 | { 253 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 254 | "type": "tidelift" 255 | } 256 | ], 257 | "time": "2024-07-24T11:22:20+00:00" 258 | }, 259 | { 260 | "name": "guzzlehttp/promises", 261 | "version": "2.0.4", 262 | "source": { 263 | "type": "git", 264 | "url": "https://github.com/guzzle/promises.git", 265 | "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" 266 | }, 267 | "dist": { 268 | "type": "zip", 269 | "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", 270 | "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", 271 | "shasum": "" 272 | }, 273 | "require": { 274 | "php": "^7.2.5 || ^8.0" 275 | }, 276 | "require-dev": { 277 | "bamarni/composer-bin-plugin": "^1.8.2", 278 | "phpunit/phpunit": "^8.5.39 || ^9.6.20" 279 | }, 280 | "type": "library", 281 | "extra": { 282 | "bamarni-bin": { 283 | "bin-links": true, 284 | "forward-command": false 285 | } 286 | }, 287 | "autoload": { 288 | "psr-4": { 289 | "GuzzleHttp\\Promise\\": "src/" 290 | } 291 | }, 292 | "notification-url": "https://packagist.org/downloads/", 293 | "license": [ 294 | "MIT" 295 | ], 296 | "authors": [ 297 | { 298 | "name": "Graham Campbell", 299 | "email": "hello@gjcampbell.co.uk", 300 | "homepage": "https://github.com/GrahamCampbell" 301 | }, 302 | { 303 | "name": "Michael Dowling", 304 | "email": "mtdowling@gmail.com", 305 | "homepage": "https://github.com/mtdowling" 306 | }, 307 | { 308 | "name": "Tobias Nyholm", 309 | "email": "tobias.nyholm@gmail.com", 310 | "homepage": "https://github.com/Nyholm" 311 | }, 312 | { 313 | "name": "Tobias Schultze", 314 | "email": "webmaster@tubo-world.de", 315 | "homepage": "https://github.com/Tobion" 316 | } 317 | ], 318 | "description": "Guzzle promises library", 319 | "keywords": [ 320 | "promise" 321 | ], 322 | "support": { 323 | "issues": "https://github.com/guzzle/promises/issues", 324 | "source": "https://github.com/guzzle/promises/tree/2.0.4" 325 | }, 326 | "funding": [ 327 | { 328 | "url": "https://github.com/GrahamCampbell", 329 | "type": "github" 330 | }, 331 | { 332 | "url": "https://github.com/Nyholm", 333 | "type": "github" 334 | }, 335 | { 336 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 337 | "type": "tidelift" 338 | } 339 | ], 340 | "time": "2024-10-17T10:06:22+00:00" 341 | }, 342 | { 343 | "name": "guzzlehttp/psr7", 344 | "version": "2.7.0", 345 | "source": { 346 | "type": "git", 347 | "url": "https://github.com/guzzle/psr7.git", 348 | "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" 349 | }, 350 | "dist": { 351 | "type": "zip", 352 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", 353 | "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", 354 | "shasum": "" 355 | }, 356 | "require": { 357 | "php": "^7.2.5 || ^8.0", 358 | "psr/http-factory": "^1.0", 359 | "psr/http-message": "^1.1 || ^2.0", 360 | "ralouphie/getallheaders": "^3.0" 361 | }, 362 | "provide": { 363 | "psr/http-factory-implementation": "1.0", 364 | "psr/http-message-implementation": "1.0" 365 | }, 366 | "require-dev": { 367 | "bamarni/composer-bin-plugin": "^1.8.2", 368 | "http-interop/http-factory-tests": "0.9.0", 369 | "phpunit/phpunit": "^8.5.39 || ^9.6.20" 370 | }, 371 | "suggest": { 372 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 373 | }, 374 | "type": "library", 375 | "extra": { 376 | "bamarni-bin": { 377 | "bin-links": true, 378 | "forward-command": false 379 | } 380 | }, 381 | "autoload": { 382 | "psr-4": { 383 | "GuzzleHttp\\Psr7\\": "src/" 384 | } 385 | }, 386 | "notification-url": "https://packagist.org/downloads/", 387 | "license": [ 388 | "MIT" 389 | ], 390 | "authors": [ 391 | { 392 | "name": "Graham Campbell", 393 | "email": "hello@gjcampbell.co.uk", 394 | "homepage": "https://github.com/GrahamCampbell" 395 | }, 396 | { 397 | "name": "Michael Dowling", 398 | "email": "mtdowling@gmail.com", 399 | "homepage": "https://github.com/mtdowling" 400 | }, 401 | { 402 | "name": "George Mponos", 403 | "email": "gmponos@gmail.com", 404 | "homepage": "https://github.com/gmponos" 405 | }, 406 | { 407 | "name": "Tobias Nyholm", 408 | "email": "tobias.nyholm@gmail.com", 409 | "homepage": "https://github.com/Nyholm" 410 | }, 411 | { 412 | "name": "Márk Sági-Kazár", 413 | "email": "mark.sagikazar@gmail.com", 414 | "homepage": "https://github.com/sagikazarmark" 415 | }, 416 | { 417 | "name": "Tobias Schultze", 418 | "email": "webmaster@tubo-world.de", 419 | "homepage": "https://github.com/Tobion" 420 | }, 421 | { 422 | "name": "Márk Sági-Kazár", 423 | "email": "mark.sagikazar@gmail.com", 424 | "homepage": "https://sagikazarmark.hu" 425 | } 426 | ], 427 | "description": "PSR-7 message implementation that also provides common utility methods", 428 | "keywords": [ 429 | "http", 430 | "message", 431 | "psr-7", 432 | "request", 433 | "response", 434 | "stream", 435 | "uri", 436 | "url" 437 | ], 438 | "support": { 439 | "issues": "https://github.com/guzzle/psr7/issues", 440 | "source": "https://github.com/guzzle/psr7/tree/2.7.0" 441 | }, 442 | "funding": [ 443 | { 444 | "url": "https://github.com/GrahamCampbell", 445 | "type": "github" 446 | }, 447 | { 448 | "url": "https://github.com/Nyholm", 449 | "type": "github" 450 | }, 451 | { 452 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 453 | "type": "tidelift" 454 | } 455 | ], 456 | "time": "2024-07-18T11:15:46+00:00" 457 | }, 458 | { 459 | "name": "http-interop/http-factory-guzzle", 460 | "version": "1.2.0", 461 | "source": { 462 | "type": "git", 463 | "url": "https://github.com/http-interop/http-factory-guzzle.git", 464 | "reference": "8f06e92b95405216b237521cc64c804dd44c4a81" 465 | }, 466 | "dist": { 467 | "type": "zip", 468 | "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81", 469 | "reference": "8f06e92b95405216b237521cc64c804dd44c4a81", 470 | "shasum": "" 471 | }, 472 | "require": { 473 | "guzzlehttp/psr7": "^1.7||^2.0", 474 | "php": ">=7.3", 475 | "psr/http-factory": "^1.0" 476 | }, 477 | "provide": { 478 | "psr/http-factory-implementation": "^1.0" 479 | }, 480 | "require-dev": { 481 | "http-interop/http-factory-tests": "^0.9", 482 | "phpunit/phpunit": "^9.5" 483 | }, 484 | "suggest": { 485 | "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0" 486 | }, 487 | "type": "library", 488 | "autoload": { 489 | "psr-4": { 490 | "Http\\Factory\\Guzzle\\": "src/" 491 | } 492 | }, 493 | "notification-url": "https://packagist.org/downloads/", 494 | "license": [ 495 | "MIT" 496 | ], 497 | "authors": [ 498 | { 499 | "name": "PHP-FIG", 500 | "homepage": "http://www.php-fig.org/" 501 | } 502 | ], 503 | "description": "An HTTP Factory using Guzzle PSR7", 504 | "keywords": [ 505 | "factory", 506 | "http", 507 | "psr-17", 508 | "psr-7" 509 | ], 510 | "support": { 511 | "issues": "https://github.com/http-interop/http-factory-guzzle/issues", 512 | "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0" 513 | }, 514 | "time": "2021-07-21T13:50:14+00:00" 515 | }, 516 | { 517 | "name": "knplabs/github-api", 518 | "version": "v3.16.0", 519 | "source": { 520 | "type": "git", 521 | "url": "https://github.com/KnpLabs/php-github-api.git", 522 | "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28" 523 | }, 524 | "dist": { 525 | "type": "zip", 526 | "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28", 527 | "reference": "25d7bafd6b0dd088d4850aef7fcc74dc4fba8b28", 528 | "shasum": "" 529 | }, 530 | "require": { 531 | "ext-json": "*", 532 | "php": "^7.2.5 || ^8.0", 533 | "php-http/cache-plugin": "^1.7.1|^2.0", 534 | "php-http/client-common": "^2.3", 535 | "php-http/discovery": "^1.12", 536 | "php-http/httplug": "^2.2", 537 | "php-http/multipart-stream-builder": "^1.1.2", 538 | "psr/cache": "^1.0|^2.0|^3.0", 539 | "psr/http-client-implementation": "^1.0", 540 | "psr/http-factory-implementation": "^1.0", 541 | "psr/http-message": "^1.0|^2.0", 542 | "symfony/deprecation-contracts": "^2.2|^3.0", 543 | "symfony/polyfill-php80": "^1.17" 544 | }, 545 | "require-dev": { 546 | "guzzlehttp/guzzle": "^7.2", 547 | "guzzlehttp/psr7": "^2.7", 548 | "http-interop/http-factory-guzzle": "^1.0", 549 | "php-http/mock-client": "^1.4.1", 550 | "phpstan/extension-installer": "^1.0.5", 551 | "phpstan/phpstan": "^0.12.57", 552 | "phpstan/phpstan-deprecation-rules": "^0.12.5", 553 | "phpunit/phpunit": "^8.5 || ^9.4", 554 | "symfony/cache": "^5.1.8", 555 | "symfony/phpunit-bridge": "^5.2" 556 | }, 557 | "type": "library", 558 | "extra": { 559 | "branch-alias": { 560 | "dev-2.x": "2.20.x-dev", 561 | "dev-master": "3.15-dev" 562 | } 563 | }, 564 | "autoload": { 565 | "psr-4": { 566 | "Github\\": "lib/Github/" 567 | } 568 | }, 569 | "notification-url": "https://packagist.org/downloads/", 570 | "license": [ 571 | "MIT" 572 | ], 573 | "authors": [ 574 | { 575 | "name": "KnpLabs Team", 576 | "homepage": "http://knplabs.com" 577 | }, 578 | { 579 | "name": "Thibault Duplessis", 580 | "email": "thibault.duplessis@gmail.com", 581 | "homepage": "http://ornicar.github.com" 582 | } 583 | ], 584 | "description": "GitHub API v3 client", 585 | "homepage": "https://github.com/KnpLabs/php-github-api", 586 | "keywords": [ 587 | "api", 588 | "gh", 589 | "gist", 590 | "github" 591 | ], 592 | "support": { 593 | "issues": "https://github.com/KnpLabs/php-github-api/issues", 594 | "source": "https://github.com/KnpLabs/php-github-api/tree/v3.16.0" 595 | }, 596 | "funding": [ 597 | { 598 | "url": "https://github.com/acrobat", 599 | "type": "github" 600 | } 601 | ], 602 | "time": "2024-11-07T19:35:30+00:00" 603 | }, 604 | { 605 | "name": "php-http/cache-plugin", 606 | "version": "2.0.1", 607 | "source": { 608 | "type": "git", 609 | "url": "https://github.com/php-http/cache-plugin.git", 610 | "reference": "5c591e9e04602cec12307e3e1be3abefeb005e29" 611 | }, 612 | "dist": { 613 | "type": "zip", 614 | "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/5c591e9e04602cec12307e3e1be3abefeb005e29", 615 | "reference": "5c591e9e04602cec12307e3e1be3abefeb005e29", 616 | "shasum": "" 617 | }, 618 | "require": { 619 | "php": "^7.1 || ^8.0", 620 | "php-http/client-common": "^1.9 || ^2.0", 621 | "psr/cache": "^1.0 || ^2.0 || ^3.0", 622 | "psr/http-factory-implementation": "^1.0", 623 | "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" 624 | }, 625 | "require-dev": { 626 | "nyholm/psr7": "^1.6.1", 627 | "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" 628 | }, 629 | "type": "library", 630 | "autoload": { 631 | "psr-4": { 632 | "Http\\Client\\Common\\Plugin\\": "src/" 633 | } 634 | }, 635 | "notification-url": "https://packagist.org/downloads/", 636 | "license": [ 637 | "MIT" 638 | ], 639 | "authors": [ 640 | { 641 | "name": "Márk Sági-Kazár", 642 | "email": "mark.sagikazar@gmail.com" 643 | } 644 | ], 645 | "description": "PSR-6 Cache plugin for HTTPlug", 646 | "homepage": "http://httplug.io", 647 | "keywords": [ 648 | "cache", 649 | "http", 650 | "httplug", 651 | "plugin" 652 | ], 653 | "support": { 654 | "issues": "https://github.com/php-http/cache-plugin/issues", 655 | "source": "https://github.com/php-http/cache-plugin/tree/2.0.1" 656 | }, 657 | "time": "2024-10-02T11:25:38+00:00" 658 | }, 659 | { 660 | "name": "php-http/client-common", 661 | "version": "2.7.2", 662 | "source": { 663 | "type": "git", 664 | "url": "https://github.com/php-http/client-common.git", 665 | "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46" 666 | }, 667 | "dist": { 668 | "type": "zip", 669 | "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46", 670 | "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46", 671 | "shasum": "" 672 | }, 673 | "require": { 674 | "php": "^7.1 || ^8.0", 675 | "php-http/httplug": "^2.0", 676 | "php-http/message": "^1.6", 677 | "psr/http-client": "^1.0", 678 | "psr/http-factory": "^1.0", 679 | "psr/http-message": "^1.0 || ^2.0", 680 | "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0", 681 | "symfony/polyfill-php80": "^1.17" 682 | }, 683 | "require-dev": { 684 | "doctrine/instantiator": "^1.1", 685 | "guzzlehttp/psr7": "^1.4", 686 | "nyholm/psr7": "^1.2", 687 | "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", 688 | "phpspec/prophecy": "^1.10.2", 689 | "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" 690 | }, 691 | "suggest": { 692 | "ext-json": "To detect JSON responses with the ContentTypePlugin", 693 | "ext-libxml": "To detect XML responses with the ContentTypePlugin", 694 | "php-http/cache-plugin": "PSR-6 Cache plugin", 695 | "php-http/logger-plugin": "PSR-3 Logger plugin", 696 | "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" 697 | }, 698 | "type": "library", 699 | "autoload": { 700 | "psr-4": { 701 | "Http\\Client\\Common\\": "src/" 702 | } 703 | }, 704 | "notification-url": "https://packagist.org/downloads/", 705 | "license": [ 706 | "MIT" 707 | ], 708 | "authors": [ 709 | { 710 | "name": "Márk Sági-Kazár", 711 | "email": "mark.sagikazar@gmail.com" 712 | } 713 | ], 714 | "description": "Common HTTP Client implementations and tools for HTTPlug", 715 | "homepage": "http://httplug.io", 716 | "keywords": [ 717 | "client", 718 | "common", 719 | "http", 720 | "httplug" 721 | ], 722 | "support": { 723 | "issues": "https://github.com/php-http/client-common/issues", 724 | "source": "https://github.com/php-http/client-common/tree/2.7.2" 725 | }, 726 | "time": "2024-09-24T06:21:48+00:00" 727 | }, 728 | { 729 | "name": "php-http/discovery", 730 | "version": "1.20.0", 731 | "source": { 732 | "type": "git", 733 | "url": "https://github.com/php-http/discovery.git", 734 | "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" 735 | }, 736 | "dist": { 737 | "type": "zip", 738 | "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", 739 | "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", 740 | "shasum": "" 741 | }, 742 | "require": { 743 | "composer-plugin-api": "^1.0|^2.0", 744 | "php": "^7.1 || ^8.0" 745 | }, 746 | "conflict": { 747 | "nyholm/psr7": "<1.0", 748 | "zendframework/zend-diactoros": "*" 749 | }, 750 | "provide": { 751 | "php-http/async-client-implementation": "*", 752 | "php-http/client-implementation": "*", 753 | "psr/http-client-implementation": "*", 754 | "psr/http-factory-implementation": "*", 755 | "psr/http-message-implementation": "*" 756 | }, 757 | "require-dev": { 758 | "composer/composer": "^1.0.2|^2.0", 759 | "graham-campbell/phpspec-skip-example-extension": "^5.0", 760 | "php-http/httplug": "^1.0 || ^2.0", 761 | "php-http/message-factory": "^1.0", 762 | "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", 763 | "sebastian/comparator": "^3.0.5 || ^4.0.8", 764 | "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" 765 | }, 766 | "type": "composer-plugin", 767 | "extra": { 768 | "class": "Http\\Discovery\\Composer\\Plugin", 769 | "plugin-optional": true 770 | }, 771 | "autoload": { 772 | "psr-4": { 773 | "Http\\Discovery\\": "src/" 774 | }, 775 | "exclude-from-classmap": [ 776 | "src/Composer/Plugin.php" 777 | ] 778 | }, 779 | "notification-url": "https://packagist.org/downloads/", 780 | "license": [ 781 | "MIT" 782 | ], 783 | "authors": [ 784 | { 785 | "name": "Márk Sági-Kazár", 786 | "email": "mark.sagikazar@gmail.com" 787 | } 788 | ], 789 | "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", 790 | "homepage": "http://php-http.org", 791 | "keywords": [ 792 | "adapter", 793 | "client", 794 | "discovery", 795 | "factory", 796 | "http", 797 | "message", 798 | "psr17", 799 | "psr7" 800 | ], 801 | "support": { 802 | "issues": "https://github.com/php-http/discovery/issues", 803 | "source": "https://github.com/php-http/discovery/tree/1.20.0" 804 | }, 805 | "time": "2024-10-02T11:20:13+00:00" 806 | }, 807 | { 808 | "name": "php-http/httplug", 809 | "version": "2.4.1", 810 | "source": { 811 | "type": "git", 812 | "url": "https://github.com/php-http/httplug.git", 813 | "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" 814 | }, 815 | "dist": { 816 | "type": "zip", 817 | "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", 818 | "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", 819 | "shasum": "" 820 | }, 821 | "require": { 822 | "php": "^7.1 || ^8.0", 823 | "php-http/promise": "^1.1", 824 | "psr/http-client": "^1.0", 825 | "psr/http-message": "^1.0 || ^2.0" 826 | }, 827 | "require-dev": { 828 | "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", 829 | "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" 830 | }, 831 | "type": "library", 832 | "autoload": { 833 | "psr-4": { 834 | "Http\\Client\\": "src/" 835 | } 836 | }, 837 | "notification-url": "https://packagist.org/downloads/", 838 | "license": [ 839 | "MIT" 840 | ], 841 | "authors": [ 842 | { 843 | "name": "Eric GELOEN", 844 | "email": "geloen.eric@gmail.com" 845 | }, 846 | { 847 | "name": "Márk Sági-Kazár", 848 | "email": "mark.sagikazar@gmail.com", 849 | "homepage": "https://sagikazarmark.hu" 850 | } 851 | ], 852 | "description": "HTTPlug, the HTTP client abstraction for PHP", 853 | "homepage": "http://httplug.io", 854 | "keywords": [ 855 | "client", 856 | "http" 857 | ], 858 | "support": { 859 | "issues": "https://github.com/php-http/httplug/issues", 860 | "source": "https://github.com/php-http/httplug/tree/2.4.1" 861 | }, 862 | "time": "2024-09-23T11:39:58+00:00" 863 | }, 864 | { 865 | "name": "php-http/message", 866 | "version": "1.16.2", 867 | "source": { 868 | "type": "git", 869 | "url": "https://github.com/php-http/message.git", 870 | "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" 871 | }, 872 | "dist": { 873 | "type": "zip", 874 | "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", 875 | "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", 876 | "shasum": "" 877 | }, 878 | "require": { 879 | "clue/stream-filter": "^1.5", 880 | "php": "^7.2 || ^8.0", 881 | "psr/http-message": "^1.1 || ^2.0" 882 | }, 883 | "provide": { 884 | "php-http/message-factory-implementation": "1.0" 885 | }, 886 | "require-dev": { 887 | "ergebnis/composer-normalize": "^2.6", 888 | "ext-zlib": "*", 889 | "guzzlehttp/psr7": "^1.0 || ^2.0", 890 | "laminas/laminas-diactoros": "^2.0 || ^3.0", 891 | "php-http/message-factory": "^1.0.2", 892 | "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", 893 | "slim/slim": "^3.0" 894 | }, 895 | "suggest": { 896 | "ext-zlib": "Used with compressor/decompressor streams", 897 | "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", 898 | "laminas/laminas-diactoros": "Used with Diactoros Factories", 899 | "slim/slim": "Used with Slim Framework PSR-7 implementation" 900 | }, 901 | "type": "library", 902 | "autoload": { 903 | "files": [ 904 | "src/filters.php" 905 | ], 906 | "psr-4": { 907 | "Http\\Message\\": "src/" 908 | } 909 | }, 910 | "notification-url": "https://packagist.org/downloads/", 911 | "license": [ 912 | "MIT" 913 | ], 914 | "authors": [ 915 | { 916 | "name": "Márk Sági-Kazár", 917 | "email": "mark.sagikazar@gmail.com" 918 | } 919 | ], 920 | "description": "HTTP Message related tools", 921 | "homepage": "http://php-http.org", 922 | "keywords": [ 923 | "http", 924 | "message", 925 | "psr-7" 926 | ], 927 | "support": { 928 | "issues": "https://github.com/php-http/message/issues", 929 | "source": "https://github.com/php-http/message/tree/1.16.2" 930 | }, 931 | "time": "2024-10-02T11:34:13+00:00" 932 | }, 933 | { 934 | "name": "php-http/multipart-stream-builder", 935 | "version": "1.4.2", 936 | "source": { 937 | "type": "git", 938 | "url": "https://github.com/php-http/multipart-stream-builder.git", 939 | "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e" 940 | }, 941 | "dist": { 942 | "type": "zip", 943 | "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e", 944 | "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e", 945 | "shasum": "" 946 | }, 947 | "require": { 948 | "php": "^7.1 || ^8.0", 949 | "php-http/discovery": "^1.15", 950 | "psr/http-factory-implementation": "^1.0" 951 | }, 952 | "require-dev": { 953 | "nyholm/psr7": "^1.0", 954 | "php-http/message": "^1.5", 955 | "php-http/message-factory": "^1.0.2", 956 | "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" 957 | }, 958 | "type": "library", 959 | "autoload": { 960 | "psr-4": { 961 | "Http\\Message\\MultipartStream\\": "src/" 962 | } 963 | }, 964 | "notification-url": "https://packagist.org/downloads/", 965 | "license": [ 966 | "MIT" 967 | ], 968 | "authors": [ 969 | { 970 | "name": "Tobias Nyholm", 971 | "email": "tobias.nyholm@gmail.com" 972 | } 973 | ], 974 | "description": "A builder class that help you create a multipart stream", 975 | "homepage": "http://php-http.org", 976 | "keywords": [ 977 | "factory", 978 | "http", 979 | "message", 980 | "multipart stream", 981 | "stream" 982 | ], 983 | "support": { 984 | "issues": "https://github.com/php-http/multipart-stream-builder/issues", 985 | "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2" 986 | }, 987 | "time": "2024-09-04T13:22:54+00:00" 988 | }, 989 | { 990 | "name": "php-http/promise", 991 | "version": "1.3.1", 992 | "source": { 993 | "type": "git", 994 | "url": "https://github.com/php-http/promise.git", 995 | "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" 996 | }, 997 | "dist": { 998 | "type": "zip", 999 | "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", 1000 | "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", 1001 | "shasum": "" 1002 | }, 1003 | "require": { 1004 | "php": "^7.1 || ^8.0" 1005 | }, 1006 | "require-dev": { 1007 | "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", 1008 | "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" 1009 | }, 1010 | "type": "library", 1011 | "autoload": { 1012 | "psr-4": { 1013 | "Http\\Promise\\": "src/" 1014 | } 1015 | }, 1016 | "notification-url": "https://packagist.org/downloads/", 1017 | "license": [ 1018 | "MIT" 1019 | ], 1020 | "authors": [ 1021 | { 1022 | "name": "Joel Wurtz", 1023 | "email": "joel.wurtz@gmail.com" 1024 | }, 1025 | { 1026 | "name": "Márk Sági-Kazár", 1027 | "email": "mark.sagikazar@gmail.com" 1028 | } 1029 | ], 1030 | "description": "Promise used for asynchronous HTTP requests", 1031 | "homepage": "http://httplug.io", 1032 | "keywords": [ 1033 | "promise" 1034 | ], 1035 | "support": { 1036 | "issues": "https://github.com/php-http/promise/issues", 1037 | "source": "https://github.com/php-http/promise/tree/1.3.1" 1038 | }, 1039 | "time": "2024-03-15T13:55:21+00:00" 1040 | }, 1041 | { 1042 | "name": "pimple/pimple", 1043 | "version": "v3.5.0", 1044 | "source": { 1045 | "type": "git", 1046 | "url": "https://github.com/silexphp/Pimple.git", 1047 | "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" 1048 | }, 1049 | "dist": { 1050 | "type": "zip", 1051 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", 1052 | "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", 1053 | "shasum": "" 1054 | }, 1055 | "require": { 1056 | "php": ">=7.2.5", 1057 | "psr/container": "^1.1 || ^2.0" 1058 | }, 1059 | "require-dev": { 1060 | "symfony/phpunit-bridge": "^5.4@dev" 1061 | }, 1062 | "type": "library", 1063 | "extra": { 1064 | "branch-alias": { 1065 | "dev-master": "3.4.x-dev" 1066 | } 1067 | }, 1068 | "autoload": { 1069 | "psr-0": { 1070 | "Pimple": "src/" 1071 | } 1072 | }, 1073 | "notification-url": "https://packagist.org/downloads/", 1074 | "license": [ 1075 | "MIT" 1076 | ], 1077 | "authors": [ 1078 | { 1079 | "name": "Fabien Potencier", 1080 | "email": "fabien@symfony.com" 1081 | } 1082 | ], 1083 | "description": "Pimple, a simple Dependency Injection Container", 1084 | "homepage": "https://pimple.symfony.com", 1085 | "keywords": [ 1086 | "container", 1087 | "dependency injection" 1088 | ], 1089 | "support": { 1090 | "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" 1091 | }, 1092 | "time": "2021-10-28T11:13:42+00:00" 1093 | }, 1094 | { 1095 | "name": "psr/cache", 1096 | "version": "3.0.0", 1097 | "source": { 1098 | "type": "git", 1099 | "url": "https://github.com/php-fig/cache.git", 1100 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" 1101 | }, 1102 | "dist": { 1103 | "type": "zip", 1104 | "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1105 | "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", 1106 | "shasum": "" 1107 | }, 1108 | "require": { 1109 | "php": ">=8.0.0" 1110 | }, 1111 | "type": "library", 1112 | "extra": { 1113 | "branch-alias": { 1114 | "dev-master": "1.0.x-dev" 1115 | } 1116 | }, 1117 | "autoload": { 1118 | "psr-4": { 1119 | "Psr\\Cache\\": "src/" 1120 | } 1121 | }, 1122 | "notification-url": "https://packagist.org/downloads/", 1123 | "license": [ 1124 | "MIT" 1125 | ], 1126 | "authors": [ 1127 | { 1128 | "name": "PHP-FIG", 1129 | "homepage": "https://www.php-fig.org/" 1130 | } 1131 | ], 1132 | "description": "Common interface for caching libraries", 1133 | "keywords": [ 1134 | "cache", 1135 | "psr", 1136 | "psr-6" 1137 | ], 1138 | "support": { 1139 | "source": "https://github.com/php-fig/cache/tree/3.0.0" 1140 | }, 1141 | "time": "2021-02-03T23:26:27+00:00" 1142 | }, 1143 | { 1144 | "name": "psr/container", 1145 | "version": "2.0.2", 1146 | "source": { 1147 | "type": "git", 1148 | "url": "https://github.com/php-fig/container.git", 1149 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1150 | }, 1151 | "dist": { 1152 | "type": "zip", 1153 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1154 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1155 | "shasum": "" 1156 | }, 1157 | "require": { 1158 | "php": ">=7.4.0" 1159 | }, 1160 | "type": "library", 1161 | "extra": { 1162 | "branch-alias": { 1163 | "dev-master": "2.0.x-dev" 1164 | } 1165 | }, 1166 | "autoload": { 1167 | "psr-4": { 1168 | "Psr\\Container\\": "src/" 1169 | } 1170 | }, 1171 | "notification-url": "https://packagist.org/downloads/", 1172 | "license": [ 1173 | "MIT" 1174 | ], 1175 | "authors": [ 1176 | { 1177 | "name": "PHP-FIG", 1178 | "homepage": "https://www.php-fig.org/" 1179 | } 1180 | ], 1181 | "description": "Common Container Interface (PHP FIG PSR-11)", 1182 | "homepage": "https://github.com/php-fig/container", 1183 | "keywords": [ 1184 | "PSR-11", 1185 | "container", 1186 | "container-interface", 1187 | "container-interop", 1188 | "psr" 1189 | ], 1190 | "support": { 1191 | "issues": "https://github.com/php-fig/container/issues", 1192 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1193 | }, 1194 | "time": "2021-11-05T16:47:00+00:00" 1195 | }, 1196 | { 1197 | "name": "psr/http-client", 1198 | "version": "1.0.3", 1199 | "source": { 1200 | "type": "git", 1201 | "url": "https://github.com/php-fig/http-client.git", 1202 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" 1203 | }, 1204 | "dist": { 1205 | "type": "zip", 1206 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", 1207 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", 1208 | "shasum": "" 1209 | }, 1210 | "require": { 1211 | "php": "^7.0 || ^8.0", 1212 | "psr/http-message": "^1.0 || ^2.0" 1213 | }, 1214 | "type": "library", 1215 | "extra": { 1216 | "branch-alias": { 1217 | "dev-master": "1.0.x-dev" 1218 | } 1219 | }, 1220 | "autoload": { 1221 | "psr-4": { 1222 | "Psr\\Http\\Client\\": "src/" 1223 | } 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "MIT" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "PHP-FIG", 1232 | "homepage": "https://www.php-fig.org/" 1233 | } 1234 | ], 1235 | "description": "Common interface for HTTP clients", 1236 | "homepage": "https://github.com/php-fig/http-client", 1237 | "keywords": [ 1238 | "http", 1239 | "http-client", 1240 | "psr", 1241 | "psr-18" 1242 | ], 1243 | "support": { 1244 | "source": "https://github.com/php-fig/http-client" 1245 | }, 1246 | "time": "2023-09-23T14:17:50+00:00" 1247 | }, 1248 | { 1249 | "name": "psr/http-factory", 1250 | "version": "1.1.0", 1251 | "source": { 1252 | "type": "git", 1253 | "url": "https://github.com/php-fig/http-factory.git", 1254 | "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" 1255 | }, 1256 | "dist": { 1257 | "type": "zip", 1258 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", 1259 | "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", 1260 | "shasum": "" 1261 | }, 1262 | "require": { 1263 | "php": ">=7.1", 1264 | "psr/http-message": "^1.0 || ^2.0" 1265 | }, 1266 | "type": "library", 1267 | "extra": { 1268 | "branch-alias": { 1269 | "dev-master": "1.0.x-dev" 1270 | } 1271 | }, 1272 | "autoload": { 1273 | "psr-4": { 1274 | "Psr\\Http\\Message\\": "src/" 1275 | } 1276 | }, 1277 | "notification-url": "https://packagist.org/downloads/", 1278 | "license": [ 1279 | "MIT" 1280 | ], 1281 | "authors": [ 1282 | { 1283 | "name": "PHP-FIG", 1284 | "homepage": "https://www.php-fig.org/" 1285 | } 1286 | ], 1287 | "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", 1288 | "keywords": [ 1289 | "factory", 1290 | "http", 1291 | "message", 1292 | "psr", 1293 | "psr-17", 1294 | "psr-7", 1295 | "request", 1296 | "response" 1297 | ], 1298 | "support": { 1299 | "source": "https://github.com/php-fig/http-factory" 1300 | }, 1301 | "time": "2024-04-15T12:06:14+00:00" 1302 | }, 1303 | { 1304 | "name": "psr/http-message", 1305 | "version": "2.0", 1306 | "source": { 1307 | "type": "git", 1308 | "url": "https://github.com/php-fig/http-message.git", 1309 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" 1310 | }, 1311 | "dist": { 1312 | "type": "zip", 1313 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1314 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1315 | "shasum": "" 1316 | }, 1317 | "require": { 1318 | "php": "^7.2 || ^8.0" 1319 | }, 1320 | "type": "library", 1321 | "extra": { 1322 | "branch-alias": { 1323 | "dev-master": "2.0.x-dev" 1324 | } 1325 | }, 1326 | "autoload": { 1327 | "psr-4": { 1328 | "Psr\\Http\\Message\\": "src/" 1329 | } 1330 | }, 1331 | "notification-url": "https://packagist.org/downloads/", 1332 | "license": [ 1333 | "MIT" 1334 | ], 1335 | "authors": [ 1336 | { 1337 | "name": "PHP-FIG", 1338 | "homepage": "https://www.php-fig.org/" 1339 | } 1340 | ], 1341 | "description": "Common interface for HTTP messages", 1342 | "homepage": "https://github.com/php-fig/http-message", 1343 | "keywords": [ 1344 | "http", 1345 | "http-message", 1346 | "psr", 1347 | "psr-7", 1348 | "request", 1349 | "response" 1350 | ], 1351 | "support": { 1352 | "source": "https://github.com/php-fig/http-message/tree/2.0" 1353 | }, 1354 | "time": "2023-04-04T09:54:51+00:00" 1355 | }, 1356 | { 1357 | "name": "ralouphie/getallheaders", 1358 | "version": "3.0.3", 1359 | "source": { 1360 | "type": "git", 1361 | "url": "https://github.com/ralouphie/getallheaders.git", 1362 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 1363 | }, 1364 | "dist": { 1365 | "type": "zip", 1366 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 1367 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 1368 | "shasum": "" 1369 | }, 1370 | "require": { 1371 | "php": ">=5.6" 1372 | }, 1373 | "require-dev": { 1374 | "php-coveralls/php-coveralls": "^2.1", 1375 | "phpunit/phpunit": "^5 || ^6.5" 1376 | }, 1377 | "type": "library", 1378 | "autoload": { 1379 | "files": [ 1380 | "src/getallheaders.php" 1381 | ] 1382 | }, 1383 | "notification-url": "https://packagist.org/downloads/", 1384 | "license": [ 1385 | "MIT" 1386 | ], 1387 | "authors": [ 1388 | { 1389 | "name": "Ralph Khattar", 1390 | "email": "ralph.khattar@gmail.com" 1391 | } 1392 | ], 1393 | "description": "A polyfill for getallheaders.", 1394 | "support": { 1395 | "issues": "https://github.com/ralouphie/getallheaders/issues", 1396 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 1397 | }, 1398 | "time": "2019-03-08T08:55:37+00:00" 1399 | }, 1400 | { 1401 | "name": "symfony/deprecation-contracts", 1402 | "version": "v3.5.0", 1403 | "source": { 1404 | "type": "git", 1405 | "url": "https://github.com/symfony/deprecation-contracts.git", 1406 | "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" 1407 | }, 1408 | "dist": { 1409 | "type": "zip", 1410 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", 1411 | "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", 1412 | "shasum": "" 1413 | }, 1414 | "require": { 1415 | "php": ">=8.1" 1416 | }, 1417 | "type": "library", 1418 | "extra": { 1419 | "branch-alias": { 1420 | "dev-main": "3.5-dev" 1421 | }, 1422 | "thanks": { 1423 | "name": "symfony/contracts", 1424 | "url": "https://github.com/symfony/contracts" 1425 | } 1426 | }, 1427 | "autoload": { 1428 | "files": [ 1429 | "function.php" 1430 | ] 1431 | }, 1432 | "notification-url": "https://packagist.org/downloads/", 1433 | "license": [ 1434 | "MIT" 1435 | ], 1436 | "authors": [ 1437 | { 1438 | "name": "Nicolas Grekas", 1439 | "email": "p@tchwork.com" 1440 | }, 1441 | { 1442 | "name": "Symfony Community", 1443 | "homepage": "https://symfony.com/contributors" 1444 | } 1445 | ], 1446 | "description": "A generic function and convention to trigger deprecation notices", 1447 | "homepage": "https://symfony.com", 1448 | "support": { 1449 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" 1450 | }, 1451 | "funding": [ 1452 | { 1453 | "url": "https://symfony.com/sponsor", 1454 | "type": "custom" 1455 | }, 1456 | { 1457 | "url": "https://github.com/fabpot", 1458 | "type": "github" 1459 | }, 1460 | { 1461 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1462 | "type": "tidelift" 1463 | } 1464 | ], 1465 | "time": "2024-04-18T09:32:20+00:00" 1466 | }, 1467 | { 1468 | "name": "symfony/options-resolver", 1469 | "version": "v6.4.13", 1470 | "source": { 1471 | "type": "git", 1472 | "url": "https://github.com/symfony/options-resolver.git", 1473 | "reference": "0a62a9f2504a8dd27083f89d21894ceb01cc59db" 1474 | }, 1475 | "dist": { 1476 | "type": "zip", 1477 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0a62a9f2504a8dd27083f89d21894ceb01cc59db", 1478 | "reference": "0a62a9f2504a8dd27083f89d21894ceb01cc59db", 1479 | "shasum": "" 1480 | }, 1481 | "require": { 1482 | "php": ">=8.1", 1483 | "symfony/deprecation-contracts": "^2.5|^3" 1484 | }, 1485 | "type": "library", 1486 | "autoload": { 1487 | "psr-4": { 1488 | "Symfony\\Component\\OptionsResolver\\": "" 1489 | }, 1490 | "exclude-from-classmap": [ 1491 | "/Tests/" 1492 | ] 1493 | }, 1494 | "notification-url": "https://packagist.org/downloads/", 1495 | "license": [ 1496 | "MIT" 1497 | ], 1498 | "authors": [ 1499 | { 1500 | "name": "Fabien Potencier", 1501 | "email": "fabien@symfony.com" 1502 | }, 1503 | { 1504 | "name": "Symfony Community", 1505 | "homepage": "https://symfony.com/contributors" 1506 | } 1507 | ], 1508 | "description": "Provides an improved replacement for the array_replace PHP function", 1509 | "homepage": "https://symfony.com", 1510 | "keywords": [ 1511 | "config", 1512 | "configuration", 1513 | "options" 1514 | ], 1515 | "support": { 1516 | "source": "https://github.com/symfony/options-resolver/tree/v6.4.13" 1517 | }, 1518 | "funding": [ 1519 | { 1520 | "url": "https://symfony.com/sponsor", 1521 | "type": "custom" 1522 | }, 1523 | { 1524 | "url": "https://github.com/fabpot", 1525 | "type": "github" 1526 | }, 1527 | { 1528 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1529 | "type": "tidelift" 1530 | } 1531 | ], 1532 | "time": "2024-09-25T14:18:03+00:00" 1533 | }, 1534 | { 1535 | "name": "symfony/polyfill-php80", 1536 | "version": "v1.31.0", 1537 | "source": { 1538 | "type": "git", 1539 | "url": "https://github.com/symfony/polyfill-php80.git", 1540 | "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" 1541 | }, 1542 | "dist": { 1543 | "type": "zip", 1544 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", 1545 | "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", 1546 | "shasum": "" 1547 | }, 1548 | "require": { 1549 | "php": ">=7.2" 1550 | }, 1551 | "type": "library", 1552 | "extra": { 1553 | "thanks": { 1554 | "name": "symfony/polyfill", 1555 | "url": "https://github.com/symfony/polyfill" 1556 | } 1557 | }, 1558 | "autoload": { 1559 | "files": [ 1560 | "bootstrap.php" 1561 | ], 1562 | "psr-4": { 1563 | "Symfony\\Polyfill\\Php80\\": "" 1564 | }, 1565 | "classmap": [ 1566 | "Resources/stubs" 1567 | ] 1568 | }, 1569 | "notification-url": "https://packagist.org/downloads/", 1570 | "license": [ 1571 | "MIT" 1572 | ], 1573 | "authors": [ 1574 | { 1575 | "name": "Ion Bazan", 1576 | "email": "ion.bazan@gmail.com" 1577 | }, 1578 | { 1579 | "name": "Nicolas Grekas", 1580 | "email": "p@tchwork.com" 1581 | }, 1582 | { 1583 | "name": "Symfony Community", 1584 | "homepage": "https://symfony.com/contributors" 1585 | } 1586 | ], 1587 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 1588 | "homepage": "https://symfony.com", 1589 | "keywords": [ 1590 | "compatibility", 1591 | "polyfill", 1592 | "portable", 1593 | "shim" 1594 | ], 1595 | "support": { 1596 | "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" 1597 | }, 1598 | "funding": [ 1599 | { 1600 | "url": "https://symfony.com/sponsor", 1601 | "type": "custom" 1602 | }, 1603 | { 1604 | "url": "https://github.com/fabpot", 1605 | "type": "github" 1606 | }, 1607 | { 1608 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1609 | "type": "tidelift" 1610 | } 1611 | ], 1612 | "time": "2024-09-09T11:45:10+00:00" 1613 | } 1614 | ], 1615 | "packages-dev": [ 1616 | { 1617 | "name": "doctrine/instantiator", 1618 | "version": "2.0.0", 1619 | "source": { 1620 | "type": "git", 1621 | "url": "https://github.com/doctrine/instantiator.git", 1622 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" 1623 | }, 1624 | "dist": { 1625 | "type": "zip", 1626 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 1627 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 1628 | "shasum": "" 1629 | }, 1630 | "require": { 1631 | "php": "^8.1" 1632 | }, 1633 | "require-dev": { 1634 | "doctrine/coding-standard": "^11", 1635 | "ext-pdo": "*", 1636 | "ext-phar": "*", 1637 | "phpbench/phpbench": "^1.2", 1638 | "phpstan/phpstan": "^1.9.4", 1639 | "phpstan/phpstan-phpunit": "^1.3", 1640 | "phpunit/phpunit": "^9.5.27", 1641 | "vimeo/psalm": "^5.4" 1642 | }, 1643 | "type": "library", 1644 | "autoload": { 1645 | "psr-4": { 1646 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1647 | } 1648 | }, 1649 | "notification-url": "https://packagist.org/downloads/", 1650 | "license": [ 1651 | "MIT" 1652 | ], 1653 | "authors": [ 1654 | { 1655 | "name": "Marco Pivetta", 1656 | "email": "ocramius@gmail.com", 1657 | "homepage": "https://ocramius.github.io/" 1658 | } 1659 | ], 1660 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1661 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 1662 | "keywords": [ 1663 | "constructor", 1664 | "instantiate" 1665 | ], 1666 | "support": { 1667 | "issues": "https://github.com/doctrine/instantiator/issues", 1668 | "source": "https://github.com/doctrine/instantiator/tree/2.0.0" 1669 | }, 1670 | "funding": [ 1671 | { 1672 | "url": "https://www.doctrine-project.org/sponsorship.html", 1673 | "type": "custom" 1674 | }, 1675 | { 1676 | "url": "https://www.patreon.com/phpdoctrine", 1677 | "type": "patreon" 1678 | }, 1679 | { 1680 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 1681 | "type": "tidelift" 1682 | } 1683 | ], 1684 | "time": "2022-12-30T00:23:10+00:00" 1685 | }, 1686 | { 1687 | "name": "myclabs/deep-copy", 1688 | "version": "1.12.1", 1689 | "source": { 1690 | "type": "git", 1691 | "url": "https://github.com/myclabs/DeepCopy.git", 1692 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" 1693 | }, 1694 | "dist": { 1695 | "type": "zip", 1696 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", 1697 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", 1698 | "shasum": "" 1699 | }, 1700 | "require": { 1701 | "php": "^7.1 || ^8.0" 1702 | }, 1703 | "conflict": { 1704 | "doctrine/collections": "<1.6.8", 1705 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 1706 | }, 1707 | "require-dev": { 1708 | "doctrine/collections": "^1.6.8", 1709 | "doctrine/common": "^2.13.3 || ^3.2.2", 1710 | "phpspec/prophecy": "^1.10", 1711 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 1712 | }, 1713 | "type": "library", 1714 | "autoload": { 1715 | "files": [ 1716 | "src/DeepCopy/deep_copy.php" 1717 | ], 1718 | "psr-4": { 1719 | "DeepCopy\\": "src/DeepCopy/" 1720 | } 1721 | }, 1722 | "notification-url": "https://packagist.org/downloads/", 1723 | "license": [ 1724 | "MIT" 1725 | ], 1726 | "description": "Create deep copies (clones) of your objects", 1727 | "keywords": [ 1728 | "clone", 1729 | "copy", 1730 | "duplicate", 1731 | "object", 1732 | "object graph" 1733 | ], 1734 | "support": { 1735 | "issues": "https://github.com/myclabs/DeepCopy/issues", 1736 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" 1737 | }, 1738 | "funding": [ 1739 | { 1740 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 1741 | "type": "tidelift" 1742 | } 1743 | ], 1744 | "time": "2024-11-08T17:47:46+00:00" 1745 | }, 1746 | { 1747 | "name": "nikic/php-parser", 1748 | "version": "v5.3.1", 1749 | "source": { 1750 | "type": "git", 1751 | "url": "https://github.com/nikic/PHP-Parser.git", 1752 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" 1753 | }, 1754 | "dist": { 1755 | "type": "zip", 1756 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", 1757 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", 1758 | "shasum": "" 1759 | }, 1760 | "require": { 1761 | "ext-ctype": "*", 1762 | "ext-json": "*", 1763 | "ext-tokenizer": "*", 1764 | "php": ">=7.4" 1765 | }, 1766 | "require-dev": { 1767 | "ircmaxell/php-yacc": "^0.0.7", 1768 | "phpunit/phpunit": "^9.0" 1769 | }, 1770 | "bin": [ 1771 | "bin/php-parse" 1772 | ], 1773 | "type": "library", 1774 | "extra": { 1775 | "branch-alias": { 1776 | "dev-master": "5.0-dev" 1777 | } 1778 | }, 1779 | "autoload": { 1780 | "psr-4": { 1781 | "PhpParser\\": "lib/PhpParser" 1782 | } 1783 | }, 1784 | "notification-url": "https://packagist.org/downloads/", 1785 | "license": [ 1786 | "BSD-3-Clause" 1787 | ], 1788 | "authors": [ 1789 | { 1790 | "name": "Nikita Popov" 1791 | } 1792 | ], 1793 | "description": "A PHP parser written in PHP", 1794 | "keywords": [ 1795 | "parser", 1796 | "php" 1797 | ], 1798 | "support": { 1799 | "issues": "https://github.com/nikic/PHP-Parser/issues", 1800 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" 1801 | }, 1802 | "time": "2024-10-08T18:51:32+00:00" 1803 | }, 1804 | { 1805 | "name": "phar-io/manifest", 1806 | "version": "2.0.4", 1807 | "source": { 1808 | "type": "git", 1809 | "url": "https://github.com/phar-io/manifest.git", 1810 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 1811 | }, 1812 | "dist": { 1813 | "type": "zip", 1814 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 1815 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 1816 | "shasum": "" 1817 | }, 1818 | "require": { 1819 | "ext-dom": "*", 1820 | "ext-libxml": "*", 1821 | "ext-phar": "*", 1822 | "ext-xmlwriter": "*", 1823 | "phar-io/version": "^3.0.1", 1824 | "php": "^7.2 || ^8.0" 1825 | }, 1826 | "type": "library", 1827 | "extra": { 1828 | "branch-alias": { 1829 | "dev-master": "2.0.x-dev" 1830 | } 1831 | }, 1832 | "autoload": { 1833 | "classmap": [ 1834 | "src/" 1835 | ] 1836 | }, 1837 | "notification-url": "https://packagist.org/downloads/", 1838 | "license": [ 1839 | "BSD-3-Clause" 1840 | ], 1841 | "authors": [ 1842 | { 1843 | "name": "Arne Blankerts", 1844 | "email": "arne@blankerts.de", 1845 | "role": "Developer" 1846 | }, 1847 | { 1848 | "name": "Sebastian Heuer", 1849 | "email": "sebastian@phpeople.de", 1850 | "role": "Developer" 1851 | }, 1852 | { 1853 | "name": "Sebastian Bergmann", 1854 | "email": "sebastian@phpunit.de", 1855 | "role": "Developer" 1856 | } 1857 | ], 1858 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1859 | "support": { 1860 | "issues": "https://github.com/phar-io/manifest/issues", 1861 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 1862 | }, 1863 | "funding": [ 1864 | { 1865 | "url": "https://github.com/theseer", 1866 | "type": "github" 1867 | } 1868 | ], 1869 | "time": "2024-03-03T12:33:53+00:00" 1870 | }, 1871 | { 1872 | "name": "phar-io/version", 1873 | "version": "3.2.1", 1874 | "source": { 1875 | "type": "git", 1876 | "url": "https://github.com/phar-io/version.git", 1877 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 1878 | }, 1879 | "dist": { 1880 | "type": "zip", 1881 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 1882 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 1883 | "shasum": "" 1884 | }, 1885 | "require": { 1886 | "php": "^7.2 || ^8.0" 1887 | }, 1888 | "type": "library", 1889 | "autoload": { 1890 | "classmap": [ 1891 | "src/" 1892 | ] 1893 | }, 1894 | "notification-url": "https://packagist.org/downloads/", 1895 | "license": [ 1896 | "BSD-3-Clause" 1897 | ], 1898 | "authors": [ 1899 | { 1900 | "name": "Arne Blankerts", 1901 | "email": "arne@blankerts.de", 1902 | "role": "Developer" 1903 | }, 1904 | { 1905 | "name": "Sebastian Heuer", 1906 | "email": "sebastian@phpeople.de", 1907 | "role": "Developer" 1908 | }, 1909 | { 1910 | "name": "Sebastian Bergmann", 1911 | "email": "sebastian@phpunit.de", 1912 | "role": "Developer" 1913 | } 1914 | ], 1915 | "description": "Library for handling version information and constraints", 1916 | "support": { 1917 | "issues": "https://github.com/phar-io/version/issues", 1918 | "source": "https://github.com/phar-io/version/tree/3.2.1" 1919 | }, 1920 | "time": "2022-02-21T01:04:05+00:00" 1921 | }, 1922 | { 1923 | "name": "phpunit/php-code-coverage", 1924 | "version": "9.2.32", 1925 | "source": { 1926 | "type": "git", 1927 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1928 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" 1929 | }, 1930 | "dist": { 1931 | "type": "zip", 1932 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", 1933 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", 1934 | "shasum": "" 1935 | }, 1936 | "require": { 1937 | "ext-dom": "*", 1938 | "ext-libxml": "*", 1939 | "ext-xmlwriter": "*", 1940 | "nikic/php-parser": "^4.19.1 || ^5.1.0", 1941 | "php": ">=7.3", 1942 | "phpunit/php-file-iterator": "^3.0.6", 1943 | "phpunit/php-text-template": "^2.0.4", 1944 | "sebastian/code-unit-reverse-lookup": "^2.0.3", 1945 | "sebastian/complexity": "^2.0.3", 1946 | "sebastian/environment": "^5.1.5", 1947 | "sebastian/lines-of-code": "^1.0.4", 1948 | "sebastian/version": "^3.0.2", 1949 | "theseer/tokenizer": "^1.2.3" 1950 | }, 1951 | "require-dev": { 1952 | "phpunit/phpunit": "^9.6" 1953 | }, 1954 | "suggest": { 1955 | "ext-pcov": "PHP extension that provides line coverage", 1956 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1957 | }, 1958 | "type": "library", 1959 | "extra": { 1960 | "branch-alias": { 1961 | "dev-main": "9.2.x-dev" 1962 | } 1963 | }, 1964 | "autoload": { 1965 | "classmap": [ 1966 | "src/" 1967 | ] 1968 | }, 1969 | "notification-url": "https://packagist.org/downloads/", 1970 | "license": [ 1971 | "BSD-3-Clause" 1972 | ], 1973 | "authors": [ 1974 | { 1975 | "name": "Sebastian Bergmann", 1976 | "email": "sebastian@phpunit.de", 1977 | "role": "lead" 1978 | } 1979 | ], 1980 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1981 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1982 | "keywords": [ 1983 | "coverage", 1984 | "testing", 1985 | "xunit" 1986 | ], 1987 | "support": { 1988 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 1989 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 1990 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" 1991 | }, 1992 | "funding": [ 1993 | { 1994 | "url": "https://github.com/sebastianbergmann", 1995 | "type": "github" 1996 | } 1997 | ], 1998 | "time": "2024-08-22T04:23:01+00:00" 1999 | }, 2000 | { 2001 | "name": "phpunit/php-file-iterator", 2002 | "version": "3.0.6", 2003 | "source": { 2004 | "type": "git", 2005 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2006 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 2007 | }, 2008 | "dist": { 2009 | "type": "zip", 2010 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 2011 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 2012 | "shasum": "" 2013 | }, 2014 | "require": { 2015 | "php": ">=7.3" 2016 | }, 2017 | "require-dev": { 2018 | "phpunit/phpunit": "^9.3" 2019 | }, 2020 | "type": "library", 2021 | "extra": { 2022 | "branch-alias": { 2023 | "dev-master": "3.0-dev" 2024 | } 2025 | }, 2026 | "autoload": { 2027 | "classmap": [ 2028 | "src/" 2029 | ] 2030 | }, 2031 | "notification-url": "https://packagist.org/downloads/", 2032 | "license": [ 2033 | "BSD-3-Clause" 2034 | ], 2035 | "authors": [ 2036 | { 2037 | "name": "Sebastian Bergmann", 2038 | "email": "sebastian@phpunit.de", 2039 | "role": "lead" 2040 | } 2041 | ], 2042 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2043 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2044 | "keywords": [ 2045 | "filesystem", 2046 | "iterator" 2047 | ], 2048 | "support": { 2049 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 2050 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 2051 | }, 2052 | "funding": [ 2053 | { 2054 | "url": "https://github.com/sebastianbergmann", 2055 | "type": "github" 2056 | } 2057 | ], 2058 | "time": "2021-12-02T12:48:52+00:00" 2059 | }, 2060 | { 2061 | "name": "phpunit/php-invoker", 2062 | "version": "3.1.1", 2063 | "source": { 2064 | "type": "git", 2065 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 2066 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 2067 | }, 2068 | "dist": { 2069 | "type": "zip", 2070 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 2071 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 2072 | "shasum": "" 2073 | }, 2074 | "require": { 2075 | "php": ">=7.3" 2076 | }, 2077 | "require-dev": { 2078 | "ext-pcntl": "*", 2079 | "phpunit/phpunit": "^9.3" 2080 | }, 2081 | "suggest": { 2082 | "ext-pcntl": "*" 2083 | }, 2084 | "type": "library", 2085 | "extra": { 2086 | "branch-alias": { 2087 | "dev-master": "3.1-dev" 2088 | } 2089 | }, 2090 | "autoload": { 2091 | "classmap": [ 2092 | "src/" 2093 | ] 2094 | }, 2095 | "notification-url": "https://packagist.org/downloads/", 2096 | "license": [ 2097 | "BSD-3-Clause" 2098 | ], 2099 | "authors": [ 2100 | { 2101 | "name": "Sebastian Bergmann", 2102 | "email": "sebastian@phpunit.de", 2103 | "role": "lead" 2104 | } 2105 | ], 2106 | "description": "Invoke callables with a timeout", 2107 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 2108 | "keywords": [ 2109 | "process" 2110 | ], 2111 | "support": { 2112 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 2113 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 2114 | }, 2115 | "funding": [ 2116 | { 2117 | "url": "https://github.com/sebastianbergmann", 2118 | "type": "github" 2119 | } 2120 | ], 2121 | "time": "2020-09-28T05:58:55+00:00" 2122 | }, 2123 | { 2124 | "name": "phpunit/php-text-template", 2125 | "version": "2.0.4", 2126 | "source": { 2127 | "type": "git", 2128 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2129 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 2130 | }, 2131 | "dist": { 2132 | "type": "zip", 2133 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 2134 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 2135 | "shasum": "" 2136 | }, 2137 | "require": { 2138 | "php": ">=7.3" 2139 | }, 2140 | "require-dev": { 2141 | "phpunit/phpunit": "^9.3" 2142 | }, 2143 | "type": "library", 2144 | "extra": { 2145 | "branch-alias": { 2146 | "dev-master": "2.0-dev" 2147 | } 2148 | }, 2149 | "autoload": { 2150 | "classmap": [ 2151 | "src/" 2152 | ] 2153 | }, 2154 | "notification-url": "https://packagist.org/downloads/", 2155 | "license": [ 2156 | "BSD-3-Clause" 2157 | ], 2158 | "authors": [ 2159 | { 2160 | "name": "Sebastian Bergmann", 2161 | "email": "sebastian@phpunit.de", 2162 | "role": "lead" 2163 | } 2164 | ], 2165 | "description": "Simple template engine.", 2166 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2167 | "keywords": [ 2168 | "template" 2169 | ], 2170 | "support": { 2171 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 2172 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 2173 | }, 2174 | "funding": [ 2175 | { 2176 | "url": "https://github.com/sebastianbergmann", 2177 | "type": "github" 2178 | } 2179 | ], 2180 | "time": "2020-10-26T05:33:50+00:00" 2181 | }, 2182 | { 2183 | "name": "phpunit/php-timer", 2184 | "version": "5.0.3", 2185 | "source": { 2186 | "type": "git", 2187 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2188 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 2189 | }, 2190 | "dist": { 2191 | "type": "zip", 2192 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 2193 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 2194 | "shasum": "" 2195 | }, 2196 | "require": { 2197 | "php": ">=7.3" 2198 | }, 2199 | "require-dev": { 2200 | "phpunit/phpunit": "^9.3" 2201 | }, 2202 | "type": "library", 2203 | "extra": { 2204 | "branch-alias": { 2205 | "dev-master": "5.0-dev" 2206 | } 2207 | }, 2208 | "autoload": { 2209 | "classmap": [ 2210 | "src/" 2211 | ] 2212 | }, 2213 | "notification-url": "https://packagist.org/downloads/", 2214 | "license": [ 2215 | "BSD-3-Clause" 2216 | ], 2217 | "authors": [ 2218 | { 2219 | "name": "Sebastian Bergmann", 2220 | "email": "sebastian@phpunit.de", 2221 | "role": "lead" 2222 | } 2223 | ], 2224 | "description": "Utility class for timing", 2225 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2226 | "keywords": [ 2227 | "timer" 2228 | ], 2229 | "support": { 2230 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 2231 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 2232 | }, 2233 | "funding": [ 2234 | { 2235 | "url": "https://github.com/sebastianbergmann", 2236 | "type": "github" 2237 | } 2238 | ], 2239 | "time": "2020-10-26T13:16:10+00:00" 2240 | }, 2241 | { 2242 | "name": "phpunit/phpunit", 2243 | "version": "9.6.21", 2244 | "source": { 2245 | "type": "git", 2246 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2247 | "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" 2248 | }, 2249 | "dist": { 2250 | "type": "zip", 2251 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", 2252 | "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", 2253 | "shasum": "" 2254 | }, 2255 | "require": { 2256 | "doctrine/instantiator": "^1.5.0 || ^2", 2257 | "ext-dom": "*", 2258 | "ext-json": "*", 2259 | "ext-libxml": "*", 2260 | "ext-mbstring": "*", 2261 | "ext-xml": "*", 2262 | "ext-xmlwriter": "*", 2263 | "myclabs/deep-copy": "^1.12.0", 2264 | "phar-io/manifest": "^2.0.4", 2265 | "phar-io/version": "^3.2.1", 2266 | "php": ">=7.3", 2267 | "phpunit/php-code-coverage": "^9.2.32", 2268 | "phpunit/php-file-iterator": "^3.0.6", 2269 | "phpunit/php-invoker": "^3.1.1", 2270 | "phpunit/php-text-template": "^2.0.4", 2271 | "phpunit/php-timer": "^5.0.3", 2272 | "sebastian/cli-parser": "^1.0.2", 2273 | "sebastian/code-unit": "^1.0.8", 2274 | "sebastian/comparator": "^4.0.8", 2275 | "sebastian/diff": "^4.0.6", 2276 | "sebastian/environment": "^5.1.5", 2277 | "sebastian/exporter": "^4.0.6", 2278 | "sebastian/global-state": "^5.0.7", 2279 | "sebastian/object-enumerator": "^4.0.4", 2280 | "sebastian/resource-operations": "^3.0.4", 2281 | "sebastian/type": "^3.2.1", 2282 | "sebastian/version": "^3.0.2" 2283 | }, 2284 | "suggest": { 2285 | "ext-soap": "To be able to generate mocks based on WSDL files", 2286 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 2287 | }, 2288 | "bin": [ 2289 | "phpunit" 2290 | ], 2291 | "type": "library", 2292 | "extra": { 2293 | "branch-alias": { 2294 | "dev-master": "9.6-dev" 2295 | } 2296 | }, 2297 | "autoload": { 2298 | "files": [ 2299 | "src/Framework/Assert/Functions.php" 2300 | ], 2301 | "classmap": [ 2302 | "src/" 2303 | ] 2304 | }, 2305 | "notification-url": "https://packagist.org/downloads/", 2306 | "license": [ 2307 | "BSD-3-Clause" 2308 | ], 2309 | "authors": [ 2310 | { 2311 | "name": "Sebastian Bergmann", 2312 | "email": "sebastian@phpunit.de", 2313 | "role": "lead" 2314 | } 2315 | ], 2316 | "description": "The PHP Unit Testing framework.", 2317 | "homepage": "https://phpunit.de/", 2318 | "keywords": [ 2319 | "phpunit", 2320 | "testing", 2321 | "xunit" 2322 | ], 2323 | "support": { 2324 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 2325 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 2326 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" 2327 | }, 2328 | "funding": [ 2329 | { 2330 | "url": "https://phpunit.de/sponsors.html", 2331 | "type": "custom" 2332 | }, 2333 | { 2334 | "url": "https://github.com/sebastianbergmann", 2335 | "type": "github" 2336 | }, 2337 | { 2338 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 2339 | "type": "tidelift" 2340 | } 2341 | ], 2342 | "time": "2024-09-19T10:50:18+00:00" 2343 | }, 2344 | { 2345 | "name": "sebastian/cli-parser", 2346 | "version": "1.0.2", 2347 | "source": { 2348 | "type": "git", 2349 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 2350 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" 2351 | }, 2352 | "dist": { 2353 | "type": "zip", 2354 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 2355 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 2356 | "shasum": "" 2357 | }, 2358 | "require": { 2359 | "php": ">=7.3" 2360 | }, 2361 | "require-dev": { 2362 | "phpunit/phpunit": "^9.3" 2363 | }, 2364 | "type": "library", 2365 | "extra": { 2366 | "branch-alias": { 2367 | "dev-master": "1.0-dev" 2368 | } 2369 | }, 2370 | "autoload": { 2371 | "classmap": [ 2372 | "src/" 2373 | ] 2374 | }, 2375 | "notification-url": "https://packagist.org/downloads/", 2376 | "license": [ 2377 | "BSD-3-Clause" 2378 | ], 2379 | "authors": [ 2380 | { 2381 | "name": "Sebastian Bergmann", 2382 | "email": "sebastian@phpunit.de", 2383 | "role": "lead" 2384 | } 2385 | ], 2386 | "description": "Library for parsing CLI options", 2387 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 2388 | "support": { 2389 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 2390 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" 2391 | }, 2392 | "funding": [ 2393 | { 2394 | "url": "https://github.com/sebastianbergmann", 2395 | "type": "github" 2396 | } 2397 | ], 2398 | "time": "2024-03-02T06:27:43+00:00" 2399 | }, 2400 | { 2401 | "name": "sebastian/code-unit", 2402 | "version": "1.0.8", 2403 | "source": { 2404 | "type": "git", 2405 | "url": "https://github.com/sebastianbergmann/code-unit.git", 2406 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 2407 | }, 2408 | "dist": { 2409 | "type": "zip", 2410 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 2411 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 2412 | "shasum": "" 2413 | }, 2414 | "require": { 2415 | "php": ">=7.3" 2416 | }, 2417 | "require-dev": { 2418 | "phpunit/phpunit": "^9.3" 2419 | }, 2420 | "type": "library", 2421 | "extra": { 2422 | "branch-alias": { 2423 | "dev-master": "1.0-dev" 2424 | } 2425 | }, 2426 | "autoload": { 2427 | "classmap": [ 2428 | "src/" 2429 | ] 2430 | }, 2431 | "notification-url": "https://packagist.org/downloads/", 2432 | "license": [ 2433 | "BSD-3-Clause" 2434 | ], 2435 | "authors": [ 2436 | { 2437 | "name": "Sebastian Bergmann", 2438 | "email": "sebastian@phpunit.de", 2439 | "role": "lead" 2440 | } 2441 | ], 2442 | "description": "Collection of value objects that represent the PHP code units", 2443 | "homepage": "https://github.com/sebastianbergmann/code-unit", 2444 | "support": { 2445 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 2446 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 2447 | }, 2448 | "funding": [ 2449 | { 2450 | "url": "https://github.com/sebastianbergmann", 2451 | "type": "github" 2452 | } 2453 | ], 2454 | "time": "2020-10-26T13:08:54+00:00" 2455 | }, 2456 | { 2457 | "name": "sebastian/code-unit-reverse-lookup", 2458 | "version": "2.0.3", 2459 | "source": { 2460 | "type": "git", 2461 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2462 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 2463 | }, 2464 | "dist": { 2465 | "type": "zip", 2466 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 2467 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 2468 | "shasum": "" 2469 | }, 2470 | "require": { 2471 | "php": ">=7.3" 2472 | }, 2473 | "require-dev": { 2474 | "phpunit/phpunit": "^9.3" 2475 | }, 2476 | "type": "library", 2477 | "extra": { 2478 | "branch-alias": { 2479 | "dev-master": "2.0-dev" 2480 | } 2481 | }, 2482 | "autoload": { 2483 | "classmap": [ 2484 | "src/" 2485 | ] 2486 | }, 2487 | "notification-url": "https://packagist.org/downloads/", 2488 | "license": [ 2489 | "BSD-3-Clause" 2490 | ], 2491 | "authors": [ 2492 | { 2493 | "name": "Sebastian Bergmann", 2494 | "email": "sebastian@phpunit.de" 2495 | } 2496 | ], 2497 | "description": "Looks up which function or method a line of code belongs to", 2498 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2499 | "support": { 2500 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 2501 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 2502 | }, 2503 | "funding": [ 2504 | { 2505 | "url": "https://github.com/sebastianbergmann", 2506 | "type": "github" 2507 | } 2508 | ], 2509 | "time": "2020-09-28T05:30:19+00:00" 2510 | }, 2511 | { 2512 | "name": "sebastian/comparator", 2513 | "version": "4.0.8", 2514 | "source": { 2515 | "type": "git", 2516 | "url": "https://github.com/sebastianbergmann/comparator.git", 2517 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 2518 | }, 2519 | "dist": { 2520 | "type": "zip", 2521 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 2522 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 2523 | "shasum": "" 2524 | }, 2525 | "require": { 2526 | "php": ">=7.3", 2527 | "sebastian/diff": "^4.0", 2528 | "sebastian/exporter": "^4.0" 2529 | }, 2530 | "require-dev": { 2531 | "phpunit/phpunit": "^9.3" 2532 | }, 2533 | "type": "library", 2534 | "extra": { 2535 | "branch-alias": { 2536 | "dev-master": "4.0-dev" 2537 | } 2538 | }, 2539 | "autoload": { 2540 | "classmap": [ 2541 | "src/" 2542 | ] 2543 | }, 2544 | "notification-url": "https://packagist.org/downloads/", 2545 | "license": [ 2546 | "BSD-3-Clause" 2547 | ], 2548 | "authors": [ 2549 | { 2550 | "name": "Sebastian Bergmann", 2551 | "email": "sebastian@phpunit.de" 2552 | }, 2553 | { 2554 | "name": "Jeff Welch", 2555 | "email": "whatthejeff@gmail.com" 2556 | }, 2557 | { 2558 | "name": "Volker Dusch", 2559 | "email": "github@wallbash.com" 2560 | }, 2561 | { 2562 | "name": "Bernhard Schussek", 2563 | "email": "bschussek@2bepublished.at" 2564 | } 2565 | ], 2566 | "description": "Provides the functionality to compare PHP values for equality", 2567 | "homepage": "https://github.com/sebastianbergmann/comparator", 2568 | "keywords": [ 2569 | "comparator", 2570 | "compare", 2571 | "equality" 2572 | ], 2573 | "support": { 2574 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 2575 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 2576 | }, 2577 | "funding": [ 2578 | { 2579 | "url": "https://github.com/sebastianbergmann", 2580 | "type": "github" 2581 | } 2582 | ], 2583 | "time": "2022-09-14T12:41:17+00:00" 2584 | }, 2585 | { 2586 | "name": "sebastian/complexity", 2587 | "version": "2.0.3", 2588 | "source": { 2589 | "type": "git", 2590 | "url": "https://github.com/sebastianbergmann/complexity.git", 2591 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" 2592 | }, 2593 | "dist": { 2594 | "type": "zip", 2595 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", 2596 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", 2597 | "shasum": "" 2598 | }, 2599 | "require": { 2600 | "nikic/php-parser": "^4.18 || ^5.0", 2601 | "php": ">=7.3" 2602 | }, 2603 | "require-dev": { 2604 | "phpunit/phpunit": "^9.3" 2605 | }, 2606 | "type": "library", 2607 | "extra": { 2608 | "branch-alias": { 2609 | "dev-master": "2.0-dev" 2610 | } 2611 | }, 2612 | "autoload": { 2613 | "classmap": [ 2614 | "src/" 2615 | ] 2616 | }, 2617 | "notification-url": "https://packagist.org/downloads/", 2618 | "license": [ 2619 | "BSD-3-Clause" 2620 | ], 2621 | "authors": [ 2622 | { 2623 | "name": "Sebastian Bergmann", 2624 | "email": "sebastian@phpunit.de", 2625 | "role": "lead" 2626 | } 2627 | ], 2628 | "description": "Library for calculating the complexity of PHP code units", 2629 | "homepage": "https://github.com/sebastianbergmann/complexity", 2630 | "support": { 2631 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 2632 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" 2633 | }, 2634 | "funding": [ 2635 | { 2636 | "url": "https://github.com/sebastianbergmann", 2637 | "type": "github" 2638 | } 2639 | ], 2640 | "time": "2023-12-22T06:19:30+00:00" 2641 | }, 2642 | { 2643 | "name": "sebastian/diff", 2644 | "version": "4.0.6", 2645 | "source": { 2646 | "type": "git", 2647 | "url": "https://github.com/sebastianbergmann/diff.git", 2648 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" 2649 | }, 2650 | "dist": { 2651 | "type": "zip", 2652 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", 2653 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", 2654 | "shasum": "" 2655 | }, 2656 | "require": { 2657 | "php": ">=7.3" 2658 | }, 2659 | "require-dev": { 2660 | "phpunit/phpunit": "^9.3", 2661 | "symfony/process": "^4.2 || ^5" 2662 | }, 2663 | "type": "library", 2664 | "extra": { 2665 | "branch-alias": { 2666 | "dev-master": "4.0-dev" 2667 | } 2668 | }, 2669 | "autoload": { 2670 | "classmap": [ 2671 | "src/" 2672 | ] 2673 | }, 2674 | "notification-url": "https://packagist.org/downloads/", 2675 | "license": [ 2676 | "BSD-3-Clause" 2677 | ], 2678 | "authors": [ 2679 | { 2680 | "name": "Sebastian Bergmann", 2681 | "email": "sebastian@phpunit.de" 2682 | }, 2683 | { 2684 | "name": "Kore Nordmann", 2685 | "email": "mail@kore-nordmann.de" 2686 | } 2687 | ], 2688 | "description": "Diff implementation", 2689 | "homepage": "https://github.com/sebastianbergmann/diff", 2690 | "keywords": [ 2691 | "diff", 2692 | "udiff", 2693 | "unidiff", 2694 | "unified diff" 2695 | ], 2696 | "support": { 2697 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2698 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" 2699 | }, 2700 | "funding": [ 2701 | { 2702 | "url": "https://github.com/sebastianbergmann", 2703 | "type": "github" 2704 | } 2705 | ], 2706 | "time": "2024-03-02T06:30:58+00:00" 2707 | }, 2708 | { 2709 | "name": "sebastian/environment", 2710 | "version": "5.1.5", 2711 | "source": { 2712 | "type": "git", 2713 | "url": "https://github.com/sebastianbergmann/environment.git", 2714 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 2715 | }, 2716 | "dist": { 2717 | "type": "zip", 2718 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 2719 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 2720 | "shasum": "" 2721 | }, 2722 | "require": { 2723 | "php": ">=7.3" 2724 | }, 2725 | "require-dev": { 2726 | "phpunit/phpunit": "^9.3" 2727 | }, 2728 | "suggest": { 2729 | "ext-posix": "*" 2730 | }, 2731 | "type": "library", 2732 | "extra": { 2733 | "branch-alias": { 2734 | "dev-master": "5.1-dev" 2735 | } 2736 | }, 2737 | "autoload": { 2738 | "classmap": [ 2739 | "src/" 2740 | ] 2741 | }, 2742 | "notification-url": "https://packagist.org/downloads/", 2743 | "license": [ 2744 | "BSD-3-Clause" 2745 | ], 2746 | "authors": [ 2747 | { 2748 | "name": "Sebastian Bergmann", 2749 | "email": "sebastian@phpunit.de" 2750 | } 2751 | ], 2752 | "description": "Provides functionality to handle HHVM/PHP environments", 2753 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2754 | "keywords": [ 2755 | "Xdebug", 2756 | "environment", 2757 | "hhvm" 2758 | ], 2759 | "support": { 2760 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2761 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 2762 | }, 2763 | "funding": [ 2764 | { 2765 | "url": "https://github.com/sebastianbergmann", 2766 | "type": "github" 2767 | } 2768 | ], 2769 | "time": "2023-02-03T06:03:51+00:00" 2770 | }, 2771 | { 2772 | "name": "sebastian/exporter", 2773 | "version": "4.0.6", 2774 | "source": { 2775 | "type": "git", 2776 | "url": "https://github.com/sebastianbergmann/exporter.git", 2777 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" 2778 | }, 2779 | "dist": { 2780 | "type": "zip", 2781 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", 2782 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", 2783 | "shasum": "" 2784 | }, 2785 | "require": { 2786 | "php": ">=7.3", 2787 | "sebastian/recursion-context": "^4.0" 2788 | }, 2789 | "require-dev": { 2790 | "ext-mbstring": "*", 2791 | "phpunit/phpunit": "^9.3" 2792 | }, 2793 | "type": "library", 2794 | "extra": { 2795 | "branch-alias": { 2796 | "dev-master": "4.0-dev" 2797 | } 2798 | }, 2799 | "autoload": { 2800 | "classmap": [ 2801 | "src/" 2802 | ] 2803 | }, 2804 | "notification-url": "https://packagist.org/downloads/", 2805 | "license": [ 2806 | "BSD-3-Clause" 2807 | ], 2808 | "authors": [ 2809 | { 2810 | "name": "Sebastian Bergmann", 2811 | "email": "sebastian@phpunit.de" 2812 | }, 2813 | { 2814 | "name": "Jeff Welch", 2815 | "email": "whatthejeff@gmail.com" 2816 | }, 2817 | { 2818 | "name": "Volker Dusch", 2819 | "email": "github@wallbash.com" 2820 | }, 2821 | { 2822 | "name": "Adam Harvey", 2823 | "email": "aharvey@php.net" 2824 | }, 2825 | { 2826 | "name": "Bernhard Schussek", 2827 | "email": "bschussek@gmail.com" 2828 | } 2829 | ], 2830 | "description": "Provides the functionality to export PHP variables for visualization", 2831 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 2832 | "keywords": [ 2833 | "export", 2834 | "exporter" 2835 | ], 2836 | "support": { 2837 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2838 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" 2839 | }, 2840 | "funding": [ 2841 | { 2842 | "url": "https://github.com/sebastianbergmann", 2843 | "type": "github" 2844 | } 2845 | ], 2846 | "time": "2024-03-02T06:33:00+00:00" 2847 | }, 2848 | { 2849 | "name": "sebastian/global-state", 2850 | "version": "5.0.7", 2851 | "source": { 2852 | "type": "git", 2853 | "url": "https://github.com/sebastianbergmann/global-state.git", 2854 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" 2855 | }, 2856 | "dist": { 2857 | "type": "zip", 2858 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 2859 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 2860 | "shasum": "" 2861 | }, 2862 | "require": { 2863 | "php": ">=7.3", 2864 | "sebastian/object-reflector": "^2.0", 2865 | "sebastian/recursion-context": "^4.0" 2866 | }, 2867 | "require-dev": { 2868 | "ext-dom": "*", 2869 | "phpunit/phpunit": "^9.3" 2870 | }, 2871 | "suggest": { 2872 | "ext-uopz": "*" 2873 | }, 2874 | "type": "library", 2875 | "extra": { 2876 | "branch-alias": { 2877 | "dev-master": "5.0-dev" 2878 | } 2879 | }, 2880 | "autoload": { 2881 | "classmap": [ 2882 | "src/" 2883 | ] 2884 | }, 2885 | "notification-url": "https://packagist.org/downloads/", 2886 | "license": [ 2887 | "BSD-3-Clause" 2888 | ], 2889 | "authors": [ 2890 | { 2891 | "name": "Sebastian Bergmann", 2892 | "email": "sebastian@phpunit.de" 2893 | } 2894 | ], 2895 | "description": "Snapshotting of global state", 2896 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2897 | "keywords": [ 2898 | "global state" 2899 | ], 2900 | "support": { 2901 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2902 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" 2903 | }, 2904 | "funding": [ 2905 | { 2906 | "url": "https://github.com/sebastianbergmann", 2907 | "type": "github" 2908 | } 2909 | ], 2910 | "time": "2024-03-02T06:35:11+00:00" 2911 | }, 2912 | { 2913 | "name": "sebastian/lines-of-code", 2914 | "version": "1.0.4", 2915 | "source": { 2916 | "type": "git", 2917 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2918 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" 2919 | }, 2920 | "dist": { 2921 | "type": "zip", 2922 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", 2923 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", 2924 | "shasum": "" 2925 | }, 2926 | "require": { 2927 | "nikic/php-parser": "^4.18 || ^5.0", 2928 | "php": ">=7.3" 2929 | }, 2930 | "require-dev": { 2931 | "phpunit/phpunit": "^9.3" 2932 | }, 2933 | "type": "library", 2934 | "extra": { 2935 | "branch-alias": { 2936 | "dev-master": "1.0-dev" 2937 | } 2938 | }, 2939 | "autoload": { 2940 | "classmap": [ 2941 | "src/" 2942 | ] 2943 | }, 2944 | "notification-url": "https://packagist.org/downloads/", 2945 | "license": [ 2946 | "BSD-3-Clause" 2947 | ], 2948 | "authors": [ 2949 | { 2950 | "name": "Sebastian Bergmann", 2951 | "email": "sebastian@phpunit.de", 2952 | "role": "lead" 2953 | } 2954 | ], 2955 | "description": "Library for counting the lines of code in PHP source code", 2956 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2957 | "support": { 2958 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2959 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" 2960 | }, 2961 | "funding": [ 2962 | { 2963 | "url": "https://github.com/sebastianbergmann", 2964 | "type": "github" 2965 | } 2966 | ], 2967 | "time": "2023-12-22T06:20:34+00:00" 2968 | }, 2969 | { 2970 | "name": "sebastian/object-enumerator", 2971 | "version": "4.0.4", 2972 | "source": { 2973 | "type": "git", 2974 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2975 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 2976 | }, 2977 | "dist": { 2978 | "type": "zip", 2979 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 2980 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 2981 | "shasum": "" 2982 | }, 2983 | "require": { 2984 | "php": ">=7.3", 2985 | "sebastian/object-reflector": "^2.0", 2986 | "sebastian/recursion-context": "^4.0" 2987 | }, 2988 | "require-dev": { 2989 | "phpunit/phpunit": "^9.3" 2990 | }, 2991 | "type": "library", 2992 | "extra": { 2993 | "branch-alias": { 2994 | "dev-master": "4.0-dev" 2995 | } 2996 | }, 2997 | "autoload": { 2998 | "classmap": [ 2999 | "src/" 3000 | ] 3001 | }, 3002 | "notification-url": "https://packagist.org/downloads/", 3003 | "license": [ 3004 | "BSD-3-Clause" 3005 | ], 3006 | "authors": [ 3007 | { 3008 | "name": "Sebastian Bergmann", 3009 | "email": "sebastian@phpunit.de" 3010 | } 3011 | ], 3012 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3013 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3014 | "support": { 3015 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 3016 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 3017 | }, 3018 | "funding": [ 3019 | { 3020 | "url": "https://github.com/sebastianbergmann", 3021 | "type": "github" 3022 | } 3023 | ], 3024 | "time": "2020-10-26T13:12:34+00:00" 3025 | }, 3026 | { 3027 | "name": "sebastian/object-reflector", 3028 | "version": "2.0.4", 3029 | "source": { 3030 | "type": "git", 3031 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 3032 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 3033 | }, 3034 | "dist": { 3035 | "type": "zip", 3036 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 3037 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 3038 | "shasum": "" 3039 | }, 3040 | "require": { 3041 | "php": ">=7.3" 3042 | }, 3043 | "require-dev": { 3044 | "phpunit/phpunit": "^9.3" 3045 | }, 3046 | "type": "library", 3047 | "extra": { 3048 | "branch-alias": { 3049 | "dev-master": "2.0-dev" 3050 | } 3051 | }, 3052 | "autoload": { 3053 | "classmap": [ 3054 | "src/" 3055 | ] 3056 | }, 3057 | "notification-url": "https://packagist.org/downloads/", 3058 | "license": [ 3059 | "BSD-3-Clause" 3060 | ], 3061 | "authors": [ 3062 | { 3063 | "name": "Sebastian Bergmann", 3064 | "email": "sebastian@phpunit.de" 3065 | } 3066 | ], 3067 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 3068 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 3069 | "support": { 3070 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 3071 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 3072 | }, 3073 | "funding": [ 3074 | { 3075 | "url": "https://github.com/sebastianbergmann", 3076 | "type": "github" 3077 | } 3078 | ], 3079 | "time": "2020-10-26T13:14:26+00:00" 3080 | }, 3081 | { 3082 | "name": "sebastian/recursion-context", 3083 | "version": "4.0.5", 3084 | "source": { 3085 | "type": "git", 3086 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3087 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 3088 | }, 3089 | "dist": { 3090 | "type": "zip", 3091 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 3092 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 3093 | "shasum": "" 3094 | }, 3095 | "require": { 3096 | "php": ">=7.3" 3097 | }, 3098 | "require-dev": { 3099 | "phpunit/phpunit": "^9.3" 3100 | }, 3101 | "type": "library", 3102 | "extra": { 3103 | "branch-alias": { 3104 | "dev-master": "4.0-dev" 3105 | } 3106 | }, 3107 | "autoload": { 3108 | "classmap": [ 3109 | "src/" 3110 | ] 3111 | }, 3112 | "notification-url": "https://packagist.org/downloads/", 3113 | "license": [ 3114 | "BSD-3-Clause" 3115 | ], 3116 | "authors": [ 3117 | { 3118 | "name": "Sebastian Bergmann", 3119 | "email": "sebastian@phpunit.de" 3120 | }, 3121 | { 3122 | "name": "Jeff Welch", 3123 | "email": "whatthejeff@gmail.com" 3124 | }, 3125 | { 3126 | "name": "Adam Harvey", 3127 | "email": "aharvey@php.net" 3128 | } 3129 | ], 3130 | "description": "Provides functionality to recursively process PHP variables", 3131 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 3132 | "support": { 3133 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 3134 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 3135 | }, 3136 | "funding": [ 3137 | { 3138 | "url": "https://github.com/sebastianbergmann", 3139 | "type": "github" 3140 | } 3141 | ], 3142 | "time": "2023-02-03T06:07:39+00:00" 3143 | }, 3144 | { 3145 | "name": "sebastian/resource-operations", 3146 | "version": "3.0.4", 3147 | "source": { 3148 | "type": "git", 3149 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3150 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" 3151 | }, 3152 | "dist": { 3153 | "type": "zip", 3154 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 3155 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 3156 | "shasum": "" 3157 | }, 3158 | "require": { 3159 | "php": ">=7.3" 3160 | }, 3161 | "require-dev": { 3162 | "phpunit/phpunit": "^9.0" 3163 | }, 3164 | "type": "library", 3165 | "extra": { 3166 | "branch-alias": { 3167 | "dev-main": "3.0-dev" 3168 | } 3169 | }, 3170 | "autoload": { 3171 | "classmap": [ 3172 | "src/" 3173 | ] 3174 | }, 3175 | "notification-url": "https://packagist.org/downloads/", 3176 | "license": [ 3177 | "BSD-3-Clause" 3178 | ], 3179 | "authors": [ 3180 | { 3181 | "name": "Sebastian Bergmann", 3182 | "email": "sebastian@phpunit.de" 3183 | } 3184 | ], 3185 | "description": "Provides a list of PHP built-in functions that operate on resources", 3186 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3187 | "support": { 3188 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" 3189 | }, 3190 | "funding": [ 3191 | { 3192 | "url": "https://github.com/sebastianbergmann", 3193 | "type": "github" 3194 | } 3195 | ], 3196 | "time": "2024-03-14T16:00:52+00:00" 3197 | }, 3198 | { 3199 | "name": "sebastian/type", 3200 | "version": "3.2.1", 3201 | "source": { 3202 | "type": "git", 3203 | "url": "https://github.com/sebastianbergmann/type.git", 3204 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 3205 | }, 3206 | "dist": { 3207 | "type": "zip", 3208 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 3209 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 3210 | "shasum": "" 3211 | }, 3212 | "require": { 3213 | "php": ">=7.3" 3214 | }, 3215 | "require-dev": { 3216 | "phpunit/phpunit": "^9.5" 3217 | }, 3218 | "type": "library", 3219 | "extra": { 3220 | "branch-alias": { 3221 | "dev-master": "3.2-dev" 3222 | } 3223 | }, 3224 | "autoload": { 3225 | "classmap": [ 3226 | "src/" 3227 | ] 3228 | }, 3229 | "notification-url": "https://packagist.org/downloads/", 3230 | "license": [ 3231 | "BSD-3-Clause" 3232 | ], 3233 | "authors": [ 3234 | { 3235 | "name": "Sebastian Bergmann", 3236 | "email": "sebastian@phpunit.de", 3237 | "role": "lead" 3238 | } 3239 | ], 3240 | "description": "Collection of value objects that represent the types of the PHP type system", 3241 | "homepage": "https://github.com/sebastianbergmann/type", 3242 | "support": { 3243 | "issues": "https://github.com/sebastianbergmann/type/issues", 3244 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 3245 | }, 3246 | "funding": [ 3247 | { 3248 | "url": "https://github.com/sebastianbergmann", 3249 | "type": "github" 3250 | } 3251 | ], 3252 | "time": "2023-02-03T06:13:03+00:00" 3253 | }, 3254 | { 3255 | "name": "sebastian/version", 3256 | "version": "3.0.2", 3257 | "source": { 3258 | "type": "git", 3259 | "url": "https://github.com/sebastianbergmann/version.git", 3260 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 3261 | }, 3262 | "dist": { 3263 | "type": "zip", 3264 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 3265 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 3266 | "shasum": "" 3267 | }, 3268 | "require": { 3269 | "php": ">=7.3" 3270 | }, 3271 | "type": "library", 3272 | "extra": { 3273 | "branch-alias": { 3274 | "dev-master": "3.0-dev" 3275 | } 3276 | }, 3277 | "autoload": { 3278 | "classmap": [ 3279 | "src/" 3280 | ] 3281 | }, 3282 | "notification-url": "https://packagist.org/downloads/", 3283 | "license": [ 3284 | "BSD-3-Clause" 3285 | ], 3286 | "authors": [ 3287 | { 3288 | "name": "Sebastian Bergmann", 3289 | "email": "sebastian@phpunit.de", 3290 | "role": "lead" 3291 | } 3292 | ], 3293 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3294 | "homepage": "https://github.com/sebastianbergmann/version", 3295 | "support": { 3296 | "issues": "https://github.com/sebastianbergmann/version/issues", 3297 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 3298 | }, 3299 | "funding": [ 3300 | { 3301 | "url": "https://github.com/sebastianbergmann", 3302 | "type": "github" 3303 | } 3304 | ], 3305 | "time": "2020-09-28T06:39:44+00:00" 3306 | }, 3307 | { 3308 | "name": "squizlabs/php_codesniffer", 3309 | "version": "3.10.3", 3310 | "source": { 3311 | "type": "git", 3312 | "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", 3313 | "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" 3314 | }, 3315 | "dist": { 3316 | "type": "zip", 3317 | "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", 3318 | "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", 3319 | "shasum": "" 3320 | }, 3321 | "require": { 3322 | "ext-simplexml": "*", 3323 | "ext-tokenizer": "*", 3324 | "ext-xmlwriter": "*", 3325 | "php": ">=5.4.0" 3326 | }, 3327 | "require-dev": { 3328 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" 3329 | }, 3330 | "bin": [ 3331 | "bin/phpcbf", 3332 | "bin/phpcs" 3333 | ], 3334 | "type": "library", 3335 | "extra": { 3336 | "branch-alias": { 3337 | "dev-master": "3.x-dev" 3338 | } 3339 | }, 3340 | "notification-url": "https://packagist.org/downloads/", 3341 | "license": [ 3342 | "BSD-3-Clause" 3343 | ], 3344 | "authors": [ 3345 | { 3346 | "name": "Greg Sherwood", 3347 | "role": "Former lead" 3348 | }, 3349 | { 3350 | "name": "Juliette Reinders Folmer", 3351 | "role": "Current lead" 3352 | }, 3353 | { 3354 | "name": "Contributors", 3355 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" 3356 | } 3357 | ], 3358 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 3359 | "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 3360 | "keywords": [ 3361 | "phpcs", 3362 | "standards", 3363 | "static analysis" 3364 | ], 3365 | "support": { 3366 | "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", 3367 | "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", 3368 | "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", 3369 | "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" 3370 | }, 3371 | "funding": [ 3372 | { 3373 | "url": "https://github.com/PHPCSStandards", 3374 | "type": "github" 3375 | }, 3376 | { 3377 | "url": "https://github.com/jrfnl", 3378 | "type": "github" 3379 | }, 3380 | { 3381 | "url": "https://opencollective.com/php_codesniffer", 3382 | "type": "open_collective" 3383 | } 3384 | ], 3385 | "time": "2024-09-18T10:38:58+00:00" 3386 | }, 3387 | { 3388 | "name": "theseer/tokenizer", 3389 | "version": "1.2.3", 3390 | "source": { 3391 | "type": "git", 3392 | "url": "https://github.com/theseer/tokenizer.git", 3393 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 3394 | }, 3395 | "dist": { 3396 | "type": "zip", 3397 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3398 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3399 | "shasum": "" 3400 | }, 3401 | "require": { 3402 | "ext-dom": "*", 3403 | "ext-tokenizer": "*", 3404 | "ext-xmlwriter": "*", 3405 | "php": "^7.2 || ^8.0" 3406 | }, 3407 | "type": "library", 3408 | "autoload": { 3409 | "classmap": [ 3410 | "src/" 3411 | ] 3412 | }, 3413 | "notification-url": "https://packagist.org/downloads/", 3414 | "license": [ 3415 | "BSD-3-Clause" 3416 | ], 3417 | "authors": [ 3418 | { 3419 | "name": "Arne Blankerts", 3420 | "email": "arne@blankerts.de", 3421 | "role": "Developer" 3422 | } 3423 | ], 3424 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3425 | "support": { 3426 | "issues": "https://github.com/theseer/tokenizer/issues", 3427 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 3428 | }, 3429 | "funding": [ 3430 | { 3431 | "url": "https://github.com/theseer", 3432 | "type": "github" 3433 | } 3434 | ], 3435 | "time": "2024-03-03T12:36:25+00:00" 3436 | } 3437 | ], 3438 | "aliases": [], 3439 | "minimum-stability": "stable", 3440 | "stability-flags": { 3441 | "chobie/jira-api-restclient": 20 3442 | }, 3443 | "prefer-stable": false, 3444 | "prefer-lowest": false, 3445 | "platform": { 3446 | "php": ">=8.1.0", 3447 | "ext-curl": "*" 3448 | }, 3449 | "platform-dev": [], 3450 | "plugin-api-version": "2.6.0" 3451 | } 3452 | --------------------------------------------------------------------------------