diff --git a/.env b/.env index 0a1d819..988bd7a 100644 --- a/.env +++ b/.env @@ -1,6 +1,7 @@ COMPOSE_PROJECT_NAME=itksites -#COMPOSE_DOMAIN=itksites.local.itkdev.dk -COMPOSE_DOMAIN=sites.itkdev.dk +COMPOSE_DOMAIN=itksites.local.itkdev.dk + +ITKDEV_TEMPLATE=symfony-6 # In all environments, the following files are loaded if they exist, # the latter taking precedence over the former: @@ -63,3 +64,5 @@ VAULT_SECRET_ID="CHANGE_ME_IN_LOCAL_ENV" # The number of old results for each server/result-type combination APP_KEEP_RESULTS=5 +APP_LEANTIME_URI=https://leantime.itkdev.dk +APP_LEANTIME_API_KEY="CHANGE_ME_IN_LOCAL_ENV" diff --git a/.github/workflows/apispec.yaml b/.github/workflows/apispec.yaml new file mode 100644 index 0000000..7d11a53 --- /dev/null +++ b/.github/workflows/apispec.yaml @@ -0,0 +1,115 @@ +name: API Spec review + +env: + COMPOSE_USER: root + +on: + pull_request: + +jobs: + api-spec-updated: + name: Ensure committed API specification is up to date + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 2 + + - name: Create docker network + run: | + docker network create frontend + + - name: Composer install + run: | + docker compose run --rm phpfpm composer install + + - name: Export API specification + run: | + docker compose run --rm phpfpm bin/console api:openapi:export --yaml --output=public/api-spec-v1.yaml --no-interaction + + - name: Check for changes in specification + id: git-diff-spec + continue-on-error: true + run: git diff --diff-filter=ACMRT --exit-code public/api-spec-v1.yaml + + - name: Comment PR + if: steps.git-diff-spec.outcome == 'failure' + env: + GH_TOKEN: ${{ github.token }} + run: | + echo '## 🛑 Exported API specification file not up to date' > var/comment.md + echo '' >> var/comment.md + echo 'Please run `composer update-api-spec` to export the API specification. Then commit and push the changes.' >> var/comment.md + gh pr comment ${{ github.event.pull_request.number }} --body-file var/comment.md --create-if-none --edit-last + + - name: Fail job, api spec is not up to date + if: steps.git-diff-spec.outcome == 'failure' + run: | + exit 1 + + detect-breaking-changes: + name: Detect breaking changes in API specification + runs-on: ubuntu-latest + needs: [api-spec-updated] + steps: + - name: Check out BASE rev + uses: actions/checkout@v5 + with: + ref: ${{ github.base_ref }} + path: base + + - name: Check out HEAD rev + uses: actions/checkout@v5 + with: + ref: ${{ github.head_ref }} + path: head + + - name: Run OpenAPI Changed (from HEAD rev) + id: api-changed + continue-on-error: true + uses: docker://openapitools/openapi-diff:latest + with: + args: --fail-on-changed base/public/api-spec-v1.yaml head/public/api-spec-v1.yaml --markdown api-spec-changed.md + + - name: Run OpenAPI Incompatible (from HEAD rev) + id: api-incompatible + continue-on-error: true + uses: docker://openapitools/openapi-diff:latest + with: + args: --fail-on-incompatible base/public/api-spec-v1.yaml head/public/api-spec-v1.yaml --markdown api-spec-incompatible.md + + - name: Comment PR with no changes + if: steps.api-changed.outcome == 'success' && steps.api-incompatible.outcome == 'success' + working-directory: head + env: + GH_TOKEN: ${{ github.token }} + run: | + gh pr comment ${{ github.event.pull_request.number }} --body "✅ **No changes detected in API specification**" --create-if-none --edit-last + + - name: Comment PR with non-breaking changes + if: steps.api-changed.outcome == 'failure' && steps.api-incompatible.outcome == 'success' + working-directory: head + env: + GH_TOKEN: ${{ github.token }} + run: | + echo "## ⚠️ Non-Breaking changes detected in API specification" > ../comment.md + echo "" >> ../comment.md + cat ../api-spec-changed.md >> ../comment.md + gh pr comment ${{ github.event.pull_request.number }} --body-file ../comment.md --create-if-none --edit-last + + - name: Comment PR with breaking changes + if: steps.api-incompatible.outcome == 'failure' + working-directory: head + env: + GH_TOKEN: ${{ github.token }} + run: | + echo "## 🛑 Breaking changes detected in API specification" > ../comment.md + echo "" >> ../comment.md + cat ../api-spec-incompatible.md >> ../comment.md + gh pr comment ${{ github.event.pull_request.number }} --body-file ../comment.md --create-if-none --edit-last + + - name: Fail if breaking changes detected + if: steps.api-incompatible.outcome == 'failure' + run: | + exit 1 diff --git a/.github/workflows/changelog.yaml b/.github/workflows/changelog.yaml new file mode 100644 index 0000000..9f5fead --- /dev/null +++ b/.github/workflows/changelog.yaml @@ -0,0 +1,27 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/changelog.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Changelog +### +### Checks that changelog has been updated + +name: Changelog + +on: + pull_request: + +jobs: + changelog: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 2 + + - name: Git fetch + run: git fetch + + - name: Check that changelog has been updated. + run: git diff --exit-code origin/${{ github.base_ref }} -- CHANGELOG.md && exit 1 || exit 0 diff --git a/.github/workflows/composer.yaml b/.github/workflows/composer.yaml new file mode 100644 index 0000000..314a11b --- /dev/null +++ b/.github/workflows/composer.yaml @@ -0,0 +1,78 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/composer.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Composer +### +### Validates composer.json and checks that it's normalized. +### +### #### Assumptions +### +### 1. A docker compose service named `phpfpm` can be run and `composer` can be +### run inside the `phpfpm` service. +### 2. [ergebnis/composer-normalize](https://github.com/ergebnis/composer-normalize) +### is a dev requirement in `composer.json`: +### +### ``` shell +### docker compose run --rm phpfpm composer require --dev ergebnis/composer-normalize +### ``` +### +### Normalize `composer.json` by running +### +### ``` shell +### docker compose run --rm phpfpm composer normalize +### ``` + +name: Composer + +env: + COMPOSE_USER: root + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + composer-validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm phpfpm composer validate --strict + + composer-normalized: + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm phpfpm composer install + docker compose run --rm phpfpm composer normalize --dry-run + + composer-audit: + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm phpfpm composer audit diff --git a/.github/workflows/doctrine.yaml b/.github/workflows/doctrine.yaml new file mode 100644 index 0000000..696886d --- /dev/null +++ b/.github/workflows/doctrine.yaml @@ -0,0 +1,41 @@ +name: Doctrine + +env: + COMPOSE_USER: root + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + coding-standards: + name: Validate Schema + runs-on: ubuntu-latest + env: + APP_ENV: prod + + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - name: Run Composer Install + run: | + docker compose run --rm phpfpm composer install + + - name: Run Doctrine Migrations + run: | + docker compose run --rm phpfpm bin/console doctrine:migrations:migrate --no-interaction + + - name: Setup messenger "failed" doctrine transport to ensure db schema is updated + run: | + docker compose run --rm phpfpm bin/console messenger:setup-transports failed + + - name: Validate Doctrine schema + run: | + docker compose run --rm phpfpm bin/console doctrine:schema:validate diff --git a/.github/workflows/github_build_release.yml b/.github/workflows/github_build_release.yml index 28f350e..b26cea6 100644 --- a/.github/workflows/github_build_release.yml +++ b/.github/workflows/github_build_release.yml @@ -1,45 +1,45 @@ on: - push: - tags: - - '*.*.*' + push: + tags: + - "*.*.*" name: Create Github Release permissions: - contents: write + contents: write jobs: - create-release: - runs-on: ubuntu-latest - env: - COMPOSER_ALLOW_SUPERUSER: 1 - APP_ENV: prod - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Composer install - run: | - docker network create frontend - docker compose run --rm --user=root --env APP_ENV=prod phpfpm composer install --no-dev -o --classmap-authoritative - docker compose run --rm --user=root --env APP_ENV=prod phpfpm composer clear-cache - docker compose run --rm node yarn install - docker compose run --rm node yarn build - - - name: Make assets dir - run: | - mkdir -p ../assets - - - name: Create archive - run: tar --exclude='.git' --exclude='node_modules' -zcf ../assets/${{ github.event.repository.name }}-${{ github.ref_name }}.tar.gz ./ - - - name: Create checksum - run: | - cd ../assets - sha256sum ${{ github.event.repository.name }}-${{ github.ref_name }}.tar.gz > ../assets/checksum.txt - - - name: Create a release in GitHub and uploads assets - run: gh release create ${{ github.ref_name }} --verify-tag --generate-notes ../assets/*.* + create-release: + runs-on: ubuntu-latest env: - GITHUB_TOKEN: ${{ github.TOKEN }} - shell: bash + COMPOSER_ALLOW_SUPERUSER: 1 + APP_ENV: prod + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Composer install + run: | + docker network create frontend + docker compose run --rm --user=root --env APP_ENV=prod phpfpm composer install --no-dev -o --classmap-authoritative + docker compose run --rm --user=root --env APP_ENV=prod phpfpm composer clear-cache + docker compose run --rm node yarn install + docker compose run --rm node yarn build + + - name: Make assets dir + run: | + mkdir -p ../assets + + - name: Create archive + run: tar --exclude='.git' --exclude='node_modules' -zcf ../assets/${{ github.event.repository.name }}-${{ github.ref_name }}.tar.gz ./ + + - name: Create checksum + run: | + cd ../assets + sha256sum ${{ github.event.repository.name }}-${{ github.ref_name }}.tar.gz > ../assets/checksum.txt + + - name: Create a release in GitHub and uploads assets + run: gh release create ${{ github.ref_name }} --verify-tag --generate-notes ../assets/*.* + env: + GITHUB_TOKEN: ${{ github.TOKEN }} + shell: bash diff --git a/.github/workflows/javascript.yaml b/.github/workflows/javascript.yaml new file mode 100644 index 0000000..15f14b6 --- /dev/null +++ b/.github/workflows/javascript.yaml @@ -0,0 +1,35 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/symfony/javascript.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Symfony JavaScript (and TypeScript) +### +### Validates JavaScript files. +### +### #### Assumptions +### +### 1. A docker compose service named `prettier` for running +### [Prettier](https://prettier.io/) exists. + +name: JavaScript + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + javascript-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm prettier 'assets/**/*.js' --check diff --git a/.github/workflows/markdown.yaml b/.github/workflows/markdown.yaml new file mode 100644 index 0000000..cf4c011 --- /dev/null +++ b/.github/workflows/markdown.yaml @@ -0,0 +1,42 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/markdown.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Markdown +### +### Lints Markdown files (`**/*.md`) in the project. +### +### [markdownlint-cli configuration +### files](https://github.com/igorshubovych/markdownlint-cli?tab=readme-ov-file#configuration), +### `.markdownlint.jsonc` and `.markdownlintignore`, control what is actually +### linted and how. +### +### #### Assumptions +### +### 1. A docker compose service named `markdownlint` for running `markdownlint` +### (from +### [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli)) +### exists. + +name: Markdown + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + markdown-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm markdownlint markdownlint '**/*.md' diff --git a/.github/workflows/php.yaml b/.github/workflows/php.yaml new file mode 100644 index 0000000..d8942c7 --- /dev/null +++ b/.github/workflows/php.yaml @@ -0,0 +1,60 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/symfony/php.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Symfony PHP +### +### Checks that PHP code adheres to the [Symfony coding +### standards](https://symfony.com/doc/current/contributing/code/standards.html). +### +### #### Assumptions +### +### 1. A docker compose service named `phpfpm` can be run and `composer` can be +### run inside the `phpfpm` service. 2. +### [friendsofphp/php-cs-fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer) +### is a dev requirement in `composer.json`: +### +### ``` shell +### docker compose run --rm phpfpm composer require --dev friendsofphp/php-cs-fixer +### ``` +### +### Clean up and check code by running +### +### ``` shell +### docker compose run --rm phpfpm vendor/bin/php-cs-fixer fix +### docker compose run --rm phpfpm vendor/bin/php-cs-fixer fix --dry-run --diff +### ``` +### +### > [!NOTE] The template adds `.php-cs-fixer.dist.php` as [a configuration +### > file for PHP CS +### > Fixer](https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/master/doc/config.rst) +### > and this makes it possible to override the actual configuration used in a +### > project by adding a more important configuration file, `.php-cs-fixer.php`. + +name: Symfony PHP + +env: + COMPOSE_USER: root + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + coding-standards: + name: PHP - Check Coding Standards + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm phpfpm composer install + # https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/master/doc/usage.rst#the-check-command + docker compose run --rm phpfpm vendor/bin/php-cs-fixer fix --dry-run --diff diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index eca4339..5f6e255 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,286 +1,95 @@ -on: pull_request -name: Review -jobs: - test-composer-install: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - php: ["8.4"] - name: Validate composer (PHP ${{ matrix.php}}) - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php}} - extensions: apcu, ctype, iconv, imagick, json, redis, soap, xmlreader, zip - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Validate composer files - run: composer validate composer.json --strict - - - name: '[prod] Composer install with exported .env variables' - run: | - set -a && source .env && set +a - APP_ENV=prod composer install --no-dev -o - - - name: Reset composer install - run: rm -rf ./vendor - - - name: '[dev] Composer install with exported .env variables' - run: | - set -a && source .env && set +a - APP_ENV=dev composer install - - - name: Normalize composer files - run: composer normalize --dry-run - - validate-doctrine-schema: - runs-on: ubuntu-latest - env: - DATABASE_URL: mysql://db:db@127.0.0.1:3306/db?serverVersion=10.11.0-mariadb - strategy: - fail-fast: false - matrix: - php: ["8.4"] - name: Validate Doctrine Schema (PHP ${{ matrix.php}}) - services: - mariadb: - image: mariadb:10.11 - env: - MYSQL_USER: db - MYSQL_PASSWORD: db - MYSQL_DATABASE: db - MYSQL_ROOT_PASSWORD: db - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php}} - extensions: apcu, ctype, iconv, imagick, json, redis, soap, xmlreader, zip - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer - - - name: 'Composer install with exported .env variables' - run: | - set -a && source .env && set +a - APP_ENV=prod composer install --no-dev -o - - - name: Run Doctrine Migrations - run: APP_ENV=prod php bin/console doctrine:migrations:migrate --no-interaction - - - name: Setup messenger "failed" doctrine transport to ensure db schema is updated - run: APP_ENV=prod php bin/console messenger:setup-transports failed - - - name: Validate Doctrine schema - run: APP_ENV=prod php bin/console doctrine:schema:validate - - php-cs-fixer: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - php: ["8.4"] - name: PHP Coding Standards Fixer (PHP ${{ matrix.php }}) - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php}} - extensions: apcu, ctype, iconv, imagick, json, redis, soap, xmlreader, zip - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer +name: PR Review - - name: Install Dependencies - run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist +env: + COMPOSE_USER: root - - name: php-cs-fixer - run: composer coding-standards-check - - phpunit: - runs-on: ubuntu-latest - services: - mariadb: - image: mariadb:10.5 - ports: - - 3306 - env: - MYSQL_USER: db - MYSQL_PASSWORD: db - MYSQL_DATABASE: db_test - MYSQL_ROOT_PASSWORD: password - options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 - strategy: - fail-fast: false - matrix: - php: ["8.4"] - name: PHP Unit tests (PHP ${{ matrix.php }}) - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php}} - extensions: apcu, ctype, iconv, imagick, json, redis, soap, xmlreader, zip - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer - - - name: Install Dependencies - run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - - - name: PHP Unit - env: - PORT: ${{ job.services.mariadb.ports[3306] }} - run: DATABASE_URL="mysql://db:db@127.0.0.1:$PORT/db?serverVersion=mariadb-10.5.13" composer run tests - - apispec: - runs-on: ubuntu-latest - name: API Specification validation - strategy: - fail-fast: false - matrix: - php: ["8.4"] - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - - name: Setup PHP, with composer and extensions - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php}} - extensions: apcu, ctype, iconv, imagick, json, redis, soap, xmlreader, zip - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer - - - name: Install Dependencies - run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - - - name: Export specifications (yaml) - run: bin/console api:openapi:export --yaml --output=public/api-spec-v1.yaml --no-interaction - - - name: Check for changes in specifications (yaml) - run: git diff --diff-filter=ACMRT --exit-code public/api-spec-v1.yaml - - fixtures: - runs-on: ubuntu-latest - name: Load fixtures - strategy: - fail-fast: false - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - - name: Install site - run: | - docker network create frontend - docker compose pull - docker compose up --detach - docker compose exec --user=root phpfpm composer install - docker compose exec phpfpm bin/console doctrine:migrations:migrate --no-interaction - - - name: Load fixtures - run: | - docker compose exec phpfpm composer fixtures - - build-assets: - runs-on: ubuntu-latest - name: Build assets - strategy: - fail-fast: false - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 2 - - - name: Build assets - run: | - docker network create frontend - docker compose run --rm node yarn install - docker compose run --rm node yarn build - - changelog: - runs-on: ubuntu-latest - name: Changelog should be updated - strategy: - fail-fast: false - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - - name: Git fetch - run: git fetch +on: pull_request - - name: Check that changelog has been updated. - run: git diff --exit-code origin/develop -- CHANGELOG.md && exit 1 || exit 0 +jobs: + test-suite: + name: Test suite + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Install Task + uses: go-task/setup-task@v1 + + - name: Setup docker network + run: | + docker network create frontend + + - name: Install Site + run: | + task site:install + + - name: Test suite + run: | + task test:setup + task test + + - name: Upload coverage to Codecov test + uses: codecov/codecov-action@v5 + with: + files: ./coverage/unit.xml + flags: unittests + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + phpstan: + name: PHPStan + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Install Task + uses: go-task/setup-task@v1 + + - name: Start docker compose setup + run: | + docker network create frontend + task compose -- up --detach + + - name: Install Dependencies + run: | + task composer -- install + + - name: Run PHPStan + run: | + task code-analysis:phpstan + + fixtures: + name: Load fixtures + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Install Task + uses: go-task/setup-task@v1 + + - name: Setup docker network + run: | + docker network create frontend + + - name: Install Site + run: | + task site:install + + - name: Load fixtures + run: | + task fixtures:load --yes + + build-assets: + name: Build assets + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + fetch-depth: 2 + + - name: Build assets + run: | + docker network create frontend + docker compose run --rm node yarn install + docker compose run --rm node yarn build diff --git a/.github/workflows/styles.yaml b/.github/workflows/styles.yaml new file mode 100644 index 0000000..985e56f --- /dev/null +++ b/.github/workflows/styles.yaml @@ -0,0 +1,35 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/symfony/styles.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Symfony Styles (CSS and SCSS) +### +### Validates styles files. +### +### #### Assumptions +### +### 1. A docker compose service named `prettier` for running +### [Prettier](https://prettier.io/) exists. + +name: Styles + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + styles-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm prettier 'assets/**/*.{css,scss}' --check diff --git a/.github/workflows/twig.yaml b/.github/workflows/twig.yaml new file mode 100644 index 0000000..680a42d --- /dev/null +++ b/.github/workflows/twig.yaml @@ -0,0 +1,49 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/twig.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### Twig +### +### Validates Twig files +### +### #### Assumptions +### +### 1. A docker compose service named `phpfpm` can be run and `composer` can be +### run inside the `phpfpm` service. +### 2. [vincentlanglet/twig-cs-fixer](https://github.com/VincentLanglet/Twig-CS-Fixer) +### is a dev requirement in `composer.json`: +### +### ``` shell +### docker compose run --rm phpfpm composer require --dev vincentlanglet/twig-cs-fixer +### ``` +### +### 3. A [Configuration +### file](https://github.com/VincentLanglet/Twig-CS-Fixer/blob/main/docs/configuration.md#configuration-file) +### in the root of the project defines which files to check and rules to use. + +name: Twig + +env: + COMPOSE_USER: root + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + twig-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm phpfpm composer install + docker compose run --rm phpfpm vendor/bin/twig-cs-fixer lint diff --git a/.github/workflows/yaml.yaml b/.github/workflows/yaml.yaml new file mode 100644 index 0000000..3115e31 --- /dev/null +++ b/.github/workflows/yaml.yaml @@ -0,0 +1,41 @@ +# Do not edit this file! Make a pull request on changing +# github/workflows/yaml.yaml in +# https://github.com/itk-dev/devops_itkdev-docker if need be. + +### ### YAML +### +### Validates YAML files. +### +### #### Assumptions +### +### 1. A docker compose service named `prettier` for running +### [Prettier](https://prettier.io/) exists. +### +### #### Symfony YAML +### +### Symfony's YAML config files use 4 spaces for indentation and single quotes. +### Therefore, we use a [Prettier configuration +### file](https://prettier.io/docs/configuration), `.prettierrc.yaml`, to make +### Prettier format YAML files in the `config/` folder like Symfony expects. + +name: YAML + +on: + pull_request: + push: + branches: + - main + - develop + +jobs: + yaml-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Create docker network + run: | + docker network create frontend + + - run: | + docker compose run --rm prettier '**/*.{yml,yaml}' --check diff --git a/.gitignore b/.gitignore index 2bf29f0..4e7ed3e 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,13 @@ yarn-error.log phpstan.neon ###< phpstan/phpstan ### .phpunit.cache + +###> vincentlanglet/twig-cs-fixer ### +/.twig-cs-fixer.cache +###< vincentlanglet/twig-cs-fixer ### + +###> symfony/asset-mapper ### +/public/assets/ +/assets/vendor/ +###< symfony/asset-mapper ### +coverage diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc new file mode 100644 index 0000000..0253096 --- /dev/null +++ b/.markdownlint.jsonc @@ -0,0 +1,22 @@ +// This file is copied from config/markdown/.markdownlint.jsonc in https://github.com/itk-dev/devops_itkdev-docker. +// Feel free to edit the file, but consider making a pull request if you find a general issue with the file. + +// markdownlint-cli configuration file (cf. https://github.com/igorshubovych/markdownlint-cli?tab=readme-ov-file#configuration) +{ + "default": true, + // https://github.com/DavidAnson/markdownlint/blob/main/doc/md013.md + "line-length": { + "line_length": 120, + "code_blocks": false, + "tables": false + }, + // https://github.com/DavidAnson/markdownlint/blob/main/doc/md024.md + "no-duplicate-heading": { + "siblings_only": true + }, + // https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/organizing-information-with-collapsed-sections#creating-a-collapsed-section + // https://github.com/DavidAnson/markdownlint/blob/main/doc/md033.md + "no-inline-html": { + "allowed_elements": ["details", "summary"] + } +} diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000..d143ace --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,12 @@ +# This file is copied from config/markdown/.markdownlintignore in https://github.com/itk-dev/devops_itkdev-docker. +# Feel free to edit the file, but consider making a pull request if you find a general issue with the file. + +# https://github.com/igorshubovych/markdownlint-cli?tab=readme-ov-file#ignoring-files +vendor/ +node_modules/ +LICENSE.md +# Drupal +web/*.md +web/core/ +web/libraries/ +web/*/contrib/ diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index bb6c6e9..c23b927 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -1,19 +1,20 @@ in(__DIR__) - ->exclude('var') -; +// https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/blob/master/doc/config.rst -return (new PhpCsFixer\Config()) - ->setRiskyAllowed(true) - ->setRules([ - '@Symfony' => true, - '@Symfony:risky' => false, - 'phpdoc_align' => false, - 'no_superfluous_phpdoc_tags' => false, - 'array_syntax' => ['syntax' => 'short'], - 'declare_strict_types' => true - ]) - ->setFinder($finder) -; +$finder = new PhpCsFixer\Finder(); +// Check all files … +$finder->in(__DIR__); +// … that are not ignored by VCS +$finder->ignoreVCSIgnored(true); + +$config = new PhpCsFixer\Config(); +$config->setFinder($finder); + +$config->setRules([ + '@Symfony' => true, +]); + +return $config; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..bb35050 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +# API spec +public/api-spec-v1.yaml diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..5b271ea --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,11 @@ +# This file is copied from config/symfony/yaml/.prettierrc.yaml in https://github.com/itk-dev/devops_itkdev-docker. +# Feel free to edit the file, but consider making a pull request if you find a general issue with the file. + +# https://prettier.io/docs/configuration +overrides: + # Symfony config + - files: + - "config/**/*.{yml,yaml}" + options: + tabWidth: 4 + singleQuote: true diff --git a/.twig-cs-fixer.dist.php b/.twig-cs-fixer.dist.php new file mode 100644 index 0000000..8242555 --- /dev/null +++ b/.twig-cs-fixer.dist.php @@ -0,0 +1,16 @@ +in(__DIR__); +// … that are not ignored by VCS +$finder->ignoreVCSIgnored(true); + +$config = new TwigCsFixer\Config\Config(); +$config->setFinder($finder); + +return $config; diff --git a/.woodpecker/prod.yml b/.woodpecker/prod.yml index 9bf9692..e3c1cc2 100644 --- a/.woodpecker/prod.yml +++ b/.woodpecker/prod.yml @@ -1,45 +1,45 @@ when: - - event: release + - event: release skip_clone: true labels: - zone: CLOUD + zone: CLOUD steps: - - name: Ansible playbook - image: itkdev/ansible-plugin:1 - pull: true - settings: - id: - from_secret: id - secret: - from_secret: secret - host: - from_secret: prod_host - path: - from_secret: prod_path - user: - from_secret: user - keep: 4 - playbook: 'release' - pre_up: - - itkdev-docker-compose-server run phpfpm bin/console doctrine:migrations:migrate --no-interaction - - itkdev-docker-compose-server run phpfpm bin/console messenger:setup-transports + - name: Ansible playbook + image: itkdev/ansible-plugin:1 + pull: true + settings: + id: + from_secret: id + secret: + from_secret: secret + host: + from_secret: prod_host + path: + from_secret: prod_path + user: + from_secret: user + keep: 4 + playbook: "release" + pre_up: + - itkdev-docker-compose-server run phpfpm bin/console doctrine:migrations:migrate --no-interaction + - itkdev-docker-compose-server run phpfpm bin/console messenger:setup-transports - - name: Run post deploy - image: itkdev/ansible-plugin:1 - pull: true - settings: - id: - from_secret: id - secret: - from_secret: secret - host: - from_secret: prod_host - path: - from_secret: prod_path - user: - from_secret: user - actions: - - itkdev-docker-compose-server exec phpfpm bin/console cache:clear + - name: Run post deploy + image: itkdev/ansible-plugin:1 + pull: true + settings: + id: + from_secret: id + secret: + from_secret: secret + host: + from_secret: prod_host + path: + from_secret: prod_path + user: + from_secret: user + actions: + - itkdev-docker-compose-server exec phpfpm bin/console cache:clear diff --git a/.woodpecker/stg.yml b/.woodpecker/stg.yml index 64ded24..0a5749a 100644 --- a/.woodpecker/stg.yml +++ b/.woodpecker/stg.yml @@ -1,37 +1,37 @@ when: - - branch: release/* - event: push + - branch: release/* + event: push skip_clone: true labels: - zone: DMZ + zone: DMZ steps: - - name: Run stg site update - image: itkdev/ansible-plugin:1 - when: - branch: release/* - event: push - pull: true - settings: - id: - from_secret: id - secret: - from_secret: secret - host: - from_secret: stg_host - path: - from_secret: stg_path - user: - from_secret: user - actions: - - git reset --hard - - git fetch origin ${CI_COMMIT_BRANCH} - - git checkout ${CI_COMMIT_BRANCH} - - git pull - - itkdev-docker-compose-server up -d --force-recreate --remove-orphans - - itkdev-docker-compose-server exec phpfpm composer install -no-dev -o --classmap-authoritative - - itkdev-docker-compose-server exec phpfpm bin/console doctrine:migrations:migrate --no-interaction - - itkdev-docker-compose-server exec phpfpm bin/console messenger:setup-transports - - itkdev-docker-compose-server exec phpfpm bin/console cache:clear + - name: Run stg site update + image: itkdev/ansible-plugin:1 + when: + branch: release/* + event: push + pull: true + settings: + id: + from_secret: id + secret: + from_secret: secret + host: + from_secret: stg_host + path: + from_secret: stg_path + user: + from_secret: user + actions: + - git reset --hard + - git fetch origin ${CI_COMMIT_BRANCH} + - git checkout ${CI_COMMIT_BRANCH} + - git pull + - itkdev-docker-compose-server up -d --force-recreate --remove-orphans + - itkdev-docker-compose-server exec phpfpm composer install -no-dev -o --classmap-authoritative + - itkdev-docker-compose-server exec phpfpm bin/console doctrine:migrations:migrate --no-interaction + - itkdev-docker-compose-server exec phpfpm bin/console messenger:setup-transports + - itkdev-docker-compose-server exec phpfpm bin/console cache:clear diff --git a/CHANGELOG.md b/CHANGELOG.md index cf0a0af..b1bf9dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- [#60](https://github.com/itk-dev/devops_itksites/pull/60) 5564: Dependency updates + - Update dependencies + - Update phpunit from 11 to 12 + - Update ITK docker template + - Update github actions workflows + - [#58](https://github.com/itk-dev/devops_itksites/pull/58) 5002: Added export to everything @@ -61,7 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgrade to: Symfony 7.2, Doctrine ORM 3.x / DBAL 4.x, Api-platform 4.0, PhpUnit 11 with dependencies - Switch to PHPStan - Added cleanup for detection results -- Refactor rootDir normalization to ensure values are always normalized, fix type errors, +- Refactor rootDir normalization to ensure values are always normalized, fix type errors, - Fix various values not being set ## [1.7.1] - 2024-11-08 @@ -133,6 +139,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.0.0] - 2022-09-15 [Unreleased]: https://github.com/itk-dev/devops_itksites/compare/1.6.0...HEAD +[1.8.10]: https://github.com/itk-dev/devops_itksites/compare/1.8.9...1.8.10 +[1.8.9]: https://github.com/itk-dev/devops_itksites/compare/1.8.8...1.8.9 +[1.8.8]: https://github.com/itk-dev/devops_itksites/compare/1.8.7...1.8.8 +[1.8.7]: https://github.com/itk-dev/devops_itksites/compare/1.8.6...1.8.7 +[1.8.6]: https://github.com/itk-dev/devops_itksites/compare/1.8.5...1.8.6 +[1.8.5]: https://github.com/itk-dev/devops_itksites/compare/1.8.4...1.8.5 +[1.8.4]: https://github.com/itk-dev/devops_itksites/compare/1.8.3...1.8.4 +[1.8.3]: https://github.com/itk-dev/devops_itksites/compare/1.8.2...1.8.3 +[1.8.2]: https://github.com/itk-dev/devops_itksites/compare/1.8.1...1.8.2 +[1.8.1]: https://github.com/itk-dev/devops_itksites/compare/1.8.0...1.8.1 +[1.8.0]: https://github.com/itk-dev/devops_itksites/compare/1.7.1...1.8.0 +[1.7.1]: https://github.com/itk-dev/devops_itksites/compare/1.7.0...1.7.1 +[1.7.0]: https://github.com/itk-dev/devops_itksites/compare/1.6.1...1.7.0 +[1.6.1]: https://github.com/itk-dev/devops_itksites/compare/1.6.0...1.6.1 [1.6.0]: https://github.com/itk-dev/devops_itksites/compare/1.5.0...1.6.0 [1.5.0]: https://github.com/itk-dev/devops_itksites/compare/1.4.1...1.5.0 [1.4.1]: https://github.com/itk-dev/devops_itksites/compare/1.4.0...1.4.1 diff --git a/README.md b/README.md index a1fc813..72b2dff 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ [![GitHub last commit](https://img.shields.io/github/last-commit/itk-dev/devops_itksites?style=flat-square)](https://github.com/itk-dev/devops_itksites/commits/develop/) [![GitHub License](https://img.shields.io/github/license/itk-dev/devops_itksites?style=flat-square)](https://github.com/itk-dev/devops_itksites/blob/develop/LICENSE) - This is our internal server and site registration tool. It works in tandem with our [ITK sites server harvester](https://github.com/itk-dev/devops_itkServerHarvest). The harvester is installed by default on all servers, and runs at intervals and collects @@ -15,6 +14,7 @@ information about sites and installations running on the server. These are sent `DetectionResults` to ITKsites where they are analysed and processed. This allows us to monitor + * What is installed and running * Which sites/domains we are hosting * What docker images we are running @@ -23,6 +23,7 @@ This allows us to monitor * What git repositories we are hosting Additionally we can register and document + * All OpenID Connect setups * All Services Certificates @@ -30,6 +31,7 @@ Servers, OpenID Connect setups, Services Certificates must be created and mainta All other information is kept up to date by analysing the DetectionResults. ## Architecture + This is a Symfony 6 project build with api-platform 3.x and EasyAdmin. Api-platform provides a simple REST api for POST'ing the DetectionResults. @@ -54,6 +56,7 @@ docker compose exec phpfpm bin/console doctrine:migrations:migrate --no-interact Then create a `.env.local` file to set secrets for your local setup. ### OpenID Connect + All users access is controlled by OpenID Connect. For local development you must add the following to your `.env.local` file: @@ -94,11 +97,13 @@ docker compose exec phpfpm bin/console itk-dev:openid-connect:login admin@exampl All processing of Detctionresults is done in a series of message handlers. To run these do either: + ```shell docker compose exec phpfpm composer queues ``` or + ```shell docker compose exec phpfpm bin/console messenger:consume async --failure-limit=1 -vvv ``` diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..cd73982 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,220 @@ +# https://taskfile.dev + +version: "3" + +# https://taskfile.dev/usage/#env-files +dotenv: [".env.local", ".env"] + +vars: + # https://taskfile.dev/reference/templating/ + DOCKER_COMPOSE: '{{.TASK_DOCKER_COMPOSE | default "docker compose"}}' + +tasks: + site:update: + desc: Update/install site + aliases: [site:install] + cmds: + - task: compose + vars: + COMPOSE_ARGS: pull + - task: compose + vars: + COMPOSE_ARGS: up --detach + - task: composer + vars: + COMPOSER_ARGS: install + - task: console + vars: + CONSOLE_ARGS: doctrine:migrations:migrate --no-interaction + - task: console + vars: + CONSOLE_ARGS: messenger:setup-transports + + fixtures:load: + desc: Load all fixtures + prompt: Really load all fixtures? + cmds: + - task: console + vars: + CONSOLE_ARGS: hautelook:fixtures:load --no-interaction + silent: true + + composer: + desc: "Run `composer` command. Example: task composer -- normalize" + cmds: + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm composer {{.COMPOSER_ARGS}} + + compose: + desc: "Run `docker compose` command. Example: task compose -- ps" + cmds: + # Run docker compose with both arguments passed via var plus any cli args. + - "{{.DOCKER_COMPOSE}} {{.COMPOSE_ARGS}} {{.CLI_ARGS}}" + + console: + desc: "Run Symfony console command. Example: task console -- cache:clear" + cmds: + # Run docker compose with both arguments passed via var plus any cli args. + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm bin/console {{.CONSOLE_ARGS}} + + coding-standards:apply: + desc: "Apply coding standards" + cmds: + - task: coding-standards:markdown:apply + - task: coding-standards:php:apply + - task: coding-standards:twig:apply + - task: coding-standards:yaml:apply + - task: coding-standards:css:apply + silent: true + + coding-standards:check: + desc: "Apply coding standards" + cmds: + - task: coding-standards:markdown:check + - task: coding-standards:php:check + - task: coding-standards:twig:check + - task: coding-standards:yaml:check + - task: coding-standards:css:check + silent: true + + coding-standards:markdown:apply: + desc: "Apply coding standards for Markdown" + cmds: + - task: compose + vars: + COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' --fix + + coding-standards:markdown:check: + desc: "Apply and check coding standards for Markdown" + cmds: + - task: coding-standards:markdown:apply + - task: compose + vars: + COMPOSE_ARGS: run --rm markdownlint markdownlint '**/*.md' + + coding-standards:php:apply: + desc: "Apply coding standards for PHP" + cmds: + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm vendor/bin/php-cs-fixer fix + silent: true + + coding-standards:php:check: + desc: "Apply and check coding standards for PHP" + cmds: + - task: coding-standards:php:apply + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm vendor/bin/php-cs-fixer check + silent: true + + coding-standards:twig:apply: + desc: "Apply coding standards for Twig" + cmds: + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm vendor/bin/twig-cs-fixer fix + silent: true + + coding-standards:twig:check: + desc: "Apply and check coding standards for Twig" + cmds: + - task: coding-standards:twig:apply + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm vendor/bin/twig-cs-fixer check + silent: true + + coding-standards:yaml:apply: + desc: "Apply coding standards for YAML" + cmds: + - task: compose + vars: + COMPOSE_ARGS: run --rm prettier '**/*.{yml,yaml}' --write + silent: true + + coding-standards:yaml:check: + desc: "Apply and check coding standards for YAML" + cmds: + - task: coding-standards:yaml:apply + - task: compose + vars: + COMPOSE_ARGS: run --rm prettier '**/*.{yml,yaml}' --check + + coding-standards:css:apply: + desc: "Apply coding standards for YAML" + cmds: + - task: compose + vars: + COMPOSE_ARGS: run --rm prettier 'assets/**/*.{css,scss}' --write + silent: true + + coding-standards:css:check: + desc: "Apply and check coding standards for YAML" + cmds: + - task: coding-standards:yaml:apply + - task: compose + vars: + COMPOSE_ARGS: run --rm prettier 'assets/**/*.{css,scss}' --check + silent: true + + code-analysis: + desc: "Run code analysis" + cmds: + - task: code-analysis:phpstan + silent: true + + code-analysis:phpstan: + desc: "Run PHPStan" + cmds: + - task: compose + vars: + COMPOSE_ARGS: exec phpfpm vendor/bin/phpstan + silent: true + + messenger:consume: + desc: "Run queue consumer" + cmds: + - task: console + vars: + CONSOLE_ARGS: bin/console messenger:consume async --failure-limit=1 -vvv + + test:setup: + desc: "Setup test environment" + cmds: + - task: console + vars: + CONSOLE_ARGS: --env=test doctrine:database:create --if-not-exists --no-interaction + - task: console + vars: + CONSOLE_ARGS: --env=test doctrine:database:create --no-interaction --if-not-exists --quiet + - task: console + vars: + CONSOLE_ARGS: --env=test doctrine:migrations:migrate --no-interaction --quiet + + test: + desc: "Run tests" + cmds: + - task: compose + vars: + COMPOSE_ARGS: exec --env XDEBUG_MODE=coverage phpfpm vendor/bin/phpunit --coverage-clover=coverage/unit.xml + + api:spec:export: + desc: "Export API spec" + cmds: + - task: console + vars: + CONSOLE_ARGS: api:openapi:export --yaml --output=public/api-spec-v1.yaml --no-interaction + - task: console + vars: + CONSOLE_ARGS: api:openapi:export --json --output=public/api-spec-v1.json --no-interaction + silent: true + + default: + cmds: + - task --list + silent: true diff --git a/assets/app.js b/assets/app.js new file mode 100644 index 0000000..e2824a5 --- /dev/null +++ b/assets/app.js @@ -0,0 +1,9 @@ +/* + * Welcome to your app's main JavaScript file! + * + * This file will be included onto the page via the importmap() Twig function, + * which should already be in your base.html.twig. + */ +import "./styles/app.css"; + +console.log("This log comes from assets/app.js - welcome to AssetMapper! 🎉"); diff --git a/assets/styles/app.css b/assets/styles/app.css new file mode 100644 index 0000000..8218dc7 --- /dev/null +++ b/assets/styles/app.css @@ -0,0 +1,28 @@ +:root { + --body-max-width: 100%; + --sidebar-bg: #fff; + /* make the base font size smaller */ + --button-primary-bg: rgb(0, 123, 166); + --pagination-active-bg: rgb(0, 123, 166); + --link-color: rgb(0, 123, 166); + --sidebar-menu-active-item-color: rgb(0, 123, 166); + --badge-boolean-true-bg: rgb(0, 123, 166); + --badge-boolean-false-bg: rgb(228, 73, 48); + --badge-boolean-false-color: var(--white); + --sidebar-menu-color: rgb(66, 66, 66); + --text-color-dark: rgb(66, 66, 66); + --bs-danger-rgb: 228, 73, 48; +} + +/* Grouped dropdown group styling for index pages */ +.dropdown-menu { + .btn-danger i, + .text-danger i { + color: var(--button-invisible-danger-color); + } + + a.btn-danger:hover, + a.text-danger:hover { + background: var(--button-invisible-danger-hover-hover-bg); + } +} diff --git a/composer.json b/composer.json index abe2133..57405df 100644 --- a/composer.json +++ b/composer.json @@ -4,63 +4,69 @@ "license": "MIT", "type": "project", "require": { - "php": ">=8.3", + "php": ">=8.4", "ext-ctype": "*", "ext-iconv": "*", - "api-platform/core": "^4.0", - "composer/semver": "^3.4", - "doctrine/dbal": "^4.0", - "doctrine/doctrine-bundle": "^2.13", - "doctrine/doctrine-migrations-bundle": "^3.4", - "doctrine/orm": "^3.0", - "easycorp/easyadmin-bundle": "^4.0", - "itk-dev/openid-connect-bundle": "^4.0", - "itk-dev/vault-bundle": "^0.1.0", - "nelmio/cors-bundle": "^2.2", - "ocramius/doctrine-batch-utils": "^2.8", - "phpdocumentor/reflection-docblock": "^5.3", - "phpstan/phpdoc-parser": "^2.0", - "symfony/amqp-messenger": "^7.2", - "symfony/asset": "^7.2", - "symfony/browser-kit": "^7.2", - "symfony/console": "^7.2", - "symfony/doctrine-messenger": "^7.2", - "symfony/dotenv": "^7.2", - "symfony/expression-language": "^7.2", - "symfony/flex": "^2", - "symfony/framework-bundle": "^7.2", - "symfony/http-client": "^7.2", - "symfony/messenger": "^7.2", - "symfony/monolog-bundle": "^3.0", - "symfony/property-access": "^7.2", - "symfony/property-info": "^7.2", - "symfony/runtime": "^7.2", - "symfony/security-bundle": "^7.2", - "symfony/serializer": "^7.2", - "symfony/twig-bundle": "^7.2", - "symfony/uid": "^7.2", - "symfony/validator": "^7.2", - "symfony/webpack-encore-bundle": "^2.0", - "symfony/yaml": "^7.2" + "ext-mbstring": "*", + "api-platform/core": "~4.1.25", + "composer/semver": "^3.4.4", + "doctrine/dbal": "^4.3.4", + "doctrine/doctrine-bundle": "^2.18", + "doctrine/doctrine-migrations-bundle": "^3.5", + "doctrine/orm": "^3.5.2", + "easycorp/easyadmin-bundle": "^4.26.3", + "itk-dev/openid-connect-bundle": "^4.0.1", + "itk-dev/vault-bundle": "^0.1.2", + "nelmio/cors-bundle": "^2.5", + "ocramius/doctrine-batch-utils": "^2.11", + "phpdocumentor/reflection-docblock": "^5.6.3", + "phpstan/phpdoc-parser": "^2.3", + "symfony/amqp-messenger": "^7.3.2", + "symfony/asset": "^7.3.0", + "symfony/asset-mapper": "^7.3.4", + "symfony/browser-kit": "^7.3.2", + "symfony/console": "^7.3.4", + "symfony/doctrine-messenger": "^7.3.4", + "symfony/dotenv": "^7.3.2", + "symfony/expression-language": "^7.3.2", + "symfony/flex": "^2.8.2", + "symfony/framework-bundle": "^7.3.4", + "symfony/http-client": "^7.3.4", + "symfony/messenger": "^7.3.3", + "symfony/monolog-bundle": "^3.10", + "symfony/object-mapper": "^7.3.0", + "symfony/property-access": "^7.3.3", + "symfony/property-info": "^7.3.4", + "symfony/runtime": "^7.3.4", + "symfony/security-bundle": "^7.3.4", + "symfony/serializer": "^7.3.4", + "symfony/twig-bundle": "^7.3.4", + "symfony/uid": "^7.3.1", + "symfony/validator": "^7.3.4", + "symfony/webpack-encore-bundle": "^2.3", + "symfony/yaml": "^7.3.3", + "twig/extra-bundle": "^2.12 || ^3.21", + "twig/twig": "^2.12 || ^3.21.1" }, "require-dev": { - "ergebnis/composer-normalize": "^2.23", - "friendsofphp/php-cs-fixer": "^3.6", - "hautelook/alice-bundle": "^2.14", - "justinrainbow/json-schema": "^6.0", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-doctrine": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-symfony": "^2.0", - "phpunit/phpunit": "^11.3", - "rector/rector": "^2.0", - "symfony/css-selector": "^7.2", - "symfony/debug-bundle": "^7.2", - "symfony/maker-bundle": "^1.37", - "symfony/stopwatch": "^7.2", - "symfony/var-dumper": "^7.2", - "symfony/web-profiler-bundle": "^7.2" + "ergebnis/composer-normalize": "^2.48.2", + "friendsofphp/php-cs-fixer": "^3.88.2", + "hautelook/alice-bundle": "^2.15.1", + "justinrainbow/json-schema": "^6.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.31", + "phpstan/phpstan-doctrine": "^2.0.10", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-symfony": "^2.0.8", + "phpunit/phpunit": "^12.4.1", + "rector/rector": "^2.2.3", + "symfony/css-selector": "^7.3", + "symfony/debug-bundle": "^7.3.4", + "symfony/maker-bundle": "^1.64", + "symfony/stopwatch": "^7.3", + "symfony/var-dumper": "^7.3.4", + "symfony/web-profiler-bundle": "^7.3.4", + "vincentlanglet/twig-cs-fixer": "^3.10" }, "replace": { "symfony/polyfill-ctype": "*", @@ -98,7 +104,7 @@ }, "extra": { "symfony": { - "allow-contrib": false, + "allow-contrib": true, "require": "7.3.*" } }, @@ -111,29 +117,8 @@ ], "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd" - }, - "coding-standards-apply": [ - "PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix" - ], - "coding-standards-check": [ - "PHP_CS_FIXER_IGNORE_ENV=1 vendor/bin/php-cs-fixer fix --dry-run" - ], - "fixtures-load": [ - "bin/console hautelook:fixtures:load --no-interaction" - ], - "queues": [ - "bin/console messenger:consume async --failure-limit=1 -vvv" - ], - "tests": [ - "bin/console --env=test doctrine:database:drop --if-exists --force --quiet", - "bin/console --env=test doctrine:database:create --no-interaction --if-not-exists --quiet", - "bin/console --env=test doctrine:migrations:migrate --no-interaction --quiet", - "vendor/bin/phpunit --stop-on-failure" - ], - "update-api-spec": [ - "bin/console api:openapi:export --output=public/api-spec-v1.yaml --yaml --no-interaction", - "bin/console api:openapi:export --output=public/api-spec-v1.json --no-interaction" - ] + "assets:install %PUBLIC_DIR%": "symfony-cmd", + "importmap:install": "symfony-cmd" + } } } diff --git a/composer.lock b/composer.lock index cbd5d07..c700676 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d347cd87a3a3926f9844ee4768154429", + "content-hash": "1e514f2fb03ce2e04966c86e6b5b2cc2", "packages": [ { "name": "api-platform/core", - "version": "v4.1.17", + "version": "v4.1.25", "source": { "type": "git", "url": "https://github.com/api-platform/core.git", - "reference": "e1191ca86e548d7610251bba2d8498b440cfd631" + "reference": "5c25cd2876740cd25e24efdbbb349359d5c98fc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/core/zipball/e1191ca86e548d7610251bba2d8498b440cfd631", - "reference": "e1191ca86e548d7610251bba2d8498b440cfd631", + "url": "https://api.github.com/repos/api-platform/core/zipball/5c25cd2876740cd25e24efdbbb349359d5c98fc1", + "reference": "5c25cd2876740cd25e24efdbbb349359d5c98fc1", "shasum": "" }, "require": { @@ -33,6 +33,7 @@ "symfony/serializer": "^6.4 || ^7.0", "symfony/translation-contracts": "^3.3", "symfony/type-info": "^7.2", + "symfony/validator": "^6.4 || ^7.1", "symfony/web-link": "^6.4 || ^7.1", "willdurand/negotiation": "^3.1" }, @@ -218,22 +219,22 @@ ], "support": { "issues": "https://github.com/api-platform/core/issues", - "source": "https://github.com/api-platform/core/tree/v4.1.17" + "source": "https://github.com/api-platform/core/tree/v4.1.25" }, - "time": "2025-06-19T10:14:20+00:00" + "time": "2025-09-26T15:30:38+00:00" }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -285,7 +286,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -295,13 +296,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "doctrine/collections", @@ -391,34 +388,34 @@ }, { "name": "doctrine/dbal", - "version": "4.2.4", + "version": "4.3.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec" + "reference": "1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b37d160498ea91a2382a2ebe825c4ea6254fc0ec", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc", + "reference": "1a2fbd0e93b8dec7c3d1ac2b6396a7b929b130dc", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "13.0.0", + "doctrine/coding-standard": "14.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.17", - "phpstan/phpstan-phpunit": "2.0.6", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.46", - "slevomat/coding-standard": "8.16.2", - "squizlabs/php_codesniffer": "3.13.1", + "phpunit/phpunit": "11.5.23", + "slevomat/coding-standard": "8.24.0", + "squizlabs/php_codesniffer": "4.0.0", "symfony/cache": "^6.3.8|^7.0", "symfony/console": "^5.4|^6.3|^7.0" }, @@ -477,7 +474,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.4" + "source": "https://github.com/doctrine/dbal/tree/4.3.4" }, "funding": [ { @@ -493,7 +490,7 @@ "type": "tidelift" } ], - "time": "2025-06-15T23:15:01+00:00" + "time": "2025-10-09T09:11:36+00:00" }, { "name": "doctrine/deprecations", @@ -545,20 +542,21 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.15.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6" + "reference": "cd5d4da6a5f7cf3d8708e17211234657b5eb4e95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d88294521a1bca943240adca65fa19ca8a7288c6", - "reference": "d88294521a1bca943240adca65fa19ca8a7288c6", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/cd5d4da6a5f7cf3d8708e17211234657b5eb4e95", + "reference": "cd5d4da6a5f7cf3d8708e17211234657b5eb4e95", "shasum": "" }, "require": { "doctrine/dbal": "^3.7.0 || ^4.0", + "doctrine/deprecations": "^1.0", "doctrine/persistence": "^3.1 || ^4", "doctrine/sql-formatter": "^1.0.1", "php": "^8.1", @@ -566,7 +564,6 @@ "symfony/config": "^6.4 || ^7.0", "symfony/console": "^6.4 || ^7.0", "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/deprecation-contracts": "^2.1 || ^3", "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3", "symfony/framework-bundle": "^6.4 || ^7.0", "symfony/service-contracts": "^2.5 || ^3" @@ -581,18 +578,17 @@ "require-dev": { "doctrine/annotations": "^1 || ^2", "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^13", - "doctrine/deprecations": "^1.0", + "doctrine/coding-standard": "^14", "doctrine/orm": "^2.17 || ^3.1", "friendsofphp/proxy-manager-lts": "^1.0", "phpstan/phpstan": "2.1.1", "phpstan/phpstan-phpunit": "2.0.3", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^9.6.22", + "phpunit/phpunit": "^10.5.53 || ^12.3.10", "psr/log": "^1.1.4 || ^2.0 || ^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", "symfony/messenger": "^6.4 || ^7.0", - "symfony/phpunit-bridge": "^7.2", "symfony/property-info": "^6.4 || ^7.0", "symfony/security-bundle": "^6.4 || ^7.0", "symfony/stopwatch": "^6.4 || ^7.0", @@ -602,7 +598,7 @@ "symfony/var-exporter": "^6.4.1 || ^7.0.1", "symfony/web-profiler-bundle": "^6.4 || ^7.0", "symfony/yaml": "^6.4 || ^7.0", - "twig/twig": "^2.13 || ^3.0.4" + "twig/twig": "^2.14.7 || ^3.0.4" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -647,7 +643,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.18.0" }, "funding": [ { @@ -663,24 +659,24 @@ "type": "tidelift" } ], - "time": "2025-06-16T19:53:58+00:00" + "time": "2025-10-11T04:43:27+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.2", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" + "reference": "71c81279ca0e907c3edc718418b93fd63074856c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", - "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/71c81279ca0e907c3edc718418b93fd63074856c", + "reference": "71c81279ca0e907c3edc718418b93fd63074856c", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^2.4", + "doctrine/doctrine-bundle": "^2.4 || ^3.0", "doctrine/migrations": "^3.2", "php": "^7.2 || ^8.0", "symfony/deprecation-contracts": "^2.1 || ^3", @@ -688,7 +684,7 @@ }, "require-dev": { "composer/semver": "^3.0", - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^12 || ^14", "doctrine/orm": "^2.6 || ^3", "phpstan/phpstan": "^1.4 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", @@ -732,7 +728,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.5.0" }, "funding": [ { @@ -748,7 +744,7 @@ "type": "tidelift" } ], - "time": "2025-03-11T17:36:26+00:00" + "time": "2025-10-12T17:06:40+00:00" }, { "name": "doctrine/event-manager", @@ -843,33 +839,32 @@ }, { "name": "doctrine/inflector", - "version": "2.0.10", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -914,7 +909,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -930,7 +925,7 @@ "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/instantiator", @@ -1081,16 +1076,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.1", + "version": "3.9.4", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999" + "reference": "1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/0f1e0c960ac29866d648a4f50142a74fe1cb6999", - "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c", + "reference": "1b88fcb812f2cd6e77c83d16db60e3cf1e35c66c", "shasum": "" }, "require": { @@ -1108,18 +1103,18 @@ "doctrine/orm": "<2.12 || >=4" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^13", "doctrine/orm": "^2.13 || ^3", "doctrine/persistence": "^2 || ^3 || ^4", "doctrine/sql-formatter": "^1.0", "ext-pdo_sqlite": "*", "fig/log-test": "^1", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.4", - "phpstan/phpstan-symfony": "^1.3", - "phpunit/phpunit": "^10.3", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpstan/phpstan-symfony": "^2", + "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0", "symfony/cache": "^5.4 || ^6.0 || ^7.0", "symfony/process": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" @@ -1164,7 +1159,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.1" + "source": "https://github.com/doctrine/migrations/tree/3.9.4" }, "funding": [ { @@ -1180,20 +1175,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T07:19:23+00:00" + "time": "2025-08-19T06:41:07+00:00" }, { "name": "doctrine/orm", - "version": "3.4.3", + "version": "3.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "ef607f26c2965fe460c55733cc7c031fb7e1f2fa" + "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/ef607f26c2965fe460c55733cc7c031fb7e1f2fa", - "reference": "ef607f26c2965fe460c55733cc7c031fb7e1f2fa", + "url": "https://api.github.com/repos/doctrine/orm/zipball/5a541b8b3a327ab1ea5f93b1615b4ff67a34e109", + "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109", "shasum": "" }, "require": { @@ -1268,22 +1263,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.4.3" + "source": "https://github.com/doctrine/orm/tree/3.5.2" }, - "time": "2025-06-27T12:14:15+00:00" + "time": "2025-08-08T17:00:40+00:00" }, { "name": "doctrine/persistence", - "version": "4.0.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa" + "reference": "dcbdfe4b211ae09478e192289cae7ab0987b29a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa", - "reference": "45004aca79189474f113cbe3a53847c2115a55fa", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/dcbdfe4b211ae09478e192289cae7ab0987b29a4", + "reference": "dcbdfe4b211ae09478e192289cae7ab0987b29a4", "shasum": "" }, "require": { @@ -1291,16 +1286,14 @@ "php": "^8.1", "psr/cache": "^1.0 || ^2.0 || ^3.0" }, - "conflict": { - "doctrine/common": "<2.10" - }, "require-dev": { "doctrine/coding-standard": "^12", "phpstan/phpstan": "1.12.7", "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", + "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "^9.6", - "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0" + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" }, "type": "library", "autoload": { @@ -1349,7 +1342,7 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/4.0.0" + "source": "https://github.com/doctrine/persistence/tree/4.1.0" }, "funding": [ { @@ -1365,7 +1358,7 @@ "type": "tidelift" } ], - "time": "2024-11-01T21:49:07+00:00" + "time": "2025-08-21T16:00:31+00:00" }, { "name": "doctrine/sql-formatter", @@ -1424,16 +1417,16 @@ }, { "name": "easycorp/easyadmin-bundle", - "version": "v4.24.9", + "version": "v4.26.3", "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "1f1ab3a897107e5c62657a8cb04790e297b95a21" + "reference": "fed89754c7532ce5592fda43921d810b59e24c4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/1f1ab3a897107e5c62657a8cb04790e297b95a21", - "reference": "1f1ab3a897107e5c62657a8cb04790e297b95a21", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/fed89754c7532ce5592fda43921d810b59e24c4c", + "reference": "fed89754c7532ce5592fda43921d810b59e24c4c", "shasum": "" }, "require": { @@ -1514,7 +1507,7 @@ ], "support": { "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", - "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.24.9" + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.26.3" }, "funding": [ { @@ -1522,7 +1515,7 @@ "type": "github" } ], - "time": "2025-06-17T18:10:27+00:00" + "time": "2025-10-08T18:21:48+00:00" }, { "name": "firebase/php-jwt", @@ -1589,22 +1582,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.3", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", - "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1695,7 +1688,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -1711,20 +1704,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:37:11+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", - "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -1732,7 +1725,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -1778,7 +1771,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.2.0" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -1794,20 +1787,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T13:27:01+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -1823,7 +1816,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1894,7 +1887,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.1" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -1910,20 +1903,20 @@ "type": "tidelift" } ], - "time": "2025-03-27T12:30:47+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "itk-dev/openid-connect", - "version": "4.0.1", + "version": "4.0.2", "source": { "type": "git", "url": "https://github.com/itk-dev/openid-connect.git", - "reference": "8f3b8c0cc4abc7e91c1ee0f3e978deee6806da6d" + "reference": "65951585ef2680432b33391fadffb1f87d210d27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/itk-dev/openid-connect/zipball/8f3b8c0cc4abc7e91c1ee0f3e978deee6806da6d", - "reference": "8f3b8c0cc4abc7e91c1ee0f3e978deee6806da6d", + "url": "https://api.github.com/repos/itk-dev/openid-connect/zipball/65951585ef2680432b33391fadffb1f87d210d27", + "reference": "65951585ef2680432b33391fadffb1f87d210d27", "shasum": "" }, "require": { @@ -1971,9 +1964,9 @@ "description": "OpenID connect configuration package", "support": { "issues": "https://github.com/itk-dev/openid-connect/issues", - "source": "https://github.com/itk-dev/openid-connect/tree/4.0.1" + "source": "https://github.com/itk-dev/openid-connect/tree/4.0.2" }, - "time": "2025-01-13T09:01:13+00:00" + "time": "2025-10-06T07:25:31+00:00" }, { "name": "itk-dev/openid-connect-bundle", @@ -2212,16 +2205,16 @@ }, { "name": "masterminds/html5", - "version": "2.9.0", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "reference": "fcf91eb64359852f00d921887b219479b4f21251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", "shasum": "" }, "require": { @@ -2273,9 +2266,9 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2025-07-25T09:04:22+00:00" }, { "name": "monolog/monolog", @@ -2639,16 +2632,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", + "version": "5.6.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9", + "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9", "shasum": "" }, "require": { @@ -2697,9 +2690,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3" }, - "time": "2025-04-13T19:20:35+00:00" + "time": "2025-08-01T19:43:32+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -2761,16 +2754,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.1.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", + "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", "shasum": "" }, "require": { @@ -2802,9 +2795,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2025-08-30T15:50:23+00:00" }, { "name": "psr/cache", @@ -3411,16 +3404,16 @@ }, { "name": "symfony/amqp-messenger", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "635c859743bb8166d1b294e7c63a142a5a0ffc16" + "reference": "0ed5f72c1d9bbfcfc751b3832939a00a3246fe98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/635c859743bb8166d1b294e7c63a142a5a0ffc16", - "reference": "635c859743bb8166d1b294e7c63a142a5a0ffc16", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/0ed5f72c1d9bbfcfc751b3832939a00a3246fe98", + "reference": "0ed5f72c1d9bbfcfc751b3832939a00a3246fe98", "shasum": "" }, "require": { @@ -3460,7 +3453,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v7.3.0" + "source": "https://github.com/symfony/amqp-messenger/tree/v7.3.2" }, "funding": [ { @@ -3471,12 +3464,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-25T10:45:43+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/asset", @@ -3547,18 +3544,102 @@ ], "time": "2025-03-05T10:15:41+00:00" }, + { + "name": "symfony/asset-mapper", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset-mapper.git", + "reference": "0c40c579e27244616cf0fe4d1759aab2ceb99a9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/0c40c579e27244616cf0fe4d1759aab2ceb99a9a", + "reference": "0c40c579e27244616cf0fe4d1759aab2ceb99a9a", + "shasum": "" + }, + "require": { + "composer/semver": "^3.0", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^7.1", + "symfony/http-client": "^6.4|^7.0" + }, + "conflict": { + "symfony/framework-bundle": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/event-dispatcher-contracts": "^3.0", + "symfony/finder": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\AssetMapper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset-mapper/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-22T15:31:00+00:00" + }, { "name": "symfony/browser-kit", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "5384291845e74fd7d54f3d925c4a86ce12336593" + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/5384291845e74fd7d54f3d925c4a86ce12336593", - "reference": "5384291845e74fd7d54f3d925c4a86ce12336593", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f0b889b73a845cddef1d25fe207b37fd04cb5419", + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419", "shasum": "" }, "require": { @@ -3597,7 +3678,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.3.0" + "source": "https://github.com/symfony/browser-kit/tree/v7.3.2" }, "funding": [ { @@ -3608,25 +3689,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-05T10:15:41+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/cache", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e" + "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", - "reference": "a7c6caa9d6113cebfb3020b427bcb021ebfdfc9e", + "url": "https://api.github.com/repos/symfony/cache/zipball/bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", + "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", "shasum": "" }, "require": { @@ -3695,7 +3780,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.1" + "source": "https://github.com/symfony/cache/tree/v7.3.4" }, "funding": [ { @@ -3706,12 +3791,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/cache-contracts", @@ -3865,16 +3954,16 @@ }, { "name": "symfony/config", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" + "reference": "8a09223170046d2cfda3d2e11af01df2c641e961" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", + "url": "https://api.github.com/repos/symfony/config/zipball/8a09223170046d2cfda3d2e11af01df2c641e961", + "reference": "8a09223170046d2cfda3d2e11af01df2c641e961", "shasum": "" }, "require": { @@ -3920,7 +4009,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.0" + "source": "https://github.com/symfony/config/tree/v7.3.4" }, "funding": [ { @@ -3931,25 +4020,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-15T09:04:05+00:00" + "time": "2025-09-22T12:46:16+00:00" }, { "name": "symfony/console", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", - "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", + "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "shasum": "" }, "require": { @@ -4014,7 +4107,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.1" + "source": "https://github.com/symfony/console/tree/v7.3.4" }, "funding": [ { @@ -4025,25 +4118,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8" + "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8656c4848b48784c4bb8c4ae50d2b43f832cead8", - "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/82119812ab0bf3425c1234d413efd1b19bb92ae4", + "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4", "shasum": "" }, "require": { @@ -4094,7 +4191,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.3.1" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.4" }, "funding": [ { @@ -4105,12 +4202,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4181,16 +4282,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f" + "reference": "21cd48c34a47a0d0e303a590a67c3450fde55888" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/6c0acb248c46452ae2c15752dc71e72f3335403f", - "reference": "6c0acb248c46452ae2c15752dc71e72f3335403f", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/21cd48c34a47a0d0e303a590a67c3450fde55888", + "reference": "21cd48c34a47a0d0e303a590a67c3450fde55888", "shasum": "" }, "require": { @@ -4239,7 +4340,7 @@ "symfony/security-core": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" @@ -4270,7 +4371,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.1" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.4" }, "funding": [ { @@ -4281,25 +4382,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-26T13:02:59+00:00" + "time": "2025-09-24T09:56:23+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "099d9cd03f889c31c90d406fed07f25dc3732487" + "reference": "064159484ab330590b7b477f6c8835812f2e340f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/099d9cd03f889c31c90d406fed07f25dc3732487", - "reference": "099d9cd03f889c31c90d406fed07f25dc3732487", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/064159484ab330590b7b477f6c8835812f2e340f", + "reference": "064159484ab330590b7b477f6c8835812f2e340f", "shasum": "" }, "require": { @@ -4342,7 +4447,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v7.3.0" + "source": "https://github.com/symfony/doctrine-messenger/tree/v7.3.4" }, "funding": [ { @@ -4353,25 +4458,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-26T11:30:13+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba", + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba", "shasum": "" }, "require": { @@ -4409,7 +4518,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.3" }, "funding": [ { @@ -4420,25 +4529,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-15T10:07:06+00:00" + "time": "2025-08-06T20:13:54+00:00" }, { "name": "symfony/dotenv", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "28347a897771d0c28e99b75166dd2689099f3045" + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/28347a897771d0c28e99b75166dd2689099f3045", - "reference": "28347a897771d0c28e99b75166dd2689099f3045", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/2192790a11f9e22cbcf9dc705a3ff22a5503923a", + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a", "shasum": "" }, "require": { @@ -4483,7 +4596,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.3.0" + "source": "https://github.com/symfony/dotenv/tree/v7.3.2" }, "funding": [ { @@ -4494,25 +4607,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-27T11:18:42+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/error-handler", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235" + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/35b55b166f6752d6aaf21aa042fc5ed280fce235", - "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", "shasum": "" }, "require": { @@ -4560,7 +4677,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.1" + "source": "https://github.com/symfony/error-handler/tree/v7.3.4" }, "funding": [ { @@ -4571,25 +4688,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { @@ -4640,7 +4761,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/v7.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -4651,12 +4772,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-22T09:11:45+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4736,16 +4861,16 @@ }, { "name": "symfony/expression-language", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e" + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/26f4884a455e755e630a5fc372df124a3578da2e", - "reference": "26f4884a455e755e630a5fc372df124a3578da2e", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23", + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23", "shasum": "" }, "require": { @@ -4780,7 +4905,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.3.0" + "source": "https://github.com/symfony/expression-language/tree/v7.3.2" }, "funding": [ { @@ -4791,25 +4916,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-15T11:52:45+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/filesystem", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", "shasum": "" }, "require": { @@ -4846,7 +4975,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.0" + "source": "https://github.com/symfony/filesystem/tree/v7.3.2" }, "funding": [ { @@ -4857,25 +4986,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2025-07-07T08:17:47+00:00" }, { "name": "symfony/finder", - "version": "v7.3.0", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { @@ -4910,7 +5043,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.0" + "source": "https://github.com/symfony/finder/tree/v7.3.2" }, "funding": [ { @@ -4921,25 +5054,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T19:00:26+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/flex", - "version": "v2.7.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155" + "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/4ae50d368415a06820739e54d38a4a29d6df9155", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155", + "url": "https://api.github.com/repos/symfony/flex/zipball/f356aa35f3cf3d2f46c31d344c1098eb2d260426", + "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426", "shasum": "" }, "require": { @@ -4978,7 +5115,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.7.1" + "source": "https://github.com/symfony/flex/tree/v2.8.2" }, "funding": [ { @@ -4989,25 +5126,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-28T14:22:54+00:00" + "time": "2025-08-22T07:17:23+00:00" }, { "name": "symfony/form", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a" + "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a", - "reference": "e06b02dd21b33b0cd7bb942c7e446ef7b22a2a5a", + "url": "https://api.github.com/repos/symfony/form/zipball/7b3eee0f4d4dfd1ff1be70a27474197330c61736", + "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736", "shasum": "" }, "require": { @@ -5075,7 +5216,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.3.1" + "source": "https://github.com/symfony/form/tree/v7.3.4" }, "funding": [ { @@ -5086,25 +5227,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab" + "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/91905f22f26aa350a33b3b9690bdf94976b0d0ab", - "reference": "91905f22f26aa350a33b3b9690bdf94976b0d0ab", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b13e7cec5a144c8dba6f4233a2c53c00bc29e140", + "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140", "shasum": "" }, "require": { @@ -5194,7 +5339,7 @@ "symfony/string": "^6.4|^7.0", "symfony/translation": "^7.3", "symfony/twig-bundle": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", @@ -5229,7 +5374,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.4" }, "funding": [ { @@ -5240,25 +5385,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-17T05:51:54+00:00" }, { "name": "symfony/http-client", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64" + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/4403d87a2c16f33345dca93407a8714ee8c05a64", - "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64", + "url": "https://api.github.com/repos/symfony/http-client/zipball/4b62871a01c49457cf2a8e560af7ee8a94b87a62", + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62", "shasum": "" }, "require": { @@ -5266,6 +5415,7 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -5324,7 +5474,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.3.1" + "source": "https://github.com/symfony/http-client/tree/v7.3.4" }, "funding": [ { @@ -5335,12 +5485,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-28T07:58:39+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/http-client-contracts", @@ -5422,16 +5576,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "23dd60256610c86a3414575b70c596e5deff6ed9" + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/23dd60256610c86a3414575b70c596e5deff6ed9", - "reference": "23dd60256610c86a3414575b70c596e5deff6ed9", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", "shasum": "" }, "require": { @@ -5481,7 +5635,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" }, "funding": [ { @@ -5492,25 +5646,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-23T15:07:14+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831" + "reference": "b796dffea7821f035047235e076b60ca2446e3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1644879a66e4aa29c36fe33dfa6c54b450ce1831", - "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf", "shasum": "" }, "require": { @@ -5595,7 +5753,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.1" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" }, "funding": [ { @@ -5606,25 +5764,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-28T08:24:55+00:00" + "time": "2025-09-27T12:32:17+00:00" }, { "name": "symfony/intl", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "bd50940329ac1cfc4af0491cc4468f477d967e45" + "reference": "e6db84864655885d9dac676a9d7dde0d904fda54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/bd50940329ac1cfc4af0491cc4468f477d967e45", - "reference": "bd50940329ac1cfc4af0491cc4468f477d967e45", + "url": "https://api.github.com/repos/symfony/intl/zipball/e6db84864655885d9dac676a9d7dde0d904fda54", + "reference": "e6db84864655885d9dac676a9d7dde0d904fda54", "shasum": "" }, "require": { @@ -5681,7 +5843,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.1" + "source": "https://github.com/symfony/intl/tree/v7.3.4" }, "funding": [ { @@ -5692,25 +5854,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-06T16:10:07+00:00" + "time": "2025-09-08T14:11:30+00:00" }, { "name": "symfony/messenger", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "716c89b86ce58c4946d436d862694971c999d1aa" + "reference": "d9e04339404ba2dcd04c24172125516dc0e06c35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/716c89b86ce58c4946d436d862694971c999d1aa", - "reference": "716c89b86ce58c4946d436d862694971c999d1aa", + "url": "https://api.github.com/repos/symfony/messenger/zipball/d9e04339404ba2dcd04c24172125516dc0e06c35", + "reference": "d9e04339404ba2dcd04c24172125516dc0e06c35", "shasum": "" }, "require": { @@ -5770,7 +5936,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v7.3.1" + "source": "https://github.com/symfony/messenger/tree/v7.3.3" }, "funding": [ { @@ -5781,25 +5947,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/mime", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35", + "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35", "shasum": "" }, "require": { @@ -5854,7 +6024,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.3.0" + "source": "https://github.com/symfony/mime/tree/v7.3.4" }, "funding": [ { @@ -5865,25 +6035,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-19T08:51:26+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990" + "reference": "7acf2abe23e5019451399ba69fc8ed3d61d4d8f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/7acf2abe23e5019451399ba69fc8ed3d61d4d8f0", + "reference": "7acf2abe23e5019451399ba69fc8ed3d61d4d8f0", "shasum": "" }, "require": { @@ -5932,7 +6106,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.4" }, "funding": [ { @@ -5943,12 +6117,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-03-21T12:17:46+00:00" + "time": "2025-09-24T16:45:39+00:00" }, { "name": "symfony/monolog-bundle", @@ -6032,27 +6210,34 @@ "time": "2023-11-06T17:08:13+00:00" }, { - "name": "symfony/options-resolver", - "version": "v7.3.0", + "name": "symfony/object-mapper", + "version": "v7.3.4", "source": { "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" + "url": "https://github.com/symfony/object-mapper.git", + "reference": "62752b89178d7654bb7ec97d3fa3dbd67e417dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", - "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", + "url": "https://api.github.com/repos/symfony/object-mapper/zipball/62752b89178d7654bb7ec97d3fa3dbd67e417dbe", + "reference": "62752b89178d7654bb7ec97d3fa3dbd67e417dbe", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "psr/container": "^2.0" + }, + "conflict": { + "symfony/property-access": "<7.2" + }, + "require-dev": { + "symfony/property-access": "^7.2", + "symfony/var-exporter": "^7.2" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" + "Symfony\\Component\\ObjectMapper\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -6072,15 +6257,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides an improved replacement for the array_replace PHP function", + "description": "Provides a way to map an object to another object", "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" + "source": "https://github.com/symfony/object-mapper/tree/v7.3.4" }, "funding": [ { @@ -6091,41 +6271,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-04T13:12:05+00:00" + "time": "2025-09-20T14:49:40+00:00" }, { - "name": "symfony/password-hasher", - "version": "v7.3.0", + "name": "symfony/options-resolver", + "version": "v7.3.3", "source": { "type": "git", - "url": "https://github.com/symfony/password-hasher.git", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/security-core": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\PasswordHasher\\": "" + "Symfony\\Component\\OptionsResolver\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -6137,22 +6315,99 @@ ], "authors": [ { - "name": "Robin Chalas", - "email": "robin.chalas@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides password hashing utilities", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ - "hashing", - "password" + "config", + "configuration", + "options" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-05T10:16:07+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/security-core": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" }, "funding": [ { @@ -6172,16 +6427,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -6230,7 +6485,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -6241,25 +6496,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", - "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", "shasum": "" }, "require": { @@ -6314,7 +6573,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" }, "funding": [ { @@ -6325,16 +6584,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-21T18:38:29+00:00" + "time": "2025-06-20T22:24:30+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -6397,7 +6660,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -6408,6 +6671,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -6417,7 +6684,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -6478,7 +6745,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -6489,6 +6756,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -6498,7 +6769,7 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -6559,7 +6830,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -6570,6 +6841,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -6579,16 +6854,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -6635,7 +6910,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -6646,25 +6921,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "000df7860439609837bbe28670b0be15783b7fbf" + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", - "reference": "000df7860439609837bbe28670b0be15783b7fbf", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { @@ -6711,7 +6990,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -6722,16 +7001,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-20T12:04:08+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -6790,7 +7073,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" }, "funding": [ { @@ -6801,6 +7084,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -6810,16 +7097,16 @@ }, { "name": "symfony/property-access", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "518d15c8cca726ebe665dcd7154074584cf862e8" + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/518d15c8cca726ebe665dcd7154074584cf862e8", - "reference": "518d15c8cca726ebe665dcd7154074584cf862e8", + "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", "shasum": "" }, "require": { @@ -6866,7 +7153,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.3.1" + "source": "https://github.com/symfony/property-access/tree/v7.3.3" }, "funding": [ { @@ -6877,25 +7164,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { "name": "symfony/property-info", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" + "reference": "7b6db23f23d13ada41e1cb484748a8ec028fbace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", - "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", + "url": "https://api.github.com/repos/symfony/property-info/zipball/7b6db23f23d13ada41e1cb484748a8ec028fbace", + "reference": "7b6db23f23d13ada41e1cb484748a8ec028fbace", "shasum": "" }, "require": { @@ -6952,7 +7243,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.3.1" + "source": "https://github.com/symfony/property-info/tree/v7.3.4" }, "funding": [ { @@ -6963,25 +7254,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-15T13:55:54+00:00" }, { "name": "symfony/routing", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8e213820c5fea844ecea29203d2a308019007c15" + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15", - "reference": "8e213820c5fea844ecea29203d2a308019007c15", + "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", "shasum": "" }, "require": { @@ -7033,7 +7328,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.0" + "source": "https://github.com/symfony/routing/tree/v7.3.4" }, "funding": [ { @@ -7044,25 +7339,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-24T20:43:28+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/runtime", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "9516056d432f8acdac9458eb41b80097da7a05c9" + "reference": "3550e2711e30bfa5d808514781cd52d1cc1d9e9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/9516056d432f8acdac9458eb41b80097da7a05c9", - "reference": "9516056d432f8acdac9458eb41b80097da7a05c9", + "url": "https://api.github.com/repos/symfony/runtime/zipball/3550e2711e30bfa5d808514781cd52d1cc1d9e9f", + "reference": "3550e2711e30bfa5d808514781cd52d1cc1d9e9f", "shasum": "" }, "require": { @@ -7112,7 +7411,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.3.1" + "source": "https://github.com/symfony/runtime/tree/v7.3.4" }, "funding": [ { @@ -7123,25 +7422,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-13T07:48:40+00:00" + "time": "2025-09-11T15:31:28+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079" + "reference": "f750d9abccbeaa433c56f6a4eb2073166476a75a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/428a281fd66c8358adc2259c8578e6d81fbb7079", - "reference": "428a281fd66c8358adc2259c8578e6d81fbb7079", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/f750d9abccbeaa433c56f6a4eb2073166476a75a", + "reference": "f750d9abccbeaa433c56f6a4eb2073166476a75a", "shasum": "" }, "require": { @@ -7218,7 +7521,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.4" }, "funding": [ { @@ -7229,25 +7532,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/security-core", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba" + "reference": "68b9d3ca57615afde6152a1e1441fa035bea43f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/fafab1003a31e51506e1a0a83e81c072211d81ba", - "reference": "fafab1003a31e51506e1a0a83e81c072211d81ba", + "url": "https://api.github.com/repos/symfony/security-core/zipball/68b9d3ca57615afde6152a1e1441fa035bea43f8", + "reference": "68b9d3ca57615afde6152a1e1441fa035bea43f8", "shasum": "" }, "require": { @@ -7305,7 +7612,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.3.1" + "source": "https://github.com/symfony/security-core/tree/v7.3.4" }, "funding": [ { @@ -7316,12 +7623,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-23T07:28:50+00:00" + "time": "2025-09-24T14:32:13+00:00" }, { "name": "symfony/security-csrf", @@ -7395,16 +7706,16 @@ }, { "name": "symfony/security-http", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "b7182ed0fd2359297f78ff6d407265168255ea84" + "reference": "1cf54d0648ebab23bf9b8972617b79f1995e13a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/b7182ed0fd2359297f78ff6d407265168255ea84", - "reference": "b7182ed0fd2359297f78ff6d407265168255ea84", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1cf54d0648ebab23bf9b8972617b79f1995e13a9", + "reference": "1cf54d0648ebab23bf9b8972617b79f1995e13a9", "shasum": "" }, "require": { @@ -7463,7 +7774,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.3.1" + "source": "https://github.com/symfony/security-http/tree/v7.3.4" }, "funding": [ { @@ -7474,31 +7785,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2025-09-09T17:06:44+00:00" }, { "name": "symfony/serializer", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "feaf837cedbbc8287986602223175d3fd639922d" + "reference": "0df5af266c6fe9a855af7db4fea86e13b9ca3ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/feaf837cedbbc8287986602223175d3fd639922d", - "reference": "feaf837cedbbc8287986602223175d3fd639922d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/0df5af266c6fe9a855af7db4fea86e13b9ca3ab1", + "reference": "0df5af266c6fe9a855af7db4fea86e13b9ca3ab1", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -7528,7 +7844,7 @@ "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", @@ -7561,7 +7877,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.3.1" + "source": "https://github.com/symfony/serializer/tree/v7.3.4" }, "funding": [ { @@ -7572,12 +7888,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-15T13:39:02+00:00" }, { "name": "symfony/service-contracts", @@ -7726,16 +8046,16 @@ }, { "name": "symfony/string", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" + "reference": "f96476035142921000338bad71e5247fbc138872" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", "shasum": "" }, "require": { @@ -7750,7 +8070,6 @@ }, "require-dev": { "symfony/emoji": "^7.1", - "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", @@ -7793,7 +8112,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.0" + "source": "https://github.com/symfony/string/tree/v7.3.4" }, "funding": [ { @@ -7804,25 +8123,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-20T20:19:01+00:00" + "time": "2025-09-11T14:36:48+00:00" }, { "name": "symfony/translation", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "241d5ac4910d256660238a7ecf250deba4c73063" + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/241d5ac4910d256660238a7ecf250deba4c73063", - "reference": "241d5ac4910d256660238a7ecf250deba4c73063", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", "shasum": "" }, "require": { @@ -7889,7 +8212,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.1" + "source": "https://github.com/symfony/translation/tree/v7.3.4" }, "funding": [ { @@ -7900,12 +8223,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-07T11:39:36+00:00" }, { "name": "symfony/translation-contracts", @@ -7987,16 +8314,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891" + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/082eb15d8a4f9afee0acc4709fbe3aaf26d48891", - "reference": "082eb15d8a4f9afee0acc4709fbe3aaf26d48891", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/33558f013b7f6ed72805527c8405cae0062e47c5", + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5", "shasum": "" }, "require": { @@ -8078,7 +8405,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.3.0" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.3" }, "funding": [ { @@ -8089,25 +8416,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-19T13:28:56+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896" + "reference": "da5c778a8416fcce5318737c4d944f6fa2bb3f81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/bc23c11d9716fc2261ee26a32e654b0e8b1b1896", - "reference": "bc23c11d9716fc2261ee26a32e654b0e8b1b1896", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/da5c778a8416fcce5318737c4d944f6fa2bb3f81", + "reference": "da5c778a8416fcce5318737c4d944f6fa2bb3f81", "shasum": "" }, "require": { @@ -8162,7 +8493,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/twig-bundle/tree/v7.3.4" }, "funding": [ { @@ -8173,25 +8504,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-24T04:04:43+00:00" + "time": "2025-09-10T12:00:31+00:00" }, { "name": "symfony/type-info", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150" + "reference": "d34eaeb57f39c8a9c97eb72a977c423207dfa35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/5fa6e25e4195e73ce9e457b521ac5e61ec271150", - "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150", + "url": "https://api.github.com/repos/symfony/type-info/zipball/d34eaeb57f39c8a9c97eb72a977c423207dfa35b", + "reference": "d34eaeb57f39c8a9c97eb72a977c423207dfa35b", "shasum": "" }, "require": { @@ -8241,7 +8576,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.3.1" + "source": "https://github.com/symfony/type-info/tree/v7.3.4" }, "funding": [ { @@ -8252,12 +8587,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-11T15:33:27+00:00" }, { "name": "symfony/uid", @@ -8335,38 +8674,38 @@ }, { "name": "symfony/ux-twig-component", - "version": "v2.27.0", + "version": "v2.30.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "0879cd53812b79e8b6a20e104b6e785a2ac2c013" + "reference": "2f445efda4d4400d4d1911ddf9710c366f339614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/0879cd53812b79e8b6a20e104b6e785a2ac2c013", - "reference": "0879cd53812b79e8b6a20e104b6e785a2ac2c013", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/2f445efda4d4400d4d1911ddf9710c366f339614", + "reference": "2f445efda4d4400d4d1911ddf9710c366f339614", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0", "symfony/deprecation-contracts": "^2.2|^3.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0|^8.0", + "symfony/property-access": "^5.4|^6.0|^7.0|^8.0", "twig/twig": "^3.10.3" }, "conflict": { "symfony/config": "<5.4.0" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/phpunit-bridge": "^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0|^8.0", + "symfony/css-selector": "^5.4|^6.0|^7.0|^8.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0|^8.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.0|^7.0|^8.0", "symfony/stimulus-bundle": "^2.9.1", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/webpack-encore-bundle": "^1.15" + "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.15|^2.3.0" }, "type": "symfony-bundle", "extra": { @@ -8398,7 +8737,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.27.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.30.0" }, "funding": [ { @@ -8409,25 +8748,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-21T16:41:28+00:00" + "time": "2025-08-27T15:25:48+00:00" }, { "name": "symfony/validator", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3" + "reference": "5e29a348b5fac2227b6938a54db006d673bb813a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/e2f2497c869fc57446f735fbf00cff4de32ae8c3", - "reference": "e2f2497c869fc57446f735fbf00cff4de32ae8c3", + "url": "https://api.github.com/repos/symfony/validator/zipball/5e29a348b5fac2227b6938a54db006d673bb813a", + "reference": "5e29a348b5fac2227b6938a54db006d673bb813a", "shasum": "" }, "require": { @@ -8466,7 +8809,7 @@ "symfony/property-info": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4.3|^7.0.3", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/yaml": "^6.4|^7.0" }, "type": "library", @@ -8496,7 +8839,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.3.1" + "source": "https://github.com/symfony/validator/tree/v7.3.4" }, "funding": [ { @@ -8507,25 +8850,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-26T13:22:23+00:00" + "time": "2025-09-24T06:32:27+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", - "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", "shasum": "" }, "require": { @@ -8537,7 +8884,6 @@ "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", @@ -8580,7 +8926,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" }, "funding": [ { @@ -8591,25 +8937,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-27T19:55:54+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c" + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c9a1168891b5aaadfd6332ef44393330b3498c4c", - "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", "shasum": "" }, "require": { @@ -8657,7 +9007,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.0" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" }, "funding": [ { @@ -8668,12 +9018,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-15T09:04:05+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/web-link", @@ -8760,32 +9114,32 @@ }, { "name": "symfony/webpack-encore-bundle", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "e335394b68a775a9b2bd173a8ba4fd2001f3870c" + "reference": "7ae70d44c24c3b913f308af8396169b5c6d9e0f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/e335394b68a775a9b2bd173a8ba4fd2001f3870c", - "reference": "e335394b68a775a9b2bd173a8ba4fd2001f3870c", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/7ae70d44c24c3b913f308af8396169b5c6d9e0f5", + "reference": "7ae70d44c24c3b913f308af8396169b5c6d9e0f5", "shasum": "" }, "require": { "php": ">=8.1.0", - "symfony/asset": "^5.4 || ^6.2 || ^7.0", - "symfony/config": "^5.4 || ^6.2 || ^7.0", - "symfony/dependency-injection": "^5.4 || ^6.2 || ^7.0", - "symfony/http-kernel": "^5.4 || ^6.2 || ^7.0", + "symfony/asset": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/config": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/dependency-injection": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/http-kernel": "^5.4 || ^6.2 || ^7.0 || ^8.0", "symfony/service-contracts": "^1.1.9 || ^2.1.3 || ^3.0" }, "require-dev": { - "symfony/framework-bundle": "^5.4 || ^6.2 || ^7.0", - "symfony/http-client": "^5.4 || ^6.2 || ^7.0", - "symfony/phpunit-bridge": "^5.4 || ^6.2 || ^7.0", - "symfony/twig-bundle": "^5.4 || ^6.2 || ^7.0", - "symfony/web-link": "^5.4 || ^6.2 || ^7.0" + "symfony/framework-bundle": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/http-client": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/phpunit-bridge": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/twig-bundle": "^5.4 || ^6.2 || ^7.0 || ^8.0", + "symfony/web-link": "^5.4 || ^6.2 || ^7.0 || ^8.0" }, "type": "symfony-bundle", "extra": { @@ -8812,7 +9166,7 @@ "description": "Integration of your Symfony app with Webpack Encore", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.2.0" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.3.0" }, "funding": [ { @@ -8823,25 +9177,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-02T07:27:19+00:00" + "time": "2025-08-05T11:43:32+00:00" }, { "name": "symfony/yaml", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", - "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { @@ -8884,7 +9242,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.1" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -8895,12 +9253,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-03T06:57:57+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "twig/extra-bundle", @@ -9450,16 +9812,16 @@ }, { "name": "doctrine/data-fixtures", - "version": "2.0.3", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f65b353922b7ac48f360428e19b22fcce5aba134" + "reference": "f161e20f04ba5440a09330e156b40f04dd70d47f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f65b353922b7ac48f360428e19b22fcce5aba134", - "reference": "f65b353922b7ac48f360428e19b22fcce5aba134", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f161e20f04ba5440a09330e156b40f04dd70d47f", + "reference": "f161e20f04ba5440a09330e156b40f04dd70d47f", "shasum": "" }, "require": { @@ -9513,7 +9875,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/2.0.3" + "source": "https://github.com/doctrine/data-fixtures/tree/2.1.0" }, "funding": [ { @@ -9529,20 +9891,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T19:59:58+00:00" + "time": "2025-07-08T17:48:20+00:00" }, { "name": "ergebnis/composer-normalize", - "version": "2.47.0", + "version": "2.48.2", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "ed24b9f8901f8fbafeca98f662eaca39427f0544" + "reference": "86dc9731b8320f49e9be9ad6d8e4de9b8b0e9b8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/ed24b9f8901f8fbafeca98f662eaca39427f0544", - "reference": "ed24b9f8901f8fbafeca98f662eaca39427f0544", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/86dc9731b8320f49e9be9ad6d8e4de9b8b0e9b8b", + "reference": "86dc9731b8320f49e9be9ad6d8e4de9b8b0e9b8b", "shasum": "" }, "require": { @@ -9552,30 +9914,31 @@ "ergebnis/json-printer": "^3.7.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", - "localheinz/diff": "^1.2.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "localheinz/diff": "^1.3.0", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "composer/composer": "^2.8.3", - "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.46.0", - "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.53.0", + "ergebnis/phpstan-rules": "^2.11.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", "fakerphp/faker": "^1.24.1", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.11", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-strict-rules": "^2.0.4", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", "phpunit/phpunit": "^9.6.20", - "rector/rector": "^2.0.11", + "rector/rector": "^2.1.4", "symfony/filesystem": "^5.4.41" }, "type": "composer-plugin", "extra": { "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin", "branch-alias": { - "dev-main": "2.44-dev" + "dev-main": "2.49-dev" }, "plugin-optional": true, "composer-normalize": { @@ -9612,43 +9975,48 @@ "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/composer-normalize" }, - "time": "2025-04-15T11:09:27+00:00" + "time": "2025-09-06T11:42:34+00:00" }, { "name": "ergebnis/json", - "version": "1.4.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json.git", - "reference": "7656ac2aa6c2ca4408f96f599e9a17a22c464f69" + "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json/zipball/7656ac2aa6c2ca4408f96f599e9a17a22c464f69", - "reference": "7656ac2aa6c2ca4408f96f599e9a17a22c464f69", + "url": "https://api.github.com/repos/ergebnis/json/zipball/7b56d2b5d9e897e75b43e2e753075a0904c921b1", + "reference": "7b56d2b5d9e897e75b43e2e753075a0904c921b1", "shasum": "" }, "require": { "ext-json": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { + "ergebnis/composer-normalize": "^2.44.0", "ergebnis/data-provider": "^3.3.0", "ergebnis/license": "^2.5.0", "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpstan-rules": "^2.11.0", "ergebnis/phpunit-slow-test-detector": "^2.16.1", "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.10", - "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^9.6.18", - "rector/rector": "^1.2.10" + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^9.6.24", + "rector/rector": "^2.1.4" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "1.7-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -9680,20 +10048,20 @@ "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json" }, - "time": "2024-11-17T11:51:22+00:00" + "time": "2025-09-06T09:08:45+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "4.9.0", + "version": "4.10.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "cc4dcf3890448572a2d9bea97133c4d860e59fb1" + "reference": "77961faf2c651c3f05977b53c6c68e8434febf62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/cc4dcf3890448572a2d9bea97133c4d860e59fb1", - "reference": "cc4dcf3890448572a2d9bea97133c4d860e59fb1", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/77961faf2c651c3f05977b53c6c68e8434febf62", + "reference": "77961faf2c651c3f05977b53c6c68e8434febf62", "shasum": "" }, "require": { @@ -9703,7 +10071,7 @@ "ergebnis/json-schema-validator": "^4.2.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "composer/semver": "^3.4.3", @@ -9728,7 +10096,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.8-dev" + "dev-main": "4.11-dev" }, "composer-normalize": { "indent-size": 2, @@ -9762,24 +10130,24 @@ "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-normalizer" }, - "time": "2025-04-10T13:13:04+00:00" + "time": "2025-09-06T09:18:13+00:00" }, { "name": "ergebnis/json-pointer", - "version": "3.6.0", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-pointer.git", - "reference": "4fc85d8edb74466d282119d8d9541ec7cffc0798" + "reference": "43bef355184e9542635e35dd2705910a3df4c236" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/4fc85d8edb74466d282119d8d9541ec7cffc0798", - "reference": "4fc85d8edb74466d282119d8d9541ec7cffc0798", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/43bef355184e9542635e35dd2705910a3df4c236", + "reference": "43bef355184e9542635e35dd2705910a3df4c236", "shasum": "" }, "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "ergebnis/composer-normalize": "^2.43.0", @@ -9800,7 +10168,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.8-dev" }, "composer-normalize": { "indent-size": 2, @@ -9835,28 +10203,29 @@ "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-pointer" }, - "time": "2024-11-17T12:37:06+00:00" + "time": "2025-09-06T09:28:19+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.7.0", + "version": "3.8.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "ced41fce7854152f0e8f38793c2ffe59513cdd82" + "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/ced41fce7854152f0e8f38793c2ffe59513cdd82", - "reference": "ced41fce7854152f0e8f38793c2ffe59513cdd82", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/211d73fc7ec6daf98568ee6ed6e6d133dee8503e", + "reference": "211d73fc7ec6daf98568ee6ed6e6d133dee8503e", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { + "ergebnis/composer-normalize": "^2.44.0", "ergebnis/data-provider": "^3.3.0", "ergebnis/license": "^2.5.0", "ergebnis/php-cs-fixer-config": "^6.37.0", @@ -9872,6 +10241,15 @@ "rector/rector": "^1.2.10" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.9-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { "Ergebnis\\Json\\Printer\\": "src/" @@ -9900,20 +10278,20 @@ "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-printer" }, - "time": "2024-11-17T11:20:51+00:00" + "time": "2025-09-06T09:59:26+00:00" }, { "name": "ergebnis/json-schema-validator", - "version": "4.4.0", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/ergebnis/json-schema-validator.git", - "reference": "85f90c81f718aebba1d738800af83eeb447dc7ec" + "reference": "b739527a480a9e3651360ad351ea77e7e9019df2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/85f90c81f718aebba1d738800af83eeb447dc7ec", - "reference": "85f90c81f718aebba1d738800af83eeb447dc7ec", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/b739527a480a9e3651360ad351ea77e7e9019df2", + "reference": "b739527a480a9e3651360ad351ea77e7e9019df2", "shasum": "" }, "require": { @@ -9921,7 +10299,7 @@ "ergebnis/json-pointer": "^3.4.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "ergebnis/composer-normalize": "^2.44.0", @@ -9942,7 +10320,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.4-dev" + "dev-main": "4.6-dev" }, "composer-normalize": { "indent-size": 2, @@ -9977,7 +10355,7 @@ "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-schema-validator" }, - "time": "2024-11-18T06:32:28+00:00" + "time": "2025-09-06T11:37:35+00:00" }, { "name": "evenement/evenement", @@ -10091,16 +10469,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { @@ -10110,10 +10488,10 @@ "fidry/makefile": "^0.2.0", "fidry/php-cs-fixer-config": "^1.1.2", "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^8.5.31 || ^9.5.26", "webmozarts/strict-phpunit": "^7.5" }, @@ -10140,7 +10518,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" }, "funding": [ { @@ -10148,63 +10526,62 @@ "type": "github" } ], - "time": "2024-08-06T10:04:20+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.76.0", + "version": "v3.88.2", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "0e3c484cef0ae9314b0f85986a36296087432c40" + "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/0e3c484cef0ae9314b0f85986a36296087432c40", - "reference": "0e3c484cef0ae9314b0f85986a36296087432c40", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a8d15584bafb0f0d9d938827840060fd4a3ebc99", + "reference": "a8d15584bafb0f0d9d938827840060fd4a3ebc99", "shasum": "" }, "require": { - "clue/ndjson-react": "^1.0", + "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", "composer/xdebug-handler": "^3.0.5", "ext-filter": "*", "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.2", + "fidry/cpu-core-counter": "^1.3", "php": "^7.4 || ^8.0", "react/child-process": "^0.6.6", - "react/event-loop": "^1.0", - "react/promise": "^2.11 || ^3.0", - "react/socket": "^1.0", - "react/stream": "^1.0", + "react/event-loop": "^1.5", + "react/promise": "^3.3", + "react/socket": "^1.16", + "react/stream": "^1.4", "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", - "symfony/console": "^5.4.45 || ^6.4.13 || ^7.0", - "symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0", - "symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0", - "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0", - "symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0", - "symfony/polyfill-mbstring": "^1.32", - "symfony/polyfill-php80": "^1.32", - "symfony/polyfill-php81": "^1.32", - "symfony/process": "^5.4.47 || ^6.4.20 || ^7.2", - "symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0" - }, - "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.6", - "infection/infection": "^0.29.14", - "justinrainbow/json-schema": "^5.3 || ^6.4", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0", + "symfony/polyfill-mbstring": "^1.33", + "symfony/polyfill-php80": "^1.33", + "symfony/polyfill-php81": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.7", + "infection/infection": "^0.31.0", + "justinrainbow/json-schema": "^6.5", "keradus/cli-executor": "^2.2", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.8", - "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25", - "symfony/polyfill-php84": "^1.32", - "symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1", - "symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1" + "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", + "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2", + "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -10245,7 +10622,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.76.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.88.2" }, "funding": [ { @@ -10253,7 +10630,7 @@ "type": "github" } ], - "time": "2025-06-30T14:15:06+00:00" + "time": "2025-09-27T00:24:15+00:00" }, { "name": "hautelook/alice-bundle", @@ -10331,16 +10708,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "6.4.2", + "version": "6.6.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02" + "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02", - "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/68ba7677532803cc0c5900dd5a4d730537f2b2f3", + "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3", "shasum": "" }, "require": { @@ -10350,7 +10727,7 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "3.3.0", - "json-schema/json-schema-test-suite": "1.2.0", + "json-schema/json-schema-test-suite": "^23.2", "marc-mabe/php-enum-phpstan": "^2.0", "phpspec/prophecy": "^1.19", "phpstan/phpstan": "^1.12", @@ -10400,26 +10777,26 @@ ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.0" }, - "time": "2025-06-03T18:27:04+00:00" + "time": "2025-10-10T11:34:09+00:00" }, { "name": "localheinz/diff", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/localheinz/diff.git", - "reference": "ec413943c2b518464865673fd5b38f7df867a010" + "reference": "33bd840935970cda6691c23fc7d94ae764c0734c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/localheinz/diff/zipball/ec413943c2b518464865673fd5b38f7df867a010", - "reference": "ec413943c2b518464865673fd5b38f7df867a010", + "url": "https://api.github.com/repos/localheinz/diff/zipball/33bd840935970cda6691c23fc7d94ae764c0734c", + "reference": "33bd840935970cda6691c23fc7d94ae764c0734c", "shasum": "" }, "require": { - "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { "phpunit/phpunit": "^7.5.0 || ^8.5.23", @@ -10455,22 +10832,22 @@ ], "support": { "issues": "https://github.com/localheinz/diff/issues", - "source": "https://github.com/localheinz/diff/tree/1.2.0" + "source": "https://github.com/localheinz/diff/tree/1.3.0" }, - "time": "2024-12-04T14:16:01+00:00" + "time": "2025-08-30T09:44:18+00:00" }, { "name": "marc-mabe/php-enum", - "version": "v4.7.1", + "version": "v4.7.2", "source": { "type": "git", "url": "https://github.com/marc-mabe/php-enum.git", - "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", - "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", "shasum": "" }, "require": { @@ -10528,22 +10905,22 @@ ], "support": { "issues": "https://github.com/marc-mabe/php-enum/issues", - "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" }, - "time": "2024-11-28T04:54:44+00:00" + "time": "2025-09-14T11:18:39+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.1", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -10582,7 +10959,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -10590,7 +10967,7 @@ "type": "tidelift" } ], - "time": "2025-04-29T12:36:36+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nelmio/alice", @@ -10690,16 +11067,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.5.0", + "version": "v5.6.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", "shasum": "" }, "require": { @@ -10718,7 +11095,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -10742,9 +11119,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" }, - "time": "2025-05-31T08:24:38+00:00" + "time": "2025-08-13T20:13:15+00:00" }, { "name": "phar-io/manifest", @@ -10914,16 +11291,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.17", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" - }, + "version": "2.1.31", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", - "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", + "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", "shasum": "" }, "require": { @@ -10968,20 +11340,20 @@ "type": "github" } ], - "time": "2025-05-21T20:55:28+00:00" + "time": "2025-10-10T14:14:11+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.3", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35" + "reference": "5eaf37b87288474051469aee9f937fc9d862f330" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/4497663eb17b9d29211830df5aceaa3a4d256a35", - "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/5eaf37b87288474051469aee9f937fc9d862f330", + "reference": "5eaf37b87288474051469aee9f937fc9d862f330", "shasum": "" }, "require": { @@ -11015,7 +11387,8 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6.20", "ramsey/uuid": "^4.2", - "symfony/cache": "^5.4" + "symfony/cache": "^5.4", + "symfony/uid": "^5.4 || ^6.4 || ^7.3" }, "type": "phpstan-extension", "extra": { @@ -11038,27 +11411,27 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.3" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.10" }, - "time": "2025-05-05T15:28:52+00:00" + "time": "2025-10-06T10:01:02+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.6", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "6b92469f8a7995e626da3aa487099617b8dfa260" + "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6b92469f8a7995e626da3aa487099617b8dfa260", - "reference": "6b92469f8a7995e626da3aa487099617b8dfa260", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9a9b161baee88a5f5c58d816943cff354ff233dc", + "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.4" + "phpstan/phpstan": "^2.1.18" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -11091,22 +11464,22 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.6" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.7" }, - "time": "2025-03-26T12:47:06+00:00" + "time": "2025-07-13T11:31:46+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.6", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "5005288e07583546ea00b52de4a9ac412eb869d7" + "reference": "8820c22d785c235f69bb48da3d41e688bc8a1796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/5005288e07583546ea00b52de4a9ac412eb869d7", - "reference": "5005288e07583546ea00b52de4a9ac412eb869d7", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/8820c22d785c235f69bb48da3d41e688bc8a1796", + "reference": "8820c22d785c235f69bb48da3d41e688bc8a1796", "shasum": "" }, "require": { @@ -11162,41 +11535,40 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.6" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.8" }, - "time": "2025-05-14T07:00:05+00:00" + "time": "2025-09-07T06:55:50+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.10", + "version": "12.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" + "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", + "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", + "nikic/php-parser": "^5.6.1", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^11.5.2" + "phpunit/phpunit": "^12.3.7" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -11205,7 +11577,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "12.4.x-dev" } }, "autoload": { @@ -11234,7 +11606,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/show" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.4.0" }, "funding": [ { @@ -11254,32 +11626,32 @@ "type": "tidelift" } ], - "time": "2025-06-18T08:56:18+00:00" + "time": "2025-09-24T13:44:41+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11307,7 +11679,7 @@ "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.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" }, "funding": [ { @@ -11315,28 +11687,28 @@ "type": "github" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2025-02-07T04:58:37+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -11344,7 +11716,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -11371,7 +11743,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -11379,32 +11751,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -11431,7 +11803,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -11439,32 +11811,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -11491,7 +11863,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -11499,20 +11871,20 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.25", + "version": "12.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "864ab32b3ff52058f917c5b19b3cef821e4a4f1b" + "reference": "fc5413a2e6d240d2f6d9317bdf7f0a24e73de194" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/864ab32b3ff52058f917c5b19b3cef821e4a4f1b", - "reference": "864ab32b3ff52058f917c5b19b3cef821e4a4f1b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc5413a2e6d240d2f6d9317bdf7f0a24e73de194", + "reference": "fc5413a2e6d240d2f6d9317bdf7f0a24e73de194", "shasum": "" }, "require": { @@ -11522,37 +11894,33 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.10", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", - "sebastian/version": "^5.0.2", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.4.0", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.3", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-main": "12.4-dev" } }, "autoload": { @@ -11584,7 +11952,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.25" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.1" }, "funding": [ { @@ -11608,7 +11976,7 @@ "type": "tidelift" } ], - "time": "2025-06-27T04:36:07+00:00" + "time": "2025-10-09T14:08:29+00:00" }, { "name": "react/cache", @@ -11907,23 +12275,23 @@ }, { "name": "react/promise", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -11968,7 +12336,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -11976,7 +12344,7 @@ "type": "open_collective" } ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "react/socket", @@ -12138,21 +12506,21 @@ }, { "name": "rector/rector", - "version": "2.1.0", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "d513dea45a94394b660e15c155d1fa27826f8e30" + "reference": "d27f976a332a87b5d03553c2e6f04adbe5da034f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/d513dea45a94394b660e15c155d1fa27826f8e30", - "reference": "d513dea45a94394b660e15c155d1fa27826f8e30", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d27f976a332a87b5d03553c2e6f04adbe5da034f", + "reference": "d27f976a332a87b5d03553c2e6f04adbe5da034f", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.17" + "phpstan/phpstan": "^2.1.26" }, "conflict": { "rector/rector-doctrine": "*", @@ -12186,7 +12554,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.1.0" + "source": "https://github.com/rectorphp/rector/tree/2.2.3" }, "funding": [ { @@ -12194,32 +12562,32 @@ "type": "github" } ], - "time": "2025-06-24T20:26:57+00:00" + "time": "2025-10-11T21:50:23+00:00" }, { "name": "sebastian/cli-parser", - "version": "3.0.2", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -12243,152 +12611,51 @@ "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.2" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "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.3" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "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": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "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.1" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.1", + "version": "7.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.4" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -12396,7 +12663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -12436,41 +12703,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2025-03-07T06:57:01+00:00" + "time": "2025-08-20T11:27:00+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -12494,7 +12773,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -12502,33 +12781,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12561,7 +12840,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -12569,27 +12848,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -12597,7 +12876,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -12625,7 +12904,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { @@ -12645,34 +12924,34 @@ "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.0", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12715,43 +12994,55 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-12-05T09:17:50+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -12777,41 +13068,53 @@ "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.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -12835,7 +13138,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -12843,34 +13146,34 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -12893,7 +13196,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -12901,32 +13204,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -12949,7 +13252,7 @@ "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.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -12957,32 +13260,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.2", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -13013,40 +13316,52 @@ "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.2" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2024-07-03T05:10:34+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "5.1.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -13070,37 +13385,49 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2025-03-18T13:35:50+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", - "version": "5.0.2", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -13124,7 +13451,7 @@ "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.2" + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -13132,7 +13459,7 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { "name": "staabm/side-effects-detector", @@ -13253,16 +13580,16 @@ }, { "name": "symfony/debug-bundle", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8" + "reference": "30f922edd53dd85238f1f26dbb68a044109f8f0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/781acc90f31f5fe18915f9276890864ebbbe3da8", - "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/30f922edd53dd85238f1f26dbb68a044109f8f0e", + "reference": "30f922edd53dd85238f1f26dbb68a044109f8f0e", "shasum": "" }, "require": { @@ -13304,7 +13631,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v7.3.0" + "source": "https://github.com/symfony/debug-bundle/tree/v7.3.4" }, "funding": [ { @@ -13315,25 +13642,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-05-04T13:21:13+00:00" + "time": "2025-09-10T12:00:31+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.63.0", + "version": "v1.64.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "69478ab39bc303abfbe3293006a78b09a8512425" + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/69478ab39bc303abfbe3293006a78b09a8512425", - "reference": "69478ab39bc303abfbe3293006a78b09a8512425", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a", + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a", "shasum": "" }, "require": { @@ -13361,6 +13692,7 @@ "symfony/http-client": "^6.4|^7.0", "symfony/phpunit-bridge": "^6.4.1|^7.0", "symfony/security-core": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0|^4.x-dev" }, @@ -13396,7 +13728,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.63.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0" }, "funding": [ { @@ -13412,11 +13744,11 @@ "type": "tidelift" } ], - "time": "2025-04-26T01:41:37+00:00" + "time": "2025-06-23T16:12:08+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -13476,7 +13808,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -13487,6 +13819,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -13496,7 +13832,7 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -13552,7 +13888,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -13563,6 +13899,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -13572,16 +13912,16 @@ }, { "name": "symfony/process", - "version": "v7.3.0", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", "shasum": "" }, "require": { @@ -13613,7 +13953,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.3.0" + "source": "https://github.com/symfony/process/tree/v7.3.4" }, "funding": [ { @@ -13624,25 +13964,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-04-17T09:11:12+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.3.1", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51" + "reference": "f305fa4add690bb7d6b14ab61f37c3bd061a3dd7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/47c994d8f08817122ffb48bf2ea4fb97b7e00d51", - "reference": "47c994d8f08817122ffb48bf2ea4fb97b7e00d51", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f305fa4add690bb7d6b14ab61f37c3bd061a3dd7", + "reference": "f305fa4add690bb7d6b14ab61f37c3bd061a3dd7", "shasum": "" }, "require": { @@ -13698,7 +14042,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.1" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.4" }, "funding": [ { @@ -13709,12 +14053,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-06-05T09:30:41+00:00" + "time": "2025-09-25T08:03:55+00:00" }, { "name": "theofidry/alice-data-fixtures", @@ -13866,6 +14214,83 @@ } ], "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "vincentlanglet/twig-cs-fixer", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", + "reference": "ee9b6a31d2c2522b2773ecf31f5d29c2e26311a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/ee9b6a31d2c2522b2773ecf31f5d29c2e26311a6", + "reference": "ee9b6a31d2c2522b2773ecf31f5d29c2e26311a6", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "ext-ctype": "*", + "ext-json": "*", + "php": ">=8.0", + "symfony/console": "^5.4.9 || ^6.4 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/string": "^5.4.42 || ^6.4.10 || ~7.0.10 || ^7.1.3 || ^8.0", + "twig/twig": "^3.4", + "webmozart/assert": "^1.10" + }, + "require-dev": { + "composer/semver": "^3.2.0", + "dereuromark/composer-prefer-lowest": "^0.1.10", + "ergebnis/composer-normalize": "^2.29", + "friendsofphp/php-cs-fixer": "^3.13.0", + "infection/infection": "^0.26.16 || ^0.29.14", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-symfony": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^9.5.26 || ^11.5.18 || ^12.1.3", + "rector/rector": "^2.0.0", + "shipmonk/composer-dependency-analyser": "^1.6", + "symfony/process": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/twig-bridge": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/ux-twig-component": "^2.2.0", + "twig/cache-extra": "^3.2" + }, + "bin": [ + "bin/twig-cs-fixer" + ], + "type": "coding-standard", + "autoload": { + "psr-4": { + "TwigCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Vincent Langlet" + } + ], + "description": "A tool to automatically fix Twig code style", + "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", + "support": { + "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.10.0" + }, + "funding": [ + { + "url": "https://github.com/VincentLanglet", + "type": "github" + } + ], + "time": "2025-09-15T11:28:55+00:00" } ], "aliases": [], @@ -13874,9 +14299,10 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.3", + "php": ">=8.4", "ext-ctype": "*", - "ext-iconv": "*" + "ext-iconv": "*", + "ext-mbstring": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/config/packages/api_platform.yaml b/config/packages/api_platform.yaml index 56a17a4..e6a1b80 100644 --- a/config/packages/api_platform.yaml +++ b/config/packages/api_platform.yaml @@ -10,7 +10,7 @@ api_platform: enable_swagger: true enable_swagger_ui: true swagger: - versions: [ 3 ] + versions: [3] api_keys: apiKey: name: Authorization diff --git a/config/packages/asset_mapper.yaml b/config/packages/asset_mapper.yaml new file mode 100644 index 0000000..f7653e9 --- /dev/null +++ b/config/packages/asset_mapper.yaml @@ -0,0 +1,11 @@ +framework: + asset_mapper: + # The paths to make available to the asset mapper. + paths: + - assets/ + missing_import_mode: strict + +when@prod: + framework: + asset_mapper: + missing_import_mode: warn diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml index 6899b72..c3eb53d 100644 --- a/config/packages/cache.yaml +++ b/config/packages/cache.yaml @@ -16,4 +16,4 @@ framework: # Namespaced pools use the above "app" backend by default #pools: - #my.dedicated.cache: null + #my.dedicated.cache: null diff --git a/config/packages/debug.yaml b/config/packages/debug.yaml index ad874af..54a4821 100644 --- a/config/packages/debug.yaml +++ b/config/packages/debug.yaml @@ -2,4 +2,4 @@ when@dev: debug: # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. # See the "server:dump" command to start a new server. - dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" + dump_destination: 'tcp://%env(VAR_DUMPER_SERVER)%' diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index 2c9057c..1ad58d7 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -13,6 +13,14 @@ framework: #esi: true #fragments: true + http_client: + scoped_clients: + leantime.client: + base_uri: '%env(APP_LEANTIME_URI)%' + scope: '%env(APP_LEANTIME_URI)%' + headers: + x-api-key: '%env(APP_LEANTIME_API_KEY)%' + when@test: framework: test: true diff --git a/config/packages/itkdev_openid_connect.yaml b/config/packages/itkdev_openid_connect.yaml index 4afe5f1..854a6d3 100644 --- a/config/packages/itkdev_openid_connect.yaml +++ b/config/packages/itkdev_openid_connect.yaml @@ -1,31 +1,31 @@ itkdev_openid_connect: - cache_options: - cache_pool: 'cache.app' # Cache item pool for caching discovery document and CLI login tokens - cli_login_options: - route: '%env(OIDC_CLI_LOGIN_ROUTE)%' # Route for CLI login - user_provider: 'security.user.provider.concrete.app_user_provider' - openid_providers: - # Define one or more providers - # [providerKey]: - # options: - # metadata_url: … - # … - azure_az: - options: - metadata_url: '%env(string:AZURE_AZ_OIDC_METADATA_URL)%' - client_id: '%env(AZURE_AZ_OIDC_CLIENT_ID)%' - client_secret: '%env(AZURE_AZ_OIDC_CLIENT_SECRET)%' - # Specify redirect URI - redirect_uri: '%env(string:AZURE_AZ_OIDC_REDIRECT_URI)%' - allow_http: '%env(bool:AZURE_AZ_OIDC_ALLOW_HTTP)%' - # Optional: Specify leeway (seconds) to account for clock skew between provider and hosting - # Defaults to 10 - leeway: '%env(int:AZURE_AZ_OIDC_LEEWAY)%' + cache_options: + cache_pool: 'cache.app' # Cache item pool for caching discovery document and CLI login tokens + cli_login_options: + route: '%env(OIDC_CLI_LOGIN_ROUTE)%' # Route for CLI login + user_provider: 'security.user.provider.concrete.app_user_provider' + openid_providers: + # Define one or more providers + # [providerKey]: + # options: + # metadata_url: … + # … + azure_az: + options: + metadata_url: '%env(string:AZURE_AZ_OIDC_METADATA_URL)%' + client_id: '%env(AZURE_AZ_OIDC_CLIENT_ID)%' + client_secret: '%env(AZURE_AZ_OIDC_CLIENT_SECRET)%' + # Specify redirect URI + redirect_uri: '%env(string:AZURE_AZ_OIDC_REDIRECT_URI)%' + allow_http: '%env(bool:AZURE_AZ_OIDC_ALLOW_HTTP)%' + # Optional: Specify leeway (seconds) to account for clock skew between provider and hosting + # Defaults to 10 + leeway: '%env(int:AZURE_AZ_OIDC_LEEWAY)%' when@prod: - itkdev_openid_connect: - openid_providers: - azure_az: - options: - client_id: '%env(vault:AZURE_AZ_OIDC_CLIENT_ID)%' - client_secret: '%env(vault:AZURE_AZ_OIDC_CLIENT_SECRET)%' + itkdev_openid_connect: + openid_providers: + azure_az: + options: + client_id: '%env(vault:AZURE_AZ_OIDC_CLIENT_ID)%' + client_secret: '%env(vault:AZURE_AZ_OIDC_CLIENT_SECRET)%' diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index 419a72f..8db527e 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -7,7 +7,7 @@ framework: # https://symfony.com/doc/current/messenger.html#transport-configuration sync: 'sync://' async: - dsn: "%env(MESSENGER_TRANSPORT_DSN)%" + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' retry_strategy: # 1, 3, 9, 27 max_retries: 4 diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index 9db7d8a..13ae420 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -7,9 +7,9 @@ when@dev: handlers: main: type: stream - path: "%kernel.logs_dir%/%kernel.environment%.log" + path: '%kernel.logs_dir%/%kernel.environment%.log' level: debug - channels: ["!event"] + channels: ['!event'] # uncomment to get logging in your browser # you may have to allow bigger header sizes in your Web server configuration #firephp: @@ -21,7 +21,7 @@ when@dev: console: type: console process_psr_3_messages: false - channels: ["!event", "!doctrine", "!console"] + channels: ['!event', '!doctrine', '!console'] when@test: monolog: @@ -31,10 +31,10 @@ when@test: action_level: error handler: nested excluded_http_codes: [404, 405] - channels: ["!event"] + channels: ['!event'] nested: type: stream - path: "%kernel.logs_dir%/%kernel.environment%.log" + path: '%kernel.logs_dir%/%kernel.environment%.log' level: debug when@prod: @@ -54,7 +54,7 @@ when@prod: console: type: console process_psr_3_messages: false - channels: ["!event", "!doctrine"] + channels: ['!event', '!doctrine'] deprecation: type: stream channels: [deprecation] diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 67b283a..25bfb56 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -42,7 +42,7 @@ security: access_control: - { path: ^/api/docs, roles: PUBLIC_ACCESS } - { path: ^/api, roles: ROLE_SERVER } - - { path: ^/admin, roles: ROLE_ADMIN } + - { path: ^/admin, roles: ROLE_ADMIN } # - { path: ^/profile, roles: ROLE_USER } when@test: diff --git a/config/packages/webpack_encore.yaml b/config/packages/webpack_encore.yaml index 4c009ee..d8b3909 100644 --- a/config/packages/webpack_encore.yaml +++ b/config/packages/webpack_encore.yaml @@ -11,8 +11,8 @@ webpack_encore: # https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change # 'data-turbo-track': reload # link_attributes: - # Uncomment if using Turbo Drive - # 'data-turbo-track': reload + # Uncomment if using Turbo Drive + # 'data-turbo-track': reload # If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials') # crossorigin: 'anonymous' @@ -25,15 +25,14 @@ webpack_encore: # If you have multiple builds: # builds: - # frontend: '%kernel.project_dir%/public/frontend/build' + # frontend: '%kernel.project_dir%/public/frontend/build' - # pass the build name as the 3rd argument to the Twig functions - # {{ encore_entry_script_tags('entry1', null, 'frontend') }} + # pass the build name as the 3rd argument to the Twig functions + # {{ encore_entry_script_tags('entry1', null, 'frontend') }} framework: assets: json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' - #when@prod: # webpack_encore: # # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) diff --git a/config/routes.yaml b/config/routes.yaml index 2048965..1459988 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,9 +1,9 @@ homepage: - path: / - controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction - defaults: - path: /admin - permanent: false + path: / + controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction + defaults: + path: /admin + permanent: false controllers: resource: diff --git a/config/routes/easyadmin.yaml b/config/routes/easyadmin.yaml index a88552e..083ca15 100644 --- a/config/routes/easyadmin.yaml +++ b/config/routes/easyadmin.yaml @@ -1,3 +1,3 @@ easyadmin: - resource: . - type: easyadmin.routes \ No newline at end of file + resource: . + type: easyadmin.routes diff --git a/config/routes/itkdev_openid_connect.yaml b/config/routes/itkdev_openid_connect.yaml index 2628cd9..1c60325 100644 --- a/config/routes/itkdev_openid_connect.yaml +++ b/config/routes/itkdev_openid_connect.yaml @@ -1,3 +1,3 @@ itkdev_openid_connect: - resource: "@ItkDevOpenIdConnectBundle/src/Resources/config/routes.yaml" - prefix: "/openidconnect" # Prefix for bundle routes \ No newline at end of file + resource: '@ItkDevOpenIdConnectBundle/src/Resources/config/routes.yaml' + prefix: '/openidconnect' # Prefix for bundle routes diff --git a/config/services.yaml b/config/services.yaml index 8463e06..c98c423 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -8,7 +8,7 @@ parameters: services: # default configuration for services in *this* file _defaults: - autowire: true # Automatically injects dependencies in your services. + autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. # makes classes in src/ available to be used as services @@ -25,15 +25,18 @@ services: _instanceof: App\Handler\DetectionResultHandlerInterface: - tags: [ app.handler.detection_result_handler ] + tags: [app.handler.detection_result_handler] App\EventListener\RemovedRelationsListener: tags: - - - name: 'doctrine.event_listener' - event: 'postFlush' + - name: 'doctrine.event_listener' + event: 'postFlush' App\MessageHandler\ProcessDetectionResultHandler: arguments: $resultHandlers: !tagged_iterator app.handler.detection_result_handler $keepResults: '%env(int:APP_KEEP_RESULTS)%' + + App\Service\Leantime\LeantimeProjectUrlFactory: + arguments: + $baseUrl: '%env(string:APP_LEANTIME_URI)%' diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 4ac6fe3..ca2f4d1 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,4 +1,4 @@ -# itk-version: 3.2.1 +# itk-version: 3.2.4 services: phpfpm: environment: diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 76201fa..4208ae2 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -2,8 +2,8 @@ services: rabbit: image: rabbitmq:4-management-alpine networks: - - app - - frontend + - app + - frontend ports: - "15672" environment: diff --git a/docker-compose.redirect.yml b/docker-compose.redirect.yml index 66f26e9..e9ba157 100644 --- a/docker-compose.redirect.yml +++ b/docker-compose.redirect.yml @@ -1,4 +1,4 @@ -# itk-version: 3.2.1 +# itk-version: 3.2.4 services: nginx: labels: diff --git a/docker-compose.server.yml b/docker-compose.server.yml index f93d840..44c75cd 100644 --- a/docker-compose.server.yml +++ b/docker-compose.server.yml @@ -1,4 +1,4 @@ -# itk-version: 3.2.1 +# itk-version: 3.2.4 networks: frontend: external: true @@ -17,7 +17,6 @@ services: environment: - PHP_MAX_EXECUTION_TIME=30 - PHP_MEMORY_LIMIT=128M - - COMPOSER_VERSION=2 volumes: - .:/app diff --git a/docker-compose.yml b/docker-compose.yml index 88d602c..dc2ef97 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -# itk-version: 3.2.1 +# itk-version: 3.2.4 networks: frontend: external: true @@ -12,7 +12,13 @@ services: networks: - app ports: - - '3306' + - "3306" + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 10s + timeout: 5s + retries: 3 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_USER=db @@ -22,6 +28,7 @@ services: phpfpm: image: itkdev/php8.4-fpm:latest + user: ${COMPOSE_USER:-deploy} networks: - app extra_hosts: @@ -33,10 +40,10 @@ services: # Depending on the setup, you may have to remove --read-envelope-from from msmtp (cf. https://marlam.de/msmtp/msmtp.html) or use SMTP to send mail - PHP_SENDMAIL_PATH=/usr/bin/msmtp --host=mail --port=1025 --read-recipients --read-envelope-from - DOCKER_HOST_DOMAIN=${COMPOSE_DOMAIN} - - COMPOSER_VERSION=2 - PHP_IDE_CONFIG=serverName=localhost depends_on: - - mariadb + mariadb: + condition: service_healthy volumes: - .:/app @@ -48,7 +55,7 @@ services: depends_on: - phpfpm ports: - - '8080' + - "8080" volumes: - ./.docker/templates:/etc/nginx/templates:ro - .:/app @@ -61,9 +68,9 @@ services: - "traefik.enable=true" - "traefik.docker.network=frontend" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${COMPOSE_DOMAIN}`)" -# HTTPS config - uncomment to enable redirect from :80 to :443 -# - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=redirect-to-https" -# - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" + # HTTPS config - uncomment to enable redirect from :80 to :443 + # - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.middlewares=redirect-to-https" + # - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" mail: image: axllent/mailpit @@ -78,3 +85,22 @@ services: - "traefik.docker.network=frontend" - "traefik.http.routers.${COMPOSE_PROJECT_NAME}mail.rule=Host(`mail-${COMPOSE_DOMAIN}`)" - "traefik.http.services.${COMPOSE_PROJECT_NAME}mail.loadbalancer.server.port=8025" + + # Code checks tools + markdownlint: + image: itkdev/markdownlint + profiles: + - dev + volumes: + - ./:/md + + prettier: + # Prettier does not (yet, fcf. + # https://github.com/prettier/prettier/issues/15206) have an official + # docker image. + # https://hub.docker.com/r/jauderho/prettier is good candidate (cf. https://hub.docker.com/search?q=prettier&sort=updated_at&order=desc) + image: jauderho/prettier + profiles: + - dev + volumes: + - ./:/work diff --git a/fixtures/oidc.yaml b/fixtures/oidc.yaml index 3712104..26fcc88 100644 --- a/fixtures/oidc.yaml +++ b/fixtures/oidc.yaml @@ -1,8 +1,8 @@ # @see https://fakerphp.github.io/formatters/ App\Entity\OIDC: - oidcservice_certificate/dev.example.com: - domain: 'dev.example.com' - expirationTime: <(new DateTime('+2 years'))> - onePasswordUrl: 'https://example.com/1password' - usageDocumentationUrl: https://example.com/example.com/README.md#oidc - type: 'stg' + oidcservice_certificate/dev.example.com: + domain: "dev.example.com" + expirationTime: <(new DateTime('+2 years'))> + onePasswordUrl: "https://example.com/1password" + usageDocumentationUrl: https://example.com/example.com/README.md#oidc + type: "stg" diff --git a/fixtures/server.yaml b/fixtures/server.yaml index 8fb9bf3..c23095a 100644 --- a/fixtures/server.yaml +++ b/fixtures/server.yaml @@ -1,17 +1,17 @@ App\Entity\Server: - server_{1..10}: - # A server id is needed by App\Entity\DetectionResult::generateHash(). - id: '<(new Symfony\Component\Uid\Ulid())>' - apiKey: - name: - hostingProvider: - internalIp: - externalIp: - aarhusSsl: - letsEncryptSsl: - veeam: - azureBackup: - monitoring: - databaseVersion: - system: - type: + server_{1..10}: + # A server id is needed by App\Entity\DetectionResult::generateHash(). + id: '<(new Symfony\Component\Uid\Ulid())>' + apiKey: + name: + hostingProvider: + internalIp: + externalIp: + aarhusSsl: + letsEncryptSsl: + veeam: + azureBackup: + monitoring: + databaseVersion: + system: + type: diff --git a/fixtures/service_certificates.yaml b/fixtures/service_certificates.yaml index 76c0a0d..66c8cd6 100644 --- a/fixtures/service_certificates.yaml +++ b/fixtures/service_certificates.yaml @@ -1,30 +1,30 @@ # @see https://fakerphp.github.io/formatters/ App\Entity\ServiceCertificate: - service_certificate/dev.example.com: - domain: 'dev.example.com' - name: 'CPR-opslag' - description: | - Bruges til opslag af CPR-numre. - onePasswordUrl: 'https://example.com/1password' - expirationTime: <(new DateTime('+2 years'))> - usageDocumentationUrl: https://example.com/example.com/README.md#certificates + service_certificate/dev.example.com: + domain: "dev.example.com" + name: "CPR-opslag" + description: | + Bruges til opslag af CPR-numre. + onePasswordUrl: "https://example.com/1password" + expirationTime: <(new DateTime('+2 years'))> + usageDocumentationUrl: https://example.com/example.com/README.md#certificates - service_certificate/prod.example.com: - domain: 'prod.example.com' - name: 'CVR-opslag' - description: | - Bruges til opslag af CVR-numre. - onePasswordUrl: 'https://example.com/1password' - expirationTime: <(new DateTime('+4 years'))> - usageDocumentationUrl: https://example.com/example.com/README.md#certificates + service_certificate/prod.example.com: + domain: "prod.example.com" + name: "CVR-opslag" + description: | + Bruges til opslag af CVR-numre. + onePasswordUrl: "https://example.com/1password" + expirationTime: <(new DateTime('+4 years'))> + usageDocumentationUrl: https://example.com/example.com/README.md#certificates App\Entity\ServiceCertificate\Service: - service/dev.example.com/service_certificate/digital-post: - certificate: '@service_certificate/dev.example.com' - type: 'digital post' - onePasswordUrl: 'https://example.com/1password' + service/dev.example.com/service_certificate/digital-post: + certificate: "@service_certificate/dev.example.com" + type: "digital post" + onePasswordUrl: "https://example.com/1password" - service/dev.example.com/service_certificate/cpr-lookup: - certificate: '@service_certificate/dev.example.com' - type: 'cpr lookup' - onePasswordUrl: 'https://example.com/1password' + service/dev.example.com/service_certificate/cpr-lookup: + certificate: "@service_certificate/dev.example.com" + type: "cpr lookup" + onePasswordUrl: "https://example.com/1password" diff --git a/fixtures/site.yaml b/fixtures/site.yaml index 4c19d2d..1e321b1 100644 --- a/fixtures/site.yaml +++ b/fixtures/site.yaml @@ -1,83 +1,83 @@ App\Entity\DetectionResult: - detection_result/dev.example.com: - server: '@server_1' - type: 'nginx' - rootDir: '/data/www/dev.example.com/htdocs/public' - data: | - { - "domain": "dev.example.com", - "phpVersion": "8.2", - "config": "/etc/nginx/sites-enabled/dev.example.com" - } - __calls: - - generateHash: [] - - setLastContact: [] + detection_result/dev.example.com: + server: "@server_1" + type: "nginx" + rootDir: "/data/www/dev.example.com/htdocs/public" + data: | + { + "domain": "dev.example.com", + "phpVersion": "8.2", + "config": "/etc/nginx/sites-enabled/dev.example.com" + } + __calls: + - generateHash: [] + - setLastContact: [] - detection_result/test.example.com: - server: '@server_1' - type: 'nginx' - rootDir: '/data/www/test.example.com/htdocs/public' - data: | - { - "domain": "test.example.com", - "phpVersion": "8.2", - "config": "/etc/nginx/sites-enabled/test.example.com" - } - __calls: - - generateHash: [] - - setLastContact: [] + detection_result/test.example.com: + server: "@server_1" + type: "nginx" + rootDir: "/data/www/test.example.com/htdocs/public" + data: | + { + "domain": "test.example.com", + "phpVersion": "8.2", + "config": "/etc/nginx/sites-enabled/test.example.com" + } + __calls: + - generateHash: [] + - setLastContact: [] - detection_result/prod.example.com: - server: '@server_1' - type: 'nginx' - rootDir: '/data/www/prod.example.com/htdocs/public' - data: | - { - "domain": "prod.example.com", - "phpVersion": "8.2", - "config": "/etc/nginx/sites-enabled/prod.example.com" - } - __calls: - - generateHash: [] - - setLastContact: [] + detection_result/prod.example.com: + server: "@server_1" + type: "nginx" + rootDir: "/data/www/prod.example.com/htdocs/public" + data: | + { + "domain": "prod.example.com", + "phpVersion": "8.2", + "config": "/etc/nginx/sites-enabled/prod.example.com" + } + __calls: + - generateHash: [] + - setLastContact: [] App\Entity\Domain: - domain/dev.example.com: - rootDir: '/tmp' - address: 'dev.example.com' - detectionResult: '@detection_result/dev.example.com' - domain/test.example.com: - rootDir: '/tmp' - address: 'test.example.com' - detectionResult: '@detection_result/test.example.com' - domain/prod.example.com: - rootDir: '/tmp' - address: 'prod.example.com' - detectionResult: '@detection_result/prod.example.com' + domain/dev.example.com: + rootDir: "/tmp" + address: "dev.example.com" + detectionResult: "@detection_result/dev.example.com" + domain/test.example.com: + rootDir: "/tmp" + address: "test.example.com" + detectionResult: "@detection_result/test.example.com" + domain/prod.example.com: + rootDir: "/tmp" + address: "prod.example.com" + detectionResult: "@detection_result/prod.example.com" App\Entity\Installation: - installation/dev.example.com: - rootDir: '/tmp' - detectionResult: '@detection_result/dev.example.com' + installation/dev.example.com: + rootDir: "/tmp" + detectionResult: "@detection_result/dev.example.com" - installation/prod.example.com: - rootDir: '/tmp' - detectionResult: '@detection_result/prod.example.com' + installation/prod.example.com: + rootDir: "/tmp" + detectionResult: "@detection_result/prod.example.com" App\Entity\Site: - site/dev.example.com: - server: '@server_1' - detectionResult: '@detection_result/dev.example.com' - rootDir: '/data/www/dev.example.com/htdocs/public' - installation: '@installation/dev.example.com' - __calls: - - addDomain: ['@domain/dev.example.com'] + site/dev.example.com: + server: "@server_1" + detectionResult: "@detection_result/dev.example.com" + rootDir: "/data/www/dev.example.com/htdocs/public" + installation: "@installation/dev.example.com" + __calls: + - addDomain: ["@domain/dev.example.com"] - site/prod.example.com: - server: '@server_1' - detectionResult: '@detection_result/prod.example.com' - rootDir: '/data/www/prod.example.com/htdocs/public' - installation: '@installation/prod.example.com' - __calls: - - addDomain: ['@domain/prod.example.com'] - - addDomain: ['@domain/test.example.com'] + site/prod.example.com: + server: "@server_1" + detectionResult: "@detection_result/prod.example.com" + rootDir: "/data/www/prod.example.com/htdocs/public" + installation: "@installation/prod.example.com" + __calls: + - addDomain: ["@domain/prod.example.com"] + - addDomain: ["@domain/test.example.com"] diff --git a/fixtures/user.yaml b/fixtures/user.yaml index ec4cfd7..de04a82 100644 --- a/fixtures/user.yaml +++ b/fixtures/user.yaml @@ -1,5 +1,3 @@ App\Entity\User: - user_admin: - __construct: [ - 'admin@example.com', 'Admin', [ROLE_ADMIN] - ] + user_admin: + __construct: ["admin@example.com", "Admin", [ROLE_ADMIN]] diff --git a/importmap.php b/importmap.php new file mode 100644 index 0000000..70ebf14 --- /dev/null +++ b/importmap.php @@ -0,0 +1,19 @@ + [ + 'path' => './assets/app.js', + 'entrypoint' => true, + ], +]; diff --git a/migrations/Version20251023091529.php b/migrations/Version20251023091529.php new file mode 100644 index 0000000..f1a4fea --- /dev/null +++ b/migrations/Version20251023091529.php @@ -0,0 +1,75 @@ +addSql(<<<'SQL' + CREATE TABLE project ( + id BINARY(16) NOT NULL, + created_at DATETIME NOT NULL, + modified_at DATETIME NOT NULL, + created_by VARCHAR(255) DEFAULT '' NOT NULL, + modified_by VARCHAR(255) DEFAULT '' NOT NULL, + leantime_id INT NOT NULL, + name VARCHAR(255) NOT NULL, + leantime_url VARCHAR(255) DEFAULT NULL, + economics_url VARCHAR(255) DEFAULT NULL, + details LONGTEXT DEFAULT NULL, + leantime_modified_at DATETIME NOT NULL, + UNIQUE INDEX UNIQ_2FB3D0EE4B785F0C (leantime_id), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE security_contract ( + id BINARY(16) NOT NULL, + created_at DATETIME NOT NULL, + modified_at DATETIME NOT NULL, + created_by VARCHAR(255) DEFAULT '' NOT NULL, + modified_by VARCHAR(255) DEFAULT '' NOT NULL, + economics_report_url VARCHAR(255) DEFAULT NULL, + operational_contract_url LONGTEXT DEFAULT NULL, + monthly_price DOUBLE PRECISION DEFAULT NULL, + quarterly_hours DOUBLE PRECISION DEFAULT NULL, + valid_from DATE NOT NULL, + valid_to DATE NOT NULL, + active TINYINT(1) NOT NULL, + notes LONGTEXT NOT NULL, + project_id BINARY(16) NOT NULL, + UNIQUE INDEX UNIQ_8AE4AF8B166D1F9C (project_id), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE + security_contract + ADD + CONSTRAINT FK_8AE4AF8B166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) + SQL); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE security_contract DROP FOREIGN KEY FK_8AE4AF8B166D1F9C'); + $this->addSql('DROP TABLE project'); + $this->addSql('DROP TABLE security_contract'); + } +} diff --git a/psalm.xml b/psalm.xml deleted file mode 100644 index bedf5ac..0000000 --- a/psalm.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/public/css/admin.css b/public/css/admin.css deleted file mode 100644 index 853c0f8..0000000 --- a/public/css/admin.css +++ /dev/null @@ -1,15 +0,0 @@ -:root { - --body-max-width: 100%; - --sidebar-bg: #fff; - /* make the base font size smaller */ - --button-primary-bg: rgb(0,123,166); - --pagination-active-bg: rgb(0,123,166); - --link-color: rgb(0,123,166); - --sidebar-menu-active-item-color: rgb(0,123,166); - --badge-boolean-true-bg: rgb(0,123,166); - --badge-boolean-false-bg: rgb(228, 73, 48); - --badge-boolean-false-color: var(--white); - --sidebar-menu-color: rgb(66,66,66); - --text-color-dark: rgb(66,66,66); - --bs-danger-rgb: 228, 73, 48; -} \ No newline at end of file diff --git a/src/Command/ReplayDetectionResultsCommand.php b/src/Command/ReplayDetectionResultsCommand.php index 020ecb1..a17c05d 100644 --- a/src/Command/ReplayDetectionResultsCommand.php +++ b/src/Command/ReplayDetectionResultsCommand.php @@ -30,9 +30,6 @@ class ReplayDetectionResultsCommand extends Command { /** * ReplayDetectionResultsCommand constructor. - * - * @param EntityManagerInterface $entityManager - * @param MessageBusInterface $messageBus */ public function __construct( private readonly EntityManagerInterface $entityManager, @@ -68,7 +65,6 @@ protected function configure(): void ; } - /** {@inheritDoc} */ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); @@ -147,10 +143,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** * Dispatch message to the message bus. * - * @param Ulid $detectionResultID - * - * @return Envelope - * * @throws \Throwable */ private function dispatch(Ulid $detectionResultID): Envelope @@ -172,10 +164,6 @@ private function dispatch(Ulid $detectionResultID): Envelope /** * Get a Ulid from a string with/without dashes. - * - * @param string $ulid - * - * @return Ulid */ private static function fromString(string $ulid): Ulid { diff --git a/src/Command/SyncLeantimeProjectsCommand.php b/src/Command/SyncLeantimeProjectsCommand.php new file mode 100644 index 0000000..dc66a49 --- /dev/null +++ b/src/Command/SyncLeantimeProjectsCommand.php @@ -0,0 +1,54 @@ +addOption('project-id', null, InputOption::VALUE_REQUIRED, 'Leantime project ID'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + try { + if ($input->getOption('project-id')) { + $projectId = (int) $input->getOption('project-id'); + + $project = $this->projectSyncService->syncProject($projectId); + + $io->success(sprintf('Project: %s (%d) synced successfully.', $project->getName(), $project->getLeantimeId())); + } else { + $count = $this->projectSyncService->syncAllProjects(); + + $io->success(sprintf('Synced %d projects successfully.', $count)); + } + } catch (\Throwable $e) { + $io->error($e->getMessage()); + + return Command::FAILURE; + } + + return Command::SUCCESS; + } +} diff --git a/src/Controller/Admin/AbstractFullCrudController.php b/src/Controller/Admin/AbstractFullCrudController.php new file mode 100644 index 0000000..10c4c47 --- /dev/null +++ b/src/Controller/Admin/AbstractFullCrudController.php @@ -0,0 +1,65 @@ +showEntityActionsInlined(); + } + + #[\Override] + public function configureActions(Actions $actions): Actions + { + // Remove default actions + $actions + ->remove(Crud::PAGE_INDEX, Action::EDIT) + ->remove(Crud::PAGE_INDEX, Action::DELETE); + + // Re-add default actions as grouped action. + $groupedDefaultActions = ActionGroup::new('default', 'Default') + ->addMainAction( + Action::new('show', 'Show') + ->linkToCrudAction(Action::DETAIL) + ) + ->addAction( + Action::new('edit', 'Edit') + ->linkToCrudAction(Action::EDIT) + ->setIcon('fa fa-edit') + ) + ->addDivider() + ->addAction( + Action::new('delete', 'Delete') + ->linkToCrudAction(Action::DELETE) + ->setIcon('fa fa-trash') + ->setCssClass('btn-danger text-danger') + ); + + return $actions + ->add(Crud::PAGE_INDEX, $groupedDefaultActions) + ->add(Crud::PAGE_INDEX, $this->createExportAction()) + ->update(Crud::PAGE_INDEX, Action::NEW, + static fn (Action $action) => $action->setIcon('fa fa-plus') + ) + ; + } + + #[\Override] + public function configureAssets(Assets $assets): Assets + { + return $assets + ->addWebpackEncoreEntry('easyadmin'); + } +} diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php index e63ed4f..9e1e0e6 100644 --- a/src/Controller/Admin/DashboardController.php +++ b/src/Controller/Admin/DashboardController.php @@ -4,6 +4,7 @@ namespace App\Controller\Admin; +use App\EasyAdmin\Config\AutoBadgeMenuItem; use App\Entity\Advisory; use App\Entity\DetectionResult; use App\Entity\DockerImage; @@ -17,10 +18,15 @@ use App\Entity\OIDC; use App\Entity\Package; use App\Entity\PackageVersion; +use App\Entity\Project; +use App\Entity\SecurityContract; use App\Entity\Server; use App\Entity\ServiceCertificate; use App\Entity\Site; use App\Repository\AdvisoryRepository; +use App\Repository\OIDCRepository; +use App\Repository\SecurityContractRepository; +use App\Repository\ServiceCertificateRepository; use EasyCorp\Bundle\EasyAdminBundle\Config\Assets; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard; @@ -34,6 +40,9 @@ class DashboardController extends AbstractDashboardController public function __construct( private readonly AdminUrlGenerator $adminUrlGenerator, private readonly AdvisoryRepository $advisoryRepository, + private readonly ServiceCertificateRepository $serviceCertificateRepository, + private readonly OIDCRepository $oidcRepository, + private readonly SecurityContractRepository $securityContractRepository, ) { } @@ -52,7 +61,7 @@ public function index(): Response public function configureDashboard(): Dashboard { return Dashboard::new() - ->setTitle('ITK sites') + ->setTitle('ITK sites logo') ->setFaviconPath('img/favicon.ico') ->renderContentMaximized(); } @@ -61,16 +70,27 @@ public function configureDashboard(): Dashboard public function configureMenuItems(): iterable { yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); + + yield MenuItem::section('Projects'); + yield MenuItem::linkToCrud('Projects', 'fas fa-folder', Project::class); + yield AutoBadgeMenuItem::linkToCrud('Cyber Security', 'fas fa-file-contract', SecurityContract::class) + ->setBadge($this->securityContractRepository->countExpiredContracts(), 'danger'); + yield AutoBadgeMenuItem::linkToCrud('OIDC', 'fas fa-shield-halved', OIDC::class) + ->setBadge($this->oidcRepository->countExpiredCertificates(), 'danger'); + yield AutoBadgeMenuItem::linkToCrud('Service certificates', 'fas fa-passport', ServiceCertificate::class) + ->setBadge($this->serviceCertificateRepository->countExpiredCertificates(), 'danger'); + + yield MenuItem::section('Hosting'); yield MenuItem::linkToCrud('Servers', 'fas fa-server', Server::class); yield MenuItem::linkToCrud('Installations', 'fas fa-folder', Installation::class); yield MenuItem::linkToCrud('Sites', 'fas fa-bookmark', Site::class); yield MenuItem::linkToCrud('Domains', 'fas fa-link', Domain::class); - yield MenuItem::linkToCrud('OIDC', 'fas fa-key', OIDC::class); - yield MenuItem::linkToCrud('Service certificates', 'fas fa-lock', ServiceCertificate::class); + yield MenuItem::section('Dependencies'); yield MenuItem::linkToCrud('Packages', 'fas fa-cube', Package::class); yield MenuItem::linkToCrud('Package Versions', 'fas fa-cubes', PackageVersion::class); - yield MenuItem::linkToCrud('Advisories', 'fas fa-skull-crossbones', Advisory::class)->setBadge($this->advisoryRepository->count([]), 'dark'); + yield AutoBadgeMenuItem::linkToCrud('Advisories', 'fas fa-skull-crossbones', Advisory::class) + ->setBadge($this->advisoryRepository->count([]), 'danger'); yield MenuItem::linkToCrud('Modules', 'fas fa-cube', Module::class); yield MenuItem::linkToCrud('Modules Versions', 'fas fa-cubes', ModuleVersion::class); yield MenuItem::linkToCrud('Docker Images', 'fas fa-cube', DockerImage::class); @@ -95,6 +115,6 @@ public function configureCrud(): Crud #[\Override] public function configureAssets(): Assets { - return Assets::new()->addCssFile('css/admin.css'); + return parent::configureAssets()->addAssetMapperEntry('app'); } } diff --git a/src/Controller/Admin/DetectionResultCrudController.php b/src/Controller/Admin/DetectionResultCrudController.php index 5027e68..a206930 100644 --- a/src/Controller/Admin/DetectionResultCrudController.php +++ b/src/Controller/Admin/DetectionResultCrudController.php @@ -36,12 +36,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/DockerImageCrudController.php b/src/Controller/Admin/DockerImageCrudController.php index 980c426..dec7b4f 100644 --- a/src/Controller/Admin/DockerImageCrudController.php +++ b/src/Controller/Admin/DockerImageCrudController.php @@ -32,12 +32,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/DockerImageTagCrudController.php b/src/Controller/Admin/DockerImageTagCrudController.php index 49f7855..779e484 100644 --- a/src/Controller/Admin/DockerImageTagCrudController.php +++ b/src/Controller/Admin/DockerImageTagCrudController.php @@ -31,12 +31,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/DomainCrudController.php b/src/Controller/Admin/DomainCrudController.php index 060e8ef..9387eb9 100644 --- a/src/Controller/Admin/DomainCrudController.php +++ b/src/Controller/Admin/DomainCrudController.php @@ -36,14 +36,9 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions + ->disable(Action::DELETE, Action::NEW, Action::EDIT) ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE) - ; + ->add(Crud::PAGE_INDEX, $this->createExportAction()); } #[\Override] diff --git a/src/Controller/Admin/GitRepoCrudController.php b/src/Controller/Admin/GitRepoCrudController.php index 7fa2d4e..562c8c9 100644 --- a/src/Controller/Admin/GitRepoCrudController.php +++ b/src/Controller/Admin/GitRepoCrudController.php @@ -35,12 +35,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/GitTagCrudController.php b/src/Controller/Admin/GitTagCrudController.php index eceec7e..8c2d592 100644 --- a/src/Controller/Admin/GitTagCrudController.php +++ b/src/Controller/Admin/GitTagCrudController.php @@ -33,12 +33,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/InstallationCrudController.php b/src/Controller/Admin/InstallationCrudController.php index e78a4cf..d36000e 100644 --- a/src/Controller/Admin/InstallationCrudController.php +++ b/src/Controller/Admin/InstallationCrudController.php @@ -41,13 +41,9 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions + ->disable(Action::DELETE, Action::NEW, Action::EDIT) ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->add(Crud::PAGE_INDEX, $this->createExportAction()); } #[\Override] diff --git a/src/Controller/Admin/ModuleCrudController.php b/src/Controller/Admin/ModuleCrudController.php index 9cc6a73..311d478 100644 --- a/src/Controller/Admin/ModuleCrudController.php +++ b/src/Controller/Admin/ModuleCrudController.php @@ -31,12 +31,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/ModuleVersionCrudController.php b/src/Controller/Admin/ModuleVersionCrudController.php index 1d3f3e5..e80ad8d 100644 --- a/src/Controller/Admin/ModuleVersionCrudController.php +++ b/src/Controller/Admin/ModuleVersionCrudController.php @@ -30,12 +30,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/OIDCCrudController.php b/src/Controller/Admin/OIDCCrudController.php index 176871e..006c319 100644 --- a/src/Controller/Admin/OIDCCrudController.php +++ b/src/Controller/Admin/OIDCCrudController.php @@ -6,11 +6,7 @@ use App\Entity\OIDC; use App\Repository\SiteRepository; -use App\Trait\ExportCrudControllerTrait; -use EasyCorp\Bundle\EasyAdminBundle\Config\Action; -use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; -use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField; @@ -18,10 +14,8 @@ use EasyCorp\Bundle\EasyAdminBundle\Field\UrlField; use Symfony\Component\Translation\TranslatableMessage; -class OIDCCrudController extends AbstractCrudController +class OIDCCrudController extends AbstractFullCrudController { - use ExportCrudControllerTrait; - public function __construct( private readonly SiteRepository $siteRepository) { @@ -32,21 +26,6 @@ public static function getEntityFqcn(): string return OIDC::class; } - #[\Override] - public function configureCrud(Crud $crud): Crud - { - return $crud->showEntityActionsInlined(); - } - - #[\Override] - public function configureActions(Actions $actions): Actions - { - return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ; - } - #[\Override] public function configureFields(string $pageName): iterable { diff --git a/src/Controller/Admin/PackageCrudController.php b/src/Controller/Admin/PackageCrudController.php index 21fbd74..1e076b4 100644 --- a/src/Controller/Admin/PackageCrudController.php +++ b/src/Controller/Admin/PackageCrudController.php @@ -37,12 +37,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/PackageVersionCrudController.php b/src/Controller/Admin/PackageVersionCrudController.php index a015c2b..d36efc4 100644 --- a/src/Controller/Admin/PackageVersionCrudController.php +++ b/src/Controller/Admin/PackageVersionCrudController.php @@ -36,12 +36,8 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, Action::DETAIL); } #[\Override] diff --git a/src/Controller/Admin/ProjectCrudController.php b/src/Controller/Admin/ProjectCrudController.php new file mode 100644 index 0000000..a435adf --- /dev/null +++ b/src/Controller/Admin/ProjectCrudController.php @@ -0,0 +1,93 @@ +setDefaultSort(['name' => 'ASC']) + ->setSearchFields(['name', 'details']) + ->showEntityActionsInlined() + ->setPageTitle(Crud::PAGE_INDEX, 'Projects') + ->setHelp(Crud::PAGE_INDEX, 'Projects are synced from Leantime. Click on the "Sync all" button to update all projects.'); + } + + #[\Override] + public function configureActions(Actions $actions): Actions + { + return $actions + ->disable(Action::DELETE, Action::NEW, Action::EDIT) + ->add(Crud::PAGE_INDEX, $this->createLeantimeAction()) + ->add(Crud::PAGE_DETAIL, $this->createLeantimeAction()) + ->add(Crud::PAGE_INDEX, Action::DETAIL) + ->add(Crud::PAGE_INDEX, $this->createExportAction()) + ->add(Crud::PAGE_INDEX, $this->createUpdateAllProjectsAction()); + } + + #[\Override] + public function configureFields(string $pageName): iterable + { + yield VersionField::new('LeantimeId')->setLabel('id'); + yield TextField::new('name'); + yield TextEditorField::new('details')->formatValue(fn ($value) => strip_tags($value)); + yield DateTimeField::new('createdAt')->hideOnIndex(); + } + + public function createLeantimeAction(?string $label = null): Action + { + return Action::new('leantime', $label ?? new TranslatableMessage('Leantime'), 'fa fa-link') + ->linkToUrl(function (Project $project) { + return $project->getLeantimeUrl(); + }); + } + + public function createUpdateAllProjectsAction(?string $label = null): Action + { + return Action::new('update', $label ?? new TranslatableMessage('Sync all'), 'fa fa-rotate') + ->createAsGlobalAction() + ->linkToCrudAction('updateAllProjects'); + } + + public function updateAllProjects(SiteRepository $siteRepository): RedirectResponse + { + try { + $this->projectSyncService->syncAllProjects(); + + $this->addFlash('info', 'All projects have been synced.'); + } catch (\Throwable $e) { + $this->addFlash('error', 'An error occurred while syncing projects. Check the log for details.'); + } + + return $this->redirectToRoute('admin_project_index'); + } +} diff --git a/src/Controller/Admin/SecurityContractCrudController.php b/src/Controller/Admin/SecurityContractCrudController.php new file mode 100644 index 0000000..c95ccad --- /dev/null +++ b/src/Controller/Admin/SecurityContractCrudController.php @@ -0,0 +1,55 @@ +setDefaultSort(['project.name' => 'ASC']) + // ->setSearchFields(['name', 'details']) + ->showEntityActionsInlined() + ->setPageTitle(Crud::PAGE_INDEX, 'Cyber Security Contracts'); + } + + #[\Override] + public function configureFields(string $pageName): iterable + { + yield FormField::addFieldset('Project'); + yield BooleanField::new('active')->renderAsSwitch(false)->setColumns(2); + yield AssociationField::new('project')->setColumns(10); + + yield FormField::addFieldset('Links'); + yield UrlField::new('project.leantimeUrl')->setLabel('Leantime URL')->setDisabled()->hideOnIndex()->hideWhenCreating(); + yield UrlField::new('economicsReportUrl')->setLabel('Economics URL')->hideOnIndex()->setColumns(12); + yield UrlField::new('operationalContractUrl')->setLabel('Contract URL')->hideOnIndex()->setColumns(12); + + yield FormField::addFieldset('Budget'); + yield NumberField::new('monthlyPrice')->setTextAlign('right')->setColumns(6); + yield NumberField::new('quarterlyHours')->setTextAlign('right')->setColumns(6); + + yield FormField::addFieldset('Validity'); + yield DateField::new('validFrom')->setColumns(6); + yield DateField::new('validTo')->setColumns(6); + + yield FormField::addFieldset('Notes'); + yield TextareaField::new('notes')->hideOnIndex()->setColumns(12); + } +} diff --git a/src/Controller/Admin/ServerCrudController.php b/src/Controller/Admin/ServerCrudController.php index a7bbcda..e56522d 100644 --- a/src/Controller/Admin/ServerCrudController.php +++ b/src/Controller/Admin/ServerCrudController.php @@ -9,16 +9,12 @@ use App\Form\Type\Admin\MariaDbVersionFilter; use App\Form\Type\Admin\ServerTypeFilter; use App\Form\Type\Admin\SystemFilter; -use App\Trait\ExportCrudControllerTrait; use App\Types\DatabaseVersionType; use App\Types\HostingProviderType; use App\Types\ServerTypeType; use App\Types\SystemType; -use EasyCorp\Bundle\EasyAdminBundle\Config\Action; -use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; -use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; @@ -28,10 +24,8 @@ use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use Symfony\Component\HttpFoundation\RequestStack; -class ServerCrudController extends AbstractCrudController +class ServerCrudController extends AbstractFullCrudController { - use ExportCrudControllerTrait; - public function __construct( private readonly RequestStack $requestStack, ) { @@ -54,17 +48,6 @@ public function configureCrud(Crud $crud): Crud return $crud; } - #[\Override] - public function configureActions(Actions $actions): Actions - { - return $actions - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ; - } - #[\Override] public function configureFields(string $pageName): iterable { diff --git a/src/Controller/Admin/ServiceCertificateCrudController.php b/src/Controller/Admin/ServiceCertificateCrudController.php index 8c68f7f..526dbe0 100644 --- a/src/Controller/Admin/ServiceCertificateCrudController.php +++ b/src/Controller/Admin/ServiceCertificateCrudController.php @@ -7,12 +7,7 @@ use App\Entity\ServiceCertificate; use App\Form\Type\ServiceCertificate\ServiceType; use App\Repository\SiteRepository; -use App\Trait\ExportCrudControllerTrait; -use EasyCorp\Bundle\EasyAdminBundle\Config\Action; -use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; -use EasyCorp\Bundle\EasyAdminBundle\Config\Assets; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; -use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; @@ -21,12 +16,11 @@ use EasyCorp\Bundle\EasyAdminBundle\Field\UrlField; use Symfony\Component\Translation\TranslatableMessage; -class ServiceCertificateCrudController extends AbstractCrudController +class ServiceCertificateCrudController extends AbstractFullCrudController { - use ExportCrudControllerTrait; - - public function __construct(private readonly SiteRepository $siteRepository) - { + public function __construct( + private readonly SiteRepository $siteRepository, + ) { } public static function getEntityFqcn(): string @@ -46,15 +40,6 @@ public function configureCrud(Crud $crud): Crud ->setSearchFields(['domain', 'name', 'description', 'services.type']); } - #[\Override] - public function configureActions(Actions $actions): Actions - { - return $actions - ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ->remove(Crud::PAGE_INDEX, Action::DELETE); - } - #[\Override] public function configureFields(string $pageName): iterable { @@ -77,7 +62,7 @@ public function configureFields(string $pageName): iterable yield TextField::new('description')->onlyOnIndex() ->setHelp(new TranslatableMessage('Tell what this certificate is used for.'))->setMaxLength(33)->stripTags(); yield UrlField::new('onePasswordUrl') - ->setLabel(new TranslatableMessage('1Password url')); + ->setLabel(new TranslatableMessage('1Password url'))->hideOnIndex(); yield UrlField::new('usageDocumentationUrl')->hideOnIndex() ->setHelp(new TranslatableMessage('Tell where to find documentation on how the certificate is used on the site and how to configure the use.')); yield DateTimeField::new('expirationTime'); @@ -93,11 +78,4 @@ public function configureFields(string $pageName): iterable ->setTemplatePath('service_certificate/services.html.twig') ; } - - #[\Override] - public function configureAssets(Assets $assets): Assets - { - return $assets - ->addWebpackEncoreEntry('easyadmin'); - } } diff --git a/src/Controller/Admin/SiteCrudController.php b/src/Controller/Admin/SiteCrudController.php index 3380dab..9a3af8e 100644 --- a/src/Controller/Admin/SiteCrudController.php +++ b/src/Controller/Admin/SiteCrudController.php @@ -44,13 +44,9 @@ public function configureCrud(Crud $crud): Crud public function configureActions(Actions $actions): Actions { return $actions + ->disable(Action::DELETE, Action::NEW, Action::EDIT) ->add(Crud::PAGE_INDEX, Action::DETAIL) - ->add(Crud::PAGE_INDEX, $this->createExportAction()) - ->remove(Crud::PAGE_INDEX, Action::NEW) - ->remove(Crud::PAGE_INDEX, Action::EDIT) - ->remove(Crud::PAGE_INDEX, Action::DELETE) - ->remove(Crud::PAGE_DETAIL, Action::EDIT) - ->remove(Crud::PAGE_DETAIL, Action::DELETE); + ->add(Crud::PAGE_INDEX, $this->createExportAction()); } #[\Override] diff --git a/src/EasyAdmin/Config/AutoBadgeMenuItem.php b/src/EasyAdmin/Config/AutoBadgeMenuItem.php new file mode 100644 index 0000000..9ba8ca1 --- /dev/null +++ b/src/EasyAdmin/Config/AutoBadgeMenuItem.php @@ -0,0 +1,29 @@ +crudMenuItem = new CrudMenuItem($label, $icon, $entityFqcn); + } + + /** @phpstan-ignore missingType.return, missingType.parameter, missingType.parameter */ + public function __call($name, $arguments) + { + return $this->crudMenuItem->$name(...$arguments); + } + + /** @phpstan-ignore missingType.return */ + public static function __callStatic(string $name, array $arguments) + { + throw new \BadMethodCallException(sprintf('Static method %s not implemented', $name)); + } + + /** @phpstan-ignore missingType.parameter */ + public function setBadge(/* \Stringable|string|int|float|bool|null */ $content, string $style = 'secondary', array $htmlAttributes = []): self + { + if (!is_int($content)) { + throw new \InvalidArgumentException('The badge content must be an integer'); + } + + if ($content > 0) { + $this->crudMenuItem->setBadge($content, $style, $htmlAttributes); + } + + return $this; + } + + public function getAsDto(): MenuItemDto + { + return $this->crudMenuItem->getAsDto(); + } +} diff --git a/src/Entity/Project.php b/src/Entity/Project.php new file mode 100644 index 0000000..a1841ed --- /dev/null +++ b/src/Entity/Project.php @@ -0,0 +1,133 @@ +leantimeId = $leantimeId; + $this->name = $name; + $this->details = $details; + } + + public function __toString(): string + { + return $this->name; + } + + public function getName(): string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } + + public function getLeantimeUrl(): ?string + { + return $this->LeantimeUrl; + } + + public function setLeantimeUrl(string $LeantimeUrl): static + { + $this->LeantimeUrl = $LeantimeUrl; + + return $this; + } + + public function getEconomicsUrl(): ?string + { + return $this->EconomicsUrl; + } + + public function setEconomicsUrl(string $EconomicsUrl): static + { + $this->EconomicsUrl = $EconomicsUrl; + + return $this; + } + + public function getDetails(): ?string + { + return $this->details; + } + + public function setDetails(?string $details): static + { + $this->details = $details; + + return $this; + } + + public function getLeantimeId(): ?int + { + return $this->leantimeId; + } + + public function setLeantimeId(int $leantimeId): static + { + $this->leantimeId = $leantimeId; + + return $this; + } + + public function getLeantimeModifiedAt(): ?\DateTimeImmutable + { + return $this->leantimeModifiedAt; + } + + public function setLeantimeModifiedAt(\DateTimeImmutable $leantimeModifiedAt): static + { + $this->leantimeModifiedAt = $leantimeModifiedAt; + + return $this; + } + + public function getSecurityContract(): ?SecurityContract + { + return $this->securityContract; + } + + public function setSecurityContract(SecurityContract $securityContract): static + { + // set the owning side of the relation if necessary + if ($securityContract->getProject() !== $this) { + $securityContract->setProject($this); + } + + $this->securityContract = $securityContract; + + return $this; + } +} diff --git a/src/Entity/SecurityContract.php b/src/Entity/SecurityContract.php new file mode 100644 index 0000000..97741e6 --- /dev/null +++ b/src/Entity/SecurityContract.php @@ -0,0 +1,152 @@ +project->getName(); + } + + public function getProject(): ?Project + { + return $this->project; + } + + public function setProject(Project $project): static + { + $this->project = $project; + + return $this; + } + + public function getEconomicsReportUrl(): ?string + { + return $this->economicsReportUrl; + } + + public function setEconomicsReportUrl(?string $economicsReportUrl): static + { + $this->economicsReportUrl = $economicsReportUrl; + + return $this; + } + + public function getOperationalContractUrl(): ?string + { + return $this->operationalContractUrl; + } + + public function setOperationalContractUrl(?string $operationalContractUrl): static + { + $this->operationalContractUrl = $operationalContractUrl; + + return $this; + } + + public function getMonthlyPrice(): ?float + { + return $this->monthlyPrice; + } + + public function setMonthlyPrice(?float $monthlyPrice): static + { + $this->monthlyPrice = $monthlyPrice; + + return $this; + } + + public function getQuarterlyHours(): ?float + { + return $this->quarterlyHours; + } + + public function setQuarterlyHours(float $quarterlyHours): static + { + $this->quarterlyHours = $quarterlyHours; + + return $this; + } + + public function getValidFrom(): ?\DateTimeImmutable + { + return $this->validFrom; + } + + public function setValidFrom(\DateTimeImmutable $validFrom): static + { + $this->validFrom = $validFrom; + + return $this; + } + + public function getValidTo(): ?\DateTimeImmutable + { + return $this->validTo; + } + + public function setValidTo(\DateTimeImmutable $validTo): static + { + $this->validTo = $validTo; + + return $this; + } + + public function isActive(): ?bool + { + return $this->active; + } + + public function setActive(bool $active): static + { + $this->active = $active; + + return $this; + } + + public function getNotes(): ?string + { + return $this->notes; + } + + public function setNotes(string $notes): static + { + $this->notes = $notes; + + return $this; + } +} diff --git a/src/Entity/Site.php b/src/Entity/Site.php index e02fb94..08d606a 100644 --- a/src/Entity/Site.php +++ b/src/Entity/Site.php @@ -167,8 +167,6 @@ public function getPrimaryDomain(): ?string * these domains the first is the primary: * - 360.aarhuskommune.dk * - 360.aarhuskommune.dk.srvitkphp74.itkdev.dk - * - * @return void */ private function updatePrimaryDomain(): void { diff --git a/src/Exception/LeantimeApiException.php b/src/Exception/LeantimeApiException.php new file mode 100644 index 0000000..ba79156 --- /dev/null +++ b/src/Exception/LeantimeApiException.php @@ -0,0 +1,7 @@ +getServer(); @@ -63,9 +57,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** - * {@inheritDoc} - */ public function supportsType(string $type): bool { return DetectionType::DIRECTORY === $type; diff --git a/src/Handler/DockerImageHandler.php b/src/Handler/DockerImageHandler.php index 195714a..0f4cc27 100644 --- a/src/Handler/DockerImageHandler.php +++ b/src/Handler/DockerImageHandler.php @@ -25,13 +25,6 @@ /** * DirectoryHandler constructor. - * - * @param DockerImageTagFactory $dockerImageTagFactory - * @param ModuleVersionFactory $moduleVersionFactory - * @param PackageVersionFactory $packageVersionFactory - * @param AdvisoryFactory $advisoryFactory - * @param SiteFactory $siteFactory - * @param DomainFactory $domainFactory */ public function __construct( private DockerImageTagFactory $dockerImageTagFactory, @@ -43,9 +36,6 @@ public function __construct( ) { } - /** - * {@inheritDoc} - */ public function handleResult(DetectionResult $detectionResult): void { if (empty($detectionResult->getData())) { @@ -86,7 +76,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** {@inheritDoc} */ public function supportsType(string $type): bool { return DetectionType::DOCKER === $type; diff --git a/src/Handler/DrupalHandler.php b/src/Handler/DrupalHandler.php index b789a48..33f1c14 100644 --- a/src/Handler/DrupalHandler.php +++ b/src/Handler/DrupalHandler.php @@ -18,10 +18,6 @@ { /** * DirectoryHandler constructor. - * - * @param InstallationFactory $installationFactory - * @param PackageVersionFactory $packageVersionFactory - * @param ModuleVersionFactory $moduleVersionFactory */ public function __construct( private InstallationFactory $installationFactory, @@ -30,9 +26,6 @@ public function __construct( ) { } - /** - * {@inheritDoc} - */ public function handleResult(DetectionResult $detectionResult): void { try { @@ -56,7 +49,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** {@inheritDoc} */ public function supportsType(string $type): bool { return DetectionType::DRUPAL === $type; diff --git a/src/Handler/GitHandler.php b/src/Handler/GitHandler.php index 2915558..da6bdd9 100644 --- a/src/Handler/GitHandler.php +++ b/src/Handler/GitHandler.php @@ -16,9 +16,6 @@ { /** * DirectoryHandler constructor. - * - * @param InstallationFactory $installationFactory - * @param GitTagFactory $gitCloneFactory */ public function __construct( private InstallationFactory $installationFactory, @@ -26,9 +23,6 @@ public function __construct( ) { } - /** - * {@inheritDoc} - */ public function handleResult(DetectionResult $detectionResult): void { try { @@ -47,9 +41,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** - * {@inheritDoc} - */ public function supportsType(string $type): bool { return DetectionType::GIT === $type; @@ -61,10 +52,6 @@ public function supportsType(string $type): bool * The git harvester will send an empty result even for * "fatal: not a git repository (or any parent up to mount point /)" * - * @param DetectionResult $result - * - * @return object|null - * * @throws \JsonException */ private function getData(DetectionResult $result): ?object diff --git a/src/Handler/NginxHandler.php b/src/Handler/NginxHandler.php index ac3c957..214c19a 100644 --- a/src/Handler/NginxHandler.php +++ b/src/Handler/NginxHandler.php @@ -20,10 +20,6 @@ /** * DirectoryHandler constructor. - * - * @param SiteFactory $siteFactory - * @param DomainFactory $domainFactory - * @param ValidatorInterface $validator */ public function __construct( private SiteFactory $siteFactory, @@ -32,9 +28,6 @@ public function __construct( ) { } - /** - * {@inheritDoc} - */ public function handleResult(DetectionResult $detectionResult): void { try { @@ -63,7 +56,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** {@inheritDoc} */ public function supportsType(string $type): bool { return DetectionType::NGINX === $type; diff --git a/src/Handler/SymfonyHandler.php b/src/Handler/SymfonyHandler.php index b92de3b..e33ccfc 100644 --- a/src/Handler/SymfonyHandler.php +++ b/src/Handler/SymfonyHandler.php @@ -17,9 +17,6 @@ { /** * DirectoryHandler constructor. - * - * @param PackageVersionFactory $packageVersionFactory - * @param InstallationFactory $installationFactory */ public function __construct( private PackageVersionFactory $packageVersionFactory, @@ -27,9 +24,6 @@ public function __construct( ) { } - /** - * {@inheritDoc} - */ public function handleResult(DetectionResult $detectionResult): void { try { @@ -57,7 +51,6 @@ public function handleResult(DetectionResult $detectionResult): void } } - /** {@inheritDoc} */ public function supportsType(string $type): bool { return DetectionType::SYMFONY === $type; diff --git a/src/MessageHandler/DetectionResultHandler.php b/src/MessageHandler/DetectionResultHandler.php index c162fa7..996e79f 100644 --- a/src/MessageHandler/DetectionResultHandler.php +++ b/src/MessageHandler/DetectionResultHandler.php @@ -16,9 +16,6 @@ { /** * DetectionResultHandler constructor. - * - * @param Security $security - * @param MessageBusInterface $messageBus */ public function __construct( private Security $security, diff --git a/src/Repository/DetectionResultRepository.php b/src/Repository/DetectionResultRepository.php index a4e9b15..beaa237 100644 --- a/src/Repository/DetectionResultRepository.php +++ b/src/Repository/DetectionResultRepository.php @@ -26,10 +26,10 @@ public function __construct(ManagerRegistry $registry) * Remove detection results base on last contact. * * @param \dateTime $date - * The date to delete before + * The date to delete before * * @return mixed - * Number of records removed or false + * Number of records removed or false */ public function remove(\DateTime $date): mixed { @@ -43,12 +43,6 @@ public function remove(\DateTime $date): mixed /** * Delete all except X similar detection results. - * - * @param DetectionResult $detectionResult - * @param int $keep - * @param bool $flush - * - * @return void */ public function cleanup(DetectionResult $detectionResult, int $keep = 5, bool $flush = false): void { @@ -78,10 +72,6 @@ public function cleanup(DetectionResult $detectionResult, int $keep = 5, bool $f /** * Delete all detection results for a given installation. - * - * @param Installation $installation - * - * @return void */ public function deleteByInstallation(Installation $installation): void { diff --git a/src/Repository/OIDCRepository.php b/src/Repository/OIDCRepository.php index cfe5a56..09171d2 100644 --- a/src/Repository/OIDCRepository.php +++ b/src/Repository/OIDCRepository.php @@ -40,4 +40,14 @@ public function remove(OIDC $entity, bool $flush = false): void $this->getEntityManager()->flush(); } } + + public function countExpiredCertificates(): int + { + return $this->createQueryBuilder('o') + ->select('COUNT(o)') + ->where('o.expirationTime < :now') + ->setParameter('now', new \DateTime()) + ->getQuery() + ->getSingleScalarResult(); + } } diff --git a/src/Repository/ProjectRepository.php b/src/Repository/ProjectRepository.php new file mode 100644 index 0000000..0865b50 --- /dev/null +++ b/src/Repository/ProjectRepository.php @@ -0,0 +1,43 @@ + + */ +class ProjectRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Project::class); + } + + // /** + // * @return Project[] Returns an array of Project objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('p') + // ->andWhere('p.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('p.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Project + // { + // return $this->createQueryBuilder('p') + // ->andWhere('p.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/SecurityContractRepository.php b/src/Repository/SecurityContractRepository.php new file mode 100644 index 0000000..d33baf8 --- /dev/null +++ b/src/Repository/SecurityContractRepository.php @@ -0,0 +1,54 @@ + + */ +class SecurityContractRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, SecurityContract::class); + } + + // /** + // * @return SecurityContract[] Returns an array of SecurityContract objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('s') + // ->andWhere('s.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('s.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?SecurityContract + // { + // return $this->createQueryBuilder('s') + // ->andWhere('s.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } + + public function countExpiredContracts(): int + { + return $this->createQueryBuilder('c') + ->select('COUNT(c)') + ->where('c.validTo < :now') + ->andWhere('c.active = true') + ->setParameter('now', new \DateTime()) + ->getQuery() + ->getSingleScalarResult(); + } +} diff --git a/src/Repository/ServiceCertificate/ServiceRepository.php b/src/Repository/ServiceCertificate/ServiceRepository.php index cdff2e7..bfd5391 100644 --- a/src/Repository/ServiceCertificate/ServiceRepository.php +++ b/src/Repository/ServiceCertificate/ServiceRepository.php @@ -44,8 +44,6 @@ public function remove(Service $entity, bool $flush = false): void /** * Get unique types from existing services. - * - * @return array */ public function getTypes(): array { diff --git a/src/Repository/ServiceCertificateRepository.php b/src/Repository/ServiceCertificateRepository.php index 219da2b..bbd1370 100644 --- a/src/Repository/ServiceCertificateRepository.php +++ b/src/Repository/ServiceCertificateRepository.php @@ -40,4 +40,14 @@ public function remove(ServiceCertificate $entity, bool $flush = false): void $this->getEntityManager()->flush(); } } + + public function countExpiredCertificates(): int + { + return $this->createQueryBuilder('c') + ->select('COUNT(c)') + ->where('c.expirationTime < :now') + ->setParameter('now', new \DateTime()) + ->getQuery() + ->getSingleScalarResult(); + } } diff --git a/src/Repository/SiteRepository.php b/src/Repository/SiteRepository.php index 9a1ec09..5b7f841 100644 --- a/src/Repository/SiteRepository.php +++ b/src/Repository/SiteRepository.php @@ -37,8 +37,6 @@ public function findByRootDirAndServer(string $rootDir, Server $server): mixed /** * Get unique primary domains from existing sites. - * - * @return array */ public function getPrimaryDomains(): array { diff --git a/src/Security/ApiKeyAuthenticator.php b/src/Security/ApiKeyAuthenticator.php index d77b9a7..8232e27 100644 --- a/src/Security/ApiKeyAuthenticator.php +++ b/src/Security/ApiKeyAuthenticator.php @@ -31,9 +31,6 @@ public function supports(Request $request): ?bool && str_starts_with((string) $request->headers->get(self::AUTH_HEADER), self::AUTH_HEADER_PREFIX); } - /** - * {@inheritdoc} - */ public function authenticate(Request $request): Passport { $apiKey = substr((string) $request->headers->get(self::AUTH_HEADER), strlen(self::AUTH_HEADER_PREFIX)); @@ -46,18 +43,12 @@ public function authenticate(Request $request): Passport return new SelfValidatingPassport(new UserBadge($apiKey)); } - /** - * {@inheritdoc} - */ public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { // on success, let the request continue return null; } - /** - * {@inheritdoc} - */ public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { $data = [ diff --git a/src/Security/AzureOIDCAuthenticator.php b/src/Security/AzureOIDCAuthenticator.php index c118bdc..459757d 100644 --- a/src/Security/AzureOIDCAuthenticator.php +++ b/src/Security/AzureOIDCAuthenticator.php @@ -28,10 +28,6 @@ class AzureOIDCAuthenticator extends OpenIdLoginAuthenticator /** * AzureOIDCAuthenticator constructor. - * - * @param EntityManagerInterface $entityManager - * @param UrlGeneratorInterface $router - * @param OpenIdConfigurationProviderManager $providerManager */ public function __construct( private readonly EntityManagerInterface $entityManager, @@ -41,7 +37,6 @@ public function __construct( parent::__construct($providerManager); } - /** {@inheritDoc} */ public function authenticate(Request $request): Passport { try { @@ -73,7 +68,6 @@ public function authenticate(Request $request): Passport } } - /** {@inheritDoc} */ public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { $targetUrl = $this->getTargetPath($request->getSession(), $firewallName) ?? $this->router->generate('admin'); @@ -81,7 +75,6 @@ public function onAuthenticationSuccess(Request $request, TokenInterface $token, return new RedirectResponse($targetUrl); } - /** {@inheritDoc} */ public function start(Request $request, ?AuthenticationException $authException = null): Response { return new RedirectResponse($this->router->generate('itkdev_openid_connect_login', [ diff --git a/src/Service/DomainFactory.php b/src/Service/DomainFactory.php index 341d2d3..6c06e12 100644 --- a/src/Service/DomainFactory.php +++ b/src/Service/DomainFactory.php @@ -23,10 +23,6 @@ public function __construct( } /** - * @param string $addressList - * @param Site $site - * @param DetectionResult $detectionResult - * * @return Collection */ public function getDomains(string $addressList, Site $site, DetectionResult $detectionResult): Collection diff --git a/src/Service/InstallationFactory.php b/src/Service/InstallationFactory.php index 51a02a0..b94f57c 100644 --- a/src/Service/InstallationFactory.php +++ b/src/Service/InstallationFactory.php @@ -23,8 +23,6 @@ public function __construct( /** * Get Installations from detection result. * - * @param DetectionResult $detectionResult - * * @return Collection */ public function getInstallations(DetectionResult $detectionResult): Collection diff --git a/src/Service/Leantime/ApiService.php b/src/Service/Leantime/ApiService.php new file mode 100644 index 0000000..83a3ea6 --- /dev/null +++ b/src/Service/Leantime/ApiService.php @@ -0,0 +1,95 @@ + + * + * @throws LeantimeApiException + */ + public function getProjects(): array + { + $projects = []; + + $data = $this->request(self::API_PATH_JSONRPC, 'POST', 'leantime.rpc.projects.getAll', []); + + foreach ($data as $project) { + $projects[$project->id] = ProjectDto::fromStdClass($project); + } + + return $projects; + } + + /** + * Get project. + * + * @param $key + * A project key or id + * + * @throws LeantimeApiException + */ + public function getProject(int $key): ProjectDto + { + $data = $this->request(self::API_PATH_JSONRPC, 'POST', 'leantime.rpc.projects.getProject', ['id' => $key]); + + if (is_array($data) && false === $data[0]) { + throw new LeantimeApiException(sprintf('Project (id: %d) not found', $key), 404); + } + + return ProjectDto::fromStdClass($data); + } + + /** + * Get from Leantime. + * + * @throws LeantimeApiException + */ + private function request(string $path, string $type, string $method, array $params = []): mixed + { + try { + $response = $this->leantimeClient->request($type, $path, + ['json' => [ + 'jsonrpc' => '2.0', + 'method' => $method, + 'id' => new Ulid()->jsonSerialize(), + 'params' => $params, + ]] + ); + + $body = $response->getContent(); + + if ($body) { + $data = json_decode($body, null, 512, JSON_THROW_ON_ERROR); + + if (isset($data->error)) { + $message = $data->error->message; + if (isset($data->error->data)) { + $message .= ': '.(is_scalar($data->error->data) ? $data->error->data : json_encode($data->error->data)); + } + throw new LeantimeApiException($message, $data->error->code); + } + + return $data->result; + } + } catch (\Throwable $e) { + throw new LeantimeApiException('Error from Leantime API: '.$e->getMessage(), (int) $e->getCode(), $e); + } + + return null; + } +} diff --git a/src/Service/Leantime/LeantimeProjectUrlFactory.php b/src/Service/Leantime/LeantimeProjectUrlFactory.php new file mode 100644 index 0000000..5ed6f5d --- /dev/null +++ b/src/Service/Leantime/LeantimeProjectUrlFactory.php @@ -0,0 +1,17 @@ +baseUrl, $projectId); + } +} diff --git a/src/Service/Leantime/ProjectDto.php b/src/Service/Leantime/ProjectDto.php new file mode 100644 index 0000000..986f051 --- /dev/null +++ b/src/Service/Leantime/ProjectDto.php @@ -0,0 +1,75 @@ +Udfyld beskrivelse

