From 1c65ca1e487096f5d3c1ffb2e395b299281a60fb Mon Sep 17 00:00:00 2001 From: "S.Sandhu" <167903774+sachin-sandhu@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:02:24 -0500 Subject: [PATCH] Remove Composer v1 Code and Related Feature Flags (#10934) Remove Composer v1 Code and Related Feature Flags --- composer/Dockerfile | 4 +- composer/helpers/v1/.php-cs-fixer.dist.php | 32 - composer/helpers/v1/bin/run | 86 - composer/helpers/v1/build | 31 - composer/helpers/v1/composer.json | 26 - composer/helpers/v1/composer.lock | 2501 ----------------- composer/helpers/v1/phpstan.dist.neon | 5 - .../v1/src/DependabotInstallationManager.php | 61 - .../v1/src/DependabotPluginManager.php | 23 - composer/helpers/v1/src/ExceptionIO.php | 25 - composer/helpers/v1/src/Hasher.php | 28 - composer/helpers/v1/src/UpdateChecker.php | 121 - composer/helpers/v1/src/Updater.php | 98 - composer/lib/dependabot/composer/helpers.rb | 14 +- .../dependabot/composer/package_manager.rb | 18 - .../dependabot/composer/file_fetcher_spec.rb | 4 +- .../file_updater/lockfile_updater_spec.rb | 112 - .../dependabot/composer/file_updater_spec.rb | 18 - .../spec/dependabot/composer/helpers_spec.rb | 4 +- .../composer/package_manager_spec.rb | 62 +- .../update_checker/version_resolver_spec.rb | 39 - .../composer/update_checker_spec.rb | 58 - composer/spec/dependabot/composer_spec.rb | 4 - 23 files changed, 18 insertions(+), 3356 deletions(-) delete mode 100644 composer/helpers/v1/.php-cs-fixer.dist.php delete mode 100755 composer/helpers/v1/bin/run delete mode 100755 composer/helpers/v1/build delete mode 100644 composer/helpers/v1/composer.json delete mode 100644 composer/helpers/v1/composer.lock delete mode 100644 composer/helpers/v1/phpstan.dist.neon delete mode 100644 composer/helpers/v1/src/DependabotInstallationManager.php delete mode 100644 composer/helpers/v1/src/DependabotPluginManager.php delete mode 100644 composer/helpers/v1/src/ExceptionIO.php delete mode 100644 composer/helpers/v1/src/Hasher.php delete mode 100644 composer/helpers/v1/src/UpdateChecker.php delete mode 100644 composer/helpers/v1/src/Updater.php diff --git a/composer/Dockerfile b/composer/Dockerfile index 11513eda85..dcaa1dcb31 100644 --- a/composer/Dockerfile +++ b/composer/Dockerfile @@ -53,8 +53,8 @@ RUN mkdir /tmp/composer-cache \ && rm -rf /tmp/composer-cache COPY --chown=dependabot:dependabot composer/helpers /opt/composer/helpers -RUN bash /opt/composer/helpers/v1/build \ - && bash /opt/composer/helpers/v2/build + +RUN bash /opt/composer/helpers/v2/build COPY --chown=dependabot:dependabot composer $DEPENDABOT_HOME/composer COPY --chown=dependabot:dependabot common $DEPENDABOT_HOME/common diff --git a/composer/helpers/v1/.php-cs-fixer.dist.php b/composer/helpers/v1/.php-cs-fixer.dist.php deleted file mode 100644 index acc6e9523d..0000000000 --- a/composer/helpers/v1/.php-cs-fixer.dist.php +++ /dev/null @@ -1,32 +0,0 @@ -in(__DIR__ . '/src') - ->in(__DIR__ . '/bin'); -$config = new PhpCsFixer\Config(); -return $config - ->setRules([ - '@Symfony' => true, - 'array_syntax' => ['syntax' => 'short'], - 'blank_line_after_opening_tag' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_strict_types' => true, - 'increment_style' => ['style' => 'post'], - 'list_syntax' => ['syntax' => 'short'], - 'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'], - 'modernize_types_casting' => true, - 'multiline_whitespace_before_semicolons' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'ordered_imports' => true, - 'php_unit_construct' => true, - 'php_unit_dedicate_assert' => true, - 'phpdoc_align' => false, - 'phpdoc_order' => true, - 'single_line_comment_style' => true, - 'ternary_to_null_coalescing' => true, - 'void_return' => true, - 'yoda_style' => false, - ]) - ->setFinder($finder) - ->setUsingCache(true) - ->setRiskyAllowed(true); diff --git a/composer/helpers/v1/bin/run b/composer/helpers/v1/bin/run deleted file mode 100755 index c56593ae9c..0000000000 --- a/composer/helpers/v1/bin/run +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env php - $error['message']])); - } -}); - -if ($memoryAlloc = getenv('DEPENDABOT_TEST_MEMORY_ALLOCATION')) { - str_repeat('*', memoryInBytes($memoryAlloc)); -} - -try { - switch ($request['function']) { - case 'update': - $updatedFiles = Updater::update($request['args']); - fwrite(STDOUT, json_encode(['result' => $updatedFiles])); - error_clear_last(); - break; - case 'get_latest_resolvable_version': - $latestVersion = UpdateChecker::getLatestResolvableVersion($request['args']); - fwrite(STDOUT, json_encode(['result' => $latestVersion])); - error_clear_last(); - break; - case 'get_content_hash': - $content_hash = Hasher::getContentHash($request['args']); - fwrite(STDOUT, json_encode(['result' => $content_hash])); - error_clear_last(); - break; - default: - fwrite(STDOUT, json_encode(['error' => "Invalid function {$request['function']}"])); - exit(1); - } -} catch (\Exception $e) { - fwrite(STDOUT, json_encode(['error' => $e->getMessage()])); - error_clear_last(); - exit(1); -} diff --git a/composer/helpers/v1/build b/composer/helpers/v1/build deleted file mode 100755 index 3253614b04..0000000000 --- a/composer/helpers/v1/build +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [ -z "$DEPENDABOT_NATIVE_HELPERS_PATH" ]; then - echo "Unable to build, DEPENDABOT_NATIVE_HELPERS_PATH is not set" - exit 1 -fi - -install_dir="$DEPENDABOT_NATIVE_HELPERS_PATH/composer/v1" -mkdir -p "$install_dir" - -helpers_dir="$(dirname "${BASH_SOURCE[0]}")" -cp -r \ - "$helpers_dir/bin" \ - "$helpers_dir/src" \ - "$helpers_dir/.php-cs-fixer.dist.php" \ - "$helpers_dir/composer.json" \ - "$helpers_dir/composer.lock" \ - "$helpers_dir/phpstan.dist.neon" \ - "$install_dir" - -cd "$install_dir" - -composer1 validate --no-check-publish -composer1 install -composer1 run lint -- --dry-run -composer1 run stan - -# Composer caches source zips and repo metadata, none of which is useful. Save space in this layer -rm -Rf ~/.composer/cache diff --git a/composer/helpers/v1/composer.json b/composer/helpers/v1/composer.json deleted file mode 100644 index b7c3c1838c..0000000000 --- a/composer/helpers/v1/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "dependabot/composer-v1-helper", - "description": "A helper package for Dependabot to perform updates using Composer", - "license": "MIT", - "require": { - "php": "^7.4", - "ext-json": "*", - "composer/composer": "^1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.9", - "phpstan/phpstan": "~1.10.3" - }, - "autoload": { - "psr-4": { - "Dependabot\\Composer\\": "src/" - } - }, - "scripts": { - "lint": "php-cs-fixer fix --diff --verbose", - "stan": "phpstan analyse" - }, - "config": { - "sort-packages": true - } -} diff --git a/composer/helpers/v1/composer.lock b/composer/helpers/v1/composer.lock deleted file mode 100644 index f4693b0914..0000000000 --- a/composer/helpers/v1/composer.lock +++ /dev/null @@ -1,2501 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "070a51b3a75393edc3d73db6b2b6ebe7", - "packages": [ - { - "name": "composer/ca-bundle", - "version": "1.3.7", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-08-30T09:31:38+00:00" - }, - { - "name": "composer/composer", - "version": "1.10.27", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "f8f49191eec76f039b466aa1f161406fe43aff50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/f8f49191eec76f039b466aa1f161406fe43aff50", - "reference": "f8f49191eec76f039b466aa1f161406fe43aff50", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^5.2.10", - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^4.2" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2023-09-29T08:50:23+00:00" - }, - { - "name": "composer/semver", - "version": "1.7.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", - "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-12-03T15:47:16+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.7", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-05-23T07:37:50+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.6", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f27e06cd9675801df441b3656569b328e04aa37c", - "reference": "f27e06cd9675801df441b3656569b328e04aa37c", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-03-25T17:01:18+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "v5.2.13", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "time": "2023-09-26T02:20:38+00:00" - }, - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2023-05-11T13:16:46+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.28", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-08-07T06:12:30+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.4.25", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-05-31T13:04:02+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.4.27", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-07-31T08:02:31+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-07-28T09:04:16+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.28.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-01-26T09:26:14+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.28", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "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": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-08-07T10:36:04+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.29", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2023-09-13T11:47:41+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/annotations", - "version": "1.13.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", - "vimeo/psalm": "^4.10" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2022-07-02T10:48:51+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-02-28T11:07:21+00:00" - }, - { - "name": "friendsofphp/php-cs-fixer", - "version": "v2.19.3", - "source": { - "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "75ac86f33fab4714ea5a39a396784d83ae3b5ed8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/75ac86f33fab4714ea5a39a396784d83ae3b5ed8", - "reference": "75ac86f33fab4714ea5a39a396784d83ae3b5ed8", - "shasum": "" - }, - "require": { - "composer/semver": "^1.4 || ^2.0 || ^3.0", - "composer/xdebug-handler": "^1.2 || ^2.0", - "doctrine/annotations": "^1.2", - "ext-json": "*", - "ext-tokenizer": "*", - "php": "^5.6 || ^7.0 || ^8.0", - "php-cs-fixer/diff": "^1.3", - "symfony/console": "^3.4.43 || ^4.1.6 || ^5.0", - "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^3.0 || ^4.0 || ^5.0", - "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", - "symfony/polyfill-php70": "^1.0", - "symfony/polyfill-php72": "^1.4", - "symfony/process": "^3.0 || ^4.0 || ^5.0", - "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.4", - "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.4.2", - "php-cs-fixer/accessible-object": "^1.0", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy-phpunit": "^1.1 || ^2.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.13 || ^9.5", - "phpunitgoodpractices/polyfill": "^1.5", - "phpunitgoodpractices/traits": "^1.9.1", - "sanmai/phpunit-legacy-adapter": "^6.4 || ^8.2.1", - "symfony/phpunit-bridge": "^5.2.1", - "symfony/yaml": "^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "ext-dom": "For handling output formats in XML", - "ext-mbstring": "For handling non-UTF8 characters.", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", - "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." - }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", - "extra": { - "branch-alias": { - "dev-master": "2.19-dev" - } - }, - "autoload": { - "psr-4": { - "PhpCsFixer\\": "src/" - }, - "classmap": [ - "tests/Test/AbstractFixerTestCase.php", - "tests/Test/AbstractIntegrationCaseFactory.php", - "tests/Test/AbstractIntegrationTestCase.php", - "tests/Test/Assert/AssertTokensTrait.php", - "tests/Test/IntegrationCase.php", - "tests/Test/IntegrationCaseFactory.php", - "tests/Test/IntegrationCaseFactoryInterface.php", - "tests/Test/InternalIntegrationCaseFactory.php", - "tests/Test/IsIdenticalConstraint.php", - "tests/Test/TokensWithObservedTransformers.php", - "tests/TestCase.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Dariusz Rumiński", - "email": "dariusz.ruminski@gmail.com" - } - ], - "description": "A tool to automatically fix PHP code style", - "funding": [ - { - "url": "https://github.com/keradus", - "type": "github" - } - ], - "time": "2021-11-15T17:17:55+00:00" - }, - { - "name": "php-cs-fixer/diff", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/PHP-CS-Fixer/diff.git", - "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/dbd31aeb251639ac0b9e7e29405c1441907f5759", - "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", - "symfony/process": "^3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "SpacePossum" - } - ], - "description": "sebastian/diff v2 backport support for PHP5.6", - "homepage": "https://github.com/PHP-CS-Fixer", - "keywords": [ - "diff" - ], - "abandoned": true, - "time": "2020-10-14T08:39:05+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.10.47", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", - "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2023-12-01T15:19:17+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-05T16:45:39+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v5.4.11", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/54f14e36aa73cb8f7261d7686691fd4d75ea2690", - "reference": "54f14e36aa73cb8f7261d7686691fd4d75ea2690", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-07-20T13:00:38+00:00" - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644", - "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "metapackage", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.4.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "reference": "4d04b5c24f3c9a1a168a131f6cbe297155bc0d30", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-02-18T16:06:09+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.4", - "ext-json": "*" - }, - "platform-dev": [], - "plugin-api-version": "1.1.0" -} diff --git a/composer/helpers/v1/phpstan.dist.neon b/composer/helpers/v1/phpstan.dist.neon deleted file mode 100644 index 112ff770dc..0000000000 --- a/composer/helpers/v1/phpstan.dist.neon +++ /dev/null @@ -1,5 +0,0 @@ -parameters: - inferPrivatePropertyTypeFromConstructor: true - level: 5 - paths: - - src diff --git a/composer/helpers/v1/src/DependabotInstallationManager.php b/composer/helpers/v1/src/DependabotInstallationManager.php deleted file mode 100644 index a25fdc36de..0000000000 --- a/composer/helpers/v1/src/DependabotInstallationManager.php +++ /dev/null @@ -1,61 +0,0 @@ -installed[] = $operation->getPackage(); - } - - public function update(RepositoryInterface $repo, UpdateOperation $operation): void - { - parent::update($repo, $operation); - $this->updated[] = [$operation->getInitialPackage(), $operation->getTargetPackage()]; - } - - public function uninstall(RepositoryInterface $repo, UninstallOperation $operation): void - { - parent::uninstall($repo, $operation); - $this->uninstalled[] = $operation->getPackage(); - } - - /** - * @return PackageInterface[] - */ - public function getInstalledPackages(): array - { - return $this->installed; - } - - /** - * @return PackageInterface[] - */ - public function getUpdatedPackages(): array - { - return $this->updated; - } - - /** - * @return PackageInterface[] - */ - public function getUninstalledPackages(): array - { - return $this->uninstalled; - } -} diff --git a/composer/helpers/v1/src/DependabotPluginManager.php b/composer/helpers/v1/src/DependabotPluginManager.php deleted file mode 100644 index 67e1436a17..0000000000 --- a/composer/helpers/v1/src/DependabotPluginManager.php +++ /dev/null @@ -1,23 +0,0 @@ -getName(), 'phpcodesniffer') !== false) { - return; - } - - parent::registerPackage($package, $failOnMissingClasses); - } -} diff --git a/composer/helpers/v1/src/ExceptionIO.php b/composer/helpers/v1/src/ExceptionIO.php deleted file mode 100644 index ce80de2d7a..0000000000 --- a/composer/helpers/v1/src/ExceptionIO.php +++ /dev/null @@ -1,25 +0,0 @@ -raise_next_error) { - throw new \RuntimeException('Your requirements could not be resolved to an installable set of packages.' . $messages); - } - if (strpos($messages, 'Your requirements could not be resolved') !== false) { - $this->raise_next_error = true; - } - } -} diff --git a/composer/helpers/v1/src/Hasher.php b/composer/helpers/v1/src/Hasher.php deleted file mode 100644 index c97bb1272b..0000000000 --- a/composer/helpers/v1/src/Hasher.php +++ /dev/null @@ -1,28 +0,0 @@ - $credentials['username'], - 'password' => $credentials['password'], - ]; - } - - foreach ($registryCredentials as $credentials) { - $httpBasicCredentials[$credentials['registry']] = [ - 'username' => $credentials['username'], - 'password' => $credentials['password'], - ]; - } - - $io = new ExceptionIO(); - - $composer = Factory::create($io, $workingDirectory . '/composer.json'); - - $config = $composer->getConfig(); - - if (0 < count($httpBasicCredentials)) { - $config->merge([ - 'config' => [ - 'http-basic' => $httpBasicCredentials, - ], - ]); - - $io->loadConfiguration($config); - } - - $installationManager = new DependabotInstallationManager(); - - $install = new Installer( - $io, - $config, - $composer->getPackage(), - $composer->getDownloadManager(), - $composer->getRepositoryManager(), - $composer->getLocker(), - $installationManager, - $composer->getEventDispatcher(), - $composer->getAutoloadGenerator() - ); - - // For all potential options, see UpdateCommand in composer - $install - ->setDryRun(true) - ->setUpdate(true) - ->setDevMode(true) - ->setUpdateAllowList([$dependencyName]) - ->setAllowListTransitiveDependencies(true) - ->setExecuteOperations(false) - ->setDumpAutoloader(false) - ->setRunScripts(false) - ->setIgnorePlatformRequirements(false); - - $install->run(); - - $installedPackages = $installationManager->getInstalledPackages(); - - $updatedPackage = current(array_filter($installedPackages, static function (PackageInterface $package) use ($dependencyName): bool { - return $package->getName() === $dependencyName; - })); - - // We found the package in the list of updated packages. Return its version. - if ($updatedPackage instanceof PackageInterface) { - return ltrim($updatedPackage->getPrettyVersion(), 'v'); - } - - // We didn't find the package in the list of updated packages. Check if - // it was replaced by another package (in which case we can ignore). - foreach ($composer->getPackage()->getReplaces() as $link) { - if ($link->getTarget() === $dependencyName) { - return null; - } - } - - foreach ($installedPackages as $package) { - foreach ($package->getReplaces() as $link) { - if ($link->getTarget() === $dependencyName) { - return null; - } - } - } - - // Similarly, check if the package was provided by any other package. - foreach ($composer->getPackage()->getProvides() as $link) { - if ($link->getTarget() === $dependencyName) { - return ltrim($link->getPrettyConstraint(), 'v'); - } - } - - foreach ($installedPackages as $package) { - foreach ($package->getProvides() as $link) { - if ($link->getTarget() === $dependencyName) { - return ltrim($link->getPrettyConstraint(), 'v'); - } - } - } - - throw new \RuntimeException('Package not found in updated packages!'); - } -} diff --git a/composer/helpers/v1/src/Updater.php b/composer/helpers/v1/src/Updater.php deleted file mode 100644 index abb08d8b6e..0000000000 --- a/composer/helpers/v1/src/Updater.php +++ /dev/null @@ -1,98 +0,0 @@ -getConfig(); - $httpBasicCredentials = []; - - $pm = new DependabotPluginManager($io, $composer, null, false); - $composer->setPluginManager($pm); - $pm->loadInstalledPlugins(); - - foreach ($gitCredentials as &$cred) { - $httpBasicCredentials[$cred['host']] = [ - 'username' => $cred['username'], - 'password' => $cred['password'], - ]; - } - - foreach ($registryCredentials as &$cred) { - $httpBasicCredentials[$cred['registry']] = [ - 'username' => $cred['username'], - 'password' => $cred['password'], - ]; - } - - if ($httpBasicCredentials) { - $config->merge( - [ - 'config' => [ - 'http-basic' => $httpBasicCredentials, - ], - ] - ); - $io->loadConfiguration($config); - } - - $install = new Installer( - $io, - $config, - $composer->getPackage(), - $composer->getDownloadManager(), - $composer->getRepositoryManager(), - $composer->getLocker(), - $composer->getInstallationManager(), - $composer->getEventDispatcher(), - $composer->getAutoloadGenerator() - ); - - // For all potential options, see UpdateCommand in composer - $install - ->setWriteLock(true) - ->setUpdate(true) - ->setDevMode(true) - ->setUpdateAllowList([$dependencyName]) - ->setAllowListTransitiveDependencies(true) - ->setExecuteOperations(false) - ->setDumpAutoloader(false) - ->setRunScripts(false) - ->setIgnorePlatformRequirements(false); - - $install->run(); - - $result = [ - 'composer.lock' => file_get_contents('composer.lock'), - ]; - - chdir($originalDir); - - return $result; - } -} diff --git a/composer/lib/dependabot/composer/helpers.rb b/composer/lib/dependabot/composer/helpers.rb index ba464ddbad..874f5b0c50 100644 --- a/composer/lib/dependabot/composer/helpers.rb +++ b/composer/lib/dependabot/composer/helpers.rb @@ -43,13 +43,13 @@ module Helpers .returns(String) end def self.composer_version(composer_json, parsed_lockfile = nil) - v1_unsupported = Dependabot::Experiments.enabled?(:composer_v1_unsupported_error) - # If the parsed lockfile has a plugin API version, we return either V1 or V2 # based on the major version of the lockfile. if parsed_lockfile && parsed_lockfile["plugin-api-version"] version = Composer::Version.new(parsed_lockfile["plugin-api-version"]) - return version.canonical_segments.first == 1 ? V1 : V2 + major_version = version.canonical_segments.first + + return major_version.nil? || major_version > 1 ? V2 : V1 end # Check if the composer name does not follow the Composer V2 naming conventions. @@ -57,18 +57,14 @@ def self.composer_version(composer_json, parsed_lockfile = nil) composer_name_invalid = composer_json["name"] && composer_json["name"] !~ COMPOSER_V2_NAME_REGEX # If the name is invalid returns the fallback version. - if composer_name_invalid - return v1_unsupported ? V2 : V1 - end + return V2 if composer_name_invalid # Check if the composer.json file contains "require" entries that don't follow # either the platform package naming conventions or the Composer V2 name conventions. invalid_v2 = invalid_v2_requirement?(composer_json) # If there are invalid requirements returns fallback version. - if invalid_v2 - return v1_unsupported ? V2 : V1 - end + return V2 if invalid_v2 # If no conditions are met return V2 by default. V2 diff --git a/composer/lib/dependabot/composer/package_manager.rb b/composer/lib/dependabot/composer/package_manager.rb index 20cb732c41..543293138a 100644 --- a/composer/lib/dependabot/composer/package_manager.rb +++ b/composer/lib/dependabot/composer/package_manager.rb @@ -29,24 +29,6 @@ def initialize(raw_version) SUPPORTED_COMPOSER_VERSIONS, ) end - - sig { override.returns(T::Boolean) } - def deprecated? - return false if unsupported? - - # Check if the feature flag for Composer v1 deprecation warning is enabled. - return false unless Dependabot::Experiments.enabled?(:composer_v1_deprecation_warning) - - super - end - - sig { override.returns(T::Boolean) } - def unsupported? - # Check if the feature flag for Composer v1 unsupported error is enabled. - return false unless Dependabot::Experiments.enabled?(:composer_v1_unsupported_error) - - super - end end end end diff --git a/composer/spec/dependabot/composer/file_fetcher_spec.rb b/composer/spec/dependabot/composer/file_fetcher_spec.rb index 5b1f4808d7..ed7e7c2b33 100644 --- a/composer/spec/dependabot/composer/file_fetcher_spec.rb +++ b/composer/spec/dependabot/composer/file_fetcher_spec.rb @@ -62,7 +62,7 @@ it "provides the composer version" do expect(file_fetcher_instance.ecosystem_versions).to eq({ - package_managers: { "composer" => "1" } + package_managers: { "composer" => "2" } }) end @@ -86,7 +86,7 @@ it "provides the composer version" do expect(file_fetcher_instance.ecosystem_versions).to eq({ - package_managers: { "composer" => "1" } + package_managers: { "composer" => "2" } }) end end diff --git a/composer/spec/dependabot/composer/file_updater/lockfile_updater_spec.rb b/composer/spec/dependabot/composer/file_updater/lockfile_updater_spec.rb index dd83f3ae1c..63fb584d6b 100644 --- a/composer/spec/dependabot/composer/file_updater/lockfile_updater_spec.rb +++ b/composer/spec/dependabot/composer/file_updater/lockfile_updater_spec.rb @@ -186,14 +186,6 @@ end end - context "with a plugin that would cause errors (composer v1)" do - let(:project_name) { "v1/plugin" } - - it "has details of the updated item" do - expect(updated_lockfile_content).to include("\"version\":\"1.22.1\"") - end - end - context "with a plugin that would cause errors (composer v2)" do let(:project_name) { "plugin" } @@ -206,37 +198,6 @@ end end - context "with a plugin that conflicts with the current composer version v1" do - let(:project_name) { "v1/outdated_flex" } - let(:dependency) do - Dependabot::Dependency.new( - name: "symphony/lock", - version: "4.1.3", - requirements: [{ - file: "composer.json", - requirement: "^4.1", - groups: ["runtime"], - source: nil - }], - previous_version: "4.1.1", - previous_requirements: [{ - file: "composer.json", - requirement: "^4.1", - groups: ["runtime"], - source: nil - }], - package_manager: "composer" - ) - end - - it "raises a helpful error" do - expect { updated_lockfile_content }.to raise_error do |error| - expect(error.message).to start_with("One of your Composer plugins is not compatible") - expect(error).to be_a Dependabot::DependencyFileNotResolvable - end - end - end - context "with a plugin that conflicts with the current composer version v2" do let(:project_name) { "outdated_flex" } let(:dependency) do @@ -269,45 +230,6 @@ end end - context "when an environment variable is required (composer v1)" do - let(:project_name) { "v1/env_variable" } - - context "when the variable hasn't been provided" do - it "raises a MissingEnvironmentVariable error" do - expect { updated_lockfile_content }.to raise_error do |error| - expect(error).to be_a(Dependabot::MissingEnvironmentVariable) - expect(error.environment_variable).to eq("ACF_PRO_KEY") - end - end - end - - context "when the variable has been provided" do - let(:updater) do - described_class.new( - dependency_files: files, - dependencies: [dependency], - credentials: [{ - "type" => "git_source", - "host" => "github.com", - "username" => "x-access-token", - "password" => "token" - }, { - "type" => "php_environment_variable", - "env-key" => "ACF_PRO_KEY", - "env-value" => "example_key" - }] - ) - end - - it "runs just fine (we get a 404 here because our key is wrong)" do - expect { updated_lockfile_content }.to raise_error do |error| - expect(error).to be_a(Dependabot::DependencyFileNotResolvable) - expect(error.message).to include("404") - end - end - end - end - context "when an environment variable is required (composer v2)" do let(:project_name) { "env_variable" } @@ -657,40 +579,6 @@ end end - context "when there are patches (composer v1)" do - let(:project_name) { "v1/patches" } - - let(:dependency) do - Dependabot::Dependency.new( - name: "ehime/hello-world", - version: "1.0.5", - requirements: [{ - file: "composer.json", - requirement: "1.0.5", - groups: [], - source: nil - }], - previous_version: "1.0.4", - previous_requirements: [{ - file: "composer.json", - requirement: "1.0.4", - groups: [], - source: nil - }], - package_manager: "composer" - ) - end - - it "doesn't strip the patches" do - updated_dep = JSON.parse(updated_lockfile_content) - .fetch("packages") - .find { |p| p["name"] == "ehime/hello-world" } - - expect(updated_dep.dig("extra", "patches_applied")) - .to include("[PATCH] markdown modified") - end - end - context "when running regression spec for media-organizer" do let(:project_name) { "media_organizer" } diff --git a/composer/spec/dependabot/composer/file_updater_spec.rb b/composer/spec/dependabot/composer/file_updater_spec.rb index 9b7f1441c4..acfd75d921 100644 --- a/composer/spec/dependabot/composer/file_updater_spec.rb +++ b/composer/spec/dependabot/composer/file_updater_spec.rb @@ -149,24 +149,6 @@ end end - describe "updates the lockfile using composer v1" do - let(:updated_lockfile_content) do - updated_files.find { |f| f.name == "composer.lock" }.content - end - let(:parsed_updated_lockfile_content) { JSON.parse(updated_lockfile_content) } - let(:updated_lockfile_entry) do - parsed_updated_lockfile_content["packages"].find do |package| - package["name"] == dependency.name - end - end - let(:project_name) { "v1/exact_version" } - - it "updates the dependency version and plugin-api-version (to match installed composer) in the lockfile" do - expect(updated_lockfile_entry["version"]).to eq("1.22.1") - expect(parsed_updated_lockfile_content["plugin-api-version"]).to eq("1.1.0") - end - end - context "with a project that specifies a platform package" do let(:updated_lockfile_content) do updated_files.find { |f| f.name == "composer.lock" }.content diff --git a/composer/spec/dependabot/composer/helpers_spec.rb b/composer/spec/dependabot/composer/helpers_spec.rb index 83066376aa..5a9166268e 100644 --- a/composer/spec/dependabot/composer/helpers_spec.rb +++ b/composer/spec/dependabot/composer/helpers_spec.rb @@ -51,10 +51,10 @@ expect(described_class.composer_version(composer_json)).to eq("2") end - it "uses '1' when one of the packages has an invalid name" do + it "uses '2' when one of the packages has an invalid name" do composer_json = JSON.parse(composer_v1_content) - expect(described_class.composer_version(composer_json)).to eq("1") + expect(described_class.composer_version(composer_json)).to eq("2") end end end diff --git a/composer/spec/dependabot/composer/package_manager_spec.rb b/composer/spec/dependabot/composer/package_manager_spec.rb index c4aa100563..f0b7a1825b 100644 --- a/composer/spec/dependabot/composer/package_manager_spec.rb +++ b/composer/spec/dependabot/composer/package_manager_spec.rb @@ -58,29 +58,16 @@ end describe "#deprecated?" do - before do - allow(Dependabot::Experiments).to receive(:enabled?) - .with(:composer_v1_deprecation_warning) - .and_return(feature_flag_deprecation_enabled) - allow(Dependabot::Experiments).to receive(:enabled?) - .with(:composer_v1_unsupported_error) - .and_return(feature_flag_unsupported_enabled) - end - - context "when feature flag `composer_v1_deprecation_warning` is enabled and version is deprecated" do + context "when there is no deprecated version defined" do let(:version) { "1" } - let(:feature_flag_deprecation_enabled) { true } - let(:feature_flag_unsupported_enabled) { false } - it "returns true" do - expect(package_manager.deprecated?).to be true + it "returns false" do + expect(package_manager.deprecated?).to be false end end - context "when feature flag `composer_v1_deprecation_warning` is disabled" do - let(:version) { "1" } - let(:feature_flag_deprecation_enabled) { false } - let(:feature_flag_unsupported_enabled) { false } + context "when version is not deprecated" do + let(:version) { "2" } it "returns false" do expect(package_manager.deprecated?).to be false @@ -89,8 +76,6 @@ context "when version is unsupported and takes precedence" do let(:version) { "0.9" } - let(:feature_flag_deprecation_enabled) { true } - let(:feature_flag_unsupported_enabled) { true } it "returns false, as unsupported takes precedence" do expect(package_manager.deprecated?).to be false @@ -99,33 +84,16 @@ end describe "#unsupported?" do - before do - allow(Dependabot::Experiments).to receive(:enabled?) - .with(:composer_v1_unsupported_error) - .and_return(feature_flag_unsupported_enabled) - end - - context "when feature flag `composer_v1_unsupported_error` is enabled and version is unsupported" do + context "when is unsupported" do let(:version) { "0.9" } - let(:feature_flag_unsupported_enabled) { true } it "returns true" do expect(package_manager.unsupported?).to be true end end - context "when feature flag `composer_v1_unsupported_error` is disabled" do - let(:version) { "0.9" } - let(:feature_flag_unsupported_enabled) { false } - - it "returns false" do - expect(package_manager.unsupported?).to be false - end - end - - context "when feature flag is enabled and version is supported" do + context "when version is supported" do let(:version) { "2" } - let(:feature_flag_unsupported_enabled) { true } it "returns false" do expect(package_manager.unsupported?).to be false @@ -134,28 +102,12 @@ end describe "#raise_if_unsupported!" do - before do - allow(Dependabot::Experiments).to receive(:enabled?) - .with(:composer_v1_unsupported_error) - .and_return(feature_flag_enabled) - end - context "when feature flag is enabled and version is unsupported" do let(:version) { "0.9" } - let(:feature_flag_enabled) { true } it "raises a ToolVersionNotSupported error" do expect { package_manager.raise_if_unsupported! }.to raise_error(Dependabot::ToolVersionNotSupported) end end - - context "when feature flag is disabled" do - let(:version) { "0.9" } - let(:feature_flag_enabled) { false } - - it "does not raise an error" do - expect { package_manager.raise_if_unsupported! }.not_to raise_error - end - end end end diff --git a/composer/spec/dependabot/composer/update_checker/version_resolver_spec.rb b/composer/spec/dependabot/composer/update_checker/version_resolver_spec.rb index 483c2d6084..ef48035128 100644 --- a/composer/spec/dependabot/composer/update_checker/version_resolver_spec.rb +++ b/composer/spec/dependabot/composer/update_checker/version_resolver_spec.rb @@ -244,33 +244,6 @@ end end - context "with a name that is only valid in v1" do - let(:project_name) { "v1/invalid_v2_name" } - let(:dependency_name) { "monolog/monolog" } - let(:latest_allowable_version) { Gem::Version.new("1.25.1") } - let(:dependency_version) { "1.0.2" } - - it { is_expected.to eq(Dependabot::Composer::Version.new("1.25.1")) } - end - - context "with a dependency name that is only valid in v1" do - let(:project_name) { "v1/invalid_v2_requirement" } - let(:dependency_name) { "monolog/Monolog" } - let(:latest_allowable_version) { Gem::Version.new("1.25.1") } - let(:dependency_version) { "1.0.2" } - - it { is_expected.to eq(Dependabot::Composer::Version.new("1.25.1")) } - end - - context "with an unresolvable path VCS source" do - let(:project_name) { "unreachable_path_vcs_source" } - - it "raises a Dependabot::DependencyFileNotResolvable error" do - expect { resolver.latest_resolvable_version } - .to raise_error(Dependabot::DependencyFileNotResolvable) - end - end - context "with a platform extension that cannot be added" do let(:project_name) { "unaddable_platform_req" } let(:dependency_name) { "monolog/monolog" } @@ -289,18 +262,6 @@ end end - context "with a missing vcs repository source (composer v1)" do - let(:project_name) { "v1/vcs_source_unreachable" } - - it "raises a Dependabot::DependencyFileNotResolvable error" do - expect { resolver.latest_resolvable_version } - .to raise_error(Dependabot::GitDependenciesNotReachable) do |error| - expect(error.dependency_urls) - .to eq(["https://github.com/dependabot-fixtures/this-repo-does-not-exist.git"]) - end - end - end - context "with a missing vcs repository source" do let(:project_name) { "vcs_source_unreachable" } diff --git a/composer/spec/dependabot/composer/update_checker_spec.rb b/composer/spec/dependabot/composer/update_checker_spec.rb index d395ab23cd..c6dfb2194b 100644 --- a/composer/spec/dependabot/composer/update_checker_spec.rb +++ b/composer/spec/dependabot/composer/update_checker_spec.rb @@ -205,12 +205,6 @@ it { is_expected.to be >= Gem::Version.new("1.22.0") } - context "with a composer v1 lockfile" do - let(:project_name) { "v1/exact_version" } - - it { is_expected.to be >= Gem::Version.new("1.22.0") } - end - context "when the user is ignoring the latest version" do let(:ignored_versions) { [">= 1.22.0.a, < 4.0"] } @@ -443,58 +437,6 @@ it { is_expected.to be_nil } end - context "with a replaced direct dependency" do - let(:project_name) { "replaced_direct_dependency" } - let(:dependency_name) { "neos/flow" } - let(:dependency_version) { nil } - let(:requirements) do - [{ - file: "composer.json", - requirement: "*", - groups: [], - source: nil - }] - end - - it { is_expected.to be_nil } - end - - context "with a PEAR dependency (composer v1)" do - let(:project_name) { "v1/pear" } - let(:dependency_name) { "pear-pear.horde.org/Horde_Date" } - let(:dependency_version) { "2.4.1" } - let(:requirements) do - [{ - file: "composer.json", - requirement: "^2.4.0@stable", - groups: [], - source: nil - }] - end - - # This unit test is testing that a dependency located on https://pear.horde.org is still correctly - # handled by composer. So ignore the fact that this package actually exists on packagist, and - # pretend it just 404's. - let(:packagist_response) { "404 not found, no packages here" } - - before do - v2_metadata_url = "https://repo.packagist.org/p2/#{dependency_name.downcase}.json" - stub_request(:get, v2_metadata_url).to_return(status: 404, body: packagist_response) - - # Also stub the v1 URL because the underlying `composer` `v1` doesn't know how to talk to the v2 metadata URL. - v1_metadata_url = "https://repo.packagist.org/p/#{dependency_name.downcase}.json" - # v1 url doesn't always return 404 for missing packages - stub_request(:get, v1_metadata_url).to_return(status: 200, body: '{"error":{"code":404,"message":"Not Found"}}') - allow(checker).to receive(:latest_version_from_registry) - .and_return(Gem::Version.new("2.4.1")) - end - - it "is between 2.0.0 and 3.0.0" do - expect(latest_resolvable_version).to be < Gem::Version.new("3.0.0") - expect(latest_resolvable_version).to be > Gem::Version.new("2.0.0") - end - end - context "with a version conflict at the latest version" do let(:project_name) { "version_conflict_at_latest" } let(:dependency_name) { "doctrine/dbal" } diff --git a/composer/spec/dependabot/composer_spec.rb b/composer/spec/dependabot/composer_spec.rb index 44bbf808c7..abeab591d5 100644 --- a/composer/spec/dependabot/composer_spec.rb +++ b/composer/spec/dependabot/composer_spec.rb @@ -21,10 +21,6 @@ expect(helper_composer_version(major_version: "v2")).to eq(native_composer_version(major_version: "v2")) end - it "has the same binary version of composer 1 installed as specified in the native helper" do - expect(helper_composer_version(major_version: "v1")).to eq(native_composer_version(major_version: "v1")) - end - private def helper_composer_version(major_version:)