From bf2241a2e8a7341e70e02f32a5b400b166ef1855 Mon Sep 17 00:00:00 2001 From: Damien Matabon Date: Tue, 15 Sep 2026 22:49:16 +0200 Subject: [PATCH 1/5] feat: Add support for PHP 8.5 Fix implicitly nullable parameter, `$http_response_header` and `curl_close` deprecations, lift the `<8.3` upper bound and drop phpDocumentor from require-dev as it cannot be installed on PHP 8.5. Renew the expired test certificates, make the test server ports configurable and extend CI to 8.1-8.5. --- .github/workflows/ci.yml | 61 +- .github/workflows/release-automated.yml | 17 +- .github/workflows/release-manual-docs.yml | 11 +- .gitignore | 3 + CONTRIBUTING.md | 45 +- README.md | 11 +- composer.json | 17 +- composer.lock | 7178 ++--------------- package.json | 5 +- phpunit.xml | 8 +- src/Parse/HttpClients/ParseCurl.php | 8 +- src/Parse/HttpClients/ParseCurlHttpClient.php | 4 +- src/Parse/HttpClients/ParseStream.php | 10 +- src/Parse/ParseException.php | 2 +- tests/Parse/AddOperationTest.php | 17 +- tests/Parse/AddUniqueOperationTest.php | 25 +- tests/Parse/Helper.php | 27 +- tests/Parse/IncrementOperationTest.php | 13 +- tests/Parse/IncrementTest.php | 13 +- tests/Parse/ParseACLTest.php | 33 +- tests/Parse/ParseAudienceTest.php | 13 +- tests/Parse/ParseClientTest.php | 135 +- tests/Parse/ParseCloudTest.php | 45 +- tests/Parse/ParseConfigTest.php | 17 +- tests/Parse/ParseFileTest.php | 21 +- tests/Parse/ParseGeoBoxTest.php | 5 +- tests/Parse/ParseHooksTest.php | 9 +- tests/Parse/ParseInstallationTest.php | 21 +- tests/Parse/ParseLogsTest.php | 21 +- tests/Parse/ParseObjectTest.php | 35 +- tests/Parse/ParsePushTest.php | 21 +- tests/Parse/ParseQueryRelativeTimeTest.php | 81 +- tests/Parse/ParseQueryTest.php | 57 +- tests/Parse/ParseRelationOperationTest.php | 41 +- tests/Parse/ParseRelationTest.php | 7 +- tests/Parse/ParseRoleTest.php | 13 +- tests/Parse/ParseSchemaTest.php | 25 +- tests/Parse/ParseServerInfoTest.php | 19 +- tests/Parse/ParseSessionStorageAltTest.php | 5 +- tests/Parse/ParseSessionStorageTest.php | 5 +- tests/Parse/ParseSessionTest.php | 9 +- tests/Parse/ParseStreamHttpClientTest.php | 9 +- tests/Parse/ParseUserTest.php | 29 +- tests/Parse/RemoveOperationTest.php | 17 +- tests/gencerts.sh | 87 +- tests/keys/client.crt | 59 +- tests/keys/client.der | Bin 1317 -> 1459 bytes tests/keys/client.fp | 2 +- tests/keys/client.pem | 59 +- tests/keys/client.pubkey.der | Bin 0 -> 550 bytes tests/keys/client.pubkey.pem | 14 + tests/keys/localhost.crt | 59 +- tests/keys/localhost.der | Bin 0 -> 1471 bytes tests/keys/localhost.fp | 2 +- tests/keys/localhost.pem | 59 +- tests/keys/parseca.crt | 58 +- tests/keys/parseca.fp | 2 +- tests/keys/parseca.pem | 58 +- tests/keys/parseca.srl | 2 +- tests/server.js | 16 +- 60 files changed, 1524 insertions(+), 7121 deletions(-) create mode 100644 tests/keys/client.pubkey.der create mode 100644 tests/keys/client.pubkey.pem create mode 100644 tests/keys/localhost.der diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8564b5b..7180f4d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,9 +11,9 @@ jobs: check-lock-file-version: name: NPM Lock File Version timeout-minutes: 5 - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Check NPM lock file version run: | version=$(node -e "console.log(require('./package-lock.json').lockfileVersion)") @@ -22,11 +22,15 @@ jobs: exit 1 fi build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest timeout-minutes: 30 strategy: matrix: include: + - name: PHP 8.5 + PHP_VERSION: 8.5 + - name: PHP 8.4 + PHP_VERSION: 8.4 - name: PHP 8.3 PHP_VERSION: 8.3 - name: PHP 8.2 @@ -36,30 +40,63 @@ jobs: fail-fast: false name: Test ${{ matrix.name }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 16.17.1 + node-version: 18 cache: npm - name: Setup PHP ${{ matrix.PHP_VERSION }} run: | sudo add-apt-repository ppa:ondrej/php -y sudo apt-get update -y - sudo apt-get install -y php${{ matrix.PHP_VERSION }} php${{ matrix.PHP_VERSION }}-mbstring php${{ matrix.PHP_VERSION }}-xml php${{ matrix.PHP_VERSION }}-curl + sudo apt-get install -y php${{ matrix.PHP_VERSION }} php${{ matrix.PHP_VERSION }}-mbstring php${{ matrix.PHP_VERSION }}-xml php${{ matrix.PHP_VERSION }}-curl php${{ matrix.PHP_VERSION }}-xdebug sudo update-alternatives --set php /usr/bin/php${{ matrix.PHP_VERSION }} php --version - - run: composer install + - name: Start MongoDB + run: | + docker run -d --name mongo -p 27017:27017 mongo:6.0 --replSet rs0 + until docker exec mongo mongosh --quiet --eval 'db.runCommand({ping:1})' > /dev/null 2>&1; do sleep 1; done + docker exec mongo mongosh --quiet --eval 'rs.initiate({_id:"rs0",members:[{_id:0,host:"localhost:27017"}]})' + until [ "$(docker exec mongo mongosh --quiet --eval 'rs.status().myState')" = "1" ]; do sleep 1; done + # `composer update` rather than `composer install`: a single lock file cannot + # cover PHP 8.1 to 8.5, since PHPUnit 10, 11 and 12 each support a different range. + - run: composer update --no-interaction --no-progress - run: npm ci - run: npm start + - name: Wait for the Parse test server + run: | + for i in $(seq 1 60); do + curl -sf http://localhost:1337/parse/health && exit 0 + sleep 2 + done + echo "::error::Parse test server did not come up" + exit 1 - run: npm run lint - run: npm run test-stream - run: npm run test:coverage - - run: npm run document-check - - run: npm run document - env: - CI: true - run: bash <(curl -s https://codecov.io/bash) + docs: + name: Documentation + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + # phpDocumentor cannot be installed on PHP 8.5 yet, so docs are built on 8.4 + - name: Setup PHP 8.4 + run: | + sudo add-apt-repository ppa:ondrej/php -y + sudo apt-get update -y + sudo apt-get install -y php8.4 php8.4-mbstring php8.4-xml php8.4-curl + sudo update-alternatives --set php /usr/bin/php8.4 + php --version + - name: Install phpDocumentor + run: | + mkdir -p tools + curl -sSL -o tools/phpDocumentor.phar \ + https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + chmod +x tools/phpDocumentor.phar + - run: npm run document-check concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml index db657859..866983ff 100644 --- a/.github/workflows/release-automated.yml +++ b/.github/workflows/release-automated.yml @@ -4,17 +4,17 @@ on: branches: [ master, release, alpha, beta ] env: NODE_VERSION: 18 - PHP_VERSION: 8.1 + PHP_VERSION: 8.4 jobs: release: runs-on: ubuntu-latest outputs: current_tag: ${{ steps.tag.outputs.current_tag }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - run: npm ci @@ -24,7 +24,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Determine tag on current commit id: tag - run: echo "::set-output name=current_tag::$(git describe --tags --abbrev=0 --exact-match || echo '')" + run: echo "current_tag=$(git describe --tags --abbrev=0 --exact-match || echo '')" >> "$GITHUB_OUTPUT" docs-publish: needs: release if: needs.release.outputs.current_tag != '' @@ -38,11 +38,11 @@ jobs: name: github-pages url: ${{ steps.deploy.outputs.page_url }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ needs.release.outputs.current_tag }} - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Setup PHP ${{ env.PHP_VERSION }} @@ -54,7 +54,10 @@ jobs: php --version - name: Generate Docs run: | - composer install + mkdir -p tools + curl -sSL -o tools/phpDocumentor.phar \ + https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + chmod +x tools/phpDocumentor.phar npm run document-check npm run document env: diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml index e4422748..4ea90ec5 100644 --- a/.github/workflows/release-manual-docs.yml +++ b/.github/workflows/release-manual-docs.yml @@ -7,7 +7,7 @@ on: description: 'Version tag:' env: NODE_VERSION: 18 - PHP_VERSION: 8.1 + PHP_VERSION: 8.4 jobs: docs-publish: if: github.event.inputs.tag != '' @@ -21,11 +21,11 @@ jobs: name: github-pages url: ${{ steps.deploy.outputs.page_url }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.tag }} - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Setup PHP ${{ env.PHP_VERSION }} @@ -37,7 +37,10 @@ jobs: php --version - name: Generate Docs run: | - composer install + mkdir -p tools + curl -sSL -o tools/phpDocumentor.phar \ + https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + chmod +x tools/phpDocumentor.phar npm run document-check npm run document env: diff --git a/.gitignore b/.gitignore index 38e69214..79b016c2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ output/ .phpdoc/ composer.phar + +# phpDocumentor phar, downloaded on demand +tools/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d805043..bf25c9b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,9 @@ Additionally you'll need to add some cloud code to it. To get started: * [Get Composer], the PHP package manager. -* Run `composer install` to download dependencies. +* Run `composer install` to download dependencies. The committed `composer.lock` + is resolved for the lowest supported PHP version; on PHP 8.3 and above run + `composer update` instead to get the matching PHPUnit release. From here you have to setup an instance of parse server. For your convenience we have included a testable version of parse server as a dev dependency. @@ -26,7 +28,29 @@ To setup the Test Parse Server: * Run `npm install` from the project root to download the server and it's dependencies. * When you're ready to run tests use `npm start` from the project root to boot up the test server. -The test server is setup with the appropriate configuration to run the php sdk test suite. Additionally it handles setting up mongodb for the server. If you have a mongodb instance already running, you can use `npm run server-only`. +The test server is setup with the appropriate configuration to run the php sdk test suite. It expects a MongoDB replica set to be reachable on `mongodb://localhost/test`; `npm run server-only` is equivalent and does not background the process. + +If those defaults clash with another Parse server or MongoDB instance running locally, the following environment variables are read by both the test server and the test suite: + +| Variable | Default | +|---|---| +| `PARSE_TEST_HTTP_PORT` | `1337` | +| `PARSE_TEST_HTTPS_PORT` | `1338` | +| `PARSE_TEST_DATABASE_URI` | `mongodb://localhost/test` | + +For instance: + + PARSE_TEST_HTTP_PORT=11337 PARSE_TEST_HTTPS_PORT=11338 \ + PARSE_TEST_DATABASE_URI=mongodb://127.0.0.1:27019/test npm start + + PARSE_TEST_HTTP_PORT=11337 PARSE_TEST_HTTPS_PORT=11338 npm test + +The TLS test server uses the certificates in `tests/keys`. They are generated by `tests/gencerts.sh`; once they expire, re-issue them from the existing private keys with: + + RESIGN=1 ./tests/gencerts.sh parseca localhost parsephp tests/keys/ + RESIGN=1 ./tests/gencerts.sh parseca client parsephp tests/keys/ + +and update the `peer_fingerprint` pinned in `tests/Parse/ParseClientTest.php` with the new SHA1 of `tests/keys/localhost.crt`. If you have specific needs and would like to alter your test server you can fork and modify the aforementioned test project. Alternately you can configure a compatible test server as follows: @@ -78,14 +102,21 @@ You can automatically fix lint errors with phpcbf: npm run lint:fix -Finally verify that your new changes are acceptable to phpdoc: - +Finally verify that your new changes are acceptable to phpDocumentor. It is no +longer a Composer dev dependency, because it cannot be installed on PHP 8.5, so +grab the phar first (and run it with PHP 8.4 or older): + + mkdir -p tools + curl -sSL -o tools/phpDocumentor.phar \ + https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + chmod +x tools/phpDocumentor.phar npm run document-check -The test suite is setup for code coverage if you have [XDebug] installed and setup. -Coverage is outputted as text and as html in the phpunit-test-results/ directory within the project root. +The test suite can produce code coverage if you have [XDebug] installed and setup: + + npm run test:coverage -If you do not have XDebug tests will still run, just without coverage. +Coverage is written to coverage.xml in the project root. Please make sure that any new functionality (or issues) you are working on are covered by tests when possible. If you have XDebug setup and can view code coverage please ensure that you do your best to completely cover any new code you are adding. diff --git a/README.md b/README.md index 70aaf2fd..f5f83932 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Coverage](http://codecov.io/github/parse-community/parse-php-sdk/coverage.svg?branch=master)](http://codecov.io/github/parse-community/parse-php-sdk?branch=master) [![auto-release](https://img.shields.io/badge/%F0%9F%9A%80-auto--release-9e34eb.svg)](https://github.com/parse-community/parse-dashboard/releases) -[![PHP Version](https://img.shields.io/badge/php-8.1,_8.2,_8.3-green.svg?logo=php&style=flat)](https://php.org/) +[![PHP Version](https://img.shields.io/badge/php-8.1,_8.2,_8.3,_8.4,_8.5-green.svg?logo=php&style=flat)](https://php.org/) [![packagist latest version](https://img.shields.io/packagist/v/parse/php-sdk)](https://packagist.org/packages/parse/php-sdk) @@ -71,12 +71,15 @@ The Parse PHP SDK is continuously tested with the most recent releases of PHP to | Version | End-of-Life | Compatible | |---------|-------------|------------| -| PHP 8.2 | Dec 2024 | ✅ Yes | -| PHP 8.1 | Nov 2023 | ✅ Yes | +| PHP 8.5 | Dec 2029 | ✅ Yes | +| PHP 8.4 | Dec 2028 | ✅ Yes | +| PHP 8.3 | Dec 2027 | ✅ Yes | +| PHP 8.2 | Dec 2026 | ✅ Yes | +| PHP 8.1 | Dec 2025 | ✅ Yes | ## Installation There are various ways to install and use this sdk. We'll elaborate on a couple here. -Note that the Parse PHP SDK requires PHP 5.4 or newer. It can also run on HHVM (recommended 3.0 or newer). +Note that the Parse PHP SDK requires PHP 8.1 or newer. ### Install with Composer diff --git a/composer.json b/composer.json index 4c6332dc..e4be491a 100644 --- a/composer.json +++ b/composer.json @@ -12,18 +12,16 @@ } ], "require": { - "php": ">=8.1 <8.4", + "php": ">=8.1", "ext-curl": "*", "ext-json": "*" }, "require-dev": { - "phpunit/phpunit": "10.1.1", - "squizlabs/php_codesniffer": "3.7.2", - "phpdocumentor/phpdocumentor": "3.0.0", - "jms/serializer": "1.7.1", - "nikic/php-parser": "4.15" + "phpunit/phpunit": "^10.5.38 || ^11.4 || ^12.0", + "squizlabs/php_codesniffer": "^3.13" }, - "minimum-stability": "dev", + "minimum-stability": "stable", + "prefer-stable": true, "autoload": { "psr-4": { "Parse\\": "src/Parse/" @@ -33,10 +31,5 @@ "psr-4": { "Parse\\Test\\": "tests/Parse/" } - }, - "config": { - "allow-plugins": { - "symfony/flex": true - } } } diff --git a/composer.lock b/composer.lock index e78e6ba6..8ef28e74 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7027 +4,1581 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d86b95ec4eb55e3150de9ccef1e53c1", + "content-hash": "85a7c81a5a50a8feb8d3800af77072b6", "packages": [], "packages-dev": [ { - "name": "composer/package-versions-deprecated", - "version": "dev-master", + "name": "myclabs/deep-copy", + "version": "1.14.0", "source": { "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", - "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" + "php": "^8.0" }, - "replace": { - "ocramius/package-versions": "1.11.99" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "default-branch": true, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, + "type": "library", "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], "psr-4": { - "PackageVersions\\": "src/PackageVersions" + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/mnapoli", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2022-01-17T14:14:24+00:00" + "time": "2026-08-11T10:17:44+00:00" }, { - "name": "doctrine/annotations", - "version": "1.14.x-dev", + "name": "nikic/php-parser", + "version": "v5.9.0", "source": { "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "50f9235edd3a3b0fc509d458eaf469f2f5cad932" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/50f9235edd3a3b0fc509d458eaf469f2f5cad932", - "reference": "50f9235edd3a3b0fc509d458eaf469f2f5cad932", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { - "doctrine/lexer": "^1 || ^2", + "ext-json": "*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" + "php": ">=7.4" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "~1.4.10 || ^1.10.28", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.30 || ^5.14" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" }, + "bin": [ + "bin/php-parse" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Nikita Popov" } ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "description": "A PHP parser written in PHP", "keywords": [ - "annotations", - "docblock", - "parser" + "parser", + "php" ], "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.14.x" + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2023-08-14T13:42:08+00:00" + "time": "2026-09-13T18:51:52+00:00" }, { - "name": "doctrine/deprecations", - "version": "1.1.x-dev", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, - "default-branch": true, "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" } }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", - "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^0.5.3 || ^1", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.8", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.24" - }, - "type": "library", "autoload": { - "psr-4": { - "Doctrine\\Common\\": "src" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.2.x" + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" + "url": "https://github.com/theseer", + "type": "github" } ], - "time": "2022-10-12T20:51:15+00:00" + "time": "2024-03-03T12:33:53+00:00" }, { - "name": "doctrine/instantiator", - "version": "1.5.x-dev", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "12be2483e1f0e850b353e26869e4e6c038459501" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/12be2483e1f0e850b353e26869e4e6c038459501", - "reference": "12be2483e1f0e850b353e26869e4e6c038459501", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", - "vimeo/psalm": "^4.30 || ^5.4" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" }, { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" }, { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" } ], - "time": "2023-12-09T14:16:53+00:00" + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "doctrine/lexer", - "version": "2.1.x-dev", + "name": "phpunit/php-code-coverage", + "version": "10.1.16", "source": { "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6" + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", - "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.1 || ^8.0" + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^4.11 || ^5.21" + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" + "coverage", + "testing", + "xunit" ], "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/2.1.x" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2024-02-05T11:35:39+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { - "name": "friendsofphp/proxy-manager-lts", - "version": "1.x-dev", + "name": "phpunit/php-file-iterator", + "version": "4.1.0", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f" + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", - "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { - "laminas/laminas-code": "~3.4.1|^4.0", - "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0" - }, - "conflict": { - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "replace": { - "ocramius/proxy-manager": "^2.1" + "php": ">=8.1" }, "require-dev": { - "ext-phar": "*", - "symfony/phpunit-bridge": "^5.4|^6.0|^7.0" + "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "ocramius/proxy-manager", - "url": "https://github.com/Ocramius/ProxyManager" + "branch-alias": { + "dev-main": "4.0-dev" } }, "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - } - ], - "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", - "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2024-03-20T12:50:41+00:00" - }, - { - "name": "jawira/plantuml", - "version": "v1.2024.5", - "source": { - "type": "git", - "url": "https://github.com/jawira/plantuml.git", - "reference": "8ec0f2693620ab0a9e52b445ce6ab2f43255cb5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jawira/plantuml/zipball/8ec0f2693620ab0a9e52b445ce6ab2f43255cb5b", - "reference": "8ec0f2693620ab0a9e52b445ce6ab2f43255cb5b", - "shasum": "" - }, - "bin": [ - "bin/plantuml" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-3.0-or-later" - ], - "authors": [ - { - "name": "Jawira Portugal" - } - ], - "description": "Provides PlantUML executable and plantuml.jar", - "keywords": [ - "diagram", - "jar", - "plantuml", - "plantuml.jar", - "uml" - ], - "support": { - "issues": "https://github.com/jawira/plantuml/issues", - "source": "https://github.com/jawira/plantuml/tree/v1.2024.5" - }, - "time": "2024-05-31T13:00:43+00:00" - }, - { - "name": "jean85/pretty-package-versions", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "a917488320c20057da87f67d0d40543dd9427f7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/a917488320c20057da87f67d0d40543dd9427f7a", - "reference": "a917488320c20057da87f67d0d40543dd9427f7a", - "shasum": "" - }, - "require": { - "composer/package-versions-deprecated": "^1.8.0", - "php": "^7.0|^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0|^8.5|^9.2" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A wrapper for ocramius/package-versions to get pretty versions strings", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/1.5.1" - }, - "time": "2020-09-14T08:43:34+00:00" - }, - { - "name": "jms/metadata", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "b7d58bca30b6c5bcc9ad79e46cae10825245d015" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/b7d58bca30b6c5bcc9ad79e46cae10825245d015", - "reference": "b7d58bca30b6c5bcc9ad79e46cae10825245d015", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "doctrine/cache": "~1.0", - "symfony/cache": "~3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "support": { - "issues": "https://github.com/schmittjoh/metadata/issues", - "source": "https://github.com/schmittjoh/metadata/tree/1.x" - }, - "time": "2020-05-31T06:14:37+00:00" - }, - { - "name": "jms/parser-lib", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "4f45952f9fa97d67adc5dd69e7d622fc89a7675d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/4f45952f9fa97d67adc5dd69e7d622fc89a7675d", - "reference": "4f45952f9fa97d67adc5dd69e7d622fc89a7675d", - "shasum": "" - }, - "require": { - "phpoption/phpoption": ">=0.9,<2.0-dev" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A library for easily creating recursive-descent parsers.", - "support": { - "issues": "https://github.com/schmittjoh/parser-lib/issues", - "source": "https://github.com/schmittjoh/parser-lib/tree/1.0.1" - }, - "time": "2022-03-19T09:24:56+00:00" - }, - { - "name": "jms/serializer", - "version": "1.7.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/serializer.git", - "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/4fad8bbbe76e05de3b79ffa3db027058ed3813ff", - "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/instantiator": "^1.0.3", - "jms/metadata": "~1.1", - "jms/parser-lib": "1.*", - "php": ">=5.5.0", - "phpcollection/phpcollection": "~0.1", - "phpoption/phpoption": "^1.1" - }, - "conflict": { - "jms/serializer-bundle": "<1.2.1", - "twig/twig": "<1.12" - }, - "require-dev": { - "doctrine/orm": "~2.1", - "doctrine/phpcr-odm": "^1.3|^2.0", - "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.1.5", - "phpunit/phpunit": "^4.8|^5.0", - "propel/propel1": "~1.7", - "symfony/expression-language": "^2.6|^3.0", - "symfony/filesystem": "^2.1", - "symfony/form": "~2.1|^3.0", - "symfony/translation": "^2.1|^3.0", - "symfony/validator": "^2.2|^3.0", - "symfony/yaml": "^2.1|^3.0", - "twig/twig": "~1.12|~2.0" - }, - "suggest": { - "doctrine/cache": "Required if you like to use cache functionality.", - "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", - "symfony/yaml": "Required if you'd like to serialize data to YAML format." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\Serializer": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", - "homepage": "http://jmsyst.com/libs/serializer", - "keywords": [ - "deserialization", - "jaxb", - "json", - "serialization", - "xml" - ], - "support": { - "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/master" - }, - "time": "2017-05-15T08:35:42+00:00" - }, - { - "name": "laminas/laminas-code", - "version": "4.15.x-dev", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/562e02b7d85cb9142b5116cc76c4c7c162a11a1c", - "reference": "562e02b7d85cb9142b5116cc76c4c7c162a11a1c", - "shasum": "" - }, - "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0.1", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.5.0", - "laminas/laminas-stdlib": "^3.17.0", - "phpunit/phpunit": "^10.3.3", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.15.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", - "keywords": [ - "code", - "laminas", - "laminasframework" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2024-06-17T08:50:25+00:00" - }, - { - "name": "league/commonmark", - "version": "1.6.x-dev", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "b7a2aedcca80659fac31b92f525b7837b15d45aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b7a2aedcca80659fac31b92f525b7837b15d45aa", - "reference": "b7a2aedcca80659fac31b92f525b7837b15d45aa", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" - }, - "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" - }, - "bin": [ - "bin/commonmark" - ], - "type": "library", - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" - } - ], - "time": "2022-01-13T17:17:14+00:00" - }, - { - "name": "league/flysystem", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.x" - }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], - "time": "2022-10-04T09:16:37+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.15.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-01-28T23:22:08+00:00" - }, - { - "name": "league/pipeline", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/pipeline.git", - "reference": "aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/pipeline/zipball/aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8", - "reference": "aa14b0e3133121f8be39e9a3b6ddd011fc5bb9a8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "leanphp/phpspec-code-coverage": "^4.2", - "phpspec/phpspec": "^4.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Pipeline\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net", - "role": "Author" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "role": "Maintainer" - } - ], - "description": "A plug and play pipeline implementation.", - "keywords": [ - "composition", - "design pattern", - "pattern", - "pipeline", - "sequential" - ], - "support": { - "issues": "https://github.com/thephpleague/pipeline/issues", - "source": "https://github.com/thephpleague/pipeline/tree/master" - }, - "time": "2018-06-05T21:06:51+00:00" - }, - { - "name": "league/tactician", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/tactician.git", - "reference": "4ea79b34fff0aac6eb6bbed9d1100183c53a564e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/tactician/zipball/4ea79b34fff0aac6eb6bbed9d1100183c53a564e", - "reference": "4ea79b34fff0aac6eb6bbed9d1100183c53a564e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^9.3.8", - "squizlabs/php_codesniffer": "^3.5.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Tactician\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ross Tuck", - "homepage": "http://tactician.thephpleague.com" - } - ], - "description": "A small, flexible command bus. Handy for building service layers.", - "keywords": [ - "command", - "command bus", - "service layer" - ], - "support": { - "issues": "https://github.com/thephpleague/tactician/issues", - "source": "https://github.com/thephpleague/tactician/tree/1.x" - }, - "time": "2022-01-17T17:16:14+00:00" - }, - { - "name": "league/tactician-bundle", - "version": "v1.5.1", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/tactician-bundle.git", - "reference": "165d9fa14eb55bf84257fc40af0a69beca9c3611" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/tactician-bundle/zipball/165d9fa14eb55bf84257fc40af0a69beca9c3611", - "reference": "165d9fa14eb55bf84257fc40af0a69beca9c3611", - "shasum": "" - }, - "require": { - "league/tactician": "^1.0", - "league/tactician-container": "^2.0|^3.0", - "league/tactician-logger": "^0.10|^0.11", - "php": ">=7.2", - "symfony/config": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/dependency-injection": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/http-kernel": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/yaml": "^3.4|^4.4|^5.0|^6.0|^7.0" - }, - "require-dev": { - "matthiasnoback/symfony-config-test": "^4.2.1", - "matthiasnoback/symfony-dependency-injection-test": "^4.2.1", - "mockery/mockery": "~1.0", - "phpspec/prophecy": "^1.18", - "phpunit/phpunit": "~8.5", - "symfony/console": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/framework-bundle": "^3.4.31|^4.4|^5.0|^6.0|^7.0", - "symfony/security-bundle": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/security-core": "^3.4|^4.4|^5.0|^6.0|^7.0", - "symfony/validator": "^3.4|^4.4|^5.0|^6.0|^7.0" - }, - "suggest": { - "league/tactician-doctrine": "For doctrine transaction middleware", - "symfony/console": "For debugging command-to-handler routing using the tactician:debug console command", - "symfony/security": "For command security middleware", - "symfony/validator": "For command validator middleware" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Tactician\\Bundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rafael Dohms", - "homepage": "http://doh.ms" - }, - { - "name": "Richard Tuin", - "homepage": "http://www.rtuin.nl/" - }, - { - "name": "Xander Smalbil", - "email": "xander@videofunk.nl" - }, - { - "name": "Ross Tuck", - "email": "me@rosstuck.com" - } - ], - "description": "Bundle to integrate Tactician with Symfony projects", - "keywords": [ - "bundle", - "symfony", - "tactician" - ], - "support": { - "issues": "https://github.com/thephpleague/tactician-bundle/issues", - "source": "https://github.com/thephpleague/tactician-bundle/tree/v1.5.1" - }, - "time": "2024-01-30T18:43:03+00:00" - }, - { - "name": "league/tactician-container", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/tactician-container.git", - "reference": "d1a5d884e072b8cafbff802d07766076eb2ffcb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/tactician-container/zipball/d1a5d884e072b8cafbff802d07766076eb2ffcb0", - "reference": "d1a5d884e072b8cafbff802d07766076eb2ffcb0", - "shasum": "" - }, - "require": { - "league/tactician": "^1.0", - "php": ">=5.5", - "psr/container": "^1.0" - }, - "require-dev": { - "league/container": "~2.3", - "phpunit/phpunit": "~4.3", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Tactician\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nigel Greenway", - "homepage": "http://futurepixels.co.uk" - } - ], - "description": "Tactician integration for any container implementing PSR-11", - "keywords": [ - "container", - "container-interop", - "di", - "interoperable", - "league", - "tactician" - ], - "support": { - "issues": "https://github.com/thephpleague/tactician-container/issues", - "source": "https://github.com/thephpleague/tactician-container/tree/master" - }, - "time": "2017-04-13T06:27:12+00:00" - }, - { - "name": "league/tactician-logger", - "version": "v0.11.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/tactician-logger.git", - "reference": "c2d0977445d18d7e3d85adccef7dc14948707ea9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/tactician-logger/zipball/c2d0977445d18d7e3d85adccef7dc14948707ea9", - "reference": "c2d0977445d18d7e3d85adccef7dc14948707ea9", - "shasum": "" - }, - "require": { - "league/tactician": "^1.1", - "php": ">=7.3", - "psr/log": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^9.3", - "squizlabs/php_codesniffer": "^3.5.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Tactician\\Logger\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ross Tuck" - } - ], - "description": "Adds PSR-3 logging support to the Tactician command bus", - "homepage": "https://github.com/thephpleague/tactician-logger", - "keywords": [ - "log", - "logging", - "tactician" - ], - "support": { - "issues": "https://github.com/thephpleague/tactician-logger/issues", - "source": "https://github.com/thephpleague/tactician-logger/tree/v0.11.0" - }, - "time": "2021-11-14T15:08:02+00:00" - }, - { - "name": "league/uri", - "version": "6.8.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri.git", - "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/a700b4656e4c54371b799ac61e300ab25a2d1d39", - "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39", - "shasum": "" - }, - "require": { - "ext-json": "*", - "league/uri-interfaces": "^2.3", - "php": "^8.1", - "psr/http-message": "^1.0.1" - }, - "conflict": { - "league/uri-schemes": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v3.9.5", - "nyholm/psr7": "^1.5.1", - "php-http/psr7-integration-tests": "^1.1.1", - "phpbench/phpbench": "^1.2.6", - "phpstan/phpstan": "^1.8.5", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.1.1", - "phpstan/phpstan-strict-rules": "^1.4.3", - "phpunit/phpunit": "^9.5.24", - "psr/http-factory": "^1.0.1" - }, - "suggest": { - "ext-fileinfo": "Needed to create Data URI from a filepath", - "ext-intl": "Needed to improve host validation", - "league/uri-components": "Needed to easily manipulate URI objects", - "psr/http-factory": "Needed to use the URI factory" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "URI manipulation library", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "uri-template", - "url", - "ws" - ], - "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri/issues", - "source": "https://github.com/thephpleague/uri/tree/6.8.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2022-09-13T19:58:47+00:00" - }, - { - "name": "league/uri-interfaces", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", - "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.19", - "phpstan/phpstan": "^0.12.90", - "phpstan/phpstan-phpunit": "^0.12.19", - "phpstan/phpstan-strict-rules": "^0.12.9", - "phpunit/phpunit": "^8.5.15 || ^9.5" - }, - "suggest": { - "ext-intl": "to use the IDNA feature", - "symfony/intl": "to use the IDNA feature via Symfony Polyfill" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "Common interface for URI representation", - "homepage": "http://github.com/thephpleague/uri-interfaces", - "keywords": [ - "rfc3986", - "rfc3987", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/thephpleague/uri-interfaces/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2021-06-28T04:27:21+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "884aa47a055ea3e8e351ceaf4dfc67f52fff44c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/884aa47a055ea3e8e351ceaf4dfc67f52fff44c0", - "reference": "884aa47a055ea3e8e351ceaf4dfc67f52fff44c0", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.38 || ^9.6.19", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.x" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2024-04-15T08:56:50+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "default-branch": true, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:39:25+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.15.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "617d0220b903895537b25791f52af4698dd19339" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/617d0220b903895537b25791f52af4698dd19339", - "reference": "617d0220b903895537b25791f52af4698dd19339", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.0" - }, - "time": "2022-09-03T19:54:32+00:00" - }, - { - "name": "phar-io/manifest", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpcollection/phpcollection", - "version": "0.6.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-collection.git", - "reference": "56d18c8c2c0400f2838703246ac7de919a605763" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/56d18c8c2c0400f2838703246ac7de919a605763", - "reference": "56d18c8c2c0400f2838703246ac7de919a605763", - "shasum": "" - }, - "require": { - "phpoption/phpoption": "1.*" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, - "autoload": { - "psr-0": { - "PhpCollection": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "General-Purpose Collection Library for PHP", - "keywords": [ - "collection", - "list", - "map", - "sequence", - "set" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-collection/issues", - "source": "https://github.com/schmittjoh/php-collection/tree/0.6.0" - }, - "time": "2022-03-21T13:02:41+00:00" - }, - { - "name": "phpdocumentor/flyfinder", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/FlyFinder.git", - "reference": "4c0fa890a507cf554457104495b7b8526267feec" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/FlyFinder/zipball/4c0fa890a507cf554457104495b7b8526267feec", - "reference": "4c0fa890a507cf554457104495b7b8526267feec", - "shasum": "" - }, - "require": { - "league/flysystem": "^1.0", - "php": "^7.2||^8.0" - }, - "require-dev": { - "league/flysystem-memory": "~1", - "mockery/mockery": "^1.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Flyfinder\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Flysystem plugin to add file finding capabilities to the Filesystem entity", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "Flysystem", - "phpdoc" - ], - "support": { - "issues": "https://github.com/phpDocumentor/FlyFinder/issues", - "source": "https://github.com/phpDocumentor/FlyFinder/tree/master" - }, - "time": "2022-10-11T20:08:49+00:00" - }, - { - "name": "phpdocumentor/graphviz", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/GraphViz.git", - "reference": "1322ff82a165865e9c967f2d10e945f4a4ca0e3a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/1322ff82a165865e9c967f2d10e945f4a4ca0e3a", - "reference": "1322ff82a165865e9c967f2d10e945f4a4ca0e3a", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "ext-simplexml": "*", - "mockery/mockery": "^1.2", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.2 || ^9.2", - "psalm/phar": "^4.15 || ^5.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\GraphViz\\": "src/phpDocumentor/GraphViz", - "phpDocumentor\\GraphViz\\PHPStan\\": "./src/phpDocumentor/PHPStan" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "description": "Wrapper for Graphviz", - "support": { - "issues": "https://github.com/phpDocumentor/GraphViz/issues", - "source": "https://github.com/phpDocumentor/GraphViz/tree/master" - }, - "time": "2024-03-29T13:33:50+00:00" - }, - { - "name": "phpdocumentor/phpdocumentor", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/phpDocumentor.git", - "reference": "405da431bdc7ca02512cb6aa15f4ed43ffca8175" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/phpDocumentor/zipball/405da431bdc7ca02512cb6aa15f4ed43ffca8175", - "reference": "405da431bdc7ca02512cb6aa15f4ed43ffca8175", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "^1.1", - "ext-ctype": "*", - "ext-hash": "*", - "ext-iconv": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "jawira/plantuml": "^1.27", - "jean85/pretty-package-versions": "^1.2", - "league/commonmark": "^1.5", - "league/flysystem": "^1.0", - "league/pipeline": "^1.0", - "league/tactician": "^1.0", - "league/tactician-bundle": "^1.2", - "league/uri": "^6.0", - "league/uri-interfaces": "^2.0", - "php": ">=7.2.5", - "phpdocumentor/flyfinder": "^1.0", - "phpdocumentor/graphviz": "^2.0@dev", - "phpdocumentor/reflection": "^4.0", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/reflection-docblock": "^5.0", - "phpdocumentor/type-resolver": "^1.0", - "psr/cache": "^1.0", - "psr/log": "^1.1", - "scrivo/highlight.php": "^9.17", - "symfony/cache": "^5.0", - "symfony/config": "^5.0", - "symfony/console": "^5.0", - "symfony/contracts": "^2.0", - "symfony/dependency-injection": "^5.0", - "symfony/dom-crawler": "5.1.*", - "symfony/dotenv": "^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/expression-language": "^5.0", - "symfony/filesystem": "^5.0", - "symfony/finder": "5.1.*", - "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "^5.0", - "symfony/http-foundation": "^5.0.7", - "symfony/http-kernel": "^5.0.8", - "symfony/monolog-bundle": "^3.0", - "symfony/process": "5.1.*", - "symfony/proxy-manager-bridge": "^5.0", - "symfony/routing": "^5.0", - "symfony/stopwatch": "^5.0", - "symfony/string": "5.1.*", - "symfony/yaml": "^5.0", - "twig/twig": "~2.0", - "webmozart/assert": "^1.3" - }, - "conflict": { - "symfony/symfony": "*" - }, - "replace": { - "paragonie/random_compat": "2.*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-php56": "*", - "symfony/polyfill-php70": "*", - "symfony/polyfill-php71": "*", - "symfony/polyfill-php72": "*" - }, - "require-dev": { - "fzaninotto/faker": "^1.9", - "mikey179/vfsstream": "^1.2", - "mockery/mockery": "^1.0" - }, - "bin": [ - "bin/phpdoc.php", - "bin/phpdoc" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - }, - "symfony": { - "id": "01C32VS9393M1CP9R8TEJMH62G", - "allow-contrib": false, - "require": "^5.0" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\": [ - "src/phpDocumentor/" - ], - "phpDocumentor\\Guides\\": "src/Guides/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Documentation Generator for PHP", - "homepage": "https://www.phpdoc.org", - "keywords": [ - "api", - "application", - "dga", - "documentation", - "phpdoc" - ], - "support": { - "issues": "https://github.com/phpDocumentor/phpDocumentor/issues", - "source": "https://github.com/phpDocumentor/phpDocumentor/tree/v3.0.0" - }, - "time": "2020-10-27T20:24:27+00:00" - }, - { - "name": "phpdocumentor/reflection", - "version": "4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "447928a45710d6313e68774cf12b5f730b909baa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/447928a45710d6313e68774cf12b5f730b909baa", - "reference": "447928a45710d6313e68774cf12b5f730b909baa", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.0", - "php": ">=7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/reflection-docblock": "^5", - "phpdocumentor/type-resolver": "^1.0", - "psr/log": "~1.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "mikey179/vfsstream": "~1.2", - "mockery/mockery": "~1.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-4.x": "4.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\": "src/phpDocumentor" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Reflection library to do Static Analysis for PHP Projects", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/Reflection/issues", - "source": "https://github.com/phpDocumentor/Reflection/tree/4.0.1" - }, - "time": "2020-06-19T18:26:14+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/a0eeab580cbdf4414fef6978732510a36ed0a9d6", - "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" - }, - "time": "2021-06-25T13:47:51+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "aa53f8d4374d1f5bd3fc598548d6272cb5d9bf39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/aa53f8d4374d1f5bd3fc598548d6272cb5d9bf39", - "reference": "aa53f8d4374d1f5bd3fc598548d6272cb5d9bf39", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "vimeo/psalm": "^5.13" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.x" - }, - "time": "2024-05-21T06:14:15+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "eee054a3d40f09920f5b27c9b09a6483f88d9d24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/eee054a3d40f09920f5b27c9b09a6483f88d9d24", - "reference": "eee054a3d40f09920f5b27c9b09a6483f88d9d24", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.x" - }, - "time": "2024-05-24T14:24:30+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "416ca2ac2a84555b785a98002d613fe13d1d1c2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/416ca2ac2a84555b785a98002d613fe13d1d1c2f", - "reference": "416ca2ac2a84555b785a98002d613fe13d1d1c2f", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "default-branch": true, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/master" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2023-11-12T22:52:20+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.29.1", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" - }, - "time": "2024-05-31T08:52:43+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-11T06:28:43+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5ec07c7cd977ca9fb1c6006f8367ad127604aebb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5ec07c7cd977ca9fb1c6006f8367ad127604aebb", - "reference": "5ec07c7cd977ca9fb1c6006f8367ad127604aebb", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:50:28+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5fe659f0b20cfb7db5359b01021f22707d8657b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5fe659f0b20cfb7db5359b01021f22707d8657b6", - "reference": "5fe659f0b20cfb7db5359b01021f22707d8657b6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:51:23+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5199f4e0818bbcb9827ae59c0d456e5759d80f7b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5199f4e0818bbcb9827ae59c0d456e5759d80f7b", - "reference": "5199f4e0818bbcb9827ae59c0d456e5759d80f7b", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:51:55+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5030e89e3954823142bef84906eb83eb0f7a49d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5030e89e3954823142bef84906eb83eb0f7a49d0", - "reference": "5030e89e3954823142bef84906eb83eb0f7a49d0", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:52:24+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0d9401b7e8245d71079e249e3cb868e9d2337887" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d9401b7e8245d71079e249e3cb868e9d2337887", - "reference": "0d9401b7e8245d71079e249e3cb868e9d2337887", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.1" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2023-04-17T12:17:05+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", - "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "suggest": { - "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "source": "https://github.com/php-fig/event-dispatcher" - }, - "time": "2024-03-17T21:29:03+00:00" - }, - { - "name": "psr/http-message", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" - }, - "time": "2023-04-04T09:50:52+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "scrivo/highlight.php", - "version": "9.18.x-dev", - "source": { - "type": "git", - "url": "https://github.com/scrivo/highlight.php.git", - "reference": "f41f88f623e9c68c2030349d652722f6e6f8df2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/f41f88f623e9c68c2030349d652722f6e6f8df2d", - "reference": "f41f88f623e9c68c2030349d652722f6e6f8df2d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "sabberworm/php-css-parser": "^8.3", - "symfony/finder": "^2.8|^3.4|^5.4", - "symfony/var-dumper": "^2.8|^3.4|^5.4" - }, - "suggest": { - "ext-mbstring": "Allows highlighting code with unicode characters and supports language with unicode keywords" - }, - "type": "library", - "autoload": { - "files": [ - "HighlightUtilities/functions.php" - ], - "psr-0": { - "Highlight\\": "", - "HighlightUtilities\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Geert Bergman", - "homepage": "http://www.scrivo.org/", - "role": "Project Author" - }, - { - "name": "Vladimir Jimenez", - "homepage": "https://allejo.io", - "role": "Maintainer" - }, - { - "name": "Martin Folkers", - "homepage": "https://twobrain.io", - "role": "Contributor" - } - ], - "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", - "keywords": [ - "code", - "highlight", - "highlight.js", - "highlight.php", - "syntax" - ], - "support": { - "issues": "https://github.com/scrivo/highlight.php/issues", - "source": "https://github.com/scrivo/highlight.php" - }, - "funding": [ - { - "url": "https://github.com/allejo", - "type": "github" - } - ], - "time": "2023-05-15T03:45:40+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "3a3cd121ce7cd032f94fb8f881ba3b5f145e3f40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/3a3cd121ce7cd032f94fb8f881ba3b5f145e3f40", - "reference": "3a3cd121ce7cd032f94fb8f881ba3b5f145e3f40", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-04-04T08:53:00+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "ac62e7f08e5b0b526386644911103bb3422c0015" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ac62e7f08e5b0b526386644911103bb3422c0015", - "reference": "ac62e7f08e5b0b526386644911103bb3422c0015", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-04-03T07:55:48+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "bdd34bf2919e400808fc747b20f59e5732f3646b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/bdd34bf2919e400808fc747b20f59e5732f3646b", - "reference": "bdd34bf2919e400808fc747b20f59e5732f3646b", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:41:34+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "44e614470e153123773072a489334c4d6b55e2fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/44e614470e153123773072a489334c4d6b55e2fa", - "reference": "44e614470e153123773072a489334c4d6b55e2fa", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:42:24+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.10", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-09-28T11:50:59+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c62945b35878561a1847d34c1ee069858ae5eaae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c62945b35878561a1847d34c1ee069858ae5eaae", - "reference": "c62945b35878561a1847d34c1ee069858ae5eaae", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:44:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c409c34cd83004034fc5a5486691e08f6e83eb65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c409c34cd83004034fc5a5486691e08f6e83eb65", - "reference": "c409c34cd83004034fc5a5486691e08f6e83eb65", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-04-04T06:29:29+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "449d3e721e00daaad2881d3eb53592970d933370" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/449d3e721e00daaad2881d3eb53592970d933370", - "reference": "449d3e721e00daaad2881d3eb53592970d933370", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:46:09+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.10", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T09:25:50+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "41eaf664fcfa48cc2e4b2924f13769e6cb20a2cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/41eaf664fcfa48cc2e4b2924f13769e6cb20a2cf", - "reference": "41eaf664fcfa48cc2e4b2924f13769e6cb20a2cf", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:47:30+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "928bc13bd615206af37c8c2e92401cfe3d53f15c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/928bc13bd615206af37c8c2e92401cfe3d53f15c", - "reference": "928bc13bd615206af37c8c2e92401cfe3d53f15c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:48:40+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "4facd2a6ce800aae87e6f5a0f73842585ca3efd6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/4facd2a6ce800aae87e6f5a0f73842585ca3efd6", - "reference": "4facd2a6ce800aae87e6f5a0f73842585ca3efd6", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-29T09:41:15+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a820c337b170875fe151b386a28862a95fe3d7ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a820c337b170875fe151b386a28862a95fe3d7ea", - "reference": "a820c337b170875fe151b386a28862a95fe3d7ea", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/4.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:53:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "cc835c21ef77e6200d6486e0ba2b794e95a27524" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/cc835c21ef77e6200d6486e0ba2b794e95a27524", - "reference": "cc835c21ef77e6200d6486e0ba2b794e95a27524", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/4.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-22T13:54:54+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.7.2", - "source": { - "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards", - "static analysis" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "funding": [ - { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", - "type": "github" - }, - { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - } - ], - "time": "2023-02-22T23:07:41+00:00" - }, - { - "name": "symfony/cache", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "89005bc368ca02ed0433c592e4d27670d0844a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/89005bc368ca02ed0433c592e4d27670d0844a66", - "reference": "89005bc368ca02ed0433c592e4d27670d0844a66", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0|2.0", - "psr/simple-cache-implementation": "1.0|2.0", - "symfony/cache-implementation": "1.0|2.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6|^2.0", - "doctrine/dbal": "^2.13.1|^3|^4", - "predis/predis": "^1.1|^2.0", - "psr/simple-cache": "^1.0|^2.0", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/config", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e", - "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/messenger": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/console", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/aa73115c0c24220b523625bfcfa655d7d73662dd", - "reference": "aa73115c0c24220b523625bfcfa655d7d73662dd", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/contracts", - "version": "2.5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/contracts.git", - "reference": "682747298ebb9c8d95469acc2a4e3083003e50e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/682747298ebb9c8d95469acc2a4e3083003e50e1", - "reference": "682747298ebb9c8d95469acc2a4e3083003e50e1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0|^2.0|^3.0", - "psr/container": "^1.1", - "psr/event-dispatcher": "^1.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "replace": { - "symfony/cache-contracts": "self.version", - "symfony/deprecation-contracts": "self.version", - "symfony/event-dispatcher-contracts": "self.version", - "symfony/http-client-contracts": "self.version", - "symfony/service-contracts": "self.version", - "symfony/translation-contracts": "self.version" - }, - "require-dev": { - "symfony/polyfill-intl-idn": "^1.10" - }, - "suggest": { - "symfony/cache-implementation": "", - "symfony/event-dispatcher-implementation": "", - "symfony/http-client-implementation": "", - "symfony/service-implementation": "", - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - } - }, - "autoload": { - "files": [ - "Deprecation/function.php" - ], - "psr-4": { - "Symfony\\Contracts\\": "" - }, - "exclude-from-classmap": [ - "**/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A set of abstractions extracted out of the Symfony components", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/contracts/tree/2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "408b33326496030c201b8051b003e9e8cdb2efc9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/408b33326496030c201b8051b003e9e8cdb2efc9", - "reference": "408b33326496030c201b8051b003e9e8cdb2efc9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<5.3", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4.26" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" - }, - "require-dev": { - "symfony/config": "^5.3|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4.26|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/dom-crawler", - "version": "5.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "5d89ceb53ec65e1973a555072fac8ed5ecad3384" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5d89ceb53ec65e1973a555072fac8ed5ecad3384", - "reference": "5d89ceb53ec65e1973a555072fac8ed5ecad3384", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "masterminds/html5": "<2.6" - }, - "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases DOM navigation for HTML and XML documents", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.1.11" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T10:01:46+00:00" - }, - { - "name": "symfony/dotenv", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "3052dbf22f71e47f6ef7a5efa6aaedfe871ba35d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/3052dbf22f71e47f6ef7a5efa6aaedfe871ba35d", - "reference": "3052dbf22f71e47f6ef7a5efa6aaedfe871ba35d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "source": "https://github.com/symfony/dotenv/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/error-handler", - "version": "6.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "93a8400a7eaaaf385b2d6f71e30e064baa639629" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/93a8400a7eaaaf385b2d6f71e30e064baa639629", - "reference": "93a8400a7eaaaf385b2d6f71e30e064baa639629", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" - }, - "conflict": { - "symfony/deprecation-contracts": "<2.5" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" - }, - "bin": [ - "Resources/bin/patch-type-declarations" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/6.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-01-23T14:35:58+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", - "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/expression-language", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/expression-language.git", - "reference": "77670d1e74086dc8d941a18f97097bbf988f2840" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/77670d1e74086dc8d941a18f97097bbf988f2840", - "reference": "77670d1e74086dc8d941a18f97097bbf988f2840", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ExpressionLanguage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an engine that can compile and evaluate expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/expression-language/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/filesystem", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "26dd9912df6940810ea00f8f53ad48d6a3424995" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/26dd9912df6940810ea00f8f53ad48d6a3424995", - "reference": "26dd9912df6940810ea00f8f53ad48d6a3424995", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "symfony/process": "^5.4|^6.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T14:33:22+00:00" - }, - { - "name": "symfony/finder", - "version": "5.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/196f45723b5e618bf0e23b97e96d11652696ea9e", - "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T10:01:46+00:00" - }, - { - "name": "symfony/flex", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/flex.git", - "reference": "33ce7c1c0fe78f8c3a106f193b6c0a7d82384462" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/33ce7c1c0fe78f8c3a106f193b6c0a7d82384462", - "reference": "33ce7c1c0fe78f8c3a106f193b6c0a7d82384462", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": ">=7.1" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/dotenv": "^4.4|^5.0|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Symfony\\Flex\\Flex" - }, - "autoload": { - "psr-4": { - "Symfony\\Flex\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" - } - ], - "description": "Composer plugin for Symfony", - "support": { - "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/1.x" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-27T10:20:37+00:00" - }, - { - "name": "symfony/framework-bundle", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "18b84194424511fe541fc7962553ae423e4553c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/18b84194424511fe541fc7962553ae423e4553c7", - "reference": "18b84194424511fe541fc7962553ae423e4553c7", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": ">=7.2.5", - "symfony/cache": "^5.2|^6.0", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^5.4.5|^6.0.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4.1|^5.0.1|^6.0", - "symfony/event-dispatcher": "^5.1|^6.0", - "symfony/filesystem": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^5.4.24|^6.2.11", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/polyfill-php81": "^1.22", - "symfony/routing": "^5.3|^6.0" - }, - "conflict": { - "doctrine/annotations": "<1.13.1", - "doctrine/cache": "<1.11", - "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.3", - "symfony/console": "<5.2.5|>=7.0", - "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/form": "<5.2", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<5.2", - "symfony/messenger": "<5.4", - "symfony/mime": "<4.4", - "symfony/property-access": "<5.3", - "symfony/property-info": "<4.4", - "symfony/security-csrf": "<5.3", - "symfony/serializer": "<5.2", - "symfony/service-contracts": ">=3.0", - "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.3", - "symfony/twig-bridge": "<4.4", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<5.3.11", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<5.2" - }, - "require-dev": { - "doctrine/annotations": "^1.13.1|^2", - "doctrine/cache": "^1.11|^2.0", - "doctrine/persistence": "^1.3|^2|^3", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.3|^6.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/console": "^5.4.9|^6.0.9", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0", - "symfony/dotenv": "^5.1|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/form": "^5.2|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/mailer": "^5.2|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/notifier": "^5.4|^6.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/property-info": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0", - "symfony/security-bundle": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/string": "^5.0|^6.0", - "symfony/translation": "^5.3|^6.0", - "symfony/twig-bundle": "^4.4|^5.0|^6.0", - "symfony/validator": "^5.3.11|^6.0", - "symfony/web-link": "^4.4|^5.0|^6.0", - "symfony/workflow": "^5.2|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0", - "twig/twig": "^2.10|^3.0.4" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/framework-bundle/tree/5.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-14T09:52:52+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "5.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "cf4893ca4eca3fac4ae06da1590afdbbb4217847" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cf4893ca4eca3fac4ae06da1590afdbbb4217847", - "reference": "cf4893ca4eca3fac4ae06da1590afdbbb4217847", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "predis/predis": "^1.0|^2.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], "support": { - "source": "https://github.com/symfony/http-foundation/tree/5.4" + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { - "name": "symfony/http-kernel", - "version": "5.4.x-dev", + "name": "phpunit/php-invoker", + "version": "4.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "ebb6f7e4ec35dbbab8429e3af254ff6bababb2fc" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ebb6f7e4ec35dbbab8429e3af254ff6bababb2fc", - "reference": "ebb6f7e4ec35dbbab8429e3af254ff6bababb2fc", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.4.21|^6.2.7", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.13" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" + "php": ">=8.1" }, "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", - "symfony/var-dumper": "^4.4.31|^5.4", - "twig/twig": "^2.13|^3.0.4" + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" }, "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], "support": { - "source": "https://github.com/symfony/http-kernel/tree/5.4" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-06-17T05:58:45+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { - "name": "symfony/monolog-bridge", - "version": "6.4.x-dev", + "name": "phpunit/php-text-template", + "version": "3.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/0fbee64913b1c595e7650a1919ba3edba8d49ea7", - "reference": "0fbee64913b1c595e7650a1919ba3edba8d49ea7", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2|^3", - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/console": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/security-core": "<5.4" + "php": ">=8.1" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "symfony-bridge", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Bridge\\Monolog\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides integration for Monolog with various Symfony components", - "homepage": "https://symfony.com", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/6.4" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { - "name": "symfony/monolog-bundle", - "version": "dev-master", + "name": "phpunit/php-timer", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "06ddd76fd24dcf325a61e826b5c799e4b929422e" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/06ddd76fd24dcf325a61e826b5c799e4b929422e", - "reference": "06ddd76fd24dcf325a61e826b5c799e4b929422e", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", - "php": ">=7.2.5", - "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", - "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0" + "php": ">=8.1" }, "require-dev": { - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/phpunit-bridge": "^6.3 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + "phpunit/phpunit": "^10.0" }, - "default-branch": true, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "6.0-dev" } }, "autoload": { - "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony MonologBundle", - "homepage": "https://symfony.com", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "log", - "logging" + "timer" ], "support": { - "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/master" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2023-11-09T09:49:27+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "1.x-dev", + "name": "phpunit/phpunit", + "version": "10.5.64", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0e8c1d19cea35ad97d4887f363d07c78e30fbf06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e8c1d19cea35ad97d4887f363d07c78e30fbf06", + "reference": "0e8c1d19cea35ad97d4887f363d07c78e30fbf06", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.5", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.4", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.1", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { - "ext-ctype": "For best performance" + "ext-soap": "To be able to generate mocks based on WSDL files" }, - "default-branch": true, + "bin": [ + "phpunit" + ], "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "10.5-dev" } }, "autoload": { "files": [ - "bootstrap.php" + "src/Framework/Assert/Functions.php" ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "phpunit", + "testing", + "xunit" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.64" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2026-07-06T14:50:35+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "1.x-dev", + "name": "sebastian/cli-parser", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "2.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", - "version": "1.x-dev", + "name": "sebastian/code-unit", + "version": "2.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, - "suggest": { - "ext-intl": "For best performance" + "require-dev": { + "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "2.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "1.x-dev", + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8740a072b86292957feb42703edde77fcfca84fb" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8740a072b86292957feb42703edde77fcfca84fb", - "reference": "8740a072b86292957feb42703edde77fcfca84fb", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=8.1" }, - "suggest": { - "ext-mbstring": "For best performance" + "require-dev": { + "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "3.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x" + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-06-20T08:18:00+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "1.x-dev", + "name": "sebastian/comparator", + "version": "5.0.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "5.0-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "comparator", + "compare", + "equality" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2026-01-24T09:25:16+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "1.x-dev", + "name": "sebastian/complexity", + "version": "3.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "php": ">=7.1" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "3.2-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "1.x-dev", + "name": "sebastian/diff", + "version": "5.1.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" }, - "default-branch": true, "type": "library", "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "branch-alias": { + "dev-main": "5.1-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, "classmap": [ - "Resources/stubs" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "diff", + "udiff", + "unidiff", + "unified diff" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { - "name": "symfony/process", - "version": "5.1.x-dev", + "name": "sebastian/environment", + "version": "6.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "d279ae7f2d6e0e4e45f66de7d76006246ae00e4d" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d279ae7f2d6e0e4e45f66de7d76006246ae00e4d", - "reference": "d279ae7f2d6e0e4e45f66de7d76006246ae00e4d", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], "support": { - "source": "https://github.com/symfony/process/tree/v5.1.11" + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { - "name": "symfony/proxy-manager-bridge", - "version": "5.4.x-dev", + "name": "sebastian/exporter", + "version": "5.1.4", "source": { "type": "git", - "url": "https://github.com/symfony/proxy-manager-bridge.git", - "reference": "2ebc25e0174a6a244f7edada5a498f9728dc0d29" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "0735b90f4da94969541dac1da743446e276defa6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/2ebc25e0174a6a244f7edada5a498f9728dc0d29", - "reference": "2ebc25e0174a6a244f7edada5a498f9728dc0d29", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", + "reference": "0735b90f4da94969541dac1da743446e276defa6", "shasum": "" }, "require": { - "friendsofphp/proxy-manager-lts": "^1.0.2", - "php": ">=7.2.5", - "symfony/dependency-injection": "^5.0|^6.0", - "symfony/polyfill-php80": "^1.16" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "symfony/config": "^4.4|^5.0|^6.0" + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } }, - "type": "symfony-bridge", "autoload": { - "psr-4": { - "Symfony\\Bridge\\ProxyManager\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "Provides integration for ProxyManager with various Symfony components", - "homepage": "https://symfony.com", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], "support": { - "source": "https://github.com/symfony/proxy-manager-bridge/tree/5.4" + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2025-09-24T06:09:11+00:00" }, { - "name": "symfony/routing", - "version": "5.4.x-dev", + "name": "sebastian/global-state", + "version": "6.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "6df1dd8b306649303267a760699cf04cf39b1f7b" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6df1dd8b306649303267a760699cf04cf39b1f7b", - "reference": "6df1dd8b306649303267a760699cf04cf39b1f7b", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", - "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" + "ext-dom": "*", + "phpunit/phpunit": "^10.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ - "router", - "routing", - "uri", - "url" + "global state" ], "support": { - "source": "https://github.com/symfony/routing/tree/5.4" + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { - "name": "symfony/stopwatch", - "version": "5.4.x-dev", + "name": "sebastian/lines-of-code", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" }, "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { - "source": "https://github.com/symfony/stopwatch/tree/5.4" + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { - "name": "symfony/string", - "version": "5.1.x-dev", + "name": "sebastian/object-enumerator", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "83bbb92d34881744b8021452a76532b28283dbfb" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/83bbb92d34881744b8021452a76532b28283dbfb", - "reference": "83bbb92d34881744b8021452a76532b28283dbfb", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "phpunit/phpunit": "^10.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { - "source": "https://github.com/symfony/string/tree/5.1" + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2021-01-25T14:41:58+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { - "name": "symfony/var-dumper", - "version": "6.4.x-dev", + "name": "sebastian/object-reflector", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "f82848117a898e1032e413ec910d30a63bc6c3bc" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f82848117a898e1032e413ec910d30a63bc6c3bc", - "reference": "f82848117a898e1032e413ec910d30a63bc6c3bc", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<5.4" + "php": ">=8.1" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "phpunit/phpunit": "^10.0" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { - "source": "https://github.com/symfony/var-dumper/tree/6.4" + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-06-22T07:55:24+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { - "name": "symfony/var-exporter", - "version": "6.4.x-dev", + "name": "sebastian/recursion-context", + "version": "5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5d32fe257a9b39cb63146924d6b4e32a22d4502a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5d32fe257a9b39cb63146924d6b4e32a22d4502a", + "reference": "5d32fe257a9b39cb63146924d6b4e32a22d4502a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.1" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "phpunit/phpunit": "^10.5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { - "source": "https://github.com/symfony/var-exporter/tree/6.4" + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" }, { - "url": "https://github.com/fabpot", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", "type": "tidelift" } ], - "time": "2024-06-24T15:53:56+00:00" + "time": "2026-08-11T05:27:39+00:00" }, { - "name": "symfony/yaml", - "version": "5.4.x-dev", + "name": "sebastian/type", + "version": "4.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/81cad0ceab3d61fe14fe941ff18a230ac9c80f83", - "reference": "81cad0ceab3d61fe14fe941ff18a230ac9c80f83", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" + "php": ">=8.1" }, "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "phpunit/phpunit": "^10.0" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", "support": { - "source": "https://github.com/symfony/yaml/tree/5.4" + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { - "name": "theseer/tokenizer", - "version": "1.2.3", + "name": "sebastian/version", + "version": "4.0.1", "source": { "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": ">=8.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -7036,173 +1590,165 @@ ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { - "name": "twig/twig", - "version": "2.x-dev", + "name": "squizlabs/php_codesniffer", + "version": "3.13.6", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "a1d84cfbc1c2f99ee4af361eb0a32dad47723b01" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a1d84cfbc1c2f99ee4af361eb0a32dad47723b01", - "reference": "a1d84cfbc1c2f99ee4af361eb0a32dad47723b01", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/4c378e1a528ea066890fc2397cbdd2f94eb2fc91", + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.8" + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.16-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - }, - "psr-4": { - "Twig\\": "src/" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "name": "Greg Sherwood", + "role": "Former lead" }, { - "name": "Twig Team", - "role": "Contributors" + "name": "Juliette Reinders Folmer", + "role": "Current lead" }, { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ - "templating" + "phpcs", + "standards", + "static analysis" ], "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/2.x" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://github.com/PHPCSStandards", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-03-19T06:42:15+00:00" + "time": "2026-08-06T00:17:32+00:00" }, { - "name": "webmozart/assert", - "version": "1.11.0", + "name": "theseer/tokenizer", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { - "ext-ctype": "*", + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, - "time": "2022-06-03T18:03:27+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], - "minimum-stability": "dev", + "minimum-stability": "stable", "stability-flags": [], - "prefer-stable": false, + "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.1 <8.4", + "php": ">=8.1", "ext-curl": "*", "ext-json": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.6.0" } diff --git a/package.json b/package.json index 9cbf449b..b95c1366 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,10 @@ "test-stream:coverage": "XDEBUG_MODE=coverage ./vendor/bin/phpunit --bootstrap=./tests/bootstrap-stream.php --coverage-clover=coverage.xml", "lint": "./vendor/bin/phpcs --standard=./phpcs.xml.dist ./src/Parse ./tests/Parse", "lint:fix": "./vendor/bin/phpcbf --standard=./phpcs.xml.dist ./src/Parse ./tests/Parse", - "prestart": "MONGODB_VERSION=4.0.4 MONGODB_TOPOLOGY=replicaset MONGODB_STORAGE_ENGINE=wiredTiger mongodb-runner start", "start": "TESTING=1 node ./tests/server.js &", "server-only": "TESTING=1 node ./tests/server.js", - "document-check": "./vendor/bin/phpdoc -d ./src/ --template='default'", - "document": "./vendor/bin/phpdoc -d ./src/ --title 'Parse PHP SDK API Reference' --template='default'" + "document-check": "./tools/phpDocumentor.phar -d ./src/ --template='default'", + "document": "./tools/phpDocumentor.phar -d ./src/ --title 'Parse PHP SDK API Reference' --template='default'" }, "type": "module", "repository": { diff --git a/phpunit.xml b/phpunit.xml index 0ca6f6f3..c2cb31ff 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,11 +1,5 @@ - - - - - - - + ./tests diff --git a/src/Parse/HttpClients/ParseCurl.php b/src/Parse/HttpClients/ParseCurl.php index 17cf2fbc..6d7077e8 100644 --- a/src/Parse/HttpClients/ParseCurl.php +++ b/src/Parse/HttpClients/ParseCurl.php @@ -18,7 +18,7 @@ class ParseCurl /** * Curl handle * - * @var resource + * @var \CurlHandle|null */ private $curl; @@ -133,10 +133,8 @@ public function close() throw new ParseException('You must call ParseCurl::init first'); } - // close our handle - curl_close($this->curl); - - // unset our curl handle + // unset our curl handle, which closes it + // note: curl_close() has been a no-op since PHP 8.0 and is deprecated as of PHP 8.5 $this->curl = null; } } diff --git a/src/Parse/HttpClients/ParseCurlHttpClient.php b/src/Parse/HttpClients/ParseCurlHttpClient.php index e9337dad..174e61ab 100644 --- a/src/Parse/HttpClients/ParseCurlHttpClient.php +++ b/src/Parse/HttpClients/ParseCurlHttpClient.php @@ -352,9 +352,9 @@ private function getHeaderSize() if ($this->needsCurlProxyFix()) { // Additional way to calculate the request body size. if (preg_match('/Content-Length: (\d+)/', $this->response, $match)) { - $headerSize = mb_strlen($this->response) - $match[1]; + $headerSize = strlen($this->response) - $match[1]; } elseif (stripos($this->response, self::CONNECTION_ESTABLISHED) !== false) { - $headerSize += mb_strlen(self::CONNECTION_ESTABLISHED); + $headerSize += strlen(self::CONNECTION_ESTABLISHED); } } return $headerSize; diff --git a/src/Parse/HttpClients/ParseStream.php b/src/Parse/HttpClients/ParseStream.php index b6845f70..ec95829c 100644 --- a/src/Parse/HttpClients/ParseStream.php +++ b/src/Parse/HttpClients/ParseStream.php @@ -110,7 +110,15 @@ public function getErrorCode() public function getFileContents($filename, $use_include_path, $context) { $result = file_get_contents($filename, $use_include_path, $context); - $this->responseHeaders = $http_response_header; + + if (function_exists('http_get_last_response_headers')) { + // PHP 8.4+, the magic $http_response_header variable is deprecated as of PHP 8.5 + $this->responseHeaders = http_get_last_response_headers(); + } else { + // $http_response_header is only defined when the http wrapper produced a response + $this->responseHeaders = $http_response_header ?? null; + } + return $result; } } diff --git a/src/Parse/ParseException.php b/src/Parse/ParseException.php index 2f46c886..d65b058a 100644 --- a/src/Parse/ParseException.php +++ b/src/Parse/ParseException.php @@ -22,7 +22,7 @@ class ParseException extends Exception * @param int $code Error code. * @param \Exception $previous Previous Exception. */ - public function __construct($message, $code = 0, Exception $previous = null) + public function __construct($message, $code = 0, ?Exception $previous = null) { parent::__construct($message, $code, $previous); } diff --git a/tests/Parse/AddOperationTest.php b/tests/Parse/AddOperationTest.php index cfa2ee52..3aeebe2a 100644 --- a/tests/Parse/AddOperationTest.php +++ b/tests/Parse/AddOperationTest.php @@ -8,6 +8,7 @@ use Parse\Internal\AddOperation; use Parse\Internal\DeleteOperation; use Parse\Internal\SetOperation; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class AddOperationTest extends TestCase @@ -17,9 +18,7 @@ public static function setUpBeforeClass() : void Helper::setUp(); } - /** - * @group add-op - */ + #[Group('add-op')] public function testAddOperation() { $objects = [ @@ -30,9 +29,7 @@ public function testAddOperation() $this->assertEquals($objects, $addOp->getValue()); } - /** - * @group add-op - */ + #[Group('add-op')] public function testBadObjects() { $this->expectException( @@ -42,9 +39,7 @@ public function testBadObjects() new AddOperation('not an array'); } - /** - * @group add-op - */ + #[Group('add-op')] public function testMergePrevious() { $addOp = new AddOperation([ @@ -74,9 +69,7 @@ public function testMergePrevious() ], $merged->getValue(), 'Value was not as expected'); } - /** - * @group add-op - */ + #[Group('add-op')] public function testInvalidMerge() { $this->expectException( diff --git a/tests/Parse/AddUniqueOperationTest.php b/tests/Parse/AddUniqueOperationTest.php index 2e173389..06fca9a3 100644 --- a/tests/Parse/AddUniqueOperationTest.php +++ b/tests/Parse/AddUniqueOperationTest.php @@ -11,6 +11,7 @@ use Parse\Internal\SetOperation; use Parse\ParseClient; use Parse\ParseObject; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class AddUniqueOperationTest extends TestCase @@ -25,9 +26,7 @@ public function tearDown() : void Helper::clearClass('TestObject'); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testAddUniqueOp() { $objects = [ @@ -39,9 +38,7 @@ public function testAddUniqueOp() $this->assertEquals($objects, $addUnique->getValue()); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testBadObjects() { $this->expectException( @@ -51,9 +48,7 @@ public function testBadObjects() new AddUniqueOperation('not-an-array'); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testEncode() { $objects = [ @@ -70,9 +65,7 @@ public function testEncode() ], $encoded); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testMergePrevious() { $addOp = new AddUniqueOperation([ @@ -102,9 +95,7 @@ public function testMergePrevious() ], $merged->getValue(), 'Value was not as expected'); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testInvalidMerge() { $this->expectException( @@ -117,9 +108,7 @@ public function testInvalidMerge() $addOp->_mergeWithPrevious(new IncrementOperation()); } - /** - * @group add-unique-op - */ + #[Group('add-unique-op')] public function testApply() { // test a null old value diff --git a/tests/Parse/Helper.php b/tests/Parse/Helper.php index 95380113..a9384a57 100644 --- a/tests/Parse/Helper.php +++ b/tests/Parse/Helper.php @@ -73,7 +73,32 @@ public static function setHttpClient() public static function setServerURL() { - ParseClient::setServerURL('http://localhost:1337', 'parse'); + ParseClient::setServerURL(self::getHttpServerURL(), 'parse'); + } + + /** + * Base url of the plain http test server. + * + * The port may be overridden with PARSE_TEST_HTTP_PORT to avoid + * clashing with another Parse server running locally. + * + * @return string + */ + public static function getHttpServerURL() + { + return 'http://localhost:'.(getenv('PARSE_TEST_HTTP_PORT') ?: '1337'); + } + + /** + * Base url of the TLS enabled test server. + * + * The port may be overridden with PARSE_TEST_HTTPS_PORT. + * + * @return string + */ + public static function getHttpsServerURL() + { + return 'https://localhost:'.(getenv('PARSE_TEST_HTTPS_PORT') ?: '1338'); } public static function tearDown() diff --git a/tests/Parse/IncrementOperationTest.php b/tests/Parse/IncrementOperationTest.php index 4ae4693e..78f9cbe7 100644 --- a/tests/Parse/IncrementOperationTest.php +++ b/tests/Parse/IncrementOperationTest.php @@ -10,6 +10,7 @@ use Parse\Internal\IncrementOperation; use Parse\Internal\SetOperation; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class IncrementOperationTest extends TestCase @@ -19,18 +20,14 @@ public static function setUpBeforeClass() : void Helper::setUp(); } - /** - * @group increment-op - */ + #[Group('increment-op')] public function testIncrementOperation() { $addOp = new IncrementOperation(32); $this->assertEquals(32, $addOp->getValue()); } - /** - * @group increment-op - */ + #[Group('increment-op')] public function testMergePrevious() { $addOp = new IncrementOperation(); @@ -52,9 +49,7 @@ public function testMergePrevious() $this->assertEquals(33, $merged->getValue(), 'Value was not as expected'); } - /** - * @group increment-op - */ + #[Group('increment-op')] public function testInvalidMerge() { $this->expectException( diff --git a/tests/Parse/IncrementTest.php b/tests/Parse/IncrementTest.php index 69de8fa3..fbbaf085 100644 --- a/tests/Parse/IncrementTest.php +++ b/tests/Parse/IncrementTest.php @@ -5,6 +5,7 @@ use Parse\ParseObject; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class IncrementTest extends TestCase @@ -20,9 +21,7 @@ public function tearDown() : void Helper::tearDown(); } - /** - * @group fresh-increment - */ + #[Group('fresh-increment')] public function testIncrementOnFreshObject() { $obj = ParseObject::create('TestObject'); @@ -189,9 +188,7 @@ public function testIncrementEmptyFieldOnFreshObject() ); } - /** - * @group increment-empty - */ + #[Group('increment-empty')] public function testIncrementEmptyField() { $obj = ParseObject::create('TestObject'); @@ -213,9 +210,7 @@ public function testIncrementEmptyField() ); } - /** - * @group empty-field-type-conflict - */ + #[Group('empty-field-type-conflict')] public function testIncrementEmptyFieldAndTypeConflict() { $obj = ParseObject::create('TestObject'); diff --git a/tests/Parse/ParseACLTest.php b/tests/Parse/ParseACLTest.php index 349a0950..f5b310b8 100644 --- a/tests/Parse/ParseACLTest.php +++ b/tests/Parse/ParseACLTest.php @@ -10,6 +10,7 @@ use Parse\ParseRole; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseACLTest extends TestCase @@ -36,9 +37,7 @@ public function testIsSharedDefault() $this->assertFalse($acl->_isShared()); } - /** - * @group acl-one-user - */ + #[Group('acl-one-user')] public function testACLAnObjectOwnedByOneUser() { $user = new ParseUser(); @@ -385,9 +384,7 @@ public function testNullDefaultACL() $this->assertNull(ParseACL::_getDefaultACL()); } - /** - * @group default-acls - */ + #[Group('default-acls')] public function testDefaultACL() { // setup default acl @@ -453,9 +450,7 @@ public function testIncludedObjectsGetACLWithDefaultACL() $this->assertFalse($objectAgain->getACL()->getPublicWriteAccess()); } - /** - * @group acl-invalid - */ + #[Group('acl-invalid')] public function testCreatingACLWithInvalidId() { $this->expectException( @@ -468,9 +463,7 @@ public function testCreatingACLWithInvalidId() ]); } - /** - * @group acl-invalid - */ + #[Group('acl-invalid')] public function testCreatingWithBadAccessType() { $this->expectException( @@ -485,9 +478,7 @@ public function testCreatingWithBadAccessType() ]); } - /** - * @group acl-invalid - */ + #[Group('acl-invalid')] public function testCreatingWithInvalidPermissionValue() { $this->expectException( @@ -502,9 +493,7 @@ public function testCreatingWithInvalidPermissionValue() ]); } - /** - * @group acl-user-notallowed - */ + #[Group('acl-user-notallowed')] public function testSettingPermissionForUserNotAllowed() { // add 'userid' @@ -528,9 +517,7 @@ public function testSettingPermissionForUserNotAllowed() ], $permissions); } - /** - * @group removing-from-acl - */ + #[Group('removing-from-acl')] public function testRemovingFromAcl() { // add 'userid' @@ -607,9 +594,7 @@ public function testGettingUserWriteAccessWithoutId() $acl->getUserWriteAccess(new ParseUser()); } - /** - * @group test-role-access - */ + #[Group('test-role-access')] public function testRoleAccess() { $acl = new ParseACL(); diff --git a/tests/Parse/ParseAudienceTest.php b/tests/Parse/ParseAudienceTest.php index 9f667723..e9911ce8 100644 --- a/tests/Parse/ParseAudienceTest.php +++ b/tests/Parse/ParseAudienceTest.php @@ -8,6 +8,7 @@ use Parse\ParsePush; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseAudienceTest extends TestCase @@ -38,9 +39,7 @@ public function createInstallations() ]); } - /** - * @group audience-tests - */ + #[Group('audience-tests')] public function testPushAudiences() { $this->createInstallations(); @@ -65,9 +64,7 @@ public function testPushAudiences() $this->assertEquals(0, $audience->getTimesUsed()); } - /** - * @group audience-tests - */ + #[Group('audience-tests')] public function testSaveWithoutMaster() { $query = ParseAudience::query(); @@ -84,9 +81,7 @@ public function testSaveWithoutMaster() $this->assertEquals(1, $query->count(true), 'Did not end at 1'); } - /** - * @group audience-tests - */ + #[Group('audience-tests')] public function testPushWithAudience() { $this->createInstallations(); diff --git a/tests/Parse/ParseClientTest.php b/tests/Parse/ParseClientTest.php index ba08e891..8cef300c 100644 --- a/tests/Parse/ParseClientTest.php +++ b/tests/Parse/ParseClientTest.php @@ -14,6 +14,7 @@ use Parse\ParseRole; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; defined('CURLOPT_PINNEDPUBLICKEY') || define('CURLOPT_PINNEDPUBLICKEY', 10230); @@ -42,9 +43,7 @@ public function tearDown() : void ParseClient::setHttpOptions(null); } - /** - * @group client-not-initialized - */ + #[Group('client-not-initialized')] public function testParseNotInitialized() { $this->expectException( @@ -64,9 +63,7 @@ public function testParseNotInitialized() ); } - /** - * @group client-init - */ + #[Group('client-init')] public function testInitialize() { @@ -95,9 +92,7 @@ public function testInitialize() $this->assertNotNull(ParseClient::getStorage()); } - /** - * @group client-storage - */ + #[Group('client-storage')] public function testStorage() { @@ -148,9 +143,7 @@ public function testStorage() */ } - /** - * @group client-test - */ + #[Group('client-test')] public function testSetServerURL() { // add extra slashes to test removal @@ -169,9 +162,7 @@ public function testSetServerURL() ); } - /** - * @group client-test - */ + #[Group('client-test')] public function testRootMountPath() { ParseClient::setServerURL('https://example.com', '/'); @@ -182,9 +173,7 @@ public function testRootMountPath() ); } - /** - * @group client-test - */ + #[Group('client-test')] public function testBadServerURL() { $this->expectException( @@ -194,9 +183,7 @@ public function testBadServerURL() ParseClient::setServerURL(null, 'parse'); } - /** - * @group client-test - */ + #[Group('client-test')] public function testBadMountPath() { $this->expectException( @@ -206,9 +193,7 @@ public function testBadMountPath() ParseClient::setServerURL('https://example.com', null); } - /** - * @group encoding-error - */ + #[Group('encoding-error')] public function testEncodingError() { $this->expectException( @@ -218,9 +203,7 @@ public function testEncodingError() ParseClient::_encode(new Helper(), false); } - /** - * @group client-decoding - */ + #[Group('client-decoding')] public function testDecodingStdClass() { $obj = new \stdClass(); @@ -234,9 +217,7 @@ public function testDecodingStdClass() $this->assertEquals($emptyClass, ParseClient::_decode($emptyClass)); } - /** - * @group timeouts - */ + #[Group('timeouts')] public function testCurlTimeout() { @@ -255,9 +236,7 @@ public function testCurlTimeout() ParseClient::setTimeout(null); } - /** - * @group timeouts - */ + #[Group('timeouts')] public function testCurlConnectionTimeout() { ParseClient::setConnectionTimeout(3000); @@ -275,9 +254,7 @@ public function testCurlConnectionTimeout() ParseClient::setConnectionTimeout(null); } - /** - * @group timeouts - */ + #[Group('timeouts')] public function testStreamTimeout() { @@ -298,9 +275,7 @@ public function testStreamTimeout() ParseClient::setTimeout(null); } - /** - * @group timeouts - */ + #[Group('timeouts')] public function testStreamConnectionTimeout() { @@ -321,9 +296,7 @@ public function testStreamConnectionTimeout() ParseClient::setConnectionTimeout(null); } - /** - * @group no-curl-exceptions - */ + #[Group('no-curl-exceptions')] public function testNoCurlExceptions() { global $USE_CLIENT_STREAM; @@ -345,9 +318,7 @@ public function testNoCurlExceptions() Helper::setUp(); } - /** - * @group curl-exceptions - */ + #[Group('curl-exceptions')] public function testCurlException() { if (function_exists('curl_init')) { @@ -364,9 +335,7 @@ public function testCurlException() } } - /** - * @group stream-exceptions - */ + #[Group('stream-exceptions')] public function testStreamException() { @@ -382,15 +351,14 @@ public function testStreamException() ); } - /** - * @group stream-bad-request - * + /** * * **NOTE** * file_get_contents may SOMETIMES not return a full set of headers. * This causes this case to fail frequently while not being a serious error. * If you are running test cases and are having problems with this, * run it a few more times and you should be OK */ + #[Group('stream-bad-request')] public function testBadStreamRequest() { $this->expectException( @@ -408,9 +376,7 @@ public function testBadStreamRequest() ); } - /** - * @group client-bad-request - */ + #[Group('client-bad-request')] public function testCurlBadRequest() { if (function_exists('curl_init')) { @@ -430,9 +396,7 @@ public function testCurlBadRequest() } } - /** - * @group default-http-client - */ + #[Group('default-http-client')] public function testGetDefaultHttpClient() { // clear existing client @@ -450,9 +414,7 @@ public function testGetDefaultHttpClient() } } - /** - * @group ca-file - */ + #[Group('ca-file')] public function testCurlCAFile() { if (function_exists('curl_init')) { @@ -476,9 +438,7 @@ public function testCurlCAFile() } } - /** - * @group ca-file - */ + #[Group('ca-file')] public function testStreamCAFile() { // set a stream client @@ -500,9 +460,7 @@ public function testStreamCAFile() ); } - /** - * @group api-not-set - */ + #[Group('api-not-set')] public function testURLNotSet() { $this->expectException( @@ -516,9 +474,7 @@ public function testURLNotSet() (new ParseObject('TestingClass'))->save(); } - /** - * @group api-not-set - */ + #[Group('api-not-set')] public function testMountPathNotSet() { $this->expectException( @@ -532,9 +488,7 @@ public function testMountPathNotSet() (new ParseObject('TestingClass'))->save(); } - /** - * @group bad-api-response - */ + #[Group('bad-api-response')] public function testBadApiResponse() { $this->expectException( @@ -545,8 +499,7 @@ public function testBadApiResponse() $httpClient = ParseClient::getHttpClient(); // create a mock of the current http client - $stubClient = $this->getMockBuilder(get_class($httpClient)) - ->getMock(); + $stubClient = $this->createStub(get_class($httpClient)); // stub the response type to return // something we will try to work with @@ -566,9 +519,7 @@ public function testBadApiResponse() $obj->save(); } - /** - * @group check-server - */ + #[Group('check-server')] public function testCheckServer() { $health = ParseClient::getServerHealth(); @@ -581,15 +532,14 @@ public function testCheckServer() /** * Structured response present in modified/later versions of parse-server * - * @group check-server */ + #[Group('check-server')] public function testStructuredHealthResponse() { $httpClient = ParseClient::getHttpClient(); // create a mock of the current http client - $stubClient = $this->getMockBuilder(get_class($httpClient)) - ->getMock(); + $stubClient = $this->createStub(get_class($httpClient)); // stub the response type to return // something we will try to work with @@ -617,15 +567,14 @@ public function testStructuredHealthResponse() /** * Plain response present in earlier versions of parse-server (from 2.2.25 on) - * @group check-server */ + #[Group('check-server')] public function testPlainHealthResponse() { $httpClient = ParseClient::getHttpClient(); // create a mock of the current http client - $stubClient = $this->getMockBuilder(get_class($httpClient)) - ->getMock(); + $stubClient = $this->createStub(get_class($httpClient)); // stub the response type to return // something we will try to work with @@ -651,12 +600,10 @@ public function testPlainHealthResponse() $this->assertEquals($health['response']['status'], 'ok'); } - /** - * @group check-server - */ + #[Group('check-server')] public function testCheckBadServer() { - ParseClient::setServerURL('http://localhost:1337', 'not-a-real-endpoint'); + ParseClient::setServerURL(Helper::getHttpServerURL(), 'not-a-real-endpoint'); $health = ParseClient::getServerHealth(); $this->assertNotNull($health); $this->assertFalse(isset($health['error'])); @@ -673,14 +620,12 @@ public function testCheckBadServer() } } - /** - * @group test-http-options - */ + #[Group('test-http-options')] public function testCurlHttpOptions() { if (function_exists('curl_init')) { ParseClient::setHttpClient(new ParseCurlHttpClient()); - ParseClient::setServerURL('https://localhost:1338', 'parse'); + ParseClient::setServerURL(Helper::getHttpsServerURL(), 'parse'); ParseClient::setHttpOptions([ CURLOPT_SSL_VERIFYPEER => false, CURLOPT_PINNEDPUBLICKEY => 'sha256//Oz+R70/uIv0irdBWc7RNPyCGeZNbN+CBiPLjJxXWigg=', @@ -696,13 +641,11 @@ public function testCurlHttpOptions() } } - /** - * @group test-http-options - */ + #[Group('test-http-options')] public function testStreamHttpOptions() { ParseClient::setHttpClient(new ParseStreamHttpClient()); - ParseClient::setServerURL('https://localhost:1338', 'parse'); + ParseClient::setServerURL(Helper::getHttpsServerURL(), 'parse'); ParseClient::setHttpOptions([ 'ssl' => [ 'verify_peer' => false, @@ -710,7 +653,7 @@ public function testStreamHttpOptions() 'allow_self_signed' => true, 'local_cert' => dirname(__DIR__).'/keys/client.crt', 'local_pk' => dirname(__DIR__).'/keys/client.key', - 'peer_fingerprint' => '29F36676EFA0CA18B5B571C6144580044CB289C2', + 'peer_fingerprint' => '5036363125B57017255B3BB3241666827BD6A3A8', ] ]); $health = ParseClient::getServerHealth(); diff --git a/tests/Parse/ParseCloudTest.php b/tests/Parse/ParseCloudTest.php index 22649c90..78fd79d0 100644 --- a/tests/Parse/ParseCloudTest.php +++ b/tests/Parse/ParseCloudTest.php @@ -7,6 +7,7 @@ use Parse\ParseObject; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseCloudTest extends TestCase @@ -25,9 +26,7 @@ public function tearDown() : void } } - /** - * @group cloud-code - */ + #[Group('cloud-code')] public function testFunctionCall() { $response = ParseCloud::run('bar', [ @@ -56,9 +55,7 @@ public function testFunctionCallWithUser() $user->destroy(true); } - /** - * @group cloud-code - */ + #[Group('cloud-code')] public function testFunctionCallException() { $this->expectException( @@ -72,9 +69,7 @@ public function testFunctionCallException() ]); } - /** - * @group cloud-code - */ + #[Group('cloud-code')] public function testFunctionsWithObjectParamsFails() { // login as user @@ -86,9 +81,7 @@ public function testFunctionsWithObjectParamsFails() ParseCloud::run('foo', $params); } - /** - * @group cloud-code - */ + #[Group('cloud-code')] public function testFunctionsWithGeoPointParamsDoNotThrow() { $params = ['key1' => new ParseGeoPoint(50, 50)]; @@ -99,9 +92,7 @@ public function testFunctionsWithGeoPointParamsDoNotThrow() ParseCloud::run('unknown_function', $params); } - /** - * @group cloud-code - */ + #[Group('cloud-code')] public function testUnknownFunctionFailure() { $params = ['key1' => 'value1']; @@ -112,9 +103,7 @@ public function testUnknownFunctionFailure() ParseCloud::run('unknown_function', $params); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testGetJobsData() { $jobsData = ParseCloud::getJobsData(); @@ -124,9 +113,7 @@ public function testGetJobsData() $this->assertEquals(3, count($jobsData['jobs'])); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testRunJob() { $jobStatusId = ParseCloud::startJob('CloudJob1', [ @@ -140,9 +127,7 @@ public function testRunJob() $this->assertEquals('Monty Python', $jobStatus->get('params')['startedBy']); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testLongJob() { $jobStatusId = ParseCloud::startJob('CloudJob2'); @@ -151,18 +136,14 @@ public function testLongJob() $this->assertEquals('running', $jobStatus->get('status')); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testBadJob() { $this->expectException('Parse\ParseException', 'Invalid job.'); ParseCloud::startJob('bad_job'); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testFailingJob() { $jobStatusId = ParseCloud::startJob('CloudJobFailing'); @@ -174,9 +155,7 @@ public function testFailingJob() $this->assertEquals('cloud job failed', $jobStatus->get('message')); } - /** - * @group cloud-code-jobs - */ + #[Group('cloud-code-jobs')] public function testGettingNotARealJobStatus() { $this->expectException('Parse\ParseException', 'Object not found.'); diff --git a/tests/Parse/ParseConfigTest.php b/tests/Parse/ParseConfigTest.php index 25eb6c85..82513006 100644 --- a/tests/Parse/ParseConfigTest.php +++ b/tests/Parse/ParseConfigTest.php @@ -4,6 +4,7 @@ use Parse\ParseConfig; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseConfigTest extends TestCase @@ -19,18 +20,14 @@ public function tearDown() : void Helper::clearClass('_GlobalConfig'); } - /** - * @group parse-config - */ + #[Group('parse-config')] public function testDefaultConfig() { $config = new ParseConfig(); $this->assertEquals([], $config->getConfig()); } - /** - * @group parse-config - */ + #[Group('parse-config')] public function testGetConfig() { $config = new ConfigMock(); @@ -44,9 +41,7 @@ public function testGetConfig() $this->assertEquals('value', $config->get('another')); } - /** - * @group parse-config - */ + #[Group('parse-config')] public function testEscapeConfig() { $config = new ConfigMock(); @@ -61,9 +56,7 @@ public function testEscapeConfig() $this->assertEquals('bar', $config->escape('foo')); } - /** - * @group parse-config - */ + #[Group('parse-config')] public function testSaveConfig() { $config = new ParseConfig(); diff --git a/tests/Parse/ParseFileTest.php b/tests/Parse/ParseFileTest.php index 37211d9e..3395131f 100644 --- a/tests/Parse/ParseFileTest.php +++ b/tests/Parse/ParseFileTest.php @@ -6,6 +6,7 @@ use Parse\ParseObject; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseFileTest extends TestCase @@ -41,9 +42,7 @@ public function testParseFileFactories() ); } - /** - * @group file-upload-test - */ + #[Group('file-upload-test')] public function testParseFileUpload() { $file = ParseFile::createFromData('Fosco', 'test.txt'); @@ -63,9 +62,7 @@ public function testParseFileDownload() ); } - /** - * @group file-download-test - */ + #[Group('file-download-test')] public function testParseFileDownloadUnsaved() { $this->expectException( @@ -76,9 +73,7 @@ public function testParseFileDownloadUnsaved() $file->getData(); } - /** - * @group file-download-test - */ + #[Group('file-download-test')] public function testParsefileDeleteUnsaved() { $this->expectException( @@ -89,9 +84,7 @@ public function testParsefileDeleteUnsaved() $file->delete(); } - /** - * @group file-download-test - */ + #[Group('file-download-test')] public function testParseFileDownloadBadURL() { global $USE_CLIENT_STREAM; @@ -109,9 +102,7 @@ public function testParseFileDownloadBadURL() } } - /** - * @group test-parsefile-round-trip - */ + #[Group('test-parsefile-round-trip')] public function testParseFileRoundTrip() { $contents = 'What would Bryan do?'; diff --git a/tests/Parse/ParseGeoBoxTest.php b/tests/Parse/ParseGeoBoxTest.php index 298cf792..fedef2ad 100644 --- a/tests/Parse/ParseGeoBoxTest.php +++ b/tests/Parse/ParseGeoBoxTest.php @@ -6,6 +6,7 @@ use Parse\ParseObject; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseGeoBoxTest extends TestCase @@ -25,9 +26,7 @@ public function tearDown() : void Helper::tearDown(); } - /** - * @group test-geo-box - */ + #[Group('test-geo-box')] public function testGeoBox() { $caltrainStationLocation = new ParseGeoPoint(37.776346, -122.394218); diff --git a/tests/Parse/ParseHooksTest.php b/tests/Parse/ParseHooksTest.php index 0a526a59..e9ce89d0 100644 --- a/tests/Parse/ParseHooksTest.php +++ b/tests/Parse/ParseHooksTest.php @@ -5,6 +5,7 @@ use Parse\ParseException; use Parse\ParseHooks; use Parse\ParseSchema; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseHooksTest extends TestCase @@ -90,9 +91,7 @@ public function testCreateFunctionAlreadyExists() self::$hooks->deleteFunction('baz'); } - /** - * @group hook-create-trigger - */ + #[Group('hook-create-trigger')] public function testCreateTrigger() { $trigger = self::$hooks->createTrigger('Game', 'beforeSave', 'https://api.example.com/Game/beforeSave'); @@ -175,9 +174,7 @@ public function testDeleteTrigger() $this->assertEmpty($deleted_trigger); } - /** - * @group hooks-fetch-functions - */ + #[Group('hooks-fetch-functions')] public function testFetchFunctions() { self::$hooks->createFunction('func1', 'http://example1.com'); diff --git a/tests/Parse/ParseInstallationTest.php b/tests/Parse/ParseInstallationTest.php index 1e5ae8d8..3d0c3dda 100644 --- a/tests/Parse/ParseInstallationTest.php +++ b/tests/Parse/ParseInstallationTest.php @@ -5,6 +5,7 @@ use Parse\ParseClient; use Parse\ParseInstallation; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseInstallationTest extends TestCase @@ -19,9 +20,7 @@ public function tearDown() : void Helper::clearClass(ParseInstallation::$parseClassName); } - /** - * @group installation-tests - */ + #[Group('installation-tests')] public function testMissingIdentifyingField() { $this->expectException( @@ -32,9 +31,7 @@ public function testMissingIdentifyingField() (new ParseInstallation())->save(); } - /** - * @group installation-tests - */ + #[Group('installation-tests')] public function testMissingDeviceType() { $this->expectException( @@ -47,9 +44,7 @@ public function testMissingDeviceType() $installation->save(); } - /** - * @group installation-tests - */ + #[Group('installation-tests')] public function testClientsCannotFindWithoutMasterKey() { $this->expectException( @@ -61,9 +56,7 @@ public function testClientsCannotFindWithoutMasterKey() $query->first(); } - /** - * @group installation-tests - */ + #[Group('installation-tests')] public function testClientsCannotDestroyWithoutMasterKey() { $installation = new ParseInstallation(); @@ -80,9 +73,7 @@ public function testClientsCannotDestroyWithoutMasterKey() $installation->destroy(); } - /** - * @group installation-tests - */ + #[Group('installation-tests')] public function testInstallation() { $installationId = '12345'; diff --git a/tests/Parse/ParseLogsTest.php b/tests/Parse/ParseLogsTest.php index 0f084a56..de51daeb 100644 --- a/tests/Parse/ParseLogsTest.php +++ b/tests/Parse/ParseLogsTest.php @@ -5,6 +5,7 @@ use Parse\ParseLogs; use Parse\ParseObject; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseLogsTest extends TestCase @@ -25,9 +26,7 @@ public static function tearDownAfterClass() : void Helper::clearClass('TestObject'); } - /** - * @group parse-logs-tests - */ + #[Group('parse-logs-tests')] public function testGettingDefaultLogs() { $logs = ParseLogs::getScriptLogs('info', 1); @@ -35,9 +34,7 @@ public function testGettingDefaultLogs() $this->assertEquals(1, count($logs)); } - /** - * @group parse-logs-tests - */ + #[Group('parse-logs-tests')] public function testGettingOneLog() { $logs = ParseLogs::getInfoLogs(1); @@ -46,9 +43,7 @@ public function testGettingOneLog() $this->assertTrue(isset($logs[0]['url'])); } - /** - * @group parse-logs-tests - */ + #[Group('parse-logs-tests')] public function testFrom() { // test getting logs from 4 hours in the future @@ -58,9 +53,7 @@ public function testFrom() $this->assertEquals(0, count($logs)); } - /** - * @group parse-logs-tests - */ + #[Group('parse-logs-tests')] public function testUntil() { // test getting logs from 1950 years in the past (not likely...) @@ -70,9 +63,7 @@ public function testUntil() $this->assertEquals(0, count($logs)); } - /** - * @group parse-logs-tests - */ + #[Group('parse-logs-tests')] public function testOrderAscending() { $logs = ParseLogs::getInfoLogs(15, null, null, 'asc'); diff --git a/tests/Parse/ParseObjectTest.php b/tests/Parse/ParseObjectTest.php index 857bc36b..b83cb75b 100644 --- a/tests/Parse/ParseObjectTest.php +++ b/tests/Parse/ParseObjectTest.php @@ -21,6 +21,7 @@ use Parse\ParseSession; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseObjectTest extends TestCase @@ -1013,9 +1014,7 @@ public function testSaveAllCurl() } } - /** - * @group test-empty-objects-arrays - */ + #[Group('test-empty-objects-arrays')] public function testEmptyObjectsAndArrays() { $obj = ParseObject::create('TestObject'); @@ -1095,9 +1094,7 @@ public function testFetchAll() $this->assertEquals('bar', $results[2]->get('foo')); } - /** - * @group test-fetch-all-include - */ + #[Group('test-fetch-all-include')] public function testFetchAllWithInclude() { $child = ParseObject::create('TestObject'); @@ -1126,9 +1123,7 @@ public function testFetchAllWithInclude() $this->assertEquals('parse', $results[2]->get('child')->get('name')); } - /** - * @group test-fetch-include - */ + #[Group('test-fetch-include')] public function testFetchWithInclude() { $child = ParseObject::create('TestObject'); @@ -1254,9 +1249,7 @@ public function testGetAllKeys() ], $estimatedData); } - /** - * @group dirty-children - */ + #[Group('dirty-children')] public function testDirtyChildren() { $obj = new ParseObject('TestClass'); @@ -1470,9 +1463,7 @@ public function testRevertingUnsavedChangesViaFetch() $obj->destroy(); } - /** - * @group merge-from-server - */ + #[Group('merge-from-server')] public function testMergeFromServer() { $obj = new ParseObject('TestClass'); @@ -1563,9 +1554,7 @@ public function testGettingQueryForUnregisteredSubclass() ParseObjectMock::query(); } - /** - * @group encode-encodable - */ + #[Group('encode-encodable')] public function testEncodeEncodable() { @@ -1639,8 +1628,8 @@ private function getTestObject() /** * Runs tests on encoding/decoding an unsaved ParseObject - * @group decode-test */ + #[Group('decode-test')] public function testDecodeOnObject() { $obj = $this->getTestObject(); @@ -1668,8 +1657,8 @@ public function testDecodeOnObject() /** * Runs tests on encoding/decoding a ParseObject that has been saved * - * @group decode-test */ + #[Group('decode-test')] public function testDecodeOnSavedObject() { // setup IVs @@ -1760,8 +1749,8 @@ public function testDecodeOnSavedObject() /** * Tests decoding with various ops * - * @group decode-test */ + #[Group('decode-test')] public function testDecodeWithOps() { $obj = new ParseObject('TestClass'); @@ -1812,8 +1801,8 @@ public function testDecodeWithOps() /** * Tests decoding with an unrecognized op * - * @group decode-unrecognized-test */ + #[Group('decode-unrecognized-test')] public function testUnrecognizedOp() { $this->expectException( @@ -1833,8 +1822,8 @@ public function testUnrecognizedOp() /** * Tests if object exists * - * @group object-exists */ + #[Group('object-exists')] public function testObjectExists() { $obj = new ParseObject('TestClass'); diff --git a/tests/Parse/ParsePushTest.php b/tests/Parse/ParsePushTest.php index 2280a620..caae406b 100644 --- a/tests/Parse/ParsePushTest.php +++ b/tests/Parse/ParsePushTest.php @@ -6,6 +6,7 @@ use Parse\ParsePush; use Parse\ParsePushStatus; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParsePushTest extends TestCase @@ -44,9 +45,7 @@ public function testBasicPush() $this->assertEquals($response['result'], 1); } - /** - * @group parse-push - */ + #[Group('parse-push')] public function testMissingWhereAndChannels() { $this->expectException( @@ -61,9 +60,7 @@ public function testMissingWhereAndChannels() ], true); } - /** - * @group parse-push - */ + #[Group('parse-push')] public function testWhereAndChannels() { $this->expectException( @@ -160,9 +157,7 @@ public function testExpirationTimeAndIntervalSet() ); } - /** - * @group push-status - */ + #[Group('push-status')] public function testPushHasHeaders() { $response = ParsePush::send( @@ -177,9 +172,7 @@ public function testPushHasHeaders() $this->assertArrayHasKey('_headers', $response); } - /** - * @group push-status - */ + #[Group('push-status')] public function testGettingPushStatus() { $payload = [ @@ -278,9 +271,7 @@ public function testGettingPushStatus() } } - /** - * @group push-status - */ + #[Group('push-status')] public function testGettingNonExistentPushStatus() { $pushStatus = ParsePushStatus::getFromId('not-a-real-id'); diff --git a/tests/Parse/ParseQueryRelativeTimeTest.php b/tests/Parse/ParseQueryRelativeTimeTest.php index 1198e0ae..fcef78a5 100644 --- a/tests/Parse/ParseQueryRelativeTimeTest.php +++ b/tests/Parse/ParseQueryRelativeTimeTest.php @@ -8,6 +8,7 @@ use Parse\ParseObject; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseQueryRelativeTimeTest extends TestCase @@ -107,9 +108,7 @@ public function provideExtendedDateTestObjects() $obj->save(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testGreaterThanRelativeTime() { $this->provideDateTestObjects(); @@ -138,9 +137,7 @@ public function testGreaterThanRelativeTime() $this->assertEquals(0, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testLessThanRelativeTime() { $this->provideDateTestObjects(); @@ -169,9 +166,7 @@ public function testLessThanRelativeTime() $this->assertEquals(4, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testGreaterThanEqualToRelativeTime() { $this->provideDateTestObjects(); @@ -200,9 +195,7 @@ public function testGreaterThanEqualToRelativeTime() $this->assertEquals(0, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testLessThanEqualToRelativeTime() { $this->provideDateTestObjects(); @@ -231,9 +224,7 @@ public function testLessThanEqualToRelativeTime() $this->assertEquals(4, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeUnits() { $this->provideDateTestObjects(); @@ -259,9 +250,7 @@ public function testRelativeTimeUnits() $this->assertEquals(1, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testLongRelativeTime() { $this->provideExtendedDateTestObjects(); @@ -287,9 +276,7 @@ public function testLongRelativeTime() $this->assertEquals(4, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testNowRelativeTime() { $this->provideDateTestObjects(); @@ -303,9 +290,7 @@ public function testNowRelativeTime() $this->assertEquals(2, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testBetweenRelativeTimes() { $this->provideDateTestObjects(); @@ -323,9 +308,7 @@ public function testBetweenRelativeTimes() $this->assertEquals(2, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testBadRelativeTimeString() { $this->expectException( @@ -337,9 +320,7 @@ public function testBadRelativeTimeString() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeStringDanglingNumber() { $this->expectException( @@ -351,9 +332,7 @@ public function testRelativeTimeStringDanglingNumber() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeStringDanglingUnit() { $this->expectException( @@ -365,9 +344,7 @@ public function testRelativeTimeStringDanglingUnit() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeCannotUseBothInAndAgo() { $this->expectException( @@ -379,9 +356,7 @@ public function testRelativeTimeCannotUseBothInAndAgo() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeNotOnDateField() { $this->expectException( @@ -398,9 +373,7 @@ public function testRelativeTimeNotOnDateField() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeOnNonExistantField() { $this->provideDateTestObjects(); @@ -412,9 +385,7 @@ public function testRelativeTimeOnNonExistantField() $this->assertEquals(0, $query->count()); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeEqualTo() { $this->expectException( @@ -430,9 +401,7 @@ public function testRelativeTimeEqualTo() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeNotEqualTo() { $this->expectException( @@ -447,9 +416,7 @@ public function testRelativeTimeNotEqualTo() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testRelativeTimeMissingAgoAndIn() { $this->expectException( @@ -461,9 +428,7 @@ public function testRelativeTimeMissingAgoAndIn() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testEmptyRelativeTime() { $this->expectException( @@ -475,9 +440,7 @@ public function testEmptyRelativeTime() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testFractionalRelativeTime() { $this->expectException( @@ -489,9 +452,7 @@ public function testFractionalRelativeTime() $query->count(); } - /** - * @group relative-time-queries - */ + #[Group('relative-time-queries')] public function testBadRelativeTimeUnit() { $this->expectException( diff --git a/tests/Parse/ParseQueryTest.php b/tests/Parse/ParseQueryTest.php index ae251ab1..0fb40ec2 100644 --- a/tests/Parse/ParseQueryTest.php +++ b/tests/Parse/ParseQueryTest.php @@ -9,6 +9,7 @@ use Parse\ParseUser; use Parse\ParseClient; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseQueryTest extends TestCase @@ -813,9 +814,7 @@ function ($i) { ); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCount() { Helper::clearClass('BoxedNumber'); @@ -835,9 +834,7 @@ function ($i) { $this->assertEquals(count($response['results']), 3); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCountDestructure() { Helper::clearClass('BoxedNumber'); @@ -857,9 +854,7 @@ function ($i) { $this->assertEquals(count($results), 3); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCountFalse() { Helper::clearClass('BoxedNumber'); @@ -879,9 +874,7 @@ function ($i) { $this->assertEquals(count($response), 3); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCountEmptyClass() { Helper::clearClass('BoxedNumber'); @@ -892,9 +885,7 @@ public function testWithCountEmptyClass() $this->assertEquals(count($response['results']), 0); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCountAndLimit() { Helper::clearClass('BoxedNumber'); @@ -915,9 +906,7 @@ function ($i) { $this->assertEquals(count($response['results']), 2); } - /** - * @group withCount - */ + #[Group('withCount')] public function testWithCountAndSkip() { Helper::clearClass('BoxedNumber'); @@ -946,9 +935,7 @@ public function testCountError() $query->count(); } - /** - * @group query-equalTo-Zero-Count - */ + #[Group('query-equalTo-Zero-Count')] public function testEqualToCountZero() { Helper::clearClass('BoxedNumber'); @@ -1838,9 +1825,7 @@ public function testOrderByCreatedAtDesc() } } - /** - * @group order-by-updated-at - */ + #[Group('order-by-updated-at')] public function testOrderByUpdatedAtAsc() { $numbers = [3, 1, 2]; @@ -1876,8 +1861,8 @@ public function testOrderByUpdatedAtAsc() /** * @throws ParseException - * @group order-by-updated-at-desc */ + #[Group('order-by-updated-at-desc')] public function testOrderByUpdatedAtDesc() { $numbers = [3, 1, 2]; @@ -2603,7 +2588,7 @@ public function testQueryNullResponse() Helper::$masterKey, false, ); - ParseClient::setServerURL('http://localhost:1337', 'parse'); + ParseClient::setServerURL(Helper::getHttpServerURL(), 'parse'); $httpClient = new HttpClientMock(); $httpClient->setResponse('{}'); @@ -2618,9 +2603,7 @@ public function testQueryNullResponse() Helper::setUp(); } - /** - * @group query-set-conditions - */ + #[Group('query-set-conditions')] public function testSetConditions() { $query = new ParseQuery('TestObject'); @@ -2637,9 +2620,7 @@ public function testSetConditions() ], $query->_getOptions()); } - /** - * @group query-set-conditions - */ + #[Group('query-set-conditions')] public function testGetAndSetConditions() { $query = new ParseQuery('TestObject'); @@ -2695,9 +2676,7 @@ public function testGetAndSetConditions() ); } - /** - * @group query-count-conditions - */ + #[Group('query-count-conditions')] public function testCountDoesNotOverrideConditions() { $obj = new ParseObject('TestObject'); @@ -2745,9 +2724,7 @@ public function testNotArrayConditions() $query->_setConditions('not-an-array'); } - /** - * @group query-set-conditions - */ + #[Group('query-set-conditions')] public function testUnknownCondition() { $this->expectException( @@ -2761,9 +2738,7 @@ public function testUnknownCondition() ]); } - /** - * @group query-equalTo-conditions - */ + #[Group('query-equalTo-conditions')] public function testEqualToWithSameKeyDoesNotOverrideOtherConditions() { $baz = new ParseObject('TestObject'); diff --git a/tests/Parse/ParseRelationOperationTest.php b/tests/Parse/ParseRelationOperationTest.php index 86f20a16..c40428bf 100644 --- a/tests/Parse/ParseRelationOperationTest.php +++ b/tests/Parse/ParseRelationOperationTest.php @@ -9,6 +9,7 @@ use Parse\ParseObject; use Parse\ParseRelation; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseRelationOperationTest extends TestCase @@ -23,9 +24,7 @@ public function tearDown() : void Helper::clearClass('Class1'); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testMissingObjects() { $this->expectException( @@ -35,9 +34,7 @@ public function testMissingObjects() new ParseRelationOperation(null, null); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testMixedClasses() { $this->expectException( @@ -52,9 +49,7 @@ public function testMixedClasses() new ParseRelationOperation($objects, null); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testSingleObjects() { $addObj = new ParseObject('Class1'); @@ -72,9 +67,7 @@ public function testSingleObjects() ParseObject::destroyAll([$addObj, $delObj]); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testApplyDifferentClassRelation() { $this->expectException( @@ -91,9 +84,7 @@ public function testApplyDifferentClassRelation() $relOp1->_apply(new ParseRelation(null, null, 'DifferentClass'), null, null); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testInvalidApply() { $this->expectException( @@ -105,9 +96,7 @@ public function testInvalidApply() $op->_apply('bad value', null, null); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testMergeNone() { $addObj = new ParseObject('Class1'); @@ -115,9 +104,7 @@ public function testMergeNone() $this->assertEquals($op, $op->_mergeWithPrevious(null)); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testMergeDifferentClass() { $this->expectException( @@ -136,9 +123,7 @@ public function testMergeDifferentClass() $this->assertEquals($op, $op->_mergeWithPrevious($mergeOp)); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testInvalidMerge() { $this->expectException( @@ -150,9 +135,7 @@ public function testInvalidMerge() $op->_mergeWithPrevious('not a relational op'); } - /** - * @group parse-relation-op - */ + #[Group('parse-relation-op')] public function testRemoveElementsFromArray() { // test without passing an array @@ -164,9 +147,7 @@ public function testRemoveElementsFromArray() $this->assertEmpty($array); } - /** - * @group relation-remove-missing-object-id - */ + #[Group('relation-remove-missing-object-id')] public function testRemoveMissingObjectId() { $obj = new ParseObject('Class1'); diff --git a/tests/Parse/ParseRelationTest.php b/tests/Parse/ParseRelationTest.php index bcff4049..7f95df4b 100644 --- a/tests/Parse/ParseRelationTest.php +++ b/tests/Parse/ParseRelationTest.php @@ -5,6 +5,7 @@ use Parse\ParseObject; use Parse\ParseQuery; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseRelationTest extends TestCase @@ -147,9 +148,7 @@ function ($i) use (&$children) { $this->assertEquals($results[0]->getObjectId(), $parent2->getObjectId()); } - /** - * @group relation-parent-set - */ + #[Group('relation-parent-set')] public function testSwitchingParent() { // setup parent 1 @@ -193,8 +192,8 @@ public function testSwitchingParent() /** * Verifies bi directional relations can be saved when an array of pointers is used and is in dirty state * @author zeliard91 - * @group bidir-test */ + #[Group('bidir-test')] public function testBiDirectionalRelations() { Helper::clearClass('BiParent'); diff --git a/tests/Parse/ParseRoleTest.php b/tests/Parse/ParseRoleTest.php index 09d2c5fc..dab8c5ad 100644 --- a/tests/Parse/ParseRoleTest.php +++ b/tests/Parse/ParseRoleTest.php @@ -9,6 +9,7 @@ use Parse\ParseRole; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseRoleTest extends TestCase @@ -85,9 +86,7 @@ public function testFindRolesByName() $this->assertEquals(2, $query3->count()); } - /** - * @group role-name-duplicate - */ + #[Group('role-name-duplicate')] public function testRoleNameUnique() { $role = ParseRole::createRole('Admin', $this->aclPublic()); @@ -100,9 +99,7 @@ public function testRoleNameUnique() $role2->save(); } - /** - * @group explicit-role-acl - */ + #[Group('explicit-role-acl')] public function testExplicitRoleACL() { $eden = $this->createEden(); @@ -262,9 +259,7 @@ public function testSettingNonStringAsName() $role->setName(12345); } - /** - * @group role-save-noname - */ + #[Group('role-save-noname')] public function testSavingWithoutName() { $this->expectException( diff --git a/tests/Parse/ParseSchemaTest.php b/tests/Parse/ParseSchemaTest.php index 24a3fbe2..8a395c11 100644 --- a/tests/Parse/ParseSchemaTest.php +++ b/tests/Parse/ParseSchemaTest.php @@ -19,6 +19,7 @@ use Parse\ParseSchema; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseSchemaTest extends TestCase @@ -219,9 +220,7 @@ public function testUpdateWrongFieldType() $schema->update(); } - /** - * @group schema-purge - */ + #[Group('schema-purge')] public function testPurgeSchema() { // get a handle to this schema @@ -254,9 +253,7 @@ public function testPurgeSchema() $schema->delete(); } - /** - * @group schema-purge - */ + #[Group('schema-purge')] public function testPurgingNonexistentSchema() { try { @@ -412,9 +409,7 @@ public function testInvalidTypeException() $schema->assertTypes('StringFormatter'); } - /** - * @group schema-test-errors - */ + #[Group('schema-test-errors')] public function testBadSchemaGet() { $this->expectException('\Parse\ParseException'); @@ -428,9 +423,7 @@ public function testBadSchemaGet() $schema->get(); } - /** - * @group schema-test-errors - */ + #[Group('schema-test-errors')] public function testBadSchemaSave() { $this->expectException('\Exception'); @@ -444,9 +437,7 @@ public function testBadSchemaSave() $schema->save(); } - /** - * @group schema-test-errors - */ + #[Group('schema-test-errors')] public function testBadSchemaUpdate() { $this->expectException('\Exception'); @@ -460,9 +451,7 @@ public function testBadSchemaUpdate() $schema->update(); } - /** - * @group schema-test-errors - */ + #[Group('schema-test-errors')] public function testBadSchemaDelete() { $this->markTestSkipped('Curl is not sending the request and does not complain.'); diff --git a/tests/Parse/ParseServerInfoTest.php b/tests/Parse/ParseServerInfoTest.php index 69f34482..d2b0370e 100644 --- a/tests/Parse/ParseServerInfoTest.php +++ b/tests/Parse/ParseServerInfoTest.php @@ -8,6 +8,7 @@ use Parse\ParseClient; use Parse\ParseServerInfo; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseServerInfoTest extends TestCase @@ -29,9 +30,7 @@ public function testGetFeatures() $this->assertNotEmpty($features); } - /** - * @group test-get-version - */ + #[Group('test-get-version')] public function testGetVersion() { ParseServerInfo::_setServerVersion(null); @@ -52,9 +51,7 @@ public function testSetVersion() $this->assertEquals($version, ParseServerInfo::getVersion()); } - /** - * @group server-info-missing-features - */ + #[Group('server-info-missing-features')] public function testMissingFeatures() { $this->expectException( @@ -65,8 +62,7 @@ public function testMissingFeatures() $httpClient = ParseClient::getHttpClient(); // create a mock of the current http client - $stubClient = $this->getMockBuilder(get_class($httpClient)) - ->getMock(); + $stubClient = $this->createStub(get_class($httpClient)); // stub the response type to return // something we will try to work with @@ -87,9 +83,7 @@ public function testMissingFeatures() ParseServerInfo::getFeatures(); } - /** - * @group server-info-missing-version - */ + #[Group('server-info-missing-version')] public function testMissingVersion() { $this->expectException( @@ -100,8 +94,7 @@ public function testMissingVersion() $httpClient = ParseClient::getHttpClient(); // create a mock of the current http client - $stubClient = $this->getMockBuilder(get_class($httpClient)) - ->getMock(); + $stubClient = $this->createStub(get_class($httpClient)); // stub the response type to return // something we will try to work with diff --git a/tests/Parse/ParseSessionStorageAltTest.php b/tests/Parse/ParseSessionStorageAltTest.php index 9913c0f2..7d1a1efd 100644 --- a/tests/Parse/ParseSessionStorageAltTest.php +++ b/tests/Parse/ParseSessionStorageAltTest.php @@ -7,13 +7,12 @@ use Parse\ParseSessionStorage; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseSessionStorageAltTest extends TestCase { - /** - * @group session-storage-not-active - */ + #[Group('session-storage-not-active')] public function testNoSessionActive() { $this->expectException( diff --git a/tests/Parse/ParseSessionStorageTest.php b/tests/Parse/ParseSessionStorageTest.php index 2047099c..c415df2b 100644 --- a/tests/Parse/ParseSessionStorageTest.php +++ b/tests/Parse/ParseSessionStorageTest.php @@ -5,6 +5,7 @@ use Parse\ParseClient; use Parse\ParseSessionStorage; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseSessionStorageTest extends TestCase @@ -89,9 +90,7 @@ public function testSave() $this->assertTrue(true); } - /** - * @group session-recreate-storage - */ + #[Group('session-recreate-storage')] public function testRecreatingSessionStorage() { unset($_SESSION['parseData']); diff --git a/tests/Parse/ParseSessionTest.php b/tests/Parse/ParseSessionTest.php index fc383dee..1f3c687a 100644 --- a/tests/Parse/ParseSessionTest.php +++ b/tests/Parse/ParseSessionTest.php @@ -6,6 +6,7 @@ use Parse\ParseSession; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseSessionTest extends TestCase @@ -59,9 +60,7 @@ public function testRevocableSession() ParseUser::become($sessionToken); } - /** - * @group upgrade-to-revocable-session - */ + #[Group('upgrade-to-revocable-session')] public function testUpgradeToRevocableSession() { $user = new ParseUser(); @@ -82,9 +81,7 @@ public function testUpgradeToRevocableSession() $this->assertTrue($session->isCurrentSessionRevocable()); } - /** - * @group upgrade-to-revocable-session - */ + #[Group('upgrade-to-revocable-session')] public function testBadUpgradeToRevocableSession() { // upgrade the current session (changes our session as well) diff --git a/tests/Parse/ParseStreamHttpClientTest.php b/tests/Parse/ParseStreamHttpClientTest.php index 03b4ca5b..baa1a07c 100644 --- a/tests/Parse/ParseStreamHttpClientTest.php +++ b/tests/Parse/ParseStreamHttpClientTest.php @@ -9,13 +9,12 @@ use Parse\HttpClients\ParseStream; use Parse\ParseException; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseStreamHttpClientTest extends TestCase { - /** - * @group test-get-response - */ + #[Group('test-get-response')] public function testGetResponse() { $client = new ParseStreamHttpClient(); @@ -44,9 +43,7 @@ public function testInvalidUrl() $client->send($url); } - /** - * @group test-stream-context-error - */ + #[Group('test-stream-context-error')] public function testStreamContextError() { $client = $this->getMockBuilder(ParseStream::class) diff --git a/tests/Parse/ParseUserTest.php b/tests/Parse/ParseUserTest.php index 1041ad3e..3e739845 100644 --- a/tests/Parse/ParseUserTest.php +++ b/tests/Parse/ParseUserTest.php @@ -8,6 +8,7 @@ use Parse\ParseQuery; use Parse\ParseUser; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class ParseUserTest extends TestCase @@ -525,9 +526,7 @@ public function testUserAssociations() ); } - /** - * @group test-fetch-include - */ + #[Group('test-fetch-include')] public function testUserFetchWithInclude() { $child = ParseObject::create('TestObject'); @@ -725,9 +724,7 @@ public function testCurrentUserIsNotDirty() $this->assertFalse($userAgain->isKeyDirty('bleep')); } - /** - * @group anon-login - */ + #[Group('anon-login')] public function testAnonymousLogin() { $user = ParseUser::loginWithAnonymous(); @@ -735,9 +732,7 @@ public function testAnonymousLogin() ParseUser::logOut(); } - /** - * @group user-by-id-session - */ + #[Group('user-by-id-session')] public function testGetCurrentUserByIdAndSession() { $user = new ParseUser(); @@ -774,9 +769,7 @@ public function testGetCurrentUserByIdAndSession() ParseUser::logOut(); } - /** - * @group verification-email - */ + #[Group('verification-email')] public function testRequestVerificationEmail() { $email = 'example@example.com'; @@ -789,9 +782,7 @@ public function testRequestVerificationEmail() $this->assertTrue(true); } - /** - * @group verification-email - */ + #[Group('verification-email')] public function testEmailAlreadyVerified() { $email = 'example2@example.com'; @@ -810,18 +801,14 @@ public function testEmailAlreadyVerified() ParseUser::requestVerificationEmail($email); } - /** - * @group verification-email - */ + #[Group('verification-email')] public function testRequestVerificationEmailEmpty() { $this->expectException('Parse\ParseException', 'you must provide an email'); ParseUser::requestVerificationEmail(''); } - /** - * @group verification-email - */ + #[Group('verification-email')] public function testRequestVerificationEmailBad() { $this->expectException('Parse\ParseException', 'No user found with email not_a_known_email'); diff --git a/tests/Parse/RemoveOperationTest.php b/tests/Parse/RemoveOperationTest.php index 794d9989..4c615360 100644 --- a/tests/Parse/RemoveOperationTest.php +++ b/tests/Parse/RemoveOperationTest.php @@ -10,13 +10,12 @@ use Parse\Internal\RemoveOperation; use Parse\Internal\SetOperation; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; class RemoveOperationTest extends TestCase { - /** - * @group remove-op - */ + #[Group('remove-op')] public function testMissingArray() { $this->expectException( @@ -26,9 +25,7 @@ public function testMissingArray() new RemoveOperation('not an array'); } - /** - * @group remove-op-merge - */ + #[Group('remove-op-merge')] public function testMergePrevious() { $removeOp = new RemoveOperation([ @@ -57,9 +54,7 @@ public function testMergePrevious() ], $merged->getValue(), 'Value was not as expected'); } - /** - * @group remove-op - */ + #[Group('remove-op')] public function testInvalidMerge() { $this->expectException( @@ -72,9 +67,7 @@ public function testInvalidMerge() $removeOp->_mergeWithPrevious(new AddOperation(['key'=>'value'])); } - /** - * @group remove-op - */ + #[Group('remove-op')] public function testEmptyApply() { $removeOp = new RemoveOperation([ diff --git a/tests/gencerts.sh b/tests/gencerts.sh index cf31ceb5..68056ad0 100755 --- a/tests/gencerts.sh +++ b/tests/gencerts.sh @@ -3,6 +3,19 @@ # https://curl.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html # ./gencerts.sh parseca localhost parsephp keys/ # ./gencerts.sh parseca client parsephp keys/ +# +# Existing private keys are always reused, so the public key hash pinned by the +# test suite through CURLOPT_PINNEDPUBLICKEY stays valid. Set RESIGN=1 to issue +# fresh certificates from those keys, which is how expired certificates are +# renewed: +# +# RESIGN=1 ./gencerts.sh parseca localhost parsephp tests/keys/ +# RESIGN=1 ./gencerts.sh parseca client parsephp tests/keys/ +# +# The SHA1 fingerprint of localhost.crt is pinned as `peer_fingerprint` in +# tests/Parse/ParseClientTest.php and must be updated after a re-signing: +# +# openssl x509 -in tests/keys/localhost.crt -noout -fingerprint -sha1 set -e @@ -30,44 +43,76 @@ if [ ! -d "$DIR" ]; then fi LENGTH=4096 -DAYS=1000 +DAYS=7300 SUBJECT=/C=NZ/ST=AKL/L=Auckland/O=$ORG -if [ ! -f "$DIR/$CA.key" ]; then +# Node >= 18 and OpenSSL 3 no longer fall back to the common name, so the +# certificates need proper X509v3 extensions. +EXTFILE=$(mktemp) +trap 'rm -f $EXTFILE' EXIT + +if [ "$NAME" = "localhost" ]; then + cat > $EXTFILE < $EXTFILE <> $DIR/$CA.fp + openssl req -x509 -new -nodes -key $DIR/$CA.key -sha256 -days $DAYS \ + -out $DIR/$CA.crt -subj $SUBJECT/CN=$CA \ + -addext "basicConstraints = critical, CA:TRUE" \ + -addext "keyUsage = critical, keyCertSign, cRLSign" + openssl x509 -in $DIR/$CA.crt -out $DIR/$CA.pem + openssl x509 -sha1 -noout -in $DIR/$CA.pem -fingerprint | sed 's/.*Fingerprint=//g' > $DIR/$CA.fp else - echo Located existing CA + echo Located existing CA certificate fi if [ ! -f "$DIR/$NAME.key" ]; then + echo Generating keys + openssl genrsa -out $DIR/$NAME.key $LENGTH +else + echo Located existing key +fi -echo Generating keys -openssl genrsa -out $DIR/$NAME.key $LENGTH - -echo Generating CSR -openssl req -new -out $DIR/$NAME.csr -key $DIR/$NAME.key -subj $SUBJECT/CN=$NAME - -echo Signing cert -openssl x509 -req -days $DAYS -in $DIR/$NAME.csr -out $DIR/$NAME.crt -CA $DIR/$CA.crt -CAkey $DIR/$CA.key -CAcreateserial +if [ ! -f "$DIR/$NAME.crt" ] || [ -n "$RESIGN" ]; then + echo Generating CSR + openssl req -new -out $DIR/$NAME.csr -key $DIR/$NAME.key -subj $SUBJECT/CN=$NAME -echo Generating PEM -openssl x509 -in $DIR/$NAME.crt -out $DIR/$NAME.pem -text + echo Signing cert + openssl x509 -req -days $DAYS -sha256 -in $DIR/$NAME.csr -out $DIR/$NAME.crt \ + -CA $DIR/$CA.crt -CAkey $DIR/$CA.key -CAcreateserial -extfile $EXTFILE -openssl x509 -sha1 -noout -in $DIR/$NAME.pem -fingerprint | sed 's/SHA1 Fingerprint=//g' > $DIR/$NAME.fp + echo Generating PEM + openssl x509 -in $DIR/$NAME.crt -out $DIR/$NAME.pem + openssl x509 -in $DIR/$NAME.crt -outform der -out $DIR/$NAME.der + openssl x509 -in $DIR/$NAME.crt -noout -pubkey > $DIR/$NAME.pubkey.pem + openssl pkey -pubin -in $DIR/$NAME.pubkey.pem -outform der -out $DIR/$NAME.pubkey.der -echo Cleaning Up -rm $DIR/*.csr + openssl x509 -sha1 -noout -in $DIR/$NAME.pem -fingerprint | sed 's/.*Fingerprint=//g' > $DIR/$NAME.fp + echo Cleaning Up + rm -f $DIR/$NAME.csr else echo Located existing client certificate fi diff --git a/tests/keys/client.crt b/tests/keys/client.crt index 761f775e..bbc8797b 100644 --- a/tests/keys/client.crt +++ b/tests/keys/client.crt @@ -1,30 +1,33 @@ -----BEGIN CERTIFICATE----- -MIIFITCCAwkCCQDEwoQengRnzDANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJO -WjEMMAoGA1UECAwDQUtMMREwDwYDVQQHDAhBdWNrbGFuZDERMA8GA1UECgwIcGFy -c2VwaHAxEDAOBgNVBAMMB3BhcnNlY2EwHhcNMjMwNTEyMjA0MzAzWhcNMjYwMjA1 -MjA0MzAzWjBSMQswCQYDVQQGEwJOWjEMMAoGA1UECAwDQUtMMREwDwYDVQQHDAhB -dWNrbGFuZDERMA8GA1UECgwIcGFyc2VwaHAxDzANBgNVBAMMBmNsaWVudDCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMlKDLogZSNxm5S4h97XM8A1+MsP -RaK15g8ebVEP7OGrwX1bvLVis0U/ixwHs0mqjQ9tbuefMZyiRgdds+8tpRCCuqGo -dwSk8YMmOlrF5xIpBT2cXJLhGvDyY0F0RLFZYBoioTYFth4i91DkzhmBaL6vjyB7 -dXduR1JQbzTpQHkhofPziQsNtinf8qBqLbH1dFaqwUUEgtsKJyaPlxJR21TF3Fv+ -2K/fmoyzP6Er7eUSCvJRRH1hCwzHxl7GqTKyQeaS1RLdrHYqZmSeiJpxwl8uSdBs -x4y8wG4lhRdantCCANlTwLd7zPiuIu+RBP276o2+02K8my9N2STZUgHXefSoNx4M -alYujKBUV+2qmhR9H2HlUB/C/h5Sb8PSlfWyD/bo3+agyw/1+9rfMUYCmiEtdik7 -amoBaahoqAHL8S3K19L0ytWkgFejSMzn+i4VDifnwupXHifDL7CPDX0vevFNDvC7 -HMLkBWmkNaTduDL5P3ximtIXE7akhK+ufiNoO3KLItenCENxCzUdNdDHguei2U5E -vhTyaTmIIrkUGxQ+aVDXRF2njAeQNMdTjsCAiiSN1corYX8RXvNo8QZQUEaHG42u -O6Yolsw8EZotbpExo1jbiDlI2pVIuwJdtaDCucPN/X6uZ8odGQ0LUeyTBYda/1OG -VIQzPZnxSHzqPzuZAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAHOLgs6FLIv+Vvpx -fNtwabgOI2JxkFwaAujwWJS10tmczJp9qZilOlVBBhDFRBwBKqAaanHKCYkEfP6u -dgC8RMOOYOb0gk6Tj3+zhvM4Qz+n8Cn2fA2+EtFXTKyMfJHuG/zddTLep2Phh9c9 -t5s/8aHAuqM9RGiA66V7mJiR9G5E8cNpyHniCh8Z11kABPMzAy92LyEGUlRwCrWx -fCwItnzY2/7J8IW20rPIpb0EWmYHhxkUUzu7APQgvJpAUTdhmVKb9GLCUyY+oICE -1WrnV9OQiqYVGFQkry9FXyKbsLVM6b6ar8DIXpYTYnd11sqFdiUUo4oItYYrO/1O -0Bt0PX6hWYjR4r7ZT23KWAHZdlU4EFfrLJeZ6HDeYttJF68x9s8RZGgVU9Xlb/7X -KGRVyCWI7aWzvI1lBVAnc7b7B9LrIkdHnYDt/ettmRvI/zZRBh73T7EPOQB7bEzP -M8BXfAr/+qa2ToBWNd9AJrw7rg+OWGD801iXqsREyLr15nRIR12mGdKuyMkfghk1 -9J1Sd0fkfB2ci7Rn3afRdKksGuADQ2fvYihw0lALOPzSq/FYRqZBzwv9Qmw43CKd -euEPcCfT7VYY47lmfFfKBcVv8d7NiJZRGkIUYUxS/UAsrLiBCgRkaUACcbLok7sJ -jrdaTDx4EZu93dmJbEozNO6dRiLb +MIIFrzCCA5egAwIBAgIJAMTChB6eBGfOMA0GCSqGSIb3DQEBCwUAMFMxCzAJBgNV +BAYTAk5aMQwwCgYDVQQIDANBS0wxETAPBgNVBAcMCEF1Y2tsYW5kMREwDwYDVQQK +DAhwYXJzZXBocDEQMA4GA1UEAwwHcGFyc2VjYTAeFw0yNjA5MTUxOTU2MzdaFw00 +NjA5MTAxOTU2MzdaMFIxCzAJBgNVBAYTAk5aMQwwCgYDVQQIDANBS0wxETAPBgNV +BAcMCEF1Y2tsYW5kMREwDwYDVQQKDAhwYXJzZXBocDEPMA0GA1UEAwwGY2xpZW50 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyUoMuiBlI3GblLiH3tcz +wDX4yw9ForXmDx5tUQ/s4avBfVu8tWKzRT+LHAezSaqND21u558xnKJGB12z7y2l +EIK6oah3BKTxgyY6WsXnEikFPZxckuEa8PJjQXREsVlgGiKhNgW2HiL3UOTOGYFo +vq+PIHt1d25HUlBvNOlAeSGh8/OJCw22Kd/yoGotsfV0VqrBRQSC2wonJo+XElHb +VMXcW/7Yr9+ajLM/oSvt5RIK8lFEfWELDMfGXsapMrJB5pLVEt2sdipmZJ6ImnHC +Xy5J0GzHjLzAbiWFF1qe0IIA2VPAt3vM+K4i75EE/bvqjb7TYrybL03ZJNlSAdd5 +9Kg3HgxqVi6MoFRX7aqaFH0fYeVQH8L+HlJvw9KV9bIP9ujf5qDLD/X72t8xRgKa +IS12KTtqagFpqGioAcvxLcrX0vTK1aSAV6NIzOf6LhUOJ+fC6lceJ8MvsI8NfS96 +8U0O8LscwuQFaaQ1pN24Mvk/fGKa0hcTtqSEr65+I2g7cosi16cIQ3ELNR010MeC +56LZTkS+FPJpOYgiuRQbFD5pUNdEXaeMB5A0x1OOwICKJI3VyithfxFe82jxBlBQ +Rocbja47piiWzDwRmi1ukTGjWNuIOUjalUi7Al21oMK5w839fq5nyh0ZDQtR7JMF +h1r/U4ZUhDM9mfFIfOo/O5kCAwEAAaOBhjCBgzAJBgNVHRMEAjAAMA4GA1UdDwEB +/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjARBgNVHREECjAIggZjbGllbnQw +HQYDVR0OBBYEFFjrlv+Qgv3HNyjzJtVjRyJBP3tPMB8GA1UdIwQYMBaAFI1jdldS +qcclQdQrfJ35zFC4qtmkMA0GCSqGSIb3DQEBCwUAA4ICAQChNjzVJ/2nPzIbOyk3 +PlbP+X/zkkNESAHCWYnTXrUwvxP3PkC1g3uGHnrSbyIDLOx7jHAnTNQqhX6nK/Ho +yoodogbG4P5y40YbjoVj7nuLlxfzLhDtokvVlmy1kzIhCBs901yNgYZ2Mt6fPW16 +USYVYj1r4dtFg7BJZfLNHB8KhhLpjdJ0kCC0M2qZoZDkOzj3+jRyTj8zdNCn5fnm +n+x4+3nT5LxHy7ilxcF1bCdTt2Q0NgYonY43svJl76VlTtpRj/rqhRZkYzuIpqch +HD40eTx4bZc0J+fpn3znD+4Li0UHBr2yL5P8LGy6yfBjBgwOxeiGSV3kBMpBkODN +S529N86S8AEYfmDhxtDu+5q3WbyDbH4LfuIn+Xb94SLVbeZO+3saBHNqwjLqvVuf +AqsVbL16dQlhY7oCTKe1uev9PUjmMOWNhJ8uMxEi38KhpIO2WeaH2HHsJRq83ad+ +T1YDuz0Uyt+Bbv+U0ITZiNqeyFONOhgN5/YA57EMF5MxnKYRt10U20jPX4tceUqx +7Upy7Cetd8CSR+UMKFQRRBwr/jLiF9F4Fr73rVVKggOIHqIBaGgpXMhlBvq5jdIF +XxLy8h0U6wOPdDv8AfsbNiPSvk9IWB7DrUNU4El4ONQdO96eE2QLCD0BsHBkQHLo +Mw6cJFuBiBR0POlgxgN+tj171w== -----END CERTIFICATE----- diff --git a/tests/keys/client.der b/tests/keys/client.der index e5aed7bbfe029263c936b82adadf9109b1a85f90..dc0eb8dbe172f6b5cca3f5e72c4b918d02abbcd4 100644 GIT binary patch delta 723 zcmV;^0xbQd3bP9sFoFfIFoFY@paTK{0s;vD#KMFgo&;ykkrQbeHZVCcH8D9gHZwO` z7Y#HvFgYfrc=FgD?pO163Up1OhMsFb)O-RUHoj0sjO90|Eu0 zFcSs?RUIV+3@{1?2rC8w1qBBK0x%H<163Un1PU++f(B!3X=QG7FdYU1RUHll76cSn z>z4nJg8j!gDDx)OV@D!EKYLFw9|i+e9U}x7FcyFmjbnCKQmMx!LDUK>e4Y8sP`Iku zq>~W?6n~*MJk=-tr#~_qJ1I9lR?qo=^O8eENCCoGiPK)SFuxP`K0vjDdxjo*(r+RI zEbM!Xa3@UEDusThEAi;ciXEZ`#^C;P<3<~fg=6k}i5bBKkRY@(YMG&seFO&Q%Y`V$tV+ITk#ps4fUE~DHL6G3h zOMjicH_npq0T_N@;l|MJ`;(gj}<^70)N>jRH;JNyCr z8#W`-zE4P49>c9eRNzT?IMf|G-kuX=3kW>{uyABRa_BP-oFrR;h!k`@>0rhKegw8X Fd)M}hFpU5J delta 595 zcmV-Z0<8VB3#AGZFoFdkFoFXK0to=b!h{~41ZT{V7-g4Kg+` zGB7nVFf=nTGqIa{0)H?K1_>&LNQUSd_KW*__OpeW{qGI#odi5XD3s0V<#xYH`X5i3EK9u66*tM8l3?=JbM2 zlaGJ1hVwW>Kd101_IwS#646&otc-k-?i>8wbu!+kW8sI_J%6{GKk=c!x}!ZrXn^ab zdzhG!^ln7)!)eHQ;tC%b*I57r^D_f4b}u0YQdDpXwXu9G2)2CK+y2S$g|^bO$fdmm zT4o1_85C1Hy8!ecyqZ8!H({AloAhGBQzky3fP~d*=U3B^il!A9R3xu2MPDMDu(eF- zzM8MV$X=EcVt;pa*2;x;B^0BI2(^YQJN-`38+1K>p;?I0;=b8WZOT{y*>+Vp5LfFg zmzn5r-eTKH7q2n)&k0@?jAf&wBi4F(A+hDe6@4FLfG1potr0uKN%f&vNxf&u{m$w~~mAY~(Qo0PbR z-q$n0HTcU9MWVIl4<2n%5A5Nq!F^l2wPLeHKZ_g(vq`Fr4{dJepD~=GMh9K9?=7Ve zg1VuocLb#IgC;s!#peJ3k|j@-}0bpEwS}eY!#oSx|*stH3 zjI%$XEA8bH3i44zePIg>$Hrd9sWP%b=91MC-K=&hW@Mg-nsLHkE=kaA$BewdZY6~m zTAt8?0NGQ(w|mU^t|IS|1pT|}jlR=jyqhmg*(BLg0oQr-s5c%AYE~|cpj21ws+tsi zA7SNCAHx0~Qg6f3mG!a@_UPZ{pvw>S``X_zMgp24Ep{n8YH9&#sA#AG%keGB*V6RL z)uez|qe#r>`Ysg?C+EWIR~{$BFR+gdeJ^_PO%Cw89Kz%UX{0rz-MBLOKYU`E(iao9 zq=c`oej{i*a*HC@rwBuF3pE`z(8q%3qS;PFz7+ClIfx>;6dM#iX;9ZhU8jr(kTl0r zj=+G5B#qU|D`9^TUh`=222fB&hZ~KqJEka>%sdgAEpCx9qgdOBIY`=-NV@`EwV=Ye o!_EDEu4l>}84U|j?2`qDTK`jqRD?4OVV~0s{d60Thb=UjP6A literal 0 HcmV?d00001 diff --git a/tests/keys/client.pubkey.pem b/tests/keys/client.pubkey.pem new file mode 100644 index 00000000..7cc0207c --- /dev/null +++ b/tests/keys/client.pubkey.pem @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyUoMuiBlI3GblLiH3tcz +wDX4yw9ForXmDx5tUQ/s4avBfVu8tWKzRT+LHAezSaqND21u558xnKJGB12z7y2l +EIK6oah3BKTxgyY6WsXnEikFPZxckuEa8PJjQXREsVlgGiKhNgW2HiL3UOTOGYFo +vq+PIHt1d25HUlBvNOlAeSGh8/OJCw22Kd/yoGotsfV0VqrBRQSC2wonJo+XElHb +VMXcW/7Yr9+ajLM/oSvt5RIK8lFEfWELDMfGXsapMrJB5pLVEt2sdipmZJ6ImnHC +Xy5J0GzHjLzAbiWFF1qe0IIA2VPAt3vM+K4i75EE/bvqjb7TYrybL03ZJNlSAdd5 +9Kg3HgxqVi6MoFRX7aqaFH0fYeVQH8L+HlJvw9KV9bIP9ujf5qDLD/X72t8xRgKa +IS12KTtqagFpqGioAcvxLcrX0vTK1aSAV6NIzOf6LhUOJ+fC6lceJ8MvsI8NfS96 +8U0O8LscwuQFaaQ1pN24Mvk/fGKa0hcTtqSEr65+I2g7cosi16cIQ3ELNR010MeC +56LZTkS+FPJpOYgiuRQbFD5pUNdEXaeMB5A0x1OOwICKJI3VyithfxFe82jxBlBQ +Rocbja47piiWzDwRmi1ukTGjWNuIOUjalUi7Al21oMK5w839fq5nyh0ZDQtR7JMF +h1r/U4ZUhDM9mfFIfOo/O5kCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/tests/keys/localhost.crt b/tests/keys/localhost.crt index 86af6e0e..a1f4e413 100644 --- a/tests/keys/localhost.crt +++ b/tests/keys/localhost.crt @@ -1,30 +1,33 @@ -----BEGIN CERTIFICATE----- -MIIFJDCCAwwCCQDEwoQengRnyzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJO -WjEMMAoGA1UECAwDQUtMMREwDwYDVQQHDAhBdWNrbGFuZDERMA8GA1UECgwIcGFy -c2VwaHAxEDAOBgNVBAMMB3BhcnNlY2EwHhcNMjMwNTEyMjA0MjQ0WhcNMjYwMjA1 -MjA0MjQ0WjBVMQswCQYDVQQGEwJOWjEMMAoGA1UECAwDQUtMMREwDwYDVQQHDAhB -dWNrbGFuZDERMA8GA1UECgwIcGFyc2VwaHAxEjAQBgNVBAMMCWxvY2FsaG9zdDCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANhB+NiGfXAgK4yJKdJEU9gC -kBUVwTmEVYIbHjK/HuWxbDIeVAHMSM1CWFZm72zfcGiLQ2vzqSNQ2mCGpefRlKGG -E5ch/HPDqeEKb/Qm+UnQTyMjKOMWckNEzqhilOiMHGR0hb6h5givz8aQ7kjp3ELm -RWaBWJ1rBizooB3fEDAdGtEEIDiq/i2/sSRcFmOeVYJ8ynIJ2/SmqF3KttQAZnuv -tFRGD+7C+loyxz+vCbAIkl1Smwj3ZsTKfGYGoSQA7Z7QVLzee7QgGmHCWiRmvKxX -ZfaW27SE7xokw68Dx84FeFYeUTXZugCLFtcHQ/M7enZsfUNjfGqFE88piKXTDgXa -qqCGKTqUhWYjnvH8AmiSbzUWYCJ+YtAY7wO7IdjrVzPh8pnCRXKefM2xJEJhDbSg -5lWkla7rJQfvKXuRlyiKonyI5hIYFwzgwPPoz+TKPLRltyzmPdmNshBN8USXOd3Q -5vG9JWSM2pP/l5UUusRRA2SrDEsud004mnQeCh1IHbF+srudSHQKPyxYOdc/WzUV -yy+RN53N1VG9JkH60t3Dg0rYiC+wilqS2G56MbgrSN4HTldmcGebzJMIdFpNSKLJ -uI886kgefd90OdsPqSI8rjPrEVAyL06w7P19/baWyyRlDQL3Do5uvMRk2YGHK2Ej -malB6uq4MatqOWXoroYrAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAJnoVzVRxyQF -qUchsTRZZFfPXZI3n6Xn1wI/U5YIUyOODbTLn35c99G/sCbECFmciBZKXLvmiBn0 -tGYphpFFLT+qHtrYn4a29LFCsYDMlmfSJPQ0+V6FNpfqo2xPMDZ8sW+SVwx/PyNx -D/NyQ1+dZs5jKvVqyddU3e/jNG6hKIJF8rTfM5X2wp8RC55VGUeocWuPLCD9Ozmf -Xhv6J8Jv9LhkOl9BjudgpQ43so8mfa3InC/1SU/2kjSjc6hpWfyjErVz32Yf1QF0 -ceVgZJ4EoMVecZMFbo6b1cdlg3AoRvBEr0LpMwFWsEWicCPQjWg/wyJLRqhDIvoC -CWPGZrYsFilhHy9Cx7fOK7ZqLJK+dNbY5It7//TIZ364cTzUpYqfiv7lQ5Xp0c0h -9FiMCrFX4C3Su0UZfJjZ3KQTJfL0LnkwcvoT98RcNVPFT4Jgbe7thZPFHHZAAmag -5+2P9Xzz8OsNYUbGhDjd9Pq7gSiM4ZpJ2tc425qCZ2E84YqDYRtwZo3UIca7ktm0 -xckuoVQzxiIE/BhyL5+wL3NLTkgVjWh11XeiKn/h6BaOMj9QKTKc3RzLtqC57oVD -iMowJq80nQUUsU8I1GibfuLM+0ahcK8an5Lzdl0dS+43eKQLJWhpfBZNgFMfXDEe -o7eD8auY/MfkFWiUBpWGx7Grb/2a/z1q +MIIFuzCCA6OgAwIBAgIJAMTChB6eBGfNMA0GCSqGSIb3DQEBCwUAMFMxCzAJBgNV +BAYTAk5aMQwwCgYDVQQIDANBS0wxETAPBgNVBAcMCEF1Y2tsYW5kMREwDwYDVQQK +DAhwYXJzZXBocDEQMA4GA1UEAwwHcGFyc2VjYTAeFw0yNjA5MTUxOTU2MzZaFw00 +NjA5MTAxOTU2MzZaMFUxCzAJBgNVBAYTAk5aMQwwCgYDVQQIDANBS0wxETAPBgNV +BAcMCEF1Y2tsYW5kMREwDwYDVQQKDAhwYXJzZXBocDESMBAGA1UEAwwJbG9jYWxo +b3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2EH42IZ9cCArjIkp +0kRT2AKQFRXBOYRVghseMr8e5bFsMh5UAcxIzUJYVmbvbN9waItDa/OpI1DaYIal +59GUoYYTlyH8c8Op4Qpv9Cb5SdBPIyMo4xZyQ0TOqGKU6IwcZHSFvqHmCK/PxpDu +SOncQuZFZoFYnWsGLOigHd8QMB0a0QQgOKr+Lb+xJFwWY55VgnzKcgnb9KaoXcq2 +1ABme6+0VEYP7sL6WjLHP68JsAiSXVKbCPdmxMp8ZgahJADtntBUvN57tCAaYcJa +JGa8rFdl9pbbtITvGiTDrwPHzgV4Vh5RNdm6AIsW1wdD8zt6dmx9Q2N8aoUTzymI +pdMOBdqqoIYpOpSFZiOe8fwCaJJvNRZgIn5i0BjvA7sh2OtXM+HymcJFcp58zbEk +QmENtKDmVaSVruslB+8pe5GXKIqifIjmEhgXDODA8+jP5Mo8tGW3LOY92Y2yEE3x +RJc53dDm8b0lZIzak/+XlRS6xFEDZKsMSy53TTiadB4KHUgdsX6yu51IdAo/LFg5 +1z9bNRXLL5E3nc3VUb0mQfrS3cODStiIL7CKWpLYbnoxuCtI3gdOV2ZwZ5vMkwh0 +Wk1Iosm4jzzqSB5933Q52w+pIjyuM+sRUDIvTrDs/X39tpbLJGUNAvcOjm68xGTZ +gYcrYSOZqUHq6rgxq2o5ZeiuhisCAwEAAaOBjzCBjDAJBgNVHRMEAjAAMA4GA1Ud +DwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAaBgNVHREEEzARgglsb2Nh +bGhvc3SHBH8AAAEwHQYDVR0OBBYEFMPNSofOD2H9PfqMyGi571rPkJ2xMB8GA1Ud +IwQYMBaAFI1jdldSqcclQdQrfJ35zFC4qtmkMA0GCSqGSIb3DQEBCwUAA4ICAQBs +uCIFLzToaEnbW7PDQZZGm0TPbkI2dwcEh5q990MdNbbxuM28StZ0aTsgruEJI3zm +VXOCptgM2LGOkQxwTlZweZzoVc1m0Uc7LYYHzsO8w54tlwWFd90cr4Bn98qlpNRn +pl754ITn/GKSiALaMJ6LbBxOgRO3rTQoJ35mhlqXV4W9iyU1+I9RK3EgizKwf5ml +gWXI/0Iq4F74MTV7NryYZ/RYbsXzh59CZs4iCVbuBfcU7r1pciuGnmZaX1j567qs +gPBbeuBFeXoGI/rAsuZz5n+DzqdPEoqEGYGNM+6uFPob534OHfWk6BID51UNeWx+ +83P4cluFzXRRTEuKPLKaIK9+mX4PZ0p7h9Rt+985WoloSqanNIaqyGBVItzICOy0 +/c5i9BbHMW87GB4mrCRVeScj/s9lZUmN2BTi+W/OtXCPgbDuXIG9EEzLX7uZkTMZ +BF6OJzFp3LGfKS/e+Z3S97RRatk67/Y6rdWhYWdLdAyrvzVlS+iCqBNgw8yc9bbC +ydT6suSyJqgcA6dRFxj6fbDkj4zfhLzq72a/ULj9NWsWe1IYwxKvjmh36/prye2v +evs1VG3QdrrY/KRnZOZ6pem/hbSkkCWSSdxSBdHeskcF19Tdez1mUQbEkr6n7w8E +2uLNot8r3QH88glfiXEVGtuzyLaHsoqP/4UyjSldug== -----END CERTIFICATE----- diff --git a/tests/keys/localhost.der b/tests/keys/localhost.der new file mode 100644 index 0000000000000000000000000000000000000000..f779fe78fa895f66305f1bc62b7a29cc67e74751 GIT binary patch literal 1471 zcmbu8eLT|%9LM))o5nnjWIGv3tMeP?61{qPs63RA;Wa%NHY-GKsJa{X>gWf8ELckCR z3e?q^f)~KT#ejwyY8&5;zoY>MZ-9el zA!c2$eBydo3dz&g|H(du!rO$m?!f<1&$7n*f&1LV&Vl|61#6Pc%yfxZs3v%i1oO+M z2QQWKbqhDI#)zt)t4A$bthf&xA`rIzj*WJ4l~jdXl4lu*aZ(?Y%8=_>?QI$YF%pE0e)}+U zol2^8_Z}gt4q0&2_Zo7E(bb#CP%AY9y%7xfwM`^6ni$bKsb-9}I|20fS4JCC6h>wu zA+%cp|IQ!pLmqAcWn!NpToxSS&#;nQLK9D>>h@cvm;b5>AE_zfTkg7)${+~lS0T)T zC^9zKG&y9zPyub-ES(LodH%Mjb8oaDQCx54Ow(vAkx|Mn*Up+F6qX73gG!wGb`NJaXdRq)EwmpWkj=N7hh>diTra$=*V5$!4ZDr@{5tmF z&Z``}I?fGOpWM(|?8Z^wvpvxM*`6S>{$s2BZ;HiFecCOYluyP*=RKt9R&^QF0%>GC zshQ|Df$$1ou*0wQT|{!I2ialdA1uh){+nyx%H zqiaBxG;<=`y26IJX+#>KsM={}rkQm6q&;0;%O^shU=a8gHy7Y$eP$k~3xfcl&-CIj zVDLH&28F;&0Nqbu;ml#GDIkezU^pBB1p`JZQyZoWX!HIfE)8}T1Ofv%Ri+8U!t_L9 zk2DE}wzgZD)x-QzLG8~gt_QwS#RQlkfIX*|9eO6fx4PThX^5Cuywd00Tr*tuC9|I< z`H5LDh}CQgx3ZNp-A9A&iJY$NyXM*->1-E^fTdk+Uvj~bo93IvZ63dIPB@s%Z9=$j;&0k zOs|F%q(epkK_<)Ci>rJ8uI<(>$qYWVFd(%()117V>q9(kl4)Icwy2y-?^$==Hg#;7 zL{6}4`#yXzF!JYxv>VP0i7Co|4!)!}*M1_J$QLlE#{*YpTkf3uGbny)Z(O_@LHV#j z79%@*UQ&5TCnIGeH``{eR!_NUI$0Co^OWD(m7FEX3N*@D5Wm4VC+^orzwiyMZ!@GHn z9Dz;nH5BOxbC|KS%7{mAgz+E9ey0Y`v`AOW!oy_o<*zzY8_V*{3*5(i;e!(m`{B=q x#uIikeAK!M9#kqYu#p$yo0G(G@akLC@e8N*jYjYFG^I6U Date: Tue, 15 Sep 2026 23:41:45 +0200 Subject: [PATCH 2/5] test: Wait for the async audience counter update Parse Server updates `_Audience` timesUsed/lastUsed without awaiting the write, so reading them right after the push races the server and fails intermittently on loaded CI runners. --- tests/Parse/ParseAudienceTest.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/Parse/ParseAudienceTest.php b/tests/Parse/ParseAudienceTest.php index e9911ce8..ddb38451 100644 --- a/tests/Parse/ParseAudienceTest.php +++ b/tests/Parse/ParseAudienceTest.php @@ -101,7 +101,15 @@ public function testPushWithAudience() 'audience_id' => $audience->getObjectId() ], true); - $audience->fetch(true); + // Parse Server updates the audience counters without waiting for that + // write to resolve, so poll until they show up rather than racing it. + for ($attempt = 0; $attempt < 50; $attempt++) { + $audience->fetch(true); + if ($audience->getTimesUsed() !== null) { + break; + } + usleep(100000); + } $this->assertEquals(1, $audience->getTimesUsed()); $this->assertNotNull($audience->getLastUsed()); From aa9cacfcac3ea843fea70fec4db21dd2c6e7e717 Mon Sep 17 00:00:00 2001 From: Damien Matabon Date: Wed, 16 Sep 2026 00:04:06 +0200 Subject: [PATCH 3/5] ci: Verify the phpDocumentor phar checksum before running it The phar was downloaded from a GitHub release and executed without any integrity check, so a replaced release asset would run arbitrary code in the CI and Pages publishing workflows. Pin the expected SHA-256 instead. --- .github/workflows/ci.yml | 6 +++++- .github/workflows/release-automated.yml | 5 ++++- .github/workflows/release-manual-docs.yml | 5 ++++- CONTRIBUTING.md | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7180f4d9..7ac74976 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -91,10 +91,14 @@ jobs: sudo update-alternatives --set php /usr/bin/php8.4 php --version - name: Install phpDocumentor + env: + PHPDOC_VERSION: 3.10.0 + PHPDOC_SHA256: fe1e7c23ba3329aa6f19ac3c807446159a431a195ec5d9163b0c281a15105207 run: | mkdir -p tools curl -sSL -o tools/phpDocumentor.phar \ - https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + "https://github.com/phpDocumentor/phpDocumentor/releases/download/v$PHPDOC_VERSION/phpDocumentor.phar" + echo "$PHPDOC_SHA256 tools/phpDocumentor.phar" | sha256sum --check --strict chmod +x tools/phpDocumentor.phar - run: npm run document-check concurrency: diff --git a/.github/workflows/release-automated.yml b/.github/workflows/release-automated.yml index 866983ff..ba99845f 100644 --- a/.github/workflows/release-automated.yml +++ b/.github/workflows/release-automated.yml @@ -56,11 +56,14 @@ jobs: run: | mkdir -p tools curl -sSL -o tools/phpDocumentor.phar \ - https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + "https://github.com/phpDocumentor/phpDocumentor/releases/download/v$PHPDOC_VERSION/phpDocumentor.phar" + echo "$PHPDOC_SHA256 tools/phpDocumentor.phar" | sha256sum --check --strict chmod +x tools/phpDocumentor.phar npm run document-check npm run document env: + PHPDOC_VERSION: 3.10.0 + PHPDOC_SHA256: fe1e7c23ba3329aa6f19ac3c807446159a431a195ec5d9163b0c281a15105207 SOURCE_TAG: ${{ needs.release.outputs.current_tag }} - name: Configure Pages uses: actions/configure-pages@v5 diff --git a/.github/workflows/release-manual-docs.yml b/.github/workflows/release-manual-docs.yml index 4ea90ec5..8beddc2f 100644 --- a/.github/workflows/release-manual-docs.yml +++ b/.github/workflows/release-manual-docs.yml @@ -39,11 +39,14 @@ jobs: run: | mkdir -p tools curl -sSL -o tools/phpDocumentor.phar \ - https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + "https://github.com/phpDocumentor/phpDocumentor/releases/download/v$PHPDOC_VERSION/phpDocumentor.phar" + echo "$PHPDOC_SHA256 tools/phpDocumentor.phar" | sha256sum --check --strict chmod +x tools/phpDocumentor.phar npm run document-check npm run document env: + PHPDOC_VERSION: 3.10.0 + PHPDOC_SHA256: fe1e7c23ba3329aa6f19ac3c807446159a431a195ec5d9163b0c281a15105207 SOURCE_TAG: ${{ github.event.inputs.tag }} - name: Configure Pages uses: actions/configure-pages@v5 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf25c9b3..e66c2ca5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -109,6 +109,7 @@ grab the phar first (and run it with PHP 8.4 or older): mkdir -p tools curl -sSL -o tools/phpDocumentor.phar \ https://github.com/phpDocumentor/phpDocumentor/releases/download/v3.10.0/phpDocumentor.phar + echo "fe1e7c23ba3329aa6f19ac3c807446159a431a195ec5d9163b0c281a15105207 tools/phpDocumentor.phar" | sha256sum --check --strict chmod +x tools/phpDocumentor.phar npm run document-check From ba506e436c9682d0c4f252b506799fed2a5f0499 Mon Sep 17 00:00:00 2001 From: Damien Matabon Date: Wed, 16 Sep 2026 00:04:06 +0200 Subject: [PATCH 4/5] test: Validate test server ports consistently PHP treats the env value "0" as unset while Node accepts it as an ephemeral port, so both ends now reject anything outside 1-65535. Also wait for the exact audience counter instead of any non-null value. --- tests/Parse/Helper.php | 32 +++++++++++++++++++++++++++++-- tests/Parse/ParseAudienceTest.php | 2 +- tests/server.js | 23 +++++++++++++++++++--- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/tests/Parse/Helper.php b/tests/Parse/Helper.php index a9384a57..529a5b7f 100644 --- a/tests/Parse/Helper.php +++ b/tests/Parse/Helper.php @@ -86,7 +86,7 @@ public static function setServerURL() */ public static function getHttpServerURL() { - return 'http://localhost:'.(getenv('PARSE_TEST_HTTP_PORT') ?: '1337'); + return 'http://localhost:'.self::getPort('PARSE_TEST_HTTP_PORT', 1337); } /** @@ -98,7 +98,35 @@ public static function getHttpServerURL() */ public static function getHttpsServerURL() { - return 'https://localhost:'.(getenv('PARSE_TEST_HTTPS_PORT') ?: '1338'); + return 'https://localhost:'.self::getPort('PARSE_TEST_HTTPS_PORT', 1338); + } + + /** + * Reads a port from the environment, applying the same validation as + * tests/server.js so both ends always agree on the port in use. + * + * @param string $variable Name of the environment variable to read + * @param int $default Port to use when the variable is not set + * + * @throws \InvalidArgumentException + * + * @return int + */ + private static function getPort($variable, $default) + { + $port = getenv($variable); + + if ($port === false || $port === '') { + return $default; + } + + if (!ctype_digit($port) || (int) $port < 1 || (int) $port > 65535) { + throw new \InvalidArgumentException( + $variable.' must be an integer between 1 and 65535, got "'.$port.'"' + ); + } + + return (int) $port; } public static function tearDown() diff --git a/tests/Parse/ParseAudienceTest.php b/tests/Parse/ParseAudienceTest.php index ddb38451..6111afb6 100644 --- a/tests/Parse/ParseAudienceTest.php +++ b/tests/Parse/ParseAudienceTest.php @@ -105,7 +105,7 @@ public function testPushWithAudience() // write to resolve, so poll until they show up rather than racing it. for ($attempt = 0; $attempt < 50; $attempt++) { $audience->fetch(true); - if ($audience->getTimesUsed() !== null) { + if ($audience->getTimesUsed() === 1) { break; } usleep(100000); diff --git a/tests/server.js b/tests/server.js index 5a932ee9..19a6d251 100644 --- a/tests/server.js +++ b/tests/server.js @@ -7,9 +7,26 @@ import emailAdapter from './MockEmailAdapter.js'; const app = express(); const __dirname = path.resolve(); -// Ports and database can be overridden to avoid clashing with a local Parse stack -const httpPort = parseInt(process.env.PARSE_TEST_HTTP_PORT || '1337', 10); -const httpsPort = parseInt(process.env.PARSE_TEST_HTTPS_PORT || process.env.PORT || '1338', 10); +// Ports and database can be overridden to avoid clashing with a local Parse stack. +// The PHP test suite resolves these ports the same way, so an ephemeral port (0) +// is rejected rather than silently disagreeing with the client. +function resolvePort(name, value, fallback) { + if (value === undefined || value === '') { + return fallback; + } + const port = Number(value); + if (!Number.isInteger(port) || port < 1 || port > 65535) { + throw new Error(`${name} must be an integer between 1 and 65535, got "${value}"`); + } + return port; +} + +const httpPort = resolvePort('PARSE_TEST_HTTP_PORT', process.env.PARSE_TEST_HTTP_PORT, 1337); +const httpsPort = resolvePort( + 'PARSE_TEST_HTTPS_PORT', + process.env.PARSE_TEST_HTTPS_PORT ?? process.env.PORT, + 1338 +); const databaseURI = process.env.PARSE_TEST_DATABASE_URI || 'mongodb://localhost/test'; const server = new ParseServer({ From 22719248ef2101661bbfdf53e9c1a41847400bef Mon Sep 17 00:00:00 2001 From: Damien Matabon Date: Wed, 16 Sep 2026 00:18:56 +0200 Subject: [PATCH 5/5] ci: Restrict the GITHUB_TOKEN to read-only access The ci workflow declared no permissions, so its jobs inherited whatever the repository or organisation defaults grant. None of them write to the repository, and codecov uploads with its own token. --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ac74976..9a5ff34e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,9 @@ on: pull_request: branches: - "**" +# Every job only reads the repository; codecov is uploaded with its own token. +permissions: + contents: read jobs: check-lock-file-version: name: NPM Lock File Version