'; + + public function __construct( + #[Map(target: 'leantimeId')] + #[Map(target: 'leantimeUrl', transform: LeantimeProjectUrlFactory::class)] + public int $id, + #[Map(target: 'name')] + public string $name, + #[Map(target: 'details')] + public ?string $details, + public int $clientId, + public ?int $state, + public float $hourBudget, + public float $dollarBudget, + public string $menuType, + public string $type, + public ?int $parent, + #[Map(target: 'leantimeModifiedAt')] + public \DateTimeImmutable $modified, + public ?string $start, + public ?string $end, + public string $clientName, + public ?int $parentId, + public ?string $parentName, + public int $isFavorite, + ) { + } + + /** + * Create a LeantimeProjectDto from JSON data. + */ + public static function fromStdClass(\stdClass $data): self + { + $data->details = self::DETAILS_DEFAULT === $data->details ? null : $data->details; + $data->hourBudget = floatval($data->hourBudget); + $data->dollarBudget = floatval($data->dollarBudget); + $data->modified = \DateTimeImmutable::createFromFormat( + self::DATE_FORMAT, + $data->modified, + new \DateTimeZone(self::TIMEZONE) + ); + + return new self( + id: $data->id, + name: $data->name, + details: $data->details ?? null, + clientId: $data->clientId, + state: $data->state, + hourBudget: $data->hourBudget, + dollarBudget: $data->dollarBudget, + menuType: $data->menuType, + type: $data->type, + parent: $data->parent, + modified: $data->modified, + start: $data->start ?? null, + end: $data->end ?? null, + clientName: $data->clientName, + parentId: $data->parentId ?? null, + parentName: $data->parentName ?? null, + isFavorite: $data->isFavorite, + ); + } +} diff --git a/src/Service/Leantime/ProjectSyncService.php b/src/Service/Leantime/ProjectSyncService.php new file mode 100644 index 0000000..60f3ae8 --- /dev/null +++ b/src/Service/Leantime/ProjectSyncService.php @@ -0,0 +1,76 @@ +leantimeApiService->getProjects(); + $count = count($projectDtoArray); + + $projects = $this->entityManager->getRepository(Project::class)->findBy([], ['id' => 'ASC']); + + foreach ($projects as $project) { + if (isset($projectDtoArray[$project->getLeantimeId()])) { + $dto = $projectDtoArray[$project->getLeantimeId()]; + $this->setProperties($project, $dto); + + unset($projectDtoArray[$project->getLeantimeId()]); + } else { + // Delete projects that are not in Leantime + $this->entityManager->remove($project); + } + } + + foreach ($projectDtoArray as $id => $projectDto) { + $project = $this->objectMapper->map($projectDto, Project::class); + $this->setProperties($project, $projectDto); + $this->entityManager->persist($project); + } + + $this->entityManager->flush(); + + return $count; + } + + public function syncProject(int $leantimeId): Project + { + $projectDto = $this->leantimeApiService->getProject($leantimeId); + $project = $this->entityManager->getRepository(Project::class)->findOneBy(['leantimeId' => $leantimeId]); + + if (null === $project) { + $project = $this->objectMapper->map($projectDto, Project::class); + $this->entityManager->persist($project); + } + + $this->setProperties($project, $projectDto); + + $this->entityManager->flush(); + + return $project; + } + + private function setProperties(Project $project, ProjectDto $projectDto): void + { + $project->setLeantimeId($projectDto->id); + $project->setName($projectDto->name); + $project->setDetails($projectDto->details); + $project->setLeantimeModifiedAt($projectDto->modified); + + $url = $this->leantimeProjectUrlFactory->getProjectUrl($project->getLeantimeId()); + $project->setLeantimeUrl($url); + } +} diff --git a/src/Trait/ExportCrudControllerTrait.php b/src/Trait/ExportCrudControllerTrait.php index 8880d58..4e9656c 100644 --- a/src/Trait/ExportCrudControllerTrait.php +++ b/src/Trait/ExportCrudControllerTrait.php @@ -34,7 +34,7 @@ public function setExporter(Exporter $exporter): void protected function createExportAction(string|TranslatableMessage|null $label = null): Action { - return Action::new('export', $label ?? new TranslatableMessage('Export')) + return Action::new('export', $label ?? new TranslatableMessage('Export'), 'fa fa-file-csv') ->createAsGlobalAction() ->linkToCrudAction('export'); } diff --git a/symfony.lock b/symfony.lock index 9cdfe30..68d5966 100644 --- a/symfony.lock +++ b/symfony.lock @@ -277,12 +277,6 @@ "sebastian/cli-parser": { "version": "1.0.1" }, - "sebastian/code-unit": { - "version": "1.0.8" - }, - "sebastian/code-unit-reverse-lookup": { - "version": "2.0.3" - }, "sebastian/comparator": { "version": "4.0.6" }, @@ -322,6 +316,21 @@ "symfony/asset": { "version": "v6.0.3" }, + "symfony/asset-mapper": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a" + }, + "files": [ + "assets/app.js", + "assets/styles/app.css", + "config/packages/asset_mapper.yaml", + "importmap.php" + ] + }, "symfony/browser-kit": { "version": "v6.0.3" }, @@ -684,6 +693,15 @@ "twig/twig": { "version": "v3.3.8" }, + "vincentlanglet/twig-cs-fixer": { + "version": "3.10", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "main", + "version": "3.0", + "ref": "d42582ae1bce86fd43491d6264c738b0867f8ffe" + } + }, "webmozart/assert": { "version": "1.10.0" }, diff --git a/templates/EasyAdminBundle/Fields/code.html.twig b/templates/EasyAdminBundle/Fields/code.html.twig index c4fb385..28a08e7 100644 --- a/templates/EasyAdminBundle/Fields/code.html.twig +++ b/templates/EasyAdminBundle/Fields/code.html.twig @@ -2,7 +2,7 @@ {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} {% if field.formattedValue is null %} - {{ 'label.null'|trans(domain = 'EasyAdminBundle') }} + {{ 'label.null'|trans(domain: 'EasyAdminBundle') }} {% else %} {{ field.formattedValue }} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/EasyAdminBundle/Fields/config_file_path.html.twig b/templates/EasyAdminBundle/Fields/config_file_path.html.twig index 2639f2c..da9307a 100644 --- a/templates/EasyAdminBundle/Fields/config_file_path.html.twig +++ b/templates/EasyAdminBundle/Fields/config_file_path.html.twig @@ -4,5 +4,5 @@ {% if ea.crud.currentAction == 'detail' %} {{ field.formattedValue }} {% else %} - {{ field.formattedValue | replace({'/etc/nginx/sites-enabled/': './'}) }} -{% endif %} \ No newline at end of file + {{ field.formattedValue|replace({'/etc/nginx/sites-enabled/': './'}) }} +{% endif %} diff --git a/templates/EasyAdminBundle/Fields/db_version.html.twig b/templates/EasyAdminBundle/Fields/db_version.html.twig index 567ae8a..c192aeb 100644 --- a/templates/EasyAdminBundle/Fields/db_version.html.twig +++ b/templates/EasyAdminBundle/Fields/db_version.html.twig @@ -2,7 +2,7 @@ {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} {% if field.formattedValue is null %} - {{ 'label.null'|trans(domain = 'EasyAdminBundle') }} + {{ 'label.null'|trans(domain: 'EasyAdminBundle') }} {% else %} {{ field.formattedValue }} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/EasyAdminBundle/Fields/domain.html.twig b/templates/EasyAdminBundle/Fields/domain.html.twig index eba0e51..3dc99f1 100644 --- a/templates/EasyAdminBundle/Fields/domain.html.twig +++ b/templates/EasyAdminBundle/Fields/domain.html.twig @@ -9,4 +9,4 @@ {{ field.value }} {% else %} {{ field.formattedValue }} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/EasyAdminBundle/Fields/eol.html.twig b/templates/EasyAdminBundle/Fields/eol.html.twig index 6e1f433..9acd5bd 100644 --- a/templates/EasyAdminBundle/Fields/eol.html.twig +++ b/templates/EasyAdminBundle/Fields/eol.html.twig @@ -2,7 +2,7 @@ {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} -{% set slicedDate = field.formattedValue | slice(0, 7) %} +{% set slicedDate = field.formattedValue|slice(0, 7) %} {% if ea.crud.currentAction == 'detail' %} {% set outputValue = field.formattedValue %} {% else %} diff --git a/templates/EasyAdminBundle/Fields/hosting_provider.html.twig b/templates/EasyAdminBundle/Fields/hosting_provider.html.twig index ad1e247..cc1d7ab 100644 --- a/templates/EasyAdminBundle/Fields/hosting_provider.html.twig +++ b/templates/EasyAdminBundle/Fields/hosting_provider.html.twig @@ -3,11 +3,11 @@ {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} {% if field.formattedValue is empty %} ? -{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::AZURE') %} +{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::AZURE') %} {{ field.formattedValue }} -{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::IT_RELATION') %} +{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::IT_RELATION') %} {{ field.formattedValue }} -{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::DBC') %} +{% elseif field.formattedValue == constant('App\\Types\\HostingProviderType::DBC') %} {{ field.formattedValue }} {% else %} {{ field.formattedValue }} diff --git a/templates/EasyAdminBundle/Fields/root_dir.html.twig b/templates/EasyAdminBundle/Fields/root_dir.html.twig index 93d3677..c31765c 100644 --- a/templates/EasyAdminBundle/Fields/root_dir.html.twig +++ b/templates/EasyAdminBundle/Fields/root_dir.html.twig @@ -7,9 +7,9 @@ {% if field.formattedValue starts with '/data/www/' %} - {{ field.formattedValue | replace({'/data/www/': './'}) }} + {{ field.formattedValue|replace({'/data/www/': './'}) }} {% elseif field.formattedValue starts with '/home/www/' %} - {{ field.formattedValue | replace({'/home/www/': './'}) }} + {{ field.formattedValue|replace({'/home/www/': './'}) }} {% else %} {{ field.formattedValue }} {% endif %} diff --git a/templates/EasyAdminBundle/Fields/server_type.html.twig b/templates/EasyAdminBundle/Fields/server_type.html.twig index a6eb2ee..52369c6 100644 --- a/templates/EasyAdminBundle/Fields/server_type.html.twig +++ b/templates/EasyAdminBundle/Fields/server_type.html.twig @@ -11,4 +11,4 @@ {{ field.formattedValue }} {% else %} {{ field.formattedValue }} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/EasyAdminBundle/Fields/site.html.twig b/templates/EasyAdminBundle/Fields/site.html.twig index 2c2fc21..6bc1a58 100644 --- a/templates/EasyAdminBundle/Fields/site.html.twig +++ b/templates/EasyAdminBundle/Fields/site.html.twig @@ -1,9 +1,9 @@ {# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} -{% if field.formattedValue == constant('App\\Types\\SiteType::NGINX') %} +{% if field.formattedValue == constant('App\\Types\\SiteType::NGINX') %} {{ field.formattedValue }} -{% elseif field.formattedValue == constant('App\\Types\\SiteType::DOCKER') %} +{% elseif field.formattedValue == constant('App\\Types\\SiteType::DOCKER') %} {{ field.formattedValue }} {% else %} {{ field.formattedValue }} diff --git a/templates/EasyAdminBundle/Fields/sources.html.twig b/templates/EasyAdminBundle/Fields/sources.html.twig index 5ae9bec..a4ba5ad 100644 --- a/templates/EasyAdminBundle/Fields/sources.html.twig +++ b/templates/EasyAdminBundle/Fields/sources.html.twig @@ -4,7 +4,7 @@ {% if ea.crud.currentAction == 'detail' %}
    {% for item in field.value %} -{#
  • {{ item }}
  • #} +{#
  • {{ item }}
  • #}
  • {{ item }}
  • {% endfor %}
diff --git a/templates/EasyAdminBundle/Fields/ssh_link.html.twig b/templates/EasyAdminBundle/Fields/ssh_link.html.twig index 0aaf499..11e692b 100644 --- a/templates/EasyAdminBundle/Fields/ssh_link.html.twig +++ b/templates/EasyAdminBundle/Fields/ssh_link.html.twig @@ -10,4 +10,4 @@
- \ No newline at end of file + diff --git a/templates/EasyAdminBundle/Fields/text_mono.html.twig b/templates/EasyAdminBundle/Fields/text_mono.html.twig index 20ddb24..dab826d 100644 --- a/templates/EasyAdminBundle/Fields/text_mono.html.twig +++ b/templates/EasyAdminBundle/Fields/text_mono.html.twig @@ -2,7 +2,7 @@ {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} {% if field.formattedValue is null %} - {{ 'label.null'|trans(domain = 'EasyAdminBundle') }} + {{ 'label.null'|trans(domain: 'EasyAdminBundle') }} {% else %} {{ field.formattedValue }} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/admin/domain.html.twig b/templates/admin/domain.html.twig index 1e63970..e9cc5a4 100644 --- a/templates/admin/domain.html.twig +++ b/templates/admin/domain.html.twig @@ -6,7 +6,7 @@ .set('filters', { primaryDomain: { comparison: '=', - value: field.value - } + value: field.value, + }, }) %} {{ field.value }} diff --git a/templates/base.html.twig b/templates/base.html.twig index d4f83f7..a4f2bfe 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -10,6 +10,7 @@ {% endblock %} {% block javascripts %} + {% block importmap %}{{ importmap('app') }}{% endblock %} {{ encore_entry_script_tags('app') }} {% endblock %} diff --git a/templates/bundles/EasyAdminBundle/crud/detail.html.twig b/templates/bundles/EasyAdminBundle/crud/detail.html.twig new file mode 100644 index 0000000..9596b80 --- /dev/null +++ b/templates/bundles/EasyAdminBundle/crud/detail.html.twig @@ -0,0 +1,40 @@ +{% extends '@!EasyAdmin/crud/detail.html.twig' %} + +{% block main %} + {{ parent() }} + +
+
+
+ + + + Notes + + + +
+
+ +
+
+ +
+
+ Notes +
+
+ +
+ + nfkngjkfdsnds + + +
+
+ +
+
+
+ +{% endblock %} diff --git a/templates/bundles/EasyAdminBundle/crud/field/association.html.twig b/templates/bundles/EasyAdminBundle/crud/field/association.html.twig index 4ec629d..8bd21aa 100644 --- a/templates/bundles/EasyAdminBundle/crud/field/association.html.twig +++ b/templates/bundles/EasyAdminBundle/crud/field/association.html.twig @@ -4,8 +4,8 @@ {% if 'toMany' == field.customOptions.get('associationType') %} {% if field.value.count == 0 %} None - {% elseif not has_display(field.value[0]) and ea.crud.currentAction != 'detail'%} - {{ field.value | length }} + {% elseif not has_display(field.value[0]) and ea.crud.currentAction != 'detail' %} + {{ field.value|length }} {% else %} {% for value in field.value %} {% if ea.crud.currentAction == 'detail' %}