diff --git a/.editorconfig b/.editorconfig index 12bcb27..78bd256 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,10 +8,10 @@ root = true [*] end_of_line = LF indent_style = space -indent_size = 2 +indent_size = 4 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -[{composer.json,composer.lock}] -indent_size = 4 +[scaffold/required/RoboFileBase.php] +indent_size = 2 diff --git a/.gitignore b/.gitignore index 78b63b5..868f11d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ -/.idea/ +.idea vendor docker-compose.yml +bin/ +.php_cs.cache diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..76595ca --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,21 @@ +in('src'); +$config = new Config(); + +return $config + ->setFinder($finder) + ->setRules([ + '@Symfony' => true, + 'strict_param' => true, + 'array_syntax' => ['syntax' => 'short'], + 'concat_space' => ['spacing' => 'one'], + 'no_superfluous_phpdoc_tags' => true, + 'phpdoc_align' => false, + 'phpdoc_no_useless_inheritdoc' => true, + ]); diff --git a/README.md b/README.md index 396e44a..3c092a2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ -# shepherd-drupal-scaffold +# Shepherd Drupal Scaffold -Composer plugin for automatically downloading Shepherd tools files (like -`RoboFileBase.php`, …). +Composer plugin for automatically adding files to a project. + + - Some files are always added, replacing existing files. + - Some files are only added if they don't exist. This is referenced by projects created using `shepherd-drupal-project`. + +## Development + +Run coding standards and fixer with: ` ./bin/php-cs-fixer fix --allow-risky=yes` diff --git a/composer.json b/composer.json index 48ad4e3..18ac40d 100644 --- a/composer.json +++ b/composer.json @@ -3,13 +3,17 @@ "description": "Composer Plugin for updating the Shepherd Drupal tools.", "type": "composer-plugin", "license": "GPL-2.0+", + "minimum-stability": "dev", "require": { - "php": ">=7.0", - "composer-plugin-api": "^1.1", - "composer/semver": "^1.4", - "drupal-composer/drupal-scaffold": "^2.2", + "php": ">=7.4", + "composer-plugin-api": "^2", "symfony/filesystem": "~3.0 || ^4.0" }, + "require-dev": { + "composer/composer": "^1.8@stable", + "friendsofphp/php-cs-fixer": "^2", + "consolidation/robo": "^1" + }, "config": { "bin-dir": "bin/" }, @@ -19,6 +23,6 @@ } }, "extra": { - "class": "UniversityOfAdelaide\\ShepherdDrupalScaffold\\Plugin" + "class": "UniversityOfAdelaide\\ShepherdDrupalScaffold\\ShepherdDrupalScaffoldPlugin" } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..1ffee87 --- /dev/null +++ b/composer.lock @@ -0,0 +1,3035 @@ +{ + "_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": "3ae2b811b771d1914a908900db35ee0a", + "packages": [ + { + "name": "symfony/filesystem", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "a501126eb6ec9288a3434af01b3d4499ec1268a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/a501126eb6ec9288a3434af01b3d4499ec1268a0", + "reference": "a501126eb6ec9288a3434af01b3d4499ec1268a0", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-30T07:12:23+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/ca-bundle", + "version": "1.2.10", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/9fdb22c2e97a614657716178093cd1da90a64aa8", + "reference": "9fdb22c2e97a614657716178093cd1da90a64aa8", + "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" + }, + "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.2.10" + }, + "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-06-07T13:58:28+00:00" + }, + { + "name": "composer/composer", + "version": "1.10.22", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/28c9dfbe2351635961f670773e8d7b17bc5eda25", + "reference": "28c9dfbe2351635961f670773e8d7b17bc5eda25", + "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/composer/issues", + "source": "https://github.com/composer/composer/tree/1.10.22" + }, + "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-04-27T11:10:45+00:00" + }, + { + "name": "composer/semver", + "version": "1.x-dev", + "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/1.7.2" + }, + "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.5", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "de30328a7af8680efdc03e396aad24befd513200" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + }, + "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" + }, + "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-03T16:04:16+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.x-dev", + "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" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/1.4.6" + }, + "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": "consolidation/annotated-command", + "version": "4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/consolidation/annotated-command.git", + "reference": "789358bdc7ae1e76d9fe92e33703d15139cfb4e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/789358bdc7ae1e76d9fe92e33703d15139cfb4e5", + "reference": "789358bdc7ae1e76d9fe92e33703d15139cfb4e5", + "shasum": "" + }, + "require": { + "consolidation/output-formatters": "^4.1.1", + "php": ">=7.1.3", + "psr/log": "^1|^2", + "symfony/console": "^4.4.8|~5.1.0", + "symfony/event-dispatcher": "^4.4.8|^5", + "symfony/finder": "^4.4.8|^5" + }, + "require-dev": { + "phpunit/phpunit": "^7.5.20 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\AnnotatedCommand\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Initialize Symfony Console commands from annotated command class methods.", + "support": { + "issues": "https://github.com/consolidation/annotated-command/issues", + "source": "https://github.com/consolidation/annotated-command/tree/4.x" + }, + "time": "2021-06-13T02:21:34+00:00" + }, + { + "name": "consolidation/config", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/consolidation/config.git", + "reference": "ddb0e6c650fc5c4e1f13d10b14604d33cebef76c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/config/zipball/ddb0e6c650fc5c4e1f13d10b14604d33cebef76c", + "reference": "ddb0e6c650fc5c4e1f13d10b14604d33cebef76c", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "grasmash/expander": "^1", + "php": ">=5.4.0" + }, + "require-dev": { + "g1a/composer-test-scenarios": "^3", + "php-coveralls/php-coveralls": "^1", + "phpunit/phpunit": "^5", + "squizlabs/php_codesniffer": "2.*", + "symfony/console": "^2.5|^3|^4", + "symfony/yaml": "^2.8.11|^3|^4" + }, + "suggest": { + "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader" + }, + "type": "library", + "extra": { + "scenarios": { + "symfony4": { + "require-dev": { + "symfony/console": "^4.0" + }, + "config": { + "platform": { + "php": "7.1.3" + } + } + }, + "symfony2": { + "require-dev": { + "symfony/console": "^2.8", + "symfony/event-dispatcher": "^2.8", + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.4.8" + } + } + } + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Provide configuration services for a commandline tool.", + "support": { + "issues": "https://github.com/consolidation/config/issues", + "source": "https://github.com/consolidation/config/tree/master" + }, + "time": "2019-04-06T17:31:34+00:00" + }, + { + "name": "consolidation/log", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/consolidation/log.git", + "reference": "12e1bbc918c5221f7a559a2c9751d2518c9b1d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/log/zipball/12e1bbc918c5221f7a559a2c9751d2518c9b1d5b", + "reference": "12e1bbc918c5221f7a559a2c9751d2518c9b1d5b", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1.0", + "symfony/console": "^4|^5" + }, + "require-dev": { + "phpunit/phpunit": ">=7.5.20", + "squizlabs/php_codesniffer": "^3", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", + "support": { + "issues": "https://github.com/consolidation/log/issues", + "source": "https://github.com/consolidation/log/tree/main" + }, + "time": "2020-12-10T16:53:33+00:00" + }, + { + "name": "consolidation/output-formatters", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/consolidation/output-formatters.git", + "reference": "fb12960888a53b4767e87eee9847cf6c54848e11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/fb12960888a53b4767e87eee9847cf6c54848e11", + "reference": "fb12960888a53b4767e87eee9847cf6c54848e11", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "php": ">=7.1.3", + "symfony/console": "^4|^5", + "symfony/finder": "^4|^5" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.4.2", + "phpunit/phpunit": ">=7", + "squizlabs/php_codesniffer": "^3", + "symfony/var-dumper": "^4", + "symfony/yaml": "^4", + "yoast/phpunit-polyfills": "^0.2.0" + }, + "suggest": { + "symfony/var-dumper": "For using the var_dump formatter" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\OutputFormatters\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Format text by applying transformations provided by plug-in formatters.", + "support": { + "issues": "https://github.com/consolidation/output-formatters/issues", + "source": "https://github.com/consolidation/output-formatters/tree/main" + }, + "time": "2021-03-11T14:26:55+00:00" + }, + { + "name": "consolidation/robo", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/consolidation/Robo.git", + "reference": "fbf5905ad8b2586da0b4b6946fb8ad2c0b0a804e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/fbf5905ad8b2586da0b4b6946fb8ad2c0b0a804e", + "reference": "fbf5905ad8b2586da0b4b6946fb8ad2c0b0a804e", + "shasum": "" + }, + "require": { + "consolidation/annotated-command": "^2.12.1|^4.1", + "consolidation/config": "^1.2.1", + "consolidation/log": "^1.1.1|^2", + "consolidation/output-formatters": "^3.5.1|^4.1", + "consolidation/self-update": "^1.1.5", + "grasmash/yaml-expander": "^1.4", + "league/container": "^2.4.1", + "php": ">=5.5.0", + "symfony/console": "^2.8|^3|^4", + "symfony/event-dispatcher": "^2.5|^3|^4", + "symfony/filesystem": "^2.5|^3|^4", + "symfony/finder": "^2.5|^3|^4|^5", + "symfony/process": "^2.5|^3|^4" + }, + "replace": { + "codegyre/robo": "< 1.0" + }, + "require-dev": { + "g1a/composer-test-scenarios": "^3", + "natxet/cssmin": "3.0.4", + "patchwork/jsqueeze": "^2", + "pear/archive_tar": "^1.4.4", + "php-coveralls/php-coveralls": "^1", + "phpunit/phpunit": "^5.7.27", + "squizlabs/php_codesniffer": "^3" + }, + "suggest": { + "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch", + "natxet/CssMin": "For minifying CSS files in taskMinify", + "patchwork/jsqueeze": "For minifying JS files in taskMinify", + "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively." + }, + "bin": [ + "robo" + ], + "type": "library", + "extra": { + "scenarios": { + "finder5": { + "require": { + "symfony/finder": "^5" + }, + "config": { + "platform": { + "php": "7.2.5" + } + } + }, + "symfony4": { + "require": { + "symfony/console": "^4" + }, + "config": { + "platform": { + "php": "7.1.3" + } + } + }, + "symfony2": { + "require": { + "symfony/console": "^2.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.5.9" + } + }, + "scenario-options": { + "create-lockfile": "false" + } + } + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Robo\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + } + ], + "description": "Modern task runner", + "support": { + "issues": "https://github.com/consolidation/Robo/issues", + "source": "https://github.com/consolidation/Robo/tree/1.x" + }, + "time": "2021-01-18T15:54:10+00:00" + }, + { + "name": "consolidation/self-update", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/consolidation/self-update.git", + "reference": "ed68ed69a427a03bb6fd2197e6d3d564a5ce0cba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/self-update/zipball/ed68ed69a427a03bb6fd2197e6d3d564a5ce0cba", + "reference": "ed68ed69a427a03bb6fd2197e6d3d564a5ce0cba", + "shasum": "" + }, + "require": { + "php": ">=5.5.0", + "symfony/console": "^2.8|^3|^4|^5", + "symfony/filesystem": "^2.5|^3|^4|^5" + }, + "default-branch": true, + "bin": [ + "scripts/release" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "SelfUpdate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Menk", + "email": "menk@mestrona.net" + }, + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Provides a self:update command for Symfony Console applications.", + "support": { + "issues": "https://github.com/consolidation/self-update/issues", + "source": "https://github.com/consolidation/self-update/tree/main" + }, + "time": "2020-12-18T03:34:58+00:00" + }, + { + "name": "container-interop/container-interop", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/container-interop/container-interop.git", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "shasum": "" + }, + "require": { + "psr/container": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "support": { + "issues": "https://github.com/container-interop/container-interop/issues", + "source": "https://github.com/container-interop/container-interop/tree/master" + }, + "abandoned": "psr/container", + "time": "2017-02-14T19:40:03+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a", + "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Dflydev\\DotAccessData": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/master" + }, + "time": "2017-01-20T21:14:22+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.14.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "5e802cc8a05c8679b01ef60423642702bdef6e6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5e802cc8a05c8679b01ef60423642702bdef6e6b", + "reference": "5e802cc8a05c8679b01ef60423642702bdef6e6b", + "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": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" + }, + "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" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.x" + }, + "time": "2021-05-16T18:15:24+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "59bfb3b9be04237be4cd1afea9bbb58794c25ce8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/59bfb3b9be04237be4cd1afea9bbb58794c25ce8", + "reference": "59bfb3b9be04237be4cd1afea9bbb58794c25ce8", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.2 || ^9.4" + }, + "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" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.3.x" + }, + "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": "2021-01-20T07:15:06+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "2.19.x-dev", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "bddb80c8a5d9e64e91f8d15e0087c3ee3d44ba7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/bddb80c8a5d9e64e91f8d15e0087c3ee3d44ba7d", + "reference": "bddb80c8a5d9e64e91f8d15e0087c3ee3d44ba7d", + "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", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.19" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2021-06-28T17:07:05+00:00" + }, + { + "name": "grasmash/expander", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/grasmash/expander.git", + "reference": "54c66e9d24a03da551e6cd88c6fb4bef571c3dc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grasmash/expander/zipball/54c66e9d24a03da551e6cd88c6fb4bef571c3dc9", + "reference": "54c66e9d24a03da551e6cd88c6fb4bef571c3dc9", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "php": ">=5.6", + "psr/log": "^1.0" + }, + "require-dev": { + "greg-1-anderson/composer-test-scenarios": "^1", + "phpunit/phpunit": "^5.5.4", + "satooshi/php-coveralls": "^1.0.2|dev-master", + "squizlabs/php_codesniffer": "^2.7" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Grasmash\\Expander\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Grasmick" + } + ], + "description": "Expands internal property references in PHP arrays file.", + "support": { + "issues": "https://github.com/grasmash/expander/issues", + "source": "https://github.com/grasmash/expander/tree/master" + }, + "time": "2020-01-09T16:20:45+00:00" + }, + { + "name": "grasmash/yaml-expander", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/grasmash/yaml-expander.git", + "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grasmash/yaml-expander/zipball/3f0f6001ae707a24f4d9733958d77d92bf9693b1", + "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "php": ">=5.4", + "symfony/yaml": "^2.8.11|^3|^4" + }, + "require-dev": { + "greg-1-anderson/composer-test-scenarios": "^1", + "phpunit/phpunit": "^4.8|^5.5.4", + "satooshi/php-coveralls": "^1.0.2|dev-master", + "squizlabs/php_codesniffer": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Grasmash\\YamlExpander\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Grasmick" + } + ], + "description": "Expands internal property references in a yaml file.", + "support": { + "issues": "https://github.com/grasmash/yaml-expander/issues", + "source": "https://github.com/grasmash/yaml-expander/tree/1.4.0" + }, + "time": "2017-12-16T16:06:03+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.10", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + }, + "time": "2020-05-27T16:41:55+00:00" + }, + { + "name": "league/container", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/container.git", + "reference": "dded0af3a39a27c1083bf341db79c0f73b169b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/container/zipball/dded0af3a39a27c1083bf341db79c0f73b169b7b", + "reference": "dded0af3a39a27c1083bf341db79c0f73b169b7b", + "shasum": "" + }, + "require": { + "container-interop/container-interop": "^1.2", + "php": "^5.4 || ^7.0 || ^8.0" + }, + "provide": { + "container-interop/container-interop-implementation": "^1.2", + "psr/container-implementation": "^1.0" + }, + "replace": { + "orno/di": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36", + "scrutinizer/ocular": "^1.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Container\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Phil Bennett", + "email": "philipobenito@gmail.com", + "homepage": "http://www.philipobenito.com", + "role": "Developer" + } + ], + "description": "A fast and intuitive dependency injection container.", + "homepage": "https://github.com/thephpleague/container", + "keywords": [ + "container", + "dependency", + "di", + "injection", + "league", + "provider", + "service" + ], + "support": { + "issues": "https://github.com/thephpleague/container/issues", + "source": "https://github.com/thephpleague/container/tree/2.x" + }, + "funding": [ + { + "url": "https://github.com/philipobenito", + "type": "github" + } + ], + "time": "2021-02-22T10:38:51+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" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1" + }, + "time": "2020-10-14T08:39:05+00:00" + }, + { + "name": "psr/cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/0a7c67d0d1c8167b342eb74339d6f961663826ce", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "suggest": { + "fig/cache-util": "Provides some useful PSR-6 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2021-02-24T03:25:37+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.x" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/log", + "version": "dev-master", + "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" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "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" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2020-11-11T09:19:24+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "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" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/master" + }, + "time": "2020-07-07T18:42:57+00:00" + }, + { + "name": "symfony/console", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "9aa1eb46c1b12fada74dc0c529e93d1ccef22576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/9aa1eb46c1b12fada74dc0c529e93d1ccef22576", + "reference": "9aa1eb46c1b12fada74dc0c529e93d1ccef22576", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.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", + "support": { + "source": "https://github.com/symfony/console/tree/4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-06T09:12:27+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "36b691b0bdbc963fb610da193a48b4c009d03a62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/36b691b0bdbc963fb610da193a48b4c009d03a62", + "reference": "36b691b0bdbc963fb610da193a48b4c009d03a62", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "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", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-09T13:36:38+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:39:37+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-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" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + }, + "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-07-06T13:19:58+00:00" + }, + { + "name": "symfony/finder", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T12:52:38+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "default-branch": true, + "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" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.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": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "dev-main", + "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" + }, + "default-branch": true, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php70/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/process", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7e812c84c3f2dba173d311de6e510edf701685a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7e812c84c3f2dba173d311de6e510edf701685a8", + "reference": "7e812c84c3f2dba173d311de6e510edf701685a8", + "shasum": "" + }, + "require": { + "php": ">=7.1.3" + }, + "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", + "support": { + "source": "https://github.com/symfony/process/tree/4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-09T14:57:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "0d8e07c43ec256df5dd92574ed468e72f444c914" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/0d8e07c43ec256df5dd92574ed468e72f444c914", + "reference": "0d8e07c43ec256df5dd92574ed468e72f444c914", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "default-branch": true, + "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" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-09T13:36:38+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "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", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, + { + "name": "symfony/yaml", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "8e3c2dd9318bd9b97eb7249f869a64f33c5039ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/8e3c2dd9318bd9b97eb7249f869a64f33c5039ad", + "reference": "8e3c2dd9318bd9b97eb7249f869a64f33c5039ad", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-30T13:02:00+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "composer/composer": 0 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.4", + "composer-plugin-api": "^2" + }, + "platform-dev": [], + "plugin-api-version": "2.1.0" +} diff --git a/drush/config-delete.yml b/drush/config-delete.yml deleted file mode 100644 index f2ed695..0000000 --- a/drush/config-delete.yml +++ /dev/null @@ -1 +0,0 @@ -delete: {} diff --git a/drush/config-ignore.yml b/drush/config-ignore.yml deleted file mode 100644 index 50c0dbb..0000000 --- a/drush/config-ignore.yml +++ /dev/null @@ -1 +0,0 @@ -ignore: {} diff --git a/RoboFile.php b/scaffold/optional/RoboFile.php similarity index 100% rename from RoboFile.php rename to scaffold/optional/RoboFile.php diff --git a/docker-compose.linux.yml b/scaffold/optional/docker-compose.linux.yml similarity index 100% rename from docker-compose.linux.yml rename to scaffold/optional/docker-compose.linux.yml diff --git a/docker-compose.osx.yml b/scaffold/optional/docker-compose.osx.yml similarity index 100% rename from docker-compose.osx.yml rename to scaffold/optional/docker-compose.osx.yml diff --git a/docker/Dockerfile b/scaffold/optional/docker/Dockerfile similarity index 99% rename from docker/Dockerfile rename to scaffold/optional/docker/Dockerfile index c9d0ad9..fc74cf7 100644 --- a/docker/Dockerfile +++ b/scaffold/optional/docker/Dockerfile @@ -46,7 +46,7 @@ RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ && rm -rf /tmp/blackfire /tmp/blackfire-probe.tar.gz # Install Composer. -RUN wget -q https://getcomposer.org/installer -O - | php -d allow_url_fopen=On -- --install-dir=/usr/local/bin --filename=composer --1 +RUN wget -q https://getcomposer.org/installer -O - | php -d allow_url_fopen=On -- --install-dir=/usr/local/bin --filename=composer COPY ./docker/xdebug.ini /etc/php/${PHP_VERSION}/mods-available/xdebug.ini diff --git a/docker/php_custom.ini b/scaffold/optional/docker/php_custom.ini similarity index 100% rename from docker/php_custom.ini rename to scaffold/optional/docker/php_custom.ini diff --git a/docker/xdebug.ini b/scaffold/optional/docker/xdebug.ini similarity index 100% rename from docker/xdebug.ini rename to scaffold/optional/docker/xdebug.ini diff --git a/dsh_bash b/scaffold/optional/dsh_bash similarity index 100% rename from dsh_bash rename to scaffold/optional/dsh_bash diff --git a/phpcs.xml b/scaffold/optional/phpcs.xml similarity index 100% rename from phpcs.xml rename to scaffold/optional/phpcs.xml diff --git a/RoboFileBase.php b/scaffold/required/RoboFileBase.php similarity index 66% rename from RoboFileBase.php rename to scaffold/required/RoboFileBase.php index cc895f6..7c3d990 100644 --- a/RoboFileBase.php +++ b/scaffold/required/RoboFileBase.php @@ -7,10 +7,12 @@ * Implementation of class for Robo - http://robo.li/ */ +use Robo\Tasks; + /** * Class RoboFileBase. */ -abstract class RoboFileBase extends \Robo\Tasks { +abstract class RoboFileBase extends Tasks { protected $drush_cmd; @@ -49,36 +51,13 @@ abstract class RoboFileBase extends \Robo\Tasks { protected $config = []; - protected $config_new_directory = 'config_new'; - protected $config_old_directory = 'config_old'; - /** - * The path to the config dir. - * - * @var string + * The path to the Drupal config directories. */ - protected $configDir = '/code/config-export'; + protected const CONFIG_DIRECTORY = '/code/config-export'; + protected const CONFIG_DIRECTORY_NEW = 'config_new'; + protected const CONFIG_DIRECTORY_OLD = 'config_old'; - /** - * The path to the config install dir. - * - * @var string - */ - protected $configInstallDir = '/code/config-install'; - - /** - * The path to the config delete list. - * - * @var string - */ - protected $configDeleteList = '/code/drush/config-delete.yml'; - - /** - * The path to the config delete list. - * - * @var string - */ - protected $configIgnoreList = '/code/drush/config-ignore.yml'; /** * Initialize config variables and apply overrides. @@ -143,18 +122,18 @@ protected function readConfigFromEnv() { /** * Perform a full build on the project. */ - public function build() { - $start = new DateTime(); + public function build(): void { + $start = new DateTimeImmutable(); $this->devXdebugDisable(); $this->devComposerValidate(); $this->buildMake(); $this->ensureDirectories(); $this->buildInstall(); - $this->configImportPlus(); + $this->configImport(); $this->devCacheRebuild(); $this->ensureDirectories(); $this->devXdebugEnable(); - $this->say('Total build duration: ' . date_diff(new DateTime(), $start)->format('%im %Ss')); + $this->say('Total build duration: ' . (new \DateTimeImmutable())->diff($start)->format('%im %Ss')); } /** @@ -185,7 +164,11 @@ public function devComposerValidate() { * Additional flags to pass to the composer install command. */ public function buildMake($flags = '') { - $successful = $this->_exec("$this->composer_bin --no-progress --no-interaction $flags install")->wasSuccessful(); + $successful = $this->_exec(sprintf( + '%s --no-progress --no-interaction %s install', + $this->composer_bin, + $flags) + )->wasSuccessful(); $this->checkFail($successful, "Composer install failed."); } @@ -205,15 +188,6 @@ public function ensureDirectories() { } } - /** - * Set the owner and group of all files in the files dir to the web user. - * - * @deprecated Use ::ensureDirectories instead. - */ - public function buildSetFilesOwner() { - $this->ensureDirectories(); - } - /** * Clean config and files, then install Drupal and module dependencies. */ @@ -221,11 +195,11 @@ public function buildInstall() { $this->devConfigWriteable(); // @TODO: When is this really used? Automated builds - can be random values. - $successful = $this->_exec("$this->drush_cmd site-install " . + $successful = $this->_exec("$this->drush_cmd site:install " . $this->getDrupalProfile() . " install_configure_form.enable_update_status_module=NULL" . " install_configure_form.enable_update_status_emails=NULL" . - " -y" . + " --yes" . " --account-mail=\"" . $this->config['site']['admin_email'] . "\"" . " --account-name=\"" . $this->config['site']['admin_user'] . "\"" . " --account-pass=\"" . $this->config['site']['admin_password'] . "\"" . @@ -236,7 +210,7 @@ public function buildInstall() { // Re-set settings.php permissions. $this->devConfigReadOnly(); - $this->checkFail($successful, 'drush site-install failed.'); + $this->checkFail($successful, 'drush site:install failed.'); $this->devCacheRebuild(); } @@ -277,7 +251,7 @@ public function buildClean() { */ public function buildApplyUpdates() { // Run the module updates. - $successful = $this->_exec("$this->drush_cmd -y updatedb")->wasSuccessful(); + $successful = $this->_exec("$this->drush_cmd --yes updatedb")->wasSuccessful(); $this->checkFail($successful, 'running drupal updates failed.'); } @@ -285,7 +259,7 @@ public function buildApplyUpdates() { * Perform cache clear in the app directory. */ public function devCacheRebuild() { - $successful = $this->_exec("$this->drush_cmd cr")->wasSuccessful(); + $successful = $this->_exec("$this->drush_cmd cache:rebuild")->wasSuccessful(); $this->checkFail($successful, 'drush cache-rebuild failed.'); } @@ -352,150 +326,44 @@ public function devXdebugDisable() { } /** - * Export the current configuration to an 'old' directory. + * Imports Drupal configuration. */ - public function configExportOld() { - $this->configExport($this->config_old_directory); - } - - /** - * Export the current configuration to a 'new' directory. - */ - public function configExportNew() { - $this->configExport($this->config_new_directory); - } - - /** - * Export config to a supplied directory. - * - * @param string $destination - * The folder within the application root. - */ - protected function configExport($destination = NULL) { - $this->yell('This command is deprecated, you should use config:export-plus instead', 40, 'red'); - if ($destination) { - $this->_exec("$this->drush_cmd -y cex --destination=" . $destination); - $this->_exec("sed -i '/^uuid:.*$/d; /^_core:$/, /^.*default_config_hash:.*$/d' $this->application_root/$destination/*.yml"); - } + public function configImport() { + $successful = $this->_exec( + sprintf('%s config:import --yes --source=%s', + $this->drush_cmd, + static::CONFIG_DIRECTORY + )) + ->wasSuccessful(); + $this->checkFail($successful, 'Config import failed.'); } /** - * Display files changed between 'config_old' and 'config_new' directories. - * - * @param array $opts - * Specify whether to show the diff output or just list them. + * Exports Drupal configuration. * - * @return array - * Diff output as an array of strings. + * @param string|null $destination + * An optional custom destination. */ - public function configChanges($opts = ['show|s' => FALSE]) { - $this->yell('This command is deprecated, you should use config:export-plus and config:import-plus instead', 40, 'red'); - $output_style = '-qbr'; - $config_old_path = $this->application_root . '/' . $this->config_old_directory; - $config_new_path = $this->application_root . '/' . $this->config_new_directory; - - if (isset($opts['show']) && $opts['show']) { - $output_style = '-ubr'; - } - - $results = $this->taskExec("diff -N -I \" - 'file:.*\" $output_style $config_old_path $config_new_path") - ->run() - ->getMessage(); - - $results_array = explode("\n", $results); - - return $results_array; + public function configExport(?string $destination = NULL): void { + $this->_exec(sprintf( + '%s config:export --yes --destination=%s', + $this->drush_cmd, + $destination ?? static::CONFIG_DIRECTORY + )); } /** - * Synchronise active config to the install profile or specified path. - * - * Synchronise the differences from the configured 'config_new' and - * 'config_old' directories into the install profile or a specific path. - * - * @param array $path - * If the sync is to update an entity instead of a profile, supple a path. - */ - public function configSync($path = NULL) { - $this->yell('This command is deprecated, you should use config:export-plus and config:import-plus instead', 40, 'red'); - $config_sync_already_run = FALSE; - $output_path = $this->application_root . '/profiles/' . $this->getDrupalProfile() . '/config/install'; - $config_new_path = $this->application_root . '/' . $this->config_new_directory; - - // If a path is passed in, use it to override the destination. - if (!empty($path) && is_dir($path)) { - $output_path = $path; - } - - $results_array = $this->configChanges(); - - $tasks = $this->taskFilesystemStack(); - - foreach ($results_array as $line) { - // Handle/remove blank lines. - $line = trim($line); - if (empty($line)) { - continue; - } - - // Never sync the extension file, it breaks things. - if (stristr($line, 'core.extension.yml')) { - continue; - } - - // Break up the line into fields and put the parts in their place. - $parts = explode(' ', $line); - $config_new_file = $parts[3]; - $output_file_path = $output_path . - preg_replace("/^" . str_replace('/', '\/', $config_new_path) ."/", '', $config_new_file); - - // If the source doesn't exist, we're removing it from the - // destination in the profile. - if (!file_exists($config_new_file)) { - if (file_exists($output_file_path)) { - $tasks->remove($output_file_path); - } - else { - $config_sync_already_run = TRUE; - } - } - else { - $tasks->copy($config_new_file, $output_file_path); - } - } - - if ($config_sync_already_run) { - $this->say("Config sync already run?"); - } - - $tasks->run(); - } - - /** - * Imports configuration using advanced drush commands. - * - * Commands provided by previousnext/drush_cmi_tools. - * - * @see https://github.com/previousnext/drush_cmi_tools + * Export the current configuration to a 'new' directory. */ - public function configImportPlus() { - $successful = $this->_exec("$this->drush_cmd cimy -y \ - --source=$this->configDir \ - --install=$this->configInstallDir \ - --delete-list=$this->configDeleteList") - ->wasSuccessful(); - $this->checkFail($successful, 'Config import failed.'); + public function configExportNew(): void { + $this->configExport(static::CONFIG_DIRECTORY_OLD); } /** - * Exports configuration using advanced drush commands. - * - * Commands provided by previousnext/drush_cmi_tools. - * - * @see https://github.com/previousnext/drush_cmi_tools + * Export the current configuration to an 'old' directory. */ - public function configExportPlus() { - $this->_exec("$this->drush_cmd cexy -y --destination=$this->configDir --ignore-list=$this->configIgnoreList"); + public function configExportOld(): void { + $this->configExport(static::CONFIG_DIRECTORY_NEW); } /** @@ -550,8 +418,8 @@ public function devTwigDebugDisable() { */ public function devAggregateAssetsDisable() { $this->taskExecStack() - ->exec($this->drush_cmd . ' cset system.performance js.preprocess 0 -y') - ->exec($this->drush_cmd . ' cset system.performance css.preprocess 0 -y') + ->exec($this->drush_cmd . ' config:set system.performance js.preprocess 0 --yes') + ->exec($this->drush_cmd . ' config:set system.performance css.preprocess 0 --yes') ->run(); $this->devCacheRebuild(); $this->say('Asset Aggregation is now disabled.'); @@ -562,8 +430,8 @@ public function devAggregateAssetsDisable() { */ public function devAggregateAssetsEnable() { $this->taskExecStack() - ->exec($this->drush_cmd . ' cset system.performance js.preprocess 1 -y') - ->exec($this->drush_cmd . ' cset system.performance css.preprocess 1 -y') + ->exec($this->drush_cmd . ' config:set system.performance js.preprocess 1 --yes') + ->exec($this->drush_cmd . ' config:set system.performance css.preprocess 1 --yes') ->run(); $this->devCacheRebuild(); $this->say('Asset Aggregation is now enabled.'); @@ -596,12 +464,13 @@ public function devConfigReadOnly() { * Path to sql file to import. */ public function devImportDb($sql_file) { - $start = new DateTime(); - $this->_exec("$this->drush_cmd -y sql-drop"); - $this->_exec("$this->drush_cmd sqlq --file=$sql_file"); - $this->_exec("$this->drush_cmd cr"); - $this->_exec("$this->drush_cmd updb --entity-updates -y"); - $this->say('Duration: ' . date_diff(new DateTime(), $start)->format('%im %Ss')); + $start = new DateTimeImmutable(); + $this->_exec("$this->drush_cmd sql:drop --yes"); + $this->_exec("$this->drush_cmd sql:query --file=$sql_file"); + $this->devCacheRebuild(); + $this->buildApplyUpdates(); + + $this->say('Duration: ' . (new \DateTimeImmutable())->diff($start)->format('%im %Ss')); $this->_exec("$this->drush_cmd upwd admin password"); $this->say('Database imported, admin user password is : password'); } @@ -613,9 +482,9 @@ public function devImportDb($sql_file) { * Name of sql file to be exported. */ public function devExportDb($name = 'dump') { - $start = new DateTime(); - $this->_exec("$this->drush_cmd sql-dump --gzip --result-file=$name.sql"); - $this->say("Duration: " . date_diff(new DateTime(), $start)->format('%im %Ss')); + $start = new DateTimeImmutable(); + $this->_exec("$this->drush_cmd sql:dump --gzip --result-file=$name.sql"); + $this->say('Duration: ' . (new \DateTimeImmutable())->diff($start)->format('%im %Ss')); $this->say("Database $name.sql.gz exported"); } diff --git a/dsh b/scaffold/required/dsh similarity index 100% rename from dsh rename to scaffold/required/dsh diff --git a/src/Handler.php b/src/Handler.php deleted file mode 100644 index a414294..0000000 --- a/src/Handler.php +++ /dev/null @@ -1,244 +0,0 @@ -composer = $composer; - $this->io = $io; - $this->filesystem = new Filesystem(); - } - - /** - * Post update command event to execute the scaffolding. - * - * @param \Composer\Script\Event $event - */ - public function onPostCmdEvent(\Composer\Script\Event $event) - { - $event->getIO()->write("Updating Shepherd scaffold files."); - $this->updateShepherdScaffoldFiles(); - $event->getIO()->write("Creating necessary directories."); - $this->createDirectories(); - $event->getIO()->write("Creating settings.php file if not present."); - $this->populateSettingsFile(); - $event->getIO()->write("Removing write permissions on settings files."); - $this->removeWritePermissions(); - } - - /** - * Update the Shepherd scaffold files. - */ - public function updateShepherdScaffoldFiles() - { - $packagePath = $this->getPackagePath(); - $projectPath = $this->getProjectPath(); - - // Always copy and replace these files. - $this->copyFiles( - $packagePath, - $projectPath, - [ - 'dsh', - 'RoboFileBase.php', - ], - true - ); - - // Only copy these files if they do not exist at the destination. - $this->copyFiles( - $packagePath, - $projectPath, - [ - 'docker-compose.linux.yml', - 'docker-compose.osx.yml', - 'drush/config-delete.yml', - 'drush/config-ignore.yml', - 'dsh_bash', - 'phpcs.xml', - 'RoboFile.php', - 'docker/Dockerfile', - 'docker/xdebug.ini', - 'docker/php_custom.ini', - ] - ); - } - - /** - * Ensure necessary directories exist. - */ - public function createDirectories() - { - $root = $this->getDrupalRootPath(); - $dirs = [ - $root . '/modules', - $root . '/profiles', - $root . '/themes', - 'config-install', - 'config-export', - ]; - - // Required for unit testing. - foreach ($dirs as $dir) { - if (!$this->filesystem->exists($dir)) { - $this->filesystem->mkdir($dir); - $this->filesystem->touch($dir . '/.gitkeep'); - } - } - } - - /** - * Create settings.php file and inject Shepherd-specific settings. - * - * Note: does nothing if the file already exists. - */ - public function populateSettingsFile() - { - $root = $this->getDrupalRootPath(); - - // Assume Drupal scaffold created the settings.php - $this->filesystem->chmod($root . '/sites/default/settings.php', 0664); - - // If we haven't already written to settings.php. - if (!(strpos(file_get_contents($root . '/sites/default/settings.php'), 'START SHEPHERD CONFIG') !== false)) { - // Append Shepherd-specific environment variable settings to settings.php. - file_put_contents( - $root.'/sites/default/settings.php', - $this->generateSettings(), - FILE_APPEND - ); - } - } - - /** - * Generates the "template" settings.php configuration. - * - * @return string - * PHP code. - * @throws \Exception - */ - public function generateSettings() - { - $settings = file_get_contents(__DIR__ . '/../fixtures/php/settings.php.txt'); - $hashSalt = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))); - return str_replace('<<>>', $hashSalt, $settings); - } - - /** - * Remove all write permissions on Drupal configuration files and folder. - */ - public function removeWritePermissions() - { - $root = $this->getDrupalRootPath(); - $this->filesystem->chmod($root . '/sites/default/settings.php', 0444); - $this->filesystem->chmod($root . '/sites/default', 0555); - } - - /** - * Copy files from origin to destination, optionally overwriting existing. - * - * @param bool $overwriteExisting - * If true, replace existing files. Defaults to false. - */ - public function copyFiles($origin, $destination, $filenames, $overwriteExisting = false) - { - foreach ($filenames as $filename) { - // Skip copying files that already exist at the destination. - if (! $overwriteExisting && $this->filesystem->exists($destination . '/' . $filename)) { - continue; - } - $this->filesystem->copy( - $origin . '/' . $filename, - $destination . '/' . $filename, - true - ); - } - } - - /** - * Get the path to the vendor directory. - * - * E.g. /home/user/code/project/vendor - * - * @return string - */ - public function getVendorPath() - { - // Load ComposerFilesystem to get access to path normalisation. - $composerFilesystem = new ComposerFilesystem(); - - $config = $this->composer->getConfig(); - $composerFilesystem->ensureDirectoryExists($config->get('vendor-dir')); - $vendorPath = $composerFilesystem->normalizePath(realpath($config->get('vendor-dir'))); - - return $vendorPath; - } - - /** - * Get the path to the project directory. - * - * E.g. /home/user/code/project - * - * @return string - */ - public function getProjectPath() - { - $projectPath = dirname($this->getVendorPath()); - return $projectPath; - } - - /** - * Get the path to the package directory. - * - * E.g. /home/user/code/project/vendor/universityofadelaide/shepherd-drupal-scaffold - * - * @return string - */ - public function getPackagePath() - { - $packagePath = $this->getVendorPath() . '/universityofadelaide/shepherd-drupal-scaffold'; - return $packagePath; - } - - /** - * Get the path to the Drupal root directory. - * - * E.g. /home/user/code/project/web - * - * @return string - */ - public function getDrupalRootPath() - { - $drupalRootPath = $this->getProjectPath() . '/web'; - return $drupalRootPath; - } -} diff --git a/src/Plugin.php b/src/Plugin.php deleted file mode 100644 index 7540fd6..0000000 --- a/src/Plugin.php +++ /dev/null @@ -1,68 +0,0 @@ -handler = new Handler($composer, $io); - } - - /** - * {@inheritdoc} - */ - public static function getSubscribedEvents() - { - return array( - // ScriptEvents::POST_INSTALL_CMD => 'postCmd', - ScriptEvents::POST_UPDATE_CMD => 'postCmd', - ); - } - - /** - * Post command event callback. - * - * @param \Composer\Script\Event $event - */ - public function postCmd(\Composer\Script\Event $event) - { - $this->handler->onPostCmdEvent($event); - } - - - /** - * Script callback for putting in composer scripts to download the - * scaffold files. - * - * @param \Composer\Script\Event $event - */ - public static function scaffold(\Composer\Script\Event $event) - { - $handler = new Handler($event->getComposer(), $event->getIO()); - $handler->onPostCmdEvent($event); - } -} diff --git a/src/ScaffoldTrait.php b/src/ScaffoldTrait.php new file mode 100644 index 0000000..84fda90 --- /dev/null +++ b/src/ScaffoldTrait.php @@ -0,0 +1,71 @@ +composer = $composer; + $instance->io = $io; + $instance->filesystem = new Filesystem(); + + return $instance; + } + + /** + * Get the path to the Drupal root directory. + * + * E.g. /home/user/code/project/web + */ + protected function getDrupalRootPath(): string + { + return $this->getProjectPath() . '/web'; + } + + /** + * Get the path to the project directory. + * + * E.g. /home/user/code/project + */ + protected function getProjectPath(): string + { + return dirname($this->getVendorPath()); + } + + /** + * Path to scaffold files. + */ + protected function getScaffoldDirectory(): string + { + return $this->getVendorPath() . '/universityofadelaide/shepherd-drupal-scaffold/scaffold'; + } + + /** + * Get the path to the vendor directory. + * + * E.g. /home/user/code/project/vendor + */ + protected function getVendorPath(): string + { + // Load ComposerFilesystem to get access to path normalisation. + $composerFilesystem = new ComposerFilesystem(); + + $config = $this->composer->getConfig(); + $composerFilesystem->ensureDirectoryExists($config->get('vendor-dir')); + + return $composerFilesystem->normalizePath(realpath($config->get('vendor-dir'))); + } +} diff --git a/src/ShepherdDrupalScaffoldPlugin.php b/src/ShepherdDrupalScaffoldPlugin.php new file mode 100644 index 0000000..0f6626c --- /dev/null +++ b/src/ShepherdDrupalScaffoldPlugin.php @@ -0,0 +1,65 @@ +composer = $composer; + $this->io = $io; + } + + public function deactivate(Composer $composer, IOInterface $io) + { + } + + public function uninstall(Composer $composer, IOInterface $io) + { + } + + public static function getSubscribedEvents() + { + return [ + ScriptEvents::POST_INSTALL_CMD => 'postCmd', + ScriptEvents::POST_UPDATE_CMD => 'postCmd', + ]; + } + + /** + * Post command event callback. + */ + public function postCmd(Event $event) + { + foreach ([ + Directories::class, + DrupalSettings::class, + GitIgnore::class, + ScaffoldFiles::class, + ] as $actionClass) { + $action = $actionClass::create($this->composer, $this->io); + assert($action instanceof ActionInterface); + $action->onEvent($event); + } + } +} diff --git a/src/actions/ActionInterface.php b/src/actions/ActionInterface.php new file mode 100644 index 0000000..31bcda4 --- /dev/null +++ b/src/actions/ActionInterface.php @@ -0,0 +1,19 @@ +getIO()->write('Creating necessary directories.'); + + $root = $this->getDrupalRootPath(); + foreach (static::tasks($this->filesystem, $root) as $task) { + $task->execute(); + } + } + + /** + * @return \UniversityOfAdelaide\ShepherdDrupalScaffold\tasks\CreateDirectory[] + */ + public static function tasks(Filesystem $filesystem, string $root): array + { + return array_map(fn (string $path): CreateDirectory => new CreateDirectory($filesystem, $path), [ + $root . '/modules', + $root . '/profiles', + $root . '/themes', + 'config-install', + 'config-export', + ]); + } +} diff --git a/src/actions/DrupalSettings.php b/src/actions/DrupalSettings.php new file mode 100644 index 0000000..8c382df --- /dev/null +++ b/src/actions/DrupalSettings.php @@ -0,0 +1,54 @@ +getIO()->write('Creating settings.php file if not present.'); + + $drupalRootPath = $this->getDrupalRootPath(); + foreach (static::tasks($this->filesystem, $drupalRootPath) as $task) { + $task->execute(); + } + } + + /** + * @return \UniversityOfAdelaide\ShepherdDrupalScaffold\tasks\AppendFile[] + */ + public static function tasks(Filesystem $filesystem, string $drupalRootPath): array + { + // settings.php comes from drupal/core-composer-scaffold. + $settingsFile = $drupalRootPath . '/sites/default/settings.php'; + + // Exit if a site has a committed settings.php with this text fragment. + if (false !== strpos(file_get_contents($settingsFile), 'START SHEPHERD CONFIG')) { + return []; + } + + $settings = file_get_contents(__DIR__ . '/../../fixtures/php/settings.php.txt'); + $hashSalt = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))); + $data = str_replace('<<>>', $hashSalt, $settings); + + // Append Shepherd-specific environment variable settings to settings.php. + return [new AppendFile($settingsFile, "\n" . $data)]; + } +} diff --git a/src/actions/GitIgnore.php b/src/actions/GitIgnore.php new file mode 100644 index 0000000..ad0c6a6 --- /dev/null +++ b/src/actions/GitIgnore.php @@ -0,0 +1,62 @@ +getIO()->write('Adding scaffold files to .gitignore'); + + $scaffoldPath = $this->getScaffoldDirectory(); + $projectPath = $this->getProjectPath(); + foreach (static::tasks($this->filesystem, $scaffoldPath, $projectPath) as $task) { + $task->execute(); + } + } + + /** + * @return \UniversityOfAdelaide\ShepherdDrupalScaffold\tasks\AppendFile[] + */ + public static function tasks(Filesystem $filesystem, string $scaffoldPath, string $projectPath): array + { + // Only continue if there is a .gitignore file. + $gitIgnorePath = $projectPath . '/.gitignore'; + if (!$filesystem->exists($gitIgnorePath)) { + return []; + } + + $gitIgnore = file_get_contents($gitIgnorePath); + + // Get list of file paths which need to be added to .gitignore. + $fileTasks = ScaffoldFiles::tasks($filesystem, $scaffoldPath, $projectPath); + $paths = array_filter( + array_map(fn (CopyFile $task) => $task->getFilename(), $fileTasks), + fn (string $fileName): bool => false === strpos($gitIgnore, $fileName) + ); + + $data = ''; + foreach ($paths as $path) { + $data .= sprintf("%s\n", $path); + } + + if (!empty($data)) { + return [new AppendFile($gitIgnorePath, "\n" . $data)]; + } + + return []; + } +} diff --git a/src/actions/ScaffoldFiles.php b/src/actions/ScaffoldFiles.php new file mode 100644 index 0000000..feb3055 --- /dev/null +++ b/src/actions/ScaffoldFiles.php @@ -0,0 +1,51 @@ +getIO()->write('Updating Shepherd scaffold files.'); + + $scaffoldPath = $this->getScaffoldDirectory(); + $projectPath = $this->getProjectPath(); + foreach (static::tasks($this->filesystem, $scaffoldPath, $projectPath) as $task) { + $task->execute(); + } + } + + /** + * @return \UniversityOfAdelaide\ShepherdDrupalScaffold\tasks\CopyFile[] + */ + public static function tasks(Filesystem $filesystem, string $scaffoldPath, string $projectPath): array + { + return array_map(fn ($args): CopyFile => new CopyFile($filesystem, $projectPath, ...$args), [ + // Always copy and replace these files. + [$scaffoldPath . '/required', 'dsh', true], + [$scaffoldPath . '/required', 'RoboFileBase.php', true], + + // Only copy these files if they do not exist at the destination. + [$scaffoldPath . '/optional', 'docker-compose.linux.yml'], + [$scaffoldPath . '/optional', 'docker-compose.osx.yml'], + [$scaffoldPath . '/optional', 'dsh_bash'], + [$scaffoldPath . '/optional', 'phpcs.xml'], + [$scaffoldPath . '/optional', 'RoboFile.php'], + [$scaffoldPath . '/optional', 'docker/Dockerfile'], + [$scaffoldPath . '/optional', 'docker/xdebug.ini'], + [$scaffoldPath . '/optional', 'docker/php_custom.ini'], + ]); + } +} diff --git a/src/tasks/AppendFile.php b/src/tasks/AppendFile.php new file mode 100644 index 0000000..8316d0f --- /dev/null +++ b/src/tasks/AppendFile.php @@ -0,0 +1,22 @@ +filePath = $filePath; + $this->data = $data; + } + + public function execute(): void + { + \file_put_contents($this->filePath, $this->data, \FILE_APPEND); + } +} diff --git a/src/tasks/CopyFile.php b/src/tasks/CopyFile.php new file mode 100644 index 0000000..29286f3 --- /dev/null +++ b/src/tasks/CopyFile.php @@ -0,0 +1,55 @@ +filesystem = $filesystem; + $this->destination = $destination; + $this->origin = $origin; + $this->filename = $filename; + $this->overwriteExisting = $overwriteExisting; + } + + public function getOrigin(): string + { + return $this->origin; + } + + public function getFilename(): string + { + return $this->filename; + } + + /** + * @throws \Symfony\Component\Filesystem\Exception\FileNotFoundException + * When original file doesn't exist + * @throws \Symfony\Component\Filesystem\Exception\IOException + * When copy fails + */ + public function execute(): void + { + // Skip copying files that already exist at the destination. + if (!$this->overwriteExisting && $this->filesystem->exists($this->destination . '/' . $this->filename)) { + return; + } + + $this->filesystem->copy( + $this->origin . '/' . $this->filename, + $this->destination . '/' . $this->filename, + $this->overwriteExisting, + ); + } +} diff --git a/src/tasks/CreateDirectory.php b/src/tasks/CreateDirectory.php new file mode 100644 index 0000000..1fe626b --- /dev/null +++ b/src/tasks/CreateDirectory.php @@ -0,0 +1,36 @@ +filesystem = $filesystem; + $this->path = $path; + $this->gitKeep = $gitKeep; + } + + /** + * @throws \Symfony\Component\Filesystem\Exception\IOException + * On any directory creation failure or when touch fails + */ + public function execute(): void + { + if (!$this->filesystem->exists($this->path)) { + $this->filesystem->mkdir($this->path); + } + + if ($this->gitKeep) { + $this->filesystem->touch($this->path . '/.gitkeep'); + } + } +} diff --git a/src/tasks/TaskInterface.php b/src/tasks/TaskInterface.php new file mode 100644 index 0000000..081bd3e --- /dev/null +++ b/src/tasks/TaskInterface.php @@ -0,0 +1,10 @@ +