From 5226b336202187f63a304a473d27cd23223fa8f9 Mon Sep 17 00:00:00 2001 From: Matthew Baggett <matthew@baggett.me> Date: Sat, 18 May 2024 16:15:55 +0200 Subject: [PATCH] Improve release pipeline, add phpstan, general refactoring. --- .github/workflows/bouncer.yml | 107 - .github/workflows/build.yml | 36 + .github/workflows/docker.build.yml | 72 + .github/workflows/docker.release.yml | 42 + .github/workflows/docker.validate.yml | 54 + .github/workflows/php.check.yml | 69 + .trunk/configs/phpstan.neon.dist | 8 + Dockerfile | 21 +- Readme.md | 11 + composer.json | 52 +- composer.lock | 3852 +++++++++++++++-- docker-compose.yml | 9 +- phpstan.neon.dist | 1 + rector.php | 62 + src/Bouncer.php | 27 +- src/Logger/AbstractLogger.php | 417 ++ src/Logger/Logger.php | 2 +- src/Target.php | 16 +- test/public-web-a/index.html | 1 - test/public-web-b/favicon.ico | Bin 34494 -> 0 bytes test/public-web-b/index.html | 1 - test/public-web-c/favicon.ico | Bin 34494 -> 0 bytes test/public-web-c/index.html | 1 - .../testsites}/favicon.ico | Bin tests/testsites/index.php | 5 + 25 files changed, 4419 insertions(+), 447 deletions(-) delete mode 100644 .github/workflows/bouncer.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/docker.build.yml create mode 100644 .github/workflows/docker.release.yml create mode 100644 .github/workflows/docker.validate.yml create mode 100644 .github/workflows/php.check.yml create mode 100644 .trunk/configs/phpstan.neon.dist create mode 120000 phpstan.neon.dist create mode 100644 rector.php create mode 100644 src/Logger/AbstractLogger.php delete mode 100644 test/public-web-a/index.html delete mode 100644 test/public-web-b/favicon.ico delete mode 100644 test/public-web-b/index.html delete mode 100644 test/public-web-c/favicon.ico delete mode 100644 test/public-web-c/index.html rename {test/public-web-a => tests/testsites}/favicon.ico (100%) create mode 100644 tests/testsites/index.php diff --git a/.github/workflows/bouncer.yml b/.github/workflows/bouncer.yml deleted file mode 100644 index 9b10463..0000000 --- a/.github/workflows/bouncer.yml +++ /dev/null @@ -1,107 +0,0 @@ -name: Build Bouncer - -permissions: - contents: read - packages: write - -on: - workflow_call: - workflow_dispatch: - push: - branches: - - main - schedule: - - cron: "0 14 * * 2" # 2pm Patch Tuesday - -concurrency: - group: ${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - build: - name: Build Docker Swarm Loadbalancer - runs-on: ubuntu-latest - steps: - - name: "Setup: Checkout Source" - uses: actions/checkout@v4 - - - name: "Setup: Get Date" - id: date - run: | - { - echo "datetime=$(date +'%Y-%m-%d %H:%M:%S')" - echo "date=$(date +'%Y-%m-%d')" - echo "time=$(date +'%H:%M:%S')" - echo "container_build_datetime=$(date -u +'%Y-%m-%dT%H:%M:%S.%3NZ')" - } >> "$GITHUB_OUTPUT" - - - name: "Setup: PHP" - uses: shivammathur/setup-php@v2 - with: - php-version: 8.2 - - - name: "Setup: Setup QEMU" - uses: docker/setup-qemu-action@v3 - - - name: "Setup: Expose GitHub Runtime" - uses: crazy-max/ghaction-github-runtime@v3 - - - name: "Setup: Setup Docker Buildx" - uses: docker/setup-buildx-action@v3 - - - name: "Setup: Login to Docker Hub" - uses: docker/login-action@v3 - with: - username: matthewbaggett - password: ${{ secrets.DOCKER_HUB_TOKEN }} - - - name: "Setup: Login to GHCR" - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: matthewbaggett - password: ${{ secrets.GITHUB_TOKEN }} - - - name: "Setup: Find Composer Cache Directory" - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: "Setup: Composer Cache" - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-bouncer-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-bouncer-composer- - - - name: "Dependencies: Composer Install" - run: composer install --ignore-platform-reqs - - - name: "Build: Build & Push Image" - uses: docker/build-push-action@v5 - with: - context: . - target: bouncer - platforms: ${{ !env.ACT && 'linux/amd64,linux/arm64' || 'linux/amd64' }} - pull: true - push: true - build-args: | - GIT_SHA=${{ github.sha }} - GIT_BUILD_ID=${{ github.ref_name }} - BUILD_DATE=${{ steps.date.outputs.container_build_datetime }} - GIT_COMMIT_MESSAGE=${{ github.event.head_commit.message }} - tags: | - benzine/bouncer:latest - ghcr.io/benzine-framework/bouncer:latest - cache-from: ${{ !env.ACT && 'type=gha' || '' }} - cache-to: ${{ !env.ACT && 'type=gha,mode=max' || '' }} - build-contexts: | - php:cli=docker-image://ghcr.io/benzine-framework/php:cli-8.2 - - - name: "Post-Build: Validate build" - shell: bash - run: | - docker \ - run \ - --rm \ - ghcr.io/benzine-framework/bouncer:latest \ - /usr/bin/install-report diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..35d9e00 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,36 @@ +name: Build Swarm Loadbalancer + +permissions: + contents: read + packages: write + +on: + workflow_call: + workflow_dispatch: + push: + branches: + - main + schedule: + - cron: "0 14 * * 2" # 2pm Patch Tuesday + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build-container: + uses: ./.github/workflows/docker.build.yml + secrets: inherit + check-php: + uses: ./.github/workflows/php.check.yml + secrets: inherit + check-trunk: + uses: ./.github/workflows/trunk.check.yml + secrets: inherit + release-container: + needs: + - build-container + - check-php + - check-trunk + uses: ./.github/workflows/docker.release.yml + secrets: inherit diff --git a/.github/workflows/docker.build.yml b/.github/workflows/docker.build.yml new file mode 100644 index 0000000..5ed1086 --- /dev/null +++ b/.github/workflows/docker.build.yml @@ -0,0 +1,72 @@ +name: Build Swarm Loadbalancer + +permissions: + contents: read + packages: write + +on: + workflow_call: + workflow_dispatch: + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + PLATFORMS: linux/amd64,linux/arm64 + CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }} + +jobs: + build: + name: Build Swarm Loadbalancer + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - id: date + run: | + { + echo "datetime=$(date +'%Y-%m-%d %H:%M:%S')" + echo "date=$(date +'%Y-%m-%d')" + echo "time=$(date +'%H:%M:%S')" + echo "container_build_datetime=$(date -u +'%Y-%m-%dT%H:%M:%S.%3NZ')" + } >> "$GITHUB_OUTPUT" + - id: read-php-version + run: echo "php_version=$(jq -r '.require["php"]' composer.json | sed -E 's/[^0-9.]//g')" >> $GITHUB_OUTPUT + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ steps.read-php-version.outputs.php_version }} + - uses: docker/setup-qemu-action@v3 + - uses: crazy-max/ghaction-github-runtime@v3 + - uses: docker/setup-buildx-action@v3 + - uses: docker/login-action@v3 + with: + registry: ghcr.io + username: matthewbaggett + password: ${{ secrets.GITHUB_TOKEN }} + - id: composer-cache-find + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + - id: composer-cache + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: "${{ runner.os }}-bouncer-composer-${{ hashFiles('**/composer.lock') }}" + restore-keys: ${{ runner.os }}-bouncer-composer- + - run: composer install --ignore-platform-reqs + - name: "Build & Push Candidate Image as ${{ env.CANDIDATE_IMAGE }}" + uses: docker/build-push-action@v5 + with: + context: . + target: bouncer + build-contexts: | + php:cli=docker-image://ghcr.io/benzine-framework/php:cli-${{ steps.read-php-version.outputs.php_version }} + build-args: | + GIT_SHA=${{ github.sha }} + GIT_BUILD_ID=${{ github.ref_name }} + BUILD_DATE=${{ steps.date.outputs.container_build_datetime }} + GIT_COMMIT_MESSAGE=${{ github.event.head_commit.message }} + platforms: ${{ !env.ACT && env.PLATFORMS || 'linux/amd64' }} + pull: true + push: true + tags: ${{ env.CANDIDATE_IMAGE }} + cache-from: ${{ !env.ACT && 'type=gha' || '' }} + cache-to: ${{ !env.ACT && 'type=gha,mode=max' || '' }} diff --git a/.github/workflows/docker.release.yml b/.github/workflows/docker.release.yml new file mode 100644 index 0000000..13baa2a --- /dev/null +++ b/.github/workflows/docker.release.yml @@ -0,0 +1,42 @@ +name: Release Swarm Loadbalancer + +permissions: + contents: read + packages: write + +on: + workflow_call: + workflow_dispatch: + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }} + RELEASE_IMAGE_GHCR: ghcr.io/benzine-framework/bouncer:latest + RELEASE_IMAGE_DOCKER: benzine/bouncer:latest + +jobs: + release: + name: Release Swarm Loadbalancer + runs-on: ubuntu-latest + strategy: + matrix: + registry: + - ghcr + - docker + fail-fast: false + steps: + - name: "Pull Candidate Image" + run: docker pull ${{ env.CANDIDATE_IMAGE }} + - name: "Login to Docker Hub" + if: matrix.registry == 'docker' + run: docker login -u matthewbaggett -p ${{ secrets.DOCKER_HUB_TOKEN }} + - name: "Login to GHCR" + if: matrix.registry == 'ghcr' + run: docker login ghcr.io -u matthewbaggett -p ${{ secrets.GITHUB_TOKEN }} + - name: "Tag Candidate Image" + run: docker tag ${{ env.CANDIDATE_IMAGE }} ${{ matrix.registry == 'ghcr' && env.RELEASE_IMAGE_GHCR || env.RELEASE_IMAGE_DOCKER }} + - name: "Push Release Image" + run: docker push ${{ matrix.registry == 'ghcr' && env.RELEASE_IMAGE_GHCR || env.RELEASE_IMAGE_DOCKER }} diff --git a/.github/workflows/docker.validate.yml b/.github/workflows/docker.validate.yml new file mode 100644 index 0000000..f9d446f --- /dev/null +++ b/.github/workflows/docker.validate.yml @@ -0,0 +1,54 @@ +name: Validate Swarm Loadbalancer + +permissions: + contents: read + packages: write + +on: + workflow_call: + workflow_dispatch: + workflow_run: + workflows: ["Build Swarm Loadbalancer"] + types: + - completed + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + CANDIDATE_IMAGE: ghcr.io/benzine-framework/bouncer:build-${{ github.sha }} + +jobs: + validate-install-report: + name: Run Install Report + runs-on: ubuntu-latest + steps: + - name: "Post-Build: Validate build" + shell: bash + run: | + docker \ + run \ + --rm \ + ${{ env.CANDIDATE_IMAGE }} \ + /usr/bin/install-report + validate-dive-report: + name: Run Dive + runs-on: ubuntu-latest + steps: + # Use Dive to inspect the image for junk + - name: "Post-Build: Dive" + uses: wagoodman/dive@v0.10.0 + with: + args: ${{ env.CANDIDATE_IMAGE }} + validate-vulnerability-report: + name: Run Trivy + runs-on: ubuntu-latest + steps: + # Inspect the container for security vulnerabilities + - name: "Post-Build: Trivy" + uses: aquasecurity/trivy-action@v0.3.0 + with: + image-ref: ${{ env.CANDIDATE_IMAGE }} + format: table + exit-code: 1 diff --git a/.github/workflows/php.check.yml b/.github/workflows/php.check.yml new file mode 100644 index 0000000..b159c67 --- /dev/null +++ b/.github/workflows/php.check.yml @@ -0,0 +1,69 @@ +name: "QC: PHP" + +permissions: read-all + +on: + workflow_call: + workflow_dispatch: + push: + branches: + - main + schedule: + - cron: "0 11 * * 2" # 11am Patch Tuesday + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + php-stan: + name: PHPStan + runs-on: ubuntu-latest + permissions: + checks: write # For trunk to post annotations + contents: read # For repo checkout + steps: + - name: "Checkout" + uses: actions/checkout@v4 + - name: "Read PHP version from composer.json" + id: read-php-version + run: echo "php_version=$(jq -r '.require["php"]' composer.json | sed -E 's/[^0-9.]//g')" >> $GITHUB_OUTPUT + - name: "Setup PHP" + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ steps.read-php-version.outputs.php_version }} + tools: phpstan + - name: Run PHPStan + run: phpstan analyse src + php-cs-fixer: + name: PHP-CS-Fixer + runs-on: ubuntu-latest + permissions: + checks: write # For trunk to post annotations + contents: read # For repo checkout + steps: + - name: "Checkout" + uses: actions/checkout@v4 + - name: "Read PHP version from composer.json" + id: read-php-version + run: echo "php_version=$(jq -r '.require["php"]' composer.json | sed -E 's/[^0-9.]//g')" >> $GITHUB_OUTPUT + - name: "Setup PHP" + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ steps.read-php-version.outputs.php_version }} + tools: php-cs-fixer + - name: "Run PHP CS Fixer" + run: php-cs-fixer fix --config=.php-cs-fixer.php --diff --verbose + # If there are changed files, create a PR, assign it to whom created the push and fail the build + - name: "Create PR" + uses: peter-evans/create-pull-request@v3 + with: + title: "Apply php-cs-fixer changes" + commit-message: "Apply php-cs-fixer changes" + branch: "php-cs-fixer-${{ github.sha }}" + token: ${{ secrets.GITHUB_TOKEN }} + assignees: ${{ github.actor }} + labels: "auto-apply" + body: | + This PR was automatically created to apply php-cs-fixer changes. + Please review the changes and merge if they are correct. diff --git a/.trunk/configs/phpstan.neon.dist b/.trunk/configs/phpstan.neon.dist new file mode 100644 index 0000000..9a9135f --- /dev/null +++ b/.trunk/configs/phpstan.neon.dist @@ -0,0 +1,8 @@ +parameters: + level: 5 + paths: + - src + - bin + - tests + scanFiles: + - bin/bouncer diff --git a/Dockerfile b/Dockerfile index 56444f9..80e37ad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# checkov:skip=CKV_DOCKER_3 user cannot be determined at this stage. +# checkov:skip=CKV_DOCKER_3 I don't have time for rootless FROM php:cli as bouncer LABEL maintainer="Matthew Baggett <matthew@baggett.me>" \ @@ -96,21 +96,8 @@ HEALTHCHECK --start-period=30s \ RUN ls -lah /app /app/bin -# checkov:skip=CKV_DOCKER_3 user cannot be determined at this stage. -FROM php:nginx as test-app-a -COPY test/public-web-a /app/public +# checkov:skip=CKV_DOCKER_3 This is a test container. +FROM php:nginx as test-app +COPY tests/testsites /app/public HEALTHCHECK --start-period=30s \ CMD curl -s -o /dev/null -w "200" http://localhost:80/ || exit 1 - -# checkov:skip=CKV_DOCKER_3 user cannot be determined at this stage. -FROM php:nginx as test-app-b -COPY test/public-web-b /app/public -HEALTHCHECK --start-period=30s \ - CMD curl -s -o /dev/null -w "200" http://localhost:80/ || exit 1 - -# checkov:skip=CKV_DOCKER_3 user cannot be determined at this stage. -FROM php:nginx as test-app-c -COPY test/public-web-c /app/public -HEALTHCHECK --start-period=30s \ - CMD curl -s -o /dev/null -w "200" http://localhost:80/ || exit 1 - diff --git a/Readme.md b/Readme.md index b94f868..dcc8d6c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,16 @@ # Automatic Swarm Nginx Load Balancer +This is a non-production-ready automatic loadbalancer that works by sniffing the docker socket for changes to the running systems in a docker swarm. +It probably works in k8s too, but I don't use k8s personally. + + + + + + + +_\* this doesn't include the number of times it's been pulled from the github container registry, and theres no nice way to pull that from a REST API so there isn't a pretty badge for that._ + ## Environment variables This container has its own environment variables, AS WELL AS scanning for some environment variables associated with your services. diff --git a/composer.json b/composer.json index 84cc57c..10508ee 100644 --- a/composer.json +++ b/composer.json @@ -1,18 +1,21 @@ { "name": "benzine/bouncer", "description": "Automated Docker-swarm aware Nginx configuration management", - "type": "project", - "config": { - "sort-packages": true - }, "license": "GPL-3.0-or-later", + "type": "project", + "authors": [ + { + "name": "Matthew Baggett", + "email": "matthew@baggett.me" + } + ], "require": { - "php": "^8.1", + "php": "^8.2", "ext-curl": "*", "ext-json": "*", "ext-openssl": "*", - "adambrett/shell-wrapper": "~1.0", - "bramus/monolog-colored-line-formatter": "~3.1", + "adambrett/shell-wrapper": "^1.0", + "bramus/monolog-colored-line-formatter": "^3.1", "guzzlehttp/guzzle": "^7.8", "kint-php/kint": "^3.3", "league/flysystem": "^2.5", @@ -21,27 +24,40 @@ "nesbot/carbon": "^2.72", "phpspec/php-diff": "^1.1", "spatie/emoji": "^2.3", + "symfony/polyfill-php83": "^1.28", "symfony/yaml": "^6.4", "twig/twig": "^3.8" }, - "authors": [ - { - "name": "Matthew Baggett", - "email": "matthew@baggett.me" - } - ], "require-dev": { - "friendsofphp/php-cs-fixer": "^3.46" + "ergebnis/composer-normalize": "^2.42", + "friendsofphp/php-cs-fixer": "^3.46", + "php-static-analysis/rector-rule": "^0.2.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11", + "rawr/phpunit-data-provider": "^3.3", + "rector/rector": "^1.0", + "rregeer/phpunit-coverage-check": "^0.3.1", + "squizlabs/php_codesniffer": "^3.7" }, "autoload": { "psr-4": { "Bouncer\\": "src/" } }, - "scripts": { - "fix": "php-cs-fixer fix" - }, "bin": [ "bin/bouncer" - ] + ], + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true, + "phpstan/extension-installer": true + }, + "sort-packages": true + }, + "scripts": { + "fix": "php-cs-fixer fix", + "stan": "phpstan analyse", + "test": "phpunit" + } } diff --git a/composer.lock b/composer.lock index ec65bfa..4670e34 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "41302ab1df8bcb8752ce40fb80be4c59", + "content-hash": "c9afde7a3533e70ccdd8bda174aa647b", "packages": [ { "name": "adambrett/shell-wrapper", @@ -53,16 +53,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.4", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", "shasum": "" }, "require": { @@ -101,22 +101,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" }, - "time": "2023-11-08T00:42:13+00:00" + "time": "2024-04-19T21:30:56+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.298.0", + "version": "3.307.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "55536f81006d8721c51e342d638e7ccc3529e754" + "reference": "cc79f16e1a1bd3feee421401ba2f21915abfdf91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/55536f81006d8721c51e342d638e7ccc3529e754", - "reference": "55536f81006d8721c51e342d638e7ccc3529e754", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cc79f16e1a1bd3feee421401ba2f21915abfdf91", + "reference": "cc79f16e1a1bd3feee421401ba2f21915abfdf91", "shasum": "" }, "require": { @@ -196,9 +196,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.298.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.307.1" }, - "time": "2024-01-31T19:06:05+00:00" + "time": "2024-05-17T18:07:44+00:00" }, { "name": "bramus/ansi-php", @@ -298,16 +298,16 @@ }, { "name": "carbonphp/carbon-doctrine-types", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5" + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/a31d3358a2a5d6ae947df1691d1f321418a5f3d5", - "reference": "a31d3358a2a5d6ae947df1691d1f321418a5f3d5", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", "shasum": "" }, "require": { @@ -347,7 +347,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.1.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" }, "funding": [ { @@ -363,7 +363,7 @@ "type": "tidelift" } ], - "time": "2023-12-10T15:33:53+00:00" + "time": "2024-02-09T16:56:22+00:00" }, { "name": "guzzlehttp/guzzle", @@ -977,16 +977,16 @@ }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", + "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654", "shasum": "" }, "require": { @@ -1009,7 +1009,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -1062,7 +1062,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.6.0" }, "funding": [ { @@ -1074,7 +1074,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-04-12T21:02:21+00:00" }, { "name": "mtdowling/jmespath.php", @@ -1392,20 +1392,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -1429,7 +1429,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1441,9 +1441,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -1660,16 +1660,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -1678,7 +1678,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1707,7 +1707,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -1723,20 +1723,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -1750,9 +1750,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1789,7 +1786,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -1805,20 +1802,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -1832,9 +1829,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1872,7 +1866,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -1888,20 +1882,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -1909,9 +1903,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1955,7 +1946,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -1971,20 +1962,97 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { - "name": "symfony/translation", - "version": "v6.4.3", + "name": "symfony/polyfill-php83", + "version": "v1.29.0", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/637c51191b6b184184bbf98937702bcf554f7d04", - "reference": "637c51191b6b184184bbf98937702bcf554f7d04", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "7495687c58bfd88b7883823747b0656d90679123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", + "reference": "7495687c58bfd88b7883823747b0656d90679123", "shasum": "" }, "require": { @@ -2050,7 +2118,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.3" + "source": "https://github.com/symfony/translation/tree/v6.4.7" }, "funding": [ { @@ -2066,20 +2134,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T13:11:52+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -2088,7 +2156,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -2128,7 +2196,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -2144,20 +2212,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "url": "https://api.github.com/repos/symfony/yaml/zipball/53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", + "reference": "53e8b1ef30a65f78eac60fddc5ee7ebbbdb1dee0", "shasum": "" }, "require": { @@ -2200,7 +2268,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.3" + "source": "https://github.com/symfony/yaml/tree/v6.4.7" }, "funding": [ { @@ -2216,34 +2284,41 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-28T10:28:08+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.10.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -2276,7 +2351,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.10.3" }, "funding": [ { @@ -2288,22 +2363,86 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-05-16T10:04:27+00:00" } ], "packages-dev": [ { - "name": "composer/pcre", - "version": "3.1.1", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", - "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.3", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", + "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "shasum": "" }, "require": { @@ -2345,7 +2484,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.1" + "source": "https://github.com/composer/pcre/tree/3.1.3" }, "funding": [ { @@ -2361,7 +2500,7 @@ "type": "tidelift" } ], - "time": "2023-10-11T07:11:09+00:00" + "time": "2024-03-19T10:26:25+00:00" }, { "name": "composer/semver", @@ -2446,16 +2585,16 @@ }, { "name": "composer/xdebug-handler", - "version": "3.0.3", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { @@ -2466,7 +2605,7 @@ "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { @@ -2490,9 +2629,9 @@ "performance" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -2508,30 +2647,554 @@ "type": "tidelift" } ], - "time": "2022-02-25T21:32:43+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v3.48.0", + "name": "ergebnis/composer-normalize", + "version": "2.42.0", "source": { "type": "git", - "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "a92472c6fb66349de25211f31c77eceae3df024e" + "url": "https://github.com/ergebnis/composer-normalize.git", + "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a92472c6fb66349de25211f31c77eceae3df024e", - "reference": "a92472c6fb66349de25211f31c77eceae3df024e", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", + "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", "shasum": "" }, "require": { + "composer-plugin-api": "^2.0.0", + "ergebnis/json": "^1.2.0", + "ergebnis/json-normalizer": "^4.5.0", + "ergebnis/json-printer": "^3.5.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "localheinz/diff": "^1.1.1", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "composer/composer": "^2.6.6", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "symfony/filesystem": "^5.4.25", + "vimeo/psalm": "^5.20.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin", + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + }, + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Ergebnis\\Composer\\Normalize\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a composer plugin for normalizing composer.json.", + "homepage": "https://github.com/ergebnis/composer-normalize", + "keywords": [ + "composer", + "normalize", + "normalizer", + "plugin" + ], + "support": { + "issues": "https://github.com/ergebnis/composer-normalize/issues", + "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/composer-normalize" + }, + "time": "2024-01-30T11:54:02+00:00" + }, + { + "name": "ergebnis/json", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json.git", + "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json/zipball/a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a Json value object for representing a valid JSON string.", + "homepage": "https://github.com/ergebnis/json", + "keywords": [ + "json" + ], + "support": { + "issues": "https://github.com/ergebnis/json/issues", + "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json" + }, + "time": "2024-01-29T15:09:24+00:00" + }, + { + "name": "ergebnis/json-normalizer", + "version": "4.5.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-normalizer.git", + "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/f0ee9e70739f121b27fac8b743e4a52b23de2152", + "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152", + "shasum": "" + }, + "require": { + "ergebnis/json": "^1.2.0", + "ergebnis/json-pointer": "^3.4.0", + "ergebnis/json-printer": "^3.5.0", + "ergebnis/json-schema-validator": "^4.2.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "composer/semver": "^3.4.0", + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.4", + "vimeo/psalm": "^5.20.0" + }, + "suggest": { + "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Normalizer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides generic and vendor-specific normalizers for normalizing JSON documents.", + "homepage": "https://github.com/ergebnis/json-normalizer", + "keywords": [ + "json", + "normalizer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-normalizer/issues", + "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-normalizer" + }, + "time": "2024-01-30T09:10:15+00:00" + }, + { + "name": "ergebnis/json-pointer", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-pointer.git", + "reference": "b654757d873050622c2166f55ab25d04685261c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b654757d873050622c2166f55ab25d04685261c5", + "reference": "b654757d873050622c2166f55ab25d04685261c5", + "shasum": "" + }, + "require": { + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Pointer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides an abstraction of a JSON pointer.", + "homepage": "https://github.com/ergebnis/json-pointer", + "keywords": [ + "RFC6901", + "json", + "pointer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-pointer/issues", + "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-pointer" + }, + "time": "2024-01-29T16:37:15+00:00" + }, + { + "name": "ergebnis/json-printer", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-printer.git", + "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/549e16fe6de34b8c3aee7b421be12caa552f3ced", + "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Printer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a JSON printer, allowing for flexible indentation.", + "homepage": "https://github.com/ergebnis/json-printer", + "keywords": [ + "formatter", + "json", + "printer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-printer/issues", + "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-printer" + }, + "time": "2024-01-29T15:33:37+00:00" + }, + { + "name": "ergebnis/json-schema-validator", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-schema-validator.git", + "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "shasum": "" + }, + "require": { + "ergebnis/json": "^1.2.0", + "ergebnis/json-pointer": "^3.4.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\SchemaValidator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a JSON schema validator, building on top of justinrainbow/json-schema.", + "homepage": "https://github.com/ergebnis/json-schema-validator", + "keywords": [ + "json", + "schema", + "validator" + ], + "support": { + "issues": "https://github.com/ergebnis/json-schema-validator/issues", + "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-schema-validator" + }, + "time": "2024-01-29T16:50:15+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-02-07T09:43:46+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.57.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f7efe667a8c9818aacceee478add7c0fc24cb21", + "reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.3", "ext-filter": "*", "ext-json": "*", "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.0", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", @@ -2545,6 +3208,7 @@ }, "require-dev": { "facile-it/paraunit": "^1.3 || ^2.0", + "infection/infection": "^0.27.11", "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.11", @@ -2552,7 +3216,8 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6 || ^10.5.5", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -2591,7 +3256,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.48.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.57.1" }, "funding": [ { @@ -2599,7 +3264,1008 @@ "type": "github" } ], - "time": "2024-01-19T21:44:39+00:00" + "time": "2024-05-15T22:01:07+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "v5.2.13", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" + }, + "time": "2023-09-26T02:20:38+00:00" + }, + { + "name": "localheinz/diff", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/localheinz/diff.git", + "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/localheinz/diff/zipball/851bb20ea8358c86f677f5f111c4ab031b1c764c", + "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "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": "Fork of sebastian/diff for use with ergebnis/composer-normalize", + "homepage": "https://github.com/localheinz/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "source": "https://github.com/localheinz/diff/tree/main" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-06T04:49:32+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-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/v5.0.2" + }, + "time": "2024-03-05T20:51:40+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-static-analysis/attributes", + "version": "0.2.2", + "source": { + "type": "git", + "url": "https://github.com/php-static-analysis/attributes.git", + "reference": "43926939b5f294c9f2d685871056178f0c67ad86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-static-analysis/attributes/zipball/43926939b5f294c9f2d685871056178f0c67ad86", + "reference": "43926939b5f294c9f2d685871056178f0c67ad86", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "php-static-analysis/node-visitor": "dev-main", + "php-static-analysis/phpstan-extension": "dev-main", + "php-static-analysis/psalm-plugin": "dev-main", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.0", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5" + }, + "suggest": { + "php-static-analysis/phpstan-extension": "PHPStan extension to read static analysis attributes", + "php-static-analysis/psalm-plugin": "Psalm plugin to read static analysis attributes", + "php-static-analysis/rector-rule": "RectorPHP rule to convert PHPDoc annotations to static analysis attributes" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpStaticAnalysis\\Attributes\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carlos Granados", + "email": "carlos@fastdebug.io" + } + ], + "description": "Attributes used instead of PHPDocs for static analysis tools", + "support": { + "issues": "https://github.com/php-static-analysis/attributes/issues", + "source": "https://github.com/php-static-analysis/attributes/tree/0.2.2" + }, + "time": "2024-03-05T11:44:26+00:00" + }, + { + "name": "php-static-analysis/rector-rule", + "version": "0.2.2", + "source": { + "type": "git", + "url": "https://github.com/php-static-analysis/rector-rule.git", + "reference": "a84ba9da2681d32be894e8f6a0bd7f9c06ab99ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-static-analysis/rector-rule/zipball/a84ba9da2681d32be894e8f6a0bd7f9c06ab99ad", + "reference": "a84ba9da2681d32be894e8f6a0bd7f9c06ab99ad", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "php-static-analysis/attributes": "^0.2.2 || dev-main", + "rector/rector": "^0.19 || ^1.0" + }, + "require-dev": { + "php-static-analysis/phpstan-extension": "dev-main", + "php-static-analysis/psalm-plugin": "dev-main", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.8", + "phpunit/phpunit": "^9.0", + "symplify/easy-coding-standard": "^12.1", + "vimeo/psalm": "^5", + "webmozart/assert": "^1.11" + }, + "type": "rector-extension", + "autoload": { + "psr-4": { + "PhpStaticAnalysis\\RectorRule\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carlos Granados", + "email": "carlos@fastdebug.io" + } + ], + "description": "RectorPHP rule to convert PHPDoc annotations for static analysis to PHP attributes", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "issues": "https://github.com/php-static-analysis/rector-rule/issues", + "source": "https://github.com/php-static-analysis/rector-rule/tree/0.2.2" + }, + "time": "2024-03-05T11:31:06+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f45734bfb9984c6c56c4486b71230355f066a58a", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.3.1" + }, + "time": "2023-05-24T08:59:17+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-05-15T08:00:59+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-text-template": "^4.0", + "sebastian/code-unit-reverse-lookup": "^4.0", + "sebastian/complexity": "^4.0", + "sebastian/environment": "^7.0", + "sebastian/lines-of-code": "^3.0", + "sebastian/version": "^5.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "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": "11.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 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/11.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:35:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/99e95c94ad9500daca992354fa09d7b99abe2210", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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", + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:04+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "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", + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:50+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/d38f6cbff1cdb6f40b03c9811421561668cc133e", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:06:56+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8a59d9e25720482ee7fcdf296595e08795b84dc5", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:01+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "d475be032238173ca3b0a516f5cc291d174708ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d475be032238173ca3b0a516f5cc291d174708ae", + "reference": "d475be032238173ca3b0a516f5cc291d174708ae", + "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.2", + "phpunit/php-code-coverage": "^11.0", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-invoker": "^5.0", + "phpunit/php-text-template": "^4.0", + "phpunit/php-timer": "^7.0", + "sebastian/cli-parser": "^3.0", + "sebastian/code-unit": "^3.0", + "sebastian/comparator": "^6.0", + "sebastian/diff": "^6.0", + "sebastian/environment": "^7.0", + "sebastian/exporter": "^6.0", + "sebastian/global-state": "^7.0", + "sebastian/object-enumerator": "^6.0", + "sebastian/type": "^5.0", + "sebastian/version": "^5.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.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/11.1.3" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-04-24T06:34:25+00:00" }, { "name": "psr/container", @@ -2705,30 +4371,1019 @@ "time": "2019-01-08T18:20:26+00:00" }, { - "name": "sebastian/diff", - "version": "5.1.0", + "name": "rawr/phpunit-data-provider", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "url": "https://github.com/t-regx/phpunit-data-provider.git", + "reference": "69b1c46e542e94beb140a7a004dce148778f49d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/t-regx/phpunit-data-provider/zipball/69b1c46e542e94beb140a7a004dce148778f49d9", + "reference": "69b1c46e542e94beb140a7a004dce148778f49d9", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^10.0", + "phpunit/phpunit": "^9.5.4 || ^8.0 || ^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "TRegx\\PhpUnit\\DataProviders\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Wilkowski", + "homepage": "https://t-regx.com/" + } + ], + "description": "Lightweight builder for PhpUnit data providers", + "support": { + "issues": "https://github.com/t-regx/phpunit-data-provider/issues", + "source": "https://github.com/t-regx/phpunit-data-provider/tree/3.3.0" + }, + "funding": [ + { + "url": "https://github.com/danon", + "type": "github" + } + ], + "time": "2023-11-18T16:20:03+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-09-16T13:41:56+00:00" + }, + { + "name": "react/dns", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "c134600642fa615b46b41237ef243daa65bb64ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec", + "reference": "c134600642fa615b46b41237ef243daa65bb64ec", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.0 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.12.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-29T12:41:06+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/promise", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-16T16:21:57+00:00" + }, + { + "name": "react/socket", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.11", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.15.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-12-15T11:02:10+00:00" + }, + { + "name": "react/stream", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-06-16T10:52:11+00:00" + }, + { + "name": "rector/rector", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "556509e2dcf527369892b7d411379c4a02f31859" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/556509e2dcf527369892b7d411379c4a02f31859", + "reference": "556509e2dcf527369892b7d411379c4a02f31859", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.11" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-05-18T09:40:27+00:00" + }, + { + "name": "rregeer/phpunit-coverage-check", + "version": "0.3.1", + "source": { + "type": "git", + "url": "https://github.com/richardregeer/phpunit-coverage-check.git", + "reference": "9618fa74477fbc448c1b0599bef5153d170094bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/richardregeer/phpunit-coverage-check/zipball/9618fa74477fbc448c1b0599bef5153d170094bd", + "reference": "9618fa74477fbc448c1b0599bef5153d170094bd", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "bin": [ + "bin/coverage-check" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Richard Regeer", + "email": "rich2309@gmail.com" + } + ], + "description": "Check the code coverage using the clover report of phpunit", + "keywords": [ + "ci", + "code coverage", + "php", + "phpunit", + "testing", + "unittest" + ], + "support": { + "issues": "https://github.com/richardregeer/phpunit-coverage-check/issues", + "source": "https://github.com/richardregeer/phpunit-coverage-check/tree/0.3.1" + }, + "time": "2019-10-14T07:04:13+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/00a74d5568694711f0222e54fb281e1d15fdf04a", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:26:58+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6634549cb8d702282a04a774e36a7477d2bd9015", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:50:41+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:52:17+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:53:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "88a434ad86150e11a606ac4866b09130712671f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/88a434ad86150e11a606ac4866b09130712671f0", + "reference": "88a434ad86150e11a606ac4866b09130712671f0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:55:19+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ab83243ecc233de5655b76f577711de9f842e712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ab83243ecc233de5655b76f577711de9f842e712", + "reference": "ab83243ecc233de5655b76f577711de9f842e712", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -2761,7 +5416,7 @@ "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.0" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.1" }, "funding": [ { @@ -2769,51 +5424,681 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:30:33+00:00" }, { - "name": "symfony/console", - "version": "v6.4.3", + "name": "sebastian/environment", + "version": "7.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4eb3a442574d0e9d141aab209cd4aaf25701b09a", + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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/7.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:56:34+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f291e5a317c321c0381fa9ecc796fa2d21b186da", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:28:20+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:32:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/376c5b3f6b43c78fdc049740bca76a7c846706c0", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:00:36+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:01:29+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/bb2a6255d30853425fd38f032eb64ced9f7f132d", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:02:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:48+00:00" + }, + { + "name": "sebastian/type", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8502785eb3523ca0dd4afe9ca62235590020f3f", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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", + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:09:34+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/13999475d2cb1ab33cb73403ba356a814fdbb001", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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", + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:10:47+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.9.2", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/aac1f6f347a5c5ac6bc98ad395007df00990f480", + "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "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": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "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/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-04-23T20:25:34+00:00" + }, + { + "name": "symfony/console", + "version": "v7.0.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c981e0e9380ce9f146416bde3150c79197ce9986" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c981e0e9380ce9f146416bde3150c79197ce9986", + "reference": "c981e0e9380ce9f146416bde3150c79197ce9986", + "shasum": "" + }, + "require": { + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^6.4|^7.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -2847,7 +6132,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.3" + "source": "https://github.com/symfony/console/tree/v7.0.7" }, "funding": [ { @@ -2863,28 +6148,28 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", + "reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -2893,13 +6178,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -2927,7 +6212,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" }, "funding": [ { @@ -2943,20 +6228,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -2966,7 +6251,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -3003,7 +6288,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -3019,26 +6304,27 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/cc168be6fbdcdf3401f50ae863ee3818ed4338f5", + "reference": "cc168be6fbdcdf3401f50ae863ee3818ed4338f5", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "symfony/polyfill-mbstring": "~1.8", + "symfony/process": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -3066,7 +6352,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v7.0.7" }, "funding": [ { @@ -3082,27 +6368,27 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "4d58f0f4fe95a30d7b538d71197135483560b97c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/4d58f0f4fe95a30d7b538d71197135483560b97c", + "reference": "4d58f0f4fe95a30d7b538d71197135483560b97c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -3130,7 +6416,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v7.0.7" }, "funding": [ { @@ -3146,24 +6432,24 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-04-28T11:44:19+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.4.0", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e" + "reference": "23cc173858776ad451e31f053b1c9f47840b2cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", - "reference": "22301f0e7fdeaacc14318928612dee79be99860e", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/23cc173858776ad451e31f053b1c9f47840b2cfa", + "reference": "23cc173858776ad451e31f053b1c9f47840b2cfa", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -3197,7 +6483,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.0.7" }, "funding": [ { @@ -3213,20 +6499,20 @@ "type": "tidelift" } ], - "time": "2023-08-08T10:16:24+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -3237,9 +6523,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3278,7 +6561,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -3294,20 +6577,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -3318,9 +6601,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3362,7 +6642,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -3378,20 +6658,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", "shasum": "" }, "require": { @@ -3399,9 +6679,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -3441,7 +6718,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0" }, "funding": [ { @@ -3457,24 +6734,24 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", - "version": "v6.4.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" + "reference": "3839e56b94dd1dbd13235d27504e66baf23faba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", + "url": "https://api.github.com/repos/symfony/process/zipball/3839e56b94dd1dbd13235d27504e66baf23faba0", + "reference": "3839e56b94dd1dbd13235d27504e66baf23faba0", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -3502,7 +6779,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.3" + "source": "https://github.com/symfony/process/tree/v7.0.7" }, "funding": [ { @@ -3518,25 +6795,26 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -3544,7 +6822,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -3584,7 +6862,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -3600,24 +6878,24 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + "reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", - "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/41a7a24aa1dc82adf46a06bc292d1923acfe6b84", + "reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -3646,7 +6924,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.3" + "source": "https://github.com/symfony/stopwatch/tree/v7.0.7" }, "funding": [ { @@ -3662,24 +6940,24 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:35:58+00:00" + "time": "2024-04-18T09:29:19+00:00" }, { "name": "symfony/string", - "version": "v6.4.3", + "version": "v7.0.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b" + "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7a14736fb179876575464e4658fce0c304e8c15b", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b", + "url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", + "reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -3689,11 +6967,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -3732,7 +7010,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.3" + "source": "https://github.com/symfony/string/tree/v7.0.7" }, "funding": [ { @@ -3748,7 +7026,57 @@ "type": "tidelift" } ], - "time": "2024-01-25T09:26:29+00:00" + "time": "2024-04-18T09:29:19+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], @@ -3757,7 +7085,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.1", + "php": "^8.2", "ext-curl": "*", "ext-json": "*", "ext-openssl": "*" diff --git a/docker-compose.yml b/docker-compose.yml index 5a51398..87f5fa5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,12 +27,11 @@ services: additional_contexts: - php:nginx=docker-image://ghcr.io/benzine-framework/php:nginx-8.2 volumes: - - ./test/public-web-a:/app/public + - ./tests/testsites:/app/public environment: - BOUNCER_DOMAIN=a.web.grey.ooo - BOUNCER_TARGET_PORT=80 - # - BOUNCER_LETSENCRYPT=true - + - SITE_NAME=A web-b: image: test-app-b build: @@ -40,8 +39,8 @@ services: additional_contexts: - php:nginx=docker-image://ghcr.io/benzine-framework/php:nginx-8.2 volumes: - - ./test/public-web-b:/app/public + - ./tests/testsites:/app/public environment: - BOUNCER_DOMAIN=b.web.grey.ooo - BOUNCER_TARGET_PORT=80 -# - BOUNCER_LETSENCRYPT=true + - SITE_NAME=B diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 120000 index 0000000..1cba7a4 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1 @@ +.trunk/configs/phpstan.neon.dist \ No newline at end of file diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..193b612 --- /dev/null +++ b/rector.php @@ -0,0 +1,62 @@ +<?php + +declare(strict_types=1); + +use PhpStaticAnalysis\RectorRule\AnnotationsToAttributesRector; +use Rector\Config\RectorConfig; +use Rector\Doctrine\Set\DoctrineSetList; +use Rector\Php80\Rector\Class_\AnnotationToAttributeRector; +use Rector\PHPUnit\AnnotationsToAttributes\Rector\Class_\AnnotationWithValueToAttributeRector; +use Rector\PHPUnit\CodeQuality\Rector\Class_\PreferPHPUnitThisCallRector; +use Rector\PHPUnit\Rector\Class_\PreferPHPUnitSelfCallRector; +use Rector\PHPUnit\Set\PHPUnitSetList; +use Rector\Removing\Rector\FuncCall\RemoveFuncCallRector; +use Rector\Renaming\Rector\Name\RenameClassRector; +use Rector\Symfony\Set\SensiolabsSetList; +use Rector\Symfony\Set\SymfonySetList; +use Rector\TypeDeclaration\Rector\ClassMethod\AddVoidReturnTypeWhereNoReturnRector; + +$rectorConfig = RectorConfig::configure(); +$rectorConfig->withParallel(30); +$rectorConfig->withPreparedSets( + deadCode: true, + codeQuality: true +); +$rectorConfig->withPaths([ + __DIR__ . '/bin', + __DIR__ . '/src', + __DIR__ . '/tests', +]); +// uncomment to reach your current PHP version +$rectorConfig->withPhpSets(); +$rectorConfig->withSets([ + PHPUnitSetList::PHPUNIT_80, + PHPUnitSetList::PHPUNIT_90, + PHPUnitSetList::PHPUNIT_100, + PHPUnitSetList::PHPUNIT_CODE_QUALITY, + PHPUnitSetList::ANNOTATIONS_TO_ATTRIBUTES, + // PhpStaticAnalysisSetList::ANNOTATIONS_TO_ATTRIBUTES,// Implied by PHPUNIT_100 + DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES, + SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES, + SensiolabsSetList::ANNOTATIONS_TO_ATTRIBUTES, + __DIR__ . '/vendor/fakerphp/faker/rector-migrate.php', +]); +$rectorConfig->withConfiguredRule(RemoveFuncCallRector::class, [ + 'var_dump', +]); +$rectorConfig->withRules([ + AddVoidReturnTypeWhereNoReturnRector::class, + AnnotationToAttributeRector::class, + AnnotationWithValueToAttributeRector::class, + AnnotationsToAttributesRector::class, +]); + +// Prefer self::assert* over $this->assert* in PHPUnit tests +$rectorConfig->withSkip([ + PreferPHPUnitThisCallRector::class, +]); +$rectorConfig->withRules([ + PreferPHPUnitSelfCallRector::class, +]); + +return $rectorConfig; diff --git a/src/Bouncer.php b/src/Bouncer.php index ad14dfa..e614bd6 100644 --- a/src/Bouncer.php +++ b/src/Bouncer.php @@ -7,6 +7,7 @@ namespace Bouncer; use AdamBrett\ShellWrapper\Command\Builder as CommandBuilder; use AdamBrett\ShellWrapper\Runners\Exec; use Aws\S3\S3Client; +use Bouncer\Logger\AbstractLogger; use GuzzleHttp\Client as Guzzle; use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Exception\ServerException; @@ -15,7 +16,7 @@ use League\Flysystem\FileAttributes; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemException; use League\Flysystem\Local\LocalFilesystemAdapter; -use Monolog\Logger; +use Bouncer\Logger\Logger; use Bouncer\Logger\Formatter; use Spatie\Emoji\Emoji; use Symfony\Component\Yaml\Yaml; @@ -38,7 +39,7 @@ class Bouncer private Filesystem $certificateStoreLocal; private ?Filesystem $certificateStoreRemote = null; private Filesystem $providedCertificateStore; - private Logger $logger; + private AbstractLogger $logger; private array $previousContainerState = []; private array $previousSwarmState = []; private array $fileHashes; @@ -61,7 +62,7 @@ class Bouncer $this->settings = new Settings(); - $this->logger = new \Bouncer\Logger\Logger( + $this->logger = new Logger( settings: $this->settings, processIdProcessor: new Processor\ProcessIdProcessor(), memoryPeakUsageProcessor: new Processor\MemoryPeakUsageProcessor(), @@ -306,6 +307,7 @@ class Bouncer $bouncerTarget->setUseGlobalCert($this->isUseGlobalCert()); + // @phpstan-ignore-next-line MB: I'm not sure you're right about ->hasCustomNginxConfig only returning false, Stan.. if ($bouncerTarget->isEndpointValid() || $bouncerTarget->hasCustomNginxConfig()) { $bouncerTargets[] = $bouncerTarget; } else { @@ -364,6 +366,7 @@ class Bouncer exit(1); } + // @phpstan-ignore-next-line Yes, I know this is a loop, that is desired. while (true) { $this->runLoop(); } @@ -471,24 +474,6 @@ class Bouncer return json_decode($this->docker->request('GET', "containers/{$id}/json")->getBody()->getContents(), true); } - private function dockerEnvHas(string $key, ?array $envs): bool - { - if ($envs === null) { - return false; - } - - foreach ($envs as $env) { - if (stripos($env, '=') !== false) { - [$envKey, $envVal] = explode('=', $env, 2); - if ($envKey === $key) { - return true; - } - } - } - - return false; - } - private function dockerEnvFilter(?array $envs): array { if ($envs === null) { diff --git a/src/Logger/AbstractLogger.php b/src/Logger/AbstractLogger.php new file mode 100644 index 0000000..0a5cfcf --- /dev/null +++ b/src/Logger/AbstractLogger.php @@ -0,0 +1,417 @@ +<?php + +declare(strict_types=1); + +namespace Bouncer\Logger; + +use PhpStaticAnalysis\Attributes\Type; +use PhpStaticAnalysis\Attributes\Param; +use PhpStaticAnalysis\Attributes\Returns; +use Monolog\DateTimeImmutable; +use Monolog\Handler\HandlerInterface; +use Monolog\Level; +use Monolog\LogRecord; +use Monolog\Processor\ProcessorInterface; +use Monolog\ResettableInterface; +use Psr\Log\LoggerInterface; + +abstract class AbstractLogger implements LoggerInterface, ResettableInterface +{ + protected array $handlers; + protected bool $microsecondTimestamps = true; + protected \DateTimeZone $timezone; + protected ?\Closure $exceptionHandler = null; + + /** + * Keeps track of depth to prevent infinite logging loops. + */ + private int $logDepth = 0; + + #[Type('\WeakMap<\Fiber<mixed, mixed, mixed, mixed>, int>')] // Keeps track of depth inside fibers to prevent infinite logging loops + private \WeakMap $fiberLogDepth; + + /** + * Whether to detect infinite logging loops + * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this. + */ + private bool $detectCycles = true; + + #[Param(name: 'string')] // The logging channel, a simple descriptive name that is attached to all log records + #[Param(handlers: 'HandlerInterface[]')] // optional stack of handlers, the first one in the array is called first, etc + #[Param(processors: 'callable[]')] // Optional array of processors + #[Param(timezone: 'null|\DateTimeZone')] // Optional timezone, if not provided date_default_timezone_get() will be used + #[Param(processors: 'array<(callable(LogRecord):LogRecord | ProcessorInterface)>')] + public function __construct(protected string $name, array $handlers = [], #[Type('array<(callable(LogRecord):LogRecord | ProcessorInterface)>')] + protected array $processors = [], ?\DateTimeZone $timezone = null) + { + $this->setHandlers($handlers); + $this->timezone = $timezone ?? new \DateTimeZone(date_default_timezone_get()); + $this->fiberLogDepth = new \WeakMap(); + } + + public function getName(): string + { + return $this->name; + } + + /** + * Return a new cloned instance with the name changed. + */ + #[Returns('static')] + public function withName(string $name): self + { + $new = clone $this; + $new->name = $name; + + return $new; + } + + public function pushHandler(HandlerInterface $handler): self + { + array_unshift($this->handlers, $handler); + + return $this; + } + + public function setHandlers(array $handlers): self + { + $this->handlers = []; + foreach (array_reverse($handlers) as $handler) { + $this->pushHandler($handler); + } + + return $this; + } + + #[Param(callback: 'ProcessorInterface|callable(LogRecord):LogRecord')] + #[Returns('$this')] + public function pushProcessor(callable | ProcessorInterface $callback): self + { + array_unshift($this->processors, $callback); + + return $this; + } + + #[Returns('$this')] + public function useLoggingLoopDetection(bool $detectCycles): self + { + $this->detectCycles = $detectCycles; + + return $this; + } + + /** + * Adds a log record. + */ + #[Param(level: 'Level')] // The logging level (a Monolog or RFC 5424 level) + #[Param(message: 'string')] // The log message + #[Param(context: 'mixed[]')] // The log context + #[Param(datetime: 'null|DateTimeImmutable')] // Optional log date to log into the past or future + #[Returns('bool')] // Whether the record has been processed + #[Param(level: 'value-of<Level::VALUES>|Level')] + public function addRecord(Level $level, string $message, array $context = [], ?DateTimeImmutable $datetime = null): bool + { + if ($this->detectCycles) { + if (($fiber = \Fiber::getCurrent()) instanceof \Fiber) { + $logDepth = $this->fiberLogDepth[$fiber] = ($this->fiberLogDepth[$fiber] ?? 0) + 1; + } else { + $logDepth = ++$this->logDepth; + } + } else { + $logDepth = 0; + } + + if ($logDepth === 3) { + $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.'); + + return false; + } + if ($logDepth >= 5) { // log depth 4 is let through, so we can log the warning above + return false; + } + + $trace = debug_backtrace(); + $context = array_merge( + [ + 'file' => basename($trace[1]['file']), + 'line' => $trace[1]['line'], + 'pid' => getmypid(), + ], + $context + ); + + try { + $recordInitialized = $this->processors === []; + + $record = new LogRecord( + datetime: $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), + channel: $this->name, + level: $level, + message: $message, + context: $context, + extra: [], + ); + $handled = false; + + foreach ($this->handlers as $handler) { + if (false === $recordInitialized) { + // skip initializing the record as long as no handler is going to handle it + if (!$handler->isHandling($record)) { + continue; + } + + try { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + $recordInitialized = true; + } catch (\Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + + // once the record is initialized, send it to all handlers as long as the bubbling chain is not interrupted + try { + $handled = true; + if (true === $handler->handle(clone $record)) { + break; + } + } catch (\Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + + return $handled; + } finally { + if ($this->detectCycles) { + if (isset($fiber)) { + --$this->fiberLogDepth[$fiber]; + } else { + --$this->logDepth; + } + } + } + } + + public function close(): void + { + foreach ($this->handlers as $handler) { + $handler->close(); + } + } + + public function reset(): void + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Checks whether the Logger has a handler that listens on the given level. + */ + #[Param(level: 'Level')] + public function isHandling(Level $level): bool + { + $record = new LogRecord( + datetime: new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), + channel: $this->name, + message: '', + level: $level, + ); + + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * Adds a log record at an arbitrary level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(level: 'mixed')] // The log level (a Monolog, PSR-3 or RFC 5424 level) + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + #[Param(level: 'Level|LogLevel::*')] + public function log($level, string | \Stringable $message, array $context = []): void + { + if (!$level instanceof Level) { + $level = Level::Critical; + } + + $this->addRecord($level, "A Level that wasn't valid was used to write to a Logger: {level}", ['level' => $level]); + $this->addRecord($level, (string) $message, $context); + } + + /** + * Adds a log record at the DEBUG level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function debug(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Debug, (string) $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function info(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Info, (string) $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function notice(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Notice, (string) $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function warning(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Warning, (string) $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function error(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Error, (string) $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function critical(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Critical, (string) $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function alert(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Alert, (string) $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + */ + #[Param(message: 'string|\Stringable')] // The log message + #[Param(context: 'mixed[]')] // The log context + public function emergency(string | \Stringable $message, array $context = []): void + { + $this->addRecord(Level::Emergency, (string) $message, $context); + } + + /** + * Sets the timezone to be used for the timestamp of log records. + */ + #[Returns('$this')] + public function setTimezone(\DateTimeZone $tz): self + { + $this->timezone = $tz; + + return $this; + } + + /** + * Returns the timezone to be used for the timestamp of log records. + */ + public function getTimezone(): \DateTimeZone + { + return $this->timezone; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + */ + protected function handleException(\Throwable $e, LogRecord $record): void + { + if (!$this->exceptionHandler instanceof \Closure) { + throw $e; + } + + ($this->exceptionHandler)($e, $record); + } + + #[Returns('array<string, mixed>')] + public function __serialize(): array + { + return [ + 'name' => $this->name, + 'handlers' => $this->handlers, + 'processors' => $this->processors, + 'microsecondTimestamps' => $this->microsecondTimestamps, + 'timezone' => $this->timezone, + 'exceptionHandler' => $this->exceptionHandler, + 'logDepth' => $this->logDepth, + 'detectCycles' => $this->detectCycles, + ]; + } + + #[Param(data: 'array<string, mixed>')] + public function __unserialize(array $data): void + { + foreach (['name', 'handlers', 'processors', 'microsecondTimestamps', 'timezone', 'exceptionHandler', 'logDepth', 'detectCycles'] as $property) { + if (isset($data[$property])) { + $this->{$property} = $data[$property]; + } + } + + $this->fiberLogDepth = new \WeakMap(); + } +} diff --git a/src/Logger/Logger.php b/src/Logger/Logger.php index 515d623..310cb36 100644 --- a/src/Logger/Logger.php +++ b/src/Logger/Logger.php @@ -7,7 +7,7 @@ namespace Bouncer\Logger; use Bouncer\Settings\Settings; use Monolog\Processor; -class Logger extends \Monolog\Logger +class Logger extends AbstractLogger { public function __construct( private readonly Settings $settings, diff --git a/src/Target.php b/src/Target.php index f319b71..d5d1f97 100644 --- a/src/Target.php +++ b/src/Target.php @@ -4,8 +4,10 @@ declare(strict_types=1); namespace Bouncer; +use Bouncer\Logger\AbstractLogger; use Bouncer\Logger\Logger; use Bouncer\Settings\Settings; +use Psr\Log\LoggerInterface; use Spatie\Emoji\Emoji; class Target @@ -27,14 +29,12 @@ class Target private ?int $proxyTimeoutSeconds = null; private ?string $username = null; private ?string $password = null; - private ?string $hostOverride = null; private ?string $customNginxConfig = null; - private bool $requiresForcedScanning = false; public function __construct( - private Logger $logger, + private AbstractLogger $logger, private Settings $settings, ) { $this->allowNonSSL = $this->settings->get('ssl/allow_non_ssl', true); @@ -94,9 +94,6 @@ class Target return $this->username; } - /** - * @param string - */ public function setUsername(string $username): self { $this->username = $username; @@ -298,9 +295,6 @@ class Target return $this; } - /** - * @return string - */ public function getDomains(): array { return $this->domains; @@ -420,10 +414,6 @@ class Target return $this; } - public function getLogger(): Logger - { - return $this->logger; - } public function updateLogger(): self { diff --git a/test/public-web-a/index.html b/test/public-web-a/index.html deleted file mode 100644 index dc614ab..0000000 --- a/test/public-web-a/index.html +++ /dev/null @@ -1 +0,0 @@ -<h1>Website A</h1> diff --git a/test/public-web-b/favicon.ico b/test/public-web-b/favicon.ico deleted file mode 100644 index 1d741baafc962315536c288db18bbb5e914ab259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34494 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 PRc@*r-EvjsEX)0WDEdAd diff --git a/test/public-web-b/index.html b/test/public-web-b/index.html deleted file mode 100644 index 7ed2f92..0000000 --- a/test/public-web-b/index.html +++ /dev/null @@ -1 +0,0 @@ -<h1>Website B</h1> diff --git a/test/public-web-c/favicon.ico b/test/public-web-c/favicon.ico deleted file mode 100644 index 1d741baafc962315536c288db18bbb5e914ab259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34494 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 PRc@*r-EvjsEX)0WDEdAd diff --git a/test/public-web-c/index.html b/test/public-web-c/index.html deleted file mode 100644 index 8e50564..0000000 --- a/test/public-web-c/index.html +++ /dev/null @@ -1 +0,0 @@ -<h1>Website C</h1> diff --git a/test/public-web-a/favicon.ico b/tests/testsites/favicon.ico similarity index 100% rename from test/public-web-a/favicon.ico rename to tests/testsites/favicon.ico diff --git a/tests/testsites/index.php b/tests/testsites/index.php new file mode 100644 index 0000000..3a3a611 --- /dev/null +++ b/tests/testsites/index.php @@ -0,0 +1,5 @@ +<?php +$environment = array_merge($_ENV, $_SERVER); +$site = $environment['SITE_NAME'] ?? 'unknown'; +$server = $environment['SERVER_NAME'] ?? gethostname(); +printf("<h1>Website %s</h1><p>Running on %s</p>", $site, $server);