diff --git a/composer.json b/composer.json
index 9d963d4d..2e21d788 100644
--- a/composer.json
+++ b/composer.json
@@ -18,9 +18,9 @@
"composer/installers": "^2.0",
"drupal/admin_toolbar": "^3.4",
"drupal/coffee": "^1.4",
- "drupal/core-composer-scaffold": "^10.3",
- "drupal/core-project-message": "^10.3",
- "drupal/core-recommended": "^10.3",
+ "drupal/core-composer-scaffold": "10.3.2",
+ "drupal/core-project-message": "10.3.2",
+ "drupal/core-recommended": "10.3.2",
"drupal/gin": "^3.0@RC",
"drupal/gin_login": "^2.1",
"drupal/gin_toolbar": "^1.0@RC",
@@ -29,6 +29,7 @@
"drupal/social_auth_apple": "^1.1",
"drupal/social_auth_facebook": "^3.0",
"drupal/social_auth_google": "^3.0",
+ "drupal/upgrade_status": "^4.3",
"drush/drush": "^12.5"
},
"conflict": {
diff --git a/composer.lock b/composer.lock
index 9c6adbdc..64a92b55 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "9afe8a0e40a1049d1e0f0d5bd0376449",
+ "content-hash": "2ba51f2146f34f63b44011031f5d2719",
"packages": [
{
"name": "asm89/stack-cors",
@@ -270,16 +270,16 @@
},
{
"name": "composer/semver",
- "version": "3.4.0",
+ "version": "3.4.2",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
+ "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6",
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6",
"shasum": ""
},
"require": {
@@ -331,7 +331,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.0"
+ "source": "https://github.com/composer/semver/tree/3.4.2"
},
"funding": [
{
@@ -347,7 +347,7 @@
"type": "tidelift"
}
],
- "time": "2023-08-31T09:50:34+00:00"
+ "time": "2024-07-12T11:35:52+00:00"
},
{
"name": "consolidation/annotated-command",
@@ -865,6 +865,55 @@
},
"time": "2024-04-06T00:00:28+00:00"
},
+ {
+ "name": "dekor/php-array-table",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/deniskoronets/php-array-table.git",
+ "reference": "ca40b21ba84eee6a9658a33fc5f897d76baaf8e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/deniskoronets/php-array-table/zipball/ca40b21ba84eee6a9658a33fc5f897d76baaf8e5",
+ "reference": "ca40b21ba84eee6a9658a33fc5f897d76baaf8e5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "dekor\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Denis Koronets",
+ "email": "deniskoronets@woo.zp.ua",
+ "homepage": "https://woo.zp.ua/"
+ }
+ ],
+ "description": "PHP Library for printing associative arrays as text table (similar to mysql terminal console)",
+ "keywords": [
+ "library",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/deniskoronets/php-array-table/issues",
+ "source": "https://github.com/deniskoronets/php-array-table/tree/2.0"
+ },
+ "time": "2023-02-10T10:13:42+00:00"
+ },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -1143,20 +1192,20 @@
},
{
"name": "drupal/admin_toolbar",
- "version": "3.4.2",
+ "version": "3.5.0",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/admin_toolbar.git",
- "reference": "3.4.2"
+ "reference": "3.5.0"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.4.2.zip",
- "reference": "3.4.2",
- "shasum": "f5a008e5c73f5a11c6c8067c0ea6ebb76aa33854"
+ "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip",
+ "reference": "3.5.0",
+ "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8"
},
"require": {
- "drupal/core": "^9.2 || ^10"
+ "drupal/core": "^9.5 || ^10 || ^11"
},
"require-dev": {
"drupal/admin_toolbar_tools": "*"
@@ -1164,8 +1213,8 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "3.4.2",
- "datestamp": "1696006195",
+ "version": "3.5.0",
+ "datestamp": "1722639094",
"security-coverage": {
"status": "covered",
"message": "Covered by Drupal's security advisory policy"
@@ -1198,6 +1247,10 @@
"homepage": "https://www.drupal.org/u/matio89",
"role": "Maintainer"
},
+ {
+ "name": "japerry",
+ "homepage": "https://www.drupal.org/user/45640"
+ },
{
"name": "matio89",
"homepage": "https://www.drupal.org/user/2320090"
@@ -1294,16 +1347,16 @@
},
{
"name": "drupal/core",
- "version": "10.3.1",
+ "version": "10.3.2",
"source": {
"type": "git",
"url": "https://github.com/drupal/core.git",
- "reference": "d137403a30d4154404e473785f48dfc889d77e23"
+ "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core/zipball/d137403a30d4154404e473785f48dfc889d77e23",
- "reference": "d137403a30d4154404e473785f48dfc889d77e23",
+ "url": "https://api.github.com/repos/drupal/core/zipball/10e79c67a903844bef02a5cf10475d9a8b623e7a",
+ "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a",
"shasum": ""
},
"require": {
@@ -1414,6 +1467,9 @@
}
},
"autoload": {
+ "files": [
+ "includes/bootstrap.inc"
+ ],
"psr-4": {
"Drupal\\Core\\": "lib/Drupal/Core",
"Drupal\\Component\\": "lib/Drupal/Component"
@@ -1441,24 +1497,21 @@
"lib/Drupal/Core/Installer/InstallerRedirectTrait.php",
"lib/Drupal/Core/Site/Settings.php",
"lib/Drupal/Component/Datetime/Time.php"
- ],
- "files": [
- "includes/bootstrap.inc"
- ]
- },
- "scripts": {
- "pre-autoload-dump": [
- "Drupal\\Core\\Composer\\Composer::preAutoloadDump"
]
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
- "description": "Drupal is an open source content management platform powering millions of websites and applications."
+ "description": "Drupal is an open source content management platform powering millions of websites and applications.",
+ "support": {
+ "source": "https://github.com/drupal/core/tree/10.3.2"
+ },
+ "time": "2024-08-08T09:23:57+00:00"
},
{
"name": "drupal/core-composer-scaffold",
- "version": "10.3.1",
+ "version": "10.3.2",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-composer-scaffold.git",
@@ -1492,6 +1545,7 @@
"Drupal\\Composer\\Plugin\\Scaffold\\": ""
}
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
@@ -1499,11 +1553,15 @@
"homepage": "https://www.drupal.org/project/drupal",
"keywords": [
"drupal"
- ]
+ ],
+ "support": {
+ "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.2"
+ },
+ "time": "2024-05-11T08:21:39+00:00"
},
{
"name": "drupal/core-project-message",
- "version": "10.3.1",
+ "version": "10.3.2",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-project-message.git",
@@ -1528,6 +1586,7 @@
"Drupal\\Composer\\Plugin\\ProjectMessage\\": "."
}
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
@@ -1535,20 +1594,24 @@
"homepage": "https://www.drupal.org/project/drupal",
"keywords": [
"drupal"
- ]
+ ],
+ "support": {
+ "source": "https://github.com/drupal/core-project-message/tree/11.0.1"
+ },
+ "time": "2023-07-24T07:55:25+00:00"
},
{
"name": "drupal/core-recommended",
- "version": "10.3.1",
+ "version": "10.3.2",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-recommended.git",
- "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57"
+ "reference": "18b7288d2e661afadfff4a714c5a166bf2554124"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core-recommended/zipball/a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
- "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
+ "url": "https://api.github.com/repos/drupal/core-recommended/zipball/18b7288d2e661afadfff4a714c5a166bf2554124",
+ "reference": "18b7288d2e661afadfff4a714c5a166bf2554124",
"shasum": ""
},
"require": {
@@ -1557,7 +1620,7 @@
"doctrine/annotations": "~1.14.3",
"doctrine/deprecations": "~1.1.3",
"doctrine/lexer": "~2.1.1",
- "drupal/core": "10.3.1",
+ "drupal/core": "10.3.2",
"egulias/email-validator": "~4.0.2",
"guzzlehttp/guzzle": "~7.8.1",
"guzzlehttp/promises": "~2.0.2",
@@ -1612,10 +1675,15 @@
"webflo/drupal-core-strict": "*"
},
"type": "metapackage",
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
- "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core."
+ "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
+ "support": {
+ "source": "https://github.com/drupal/core-recommended/tree/10.3.2"
+ },
+ "time": "2024-08-08T09:23:57+00:00"
},
{
"name": "drupal/gin",
@@ -2179,18 +2247,76 @@
"issues": "https://www.drupal.org/project/issues/social_auth_google"
}
},
+ {
+ "name": "drupal/upgrade_status",
+ "version": "4.3.5",
+ "source": {
+ "type": "git",
+ "url": "https://git.drupalcode.org/project/upgrade_status.git",
+ "reference": "4.3.5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://ftp.drupal.org/files/projects/upgrade_status-4.3.5.zip",
+ "reference": "4.3.5",
+ "shasum": "353c17f14c855f5ba0fe48c6a4f6486360c066a7"
+ },
+ "require": {
+ "dekor/php-array-table": "^2.0",
+ "drupal/core": "^9 || ^10 || ^11",
+ "mglaman/phpstan-drupal": "^1.2.11",
+ "nikic/php-parser": "^4.0.0|^5.0.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "symfony/process": "^3.4|^4.0|^5.0|^6.0|^7.0",
+ "webflo/drupal-finder": "^1.2"
+ },
+ "require-dev": {
+ "drush/drush": "^11|^12|^13"
+ },
+ "type": "drupal-module",
+ "extra": {
+ "drupal": {
+ "version": "4.3.5",
+ "datestamp": "1723044184",
+ "security-coverage": {
+ "status": "covered",
+ "message": "Covered by Drupal's security advisory policy"
+ }
+ },
+ "drush": {
+ "services": {
+ "drush.services.yml": "^9 || ^10"
+ }
+ }
+ },
+ "notification-url": "https://packages.drupal.org/8/downloads",
+ "license": [
+ "GPL-2.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Gábor Hojtsy",
+ "homepage": "https://www.drupal.org/user/4166"
+ }
+ ],
+ "description": "Review Drupal major upgrade readiness of the environment and components of the site.",
+ "homepage": "http://drupal.org/project/upgrade_status",
+ "support": {
+ "source": "https://git.drupalcode.org/project/upgrade_status"
+ }
+ },
{
"name": "drush/drush",
- "version": "12.5.2",
+ "version": "12.5.3",
"source": {
"type": "git",
"url": "https://github.com/drush-ops/drush.git",
- "reference": "4aebed85dc818ff762f2e24a85b023d2a52050df"
+ "reference": "7fe0a492d5126c457c5fb184c4668a132b0aaac6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drush-ops/drush/zipball/4aebed85dc818ff762f2e24a85b023d2a52050df",
- "reference": "4aebed85dc818ff762f2e24a85b023d2a52050df",
+ "url": "https://api.github.com/repos/drush-ops/drush/zipball/7fe0a492d5126c457c5fb184c4668a132b0aaac6",
+ "reference": "7fe0a492d5126c457c5fb184c4668a132b0aaac6",
"shasum": ""
},
"require": {
@@ -2313,7 +2439,7 @@
"issues": "https://github.com/drush-ops/drush/issues",
"security": "https://github.com/drush-ops/drush/security/advisories",
"slack": "https://drupal.slack.com/messages/C62H9CWQM",
- "source": "https://github.com/drush-ops/drush/tree/12.5.2"
+ "source": "https://github.com/drush-ops/drush/tree/12.5.3"
},
"funding": [
{
@@ -2321,7 +2447,7 @@
"type": "github"
}
],
- "time": "2024-05-02T17:20:48+00:00"
+ "time": "2024-08-02T11:57:29+00:00"
},
{
"name": "egulias/email-validator",
@@ -2563,22 +2689,22 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.8.1",
+ "version": "7.8.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
+ "reference": "f4152d9eb85c445fe1f992001d1748e8bec070d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4152d9eb85c445fe1f992001d1748e8bec070d2",
+ "reference": "f4152d9eb85c445fe1f992001d1748e8bec070d2",
"shasum": ""
},
"require": {
"ext-json": "*",
- "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
- "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.6.3",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
@@ -2589,9 +2715,9 @@
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
- "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
@@ -2669,7 +2795,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.8.1"
+ "source": "https://github.com/guzzle/guzzle/tree/7.8.2"
},
"funding": [
{
@@ -2685,20 +2811,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:35:24+00:00"
+ "time": "2024-07-18T11:12:18+00:00"
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.2",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"shasum": ""
},
"require": {
@@ -2706,7 +2832,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"type": "library",
"extra": {
@@ -2752,7 +2878,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.2"
+ "source": "https://github.com/guzzle/promises/tree/2.0.3"
},
"funding": [
{
@@ -2768,20 +2894,20 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:19:20+00:00"
+ "time": "2024-07-18T10:29:17+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "2.6.2",
+ "version": "2.6.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
+ "reference": "6de29867b18790c0d2c846af4c13a24cc3ad56f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/6de29867b18790c0d2c846af4c13a24cc3ad56f3",
+ "reference": "6de29867b18790c0d2c846af4c13a24cc3ad56f3",
"shasum": ""
},
"require": {
@@ -2796,8 +2922,8 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@@ -2868,7 +2994,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.6.2"
+ "source": "https://github.com/guzzle/psr7/tree/2.6.3"
},
"funding": [
{
@@ -2884,7 +3010,7 @@
"type": "tidelift"
}
],
- "time": "2023-12-03T20:05:35+00:00"
+ "time": "2024-07-18T09:59:12+00:00"
},
{
"name": "lcobucci/clock",
@@ -3356,16 +3482,16 @@
},
{
"name": "mck89/peast",
- "version": "v1.16.2",
+ "version": "v1.16.3",
"source": {
"type": "git",
"url": "https://github.com/mck89/peast.git",
- "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe"
+ "reference": "645ec21b650bc2aced18285c85f220d22afc1430"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mck89/peast/zipball/2791b08ffcc1862fe18eef85675da3aa58c406fe",
- "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe",
+ "url": "https://api.github.com/repos/mck89/peast/zipball/645ec21b650bc2aced18285c85f220d22afc1430",
+ "reference": "645ec21b650bc2aced18285c85f220d22afc1430",
"shasum": ""
},
"require": {
@@ -3378,7 +3504,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.16.2-dev"
+ "dev-master": "1.16.3-dev"
}
},
"autoload": {
@@ -3399,9 +3525,113 @@
"description": "Peast is PHP library that generates AST for JavaScript code",
"support": {
"issues": "https://github.com/mck89/peast/issues",
- "source": "https://github.com/mck89/peast/tree/v1.16.2"
+ "source": "https://github.com/mck89/peast/tree/v1.16.3"
},
- "time": "2024-03-05T09:16:03+00:00"
+ "time": "2024-07-23T14:00:32+00:00"
+ },
+ {
+ "name": "mglaman/phpstan-drupal",
+ "version": "1.2.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mglaman/phpstan-drupal.git",
+ "reference": "e624a4b64de5b91a0c56852635af2115e9a6e08c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/e624a4b64de5b91a0c56852635af2115e9a6e08c",
+ "reference": "e624a4b64de5b91a0c56852635af2115e9a6e08c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^1.10.56",
+ "phpstan/phpstan-deprecation-rules": "^1.1.4",
+ "symfony/finder": "^4.2 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/yaml": "^4.2|| ^5.0 || ^6.0 || ^7.0",
+ "webflo/drupal-finder": "^1.2"
+ },
+ "require-dev": {
+ "behat/mink": "^1.8",
+ "composer/installers": "^1.9",
+ "drupal/core-recommended": "^10",
+ "drush/drush": "^10.0 || ^11 || ^12 || ^13@beta",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^8.5 || ^9 || ^10 || ^11",
+ "slevomat/coding-standard": "^7.1",
+ "squizlabs/php_codesniffer": "^3.3",
+ "symfony/phpunit-bridge": "^4.4 || ^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "jangregor/phpstan-prophecy": "Provides a prophecy/prophecy extension for phpstan/phpstan.",
+ "phpstan/phpstan-deprecation-rules": "For catching deprecations, especially in Drupal core.",
+ "phpstan/phpstan-phpunit": "PHPUnit extensions and rules for PHPStan."
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.0-dev"
+ },
+ "installer-paths": {
+ "tests/fixtures/drupal/core": [
+ "type:drupal-core"
+ ],
+ "tests/fixtures/drupal/libraries/{$name}": [
+ "type:drupal-library"
+ ],
+ "tests/fixtures/drupal/modules/contrib/{$name}": [
+ "type:drupal-module"
+ ],
+ "tests/fixtures/drupal/profiles/contrib/{$name}": [
+ "type:drupal-profile"
+ ],
+ "tests/fixtures/drupal/themes/contrib/{$name}": [
+ "type:drupal-theme"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "mglaman\\PHPStanDrupal\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Glaman",
+ "email": "nmd.matt@gmail.com"
+ }
+ ],
+ "description": "Drupal extension and rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/mglaman/phpstan-drupal/issues",
+ "source": "https://github.com/mglaman/phpstan-drupal/tree/1.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/mglaman",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/phpstan-drupal",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/mglaman/phpstan-drupal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-10T17:22:10+00:00"
},
{
"name": "nikic/php-parser",
@@ -3960,6 +4190,111 @@
},
"time": "2021-09-22T16:57:06+00:00"
},
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.11.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "e370bcddadaede0c1716338b262346f40d296f82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82",
+ "reference": "e370bcddadaede0c1716338b262346f40d296f82",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-01T16:25:18+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-deprecation-rules",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
+ "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
+ "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.11"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0"
+ },
+ "time": "2024-04-20T06:39:48+00:00"
+ },
{
"name": "psr/cache",
"version": "3.0.0",
@@ -4561,16 +4896,16 @@
},
{
"name": "symfony/console",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9"
+ "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
- "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
+ "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc",
+ "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc",
"shasum": ""
},
"require": {
@@ -4635,7 +4970,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.9"
+ "source": "https://github.com/symfony/console/tree/v6.4.10"
},
"funding": [
{
@@ -4651,20 +4986,20 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T09:49:33+00:00"
+ "time": "2024-07-26T12:30:32+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e"
+ "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a4df9dfe5da2d177af6643610c7bee2cb76a9f5e",
- "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
+ "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
"shasum": ""
},
"require": {
@@ -4716,7 +5051,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v6.4.9"
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10"
},
"funding": [
{
@@ -4732,7 +5067,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-19T10:45:28+00:00"
+ "time": "2024-07-26T07:32:07+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -4803,16 +5138,16 @@
},
{
"name": "symfony/error-handler",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec"
+ "reference": "231f1b2ee80f72daa1972f7340297d67439224f0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/c9b7cc075b3ab484239855622ca05cb0b99c13ec",
- "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0",
+ "reference": "231f1b2ee80f72daa1972f7340297d67439224f0",
"shasum": ""
},
"require": {
@@ -4858,7 +5193,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.9"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.10"
},
"funding": [
{
@@ -4874,7 +5209,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-21T16:04:15+00:00"
+ "time": "2024-07-26T12:30:32+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -5100,16 +5435,16 @@
},
{
"name": "symfony/finder",
- "version": "v6.4.8",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "3ef977a43883215d560a2cecb82ec8e62131471c"
+ "reference": "af29198d87112bebdd397bd7735fbd115997824c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c",
- "reference": "3ef977a43883215d560a2cecb82ec8e62131471c",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c",
+ "reference": "af29198d87112bebdd397bd7735fbd115997824c",
"shasum": ""
},
"require": {
@@ -5144,7 +5479,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.8"
+ "source": "https://github.com/symfony/finder/tree/v6.4.10"
},
"funding": [
{
@@ -5160,20 +5495,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:49:08+00:00"
+ "time": "2024-07-24T07:06:38+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v6.4.8",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "27de8cc95e11db7a50b027e71caaab9024545947"
+ "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947",
- "reference": "27de8cc95e11db7a50b027e71caaab9024545947",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b",
+ "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b",
"shasum": ""
},
"require": {
@@ -5221,7 +5556,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.4.8"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.10"
},
"funding": [
{
@@ -5237,20 +5572,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:49:08+00:00"
+ "time": "2024-07-26T12:36:27+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005"
+ "reference": "147e0daf618d7575b5007055340d09aece5cf068"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
- "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068",
+ "reference": "147e0daf618d7575b5007055340d09aece5cf068",
"shasum": ""
},
"require": {
@@ -5335,7 +5670,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v6.4.9"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.10"
},
"funding": [
{
@@ -5351,7 +5686,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T11:48:06+00:00"
+ "time": "2024-07-26T14:52:04+00:00"
},
{
"name": "symfony/mailer",
@@ -6369,16 +6704,16 @@
},
{
"name": "symfony/psr-http-message-bridge",
- "version": "v6.4.8",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "23a162bd446b93948a2c2f6909d80ad06195be10"
+ "reference": "89a24648d73e4eee30893b0da16abc454a65c53b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/23a162bd446b93948a2c2f6909d80ad06195be10",
- "reference": "23a162bd446b93948a2c2f6909d80ad06195be10",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/89a24648d73e4eee30893b0da16abc454a65c53b",
+ "reference": "89a24648d73e4eee30893b0da16abc454a65c53b",
"shasum": ""
},
"require": {
@@ -6432,7 +6767,7 @@
"psr-7"
],
"support": {
- "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.8"
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.10"
},
"funding": [
{
@@ -6448,20 +6783,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:51:39+00:00"
+ "time": "2024-07-15T09:36:38+00:00"
},
{
"name": "symfony/routing",
- "version": "v6.4.8",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58"
+ "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
- "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87",
+ "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87",
"shasum": ""
},
"require": {
@@ -6515,7 +6850,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v6.4.8"
+ "source": "https://github.com/symfony/routing/tree/v6.4.10"
},
"funding": [
{
@@ -6531,20 +6866,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:49:08+00:00"
+ "time": "2024-07-15T09:26:24+00:00"
},
{
"name": "symfony/serializer",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
- "reference": "56ce31d19127e79647ac53387c7555bdcd5730ce"
+ "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/serializer/zipball/56ce31d19127e79647ac53387c7555bdcd5730ce",
- "reference": "56ce31d19127e79647ac53387c7555bdcd5730ce",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/9a67fcf320561e96f94d62bbe0e169ac534a5718",
+ "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718",
"shasum": ""
},
"require": {
@@ -6613,7 +6948,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/serializer/tree/v6.4.9"
+ "source": "https://github.com/symfony/serializer/tree/v6.4.10"
},
"funding": [
{
@@ -6629,7 +6964,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T07:59:05+00:00"
+ "time": "2024-07-26T13:13:26+00:00"
},
{
"name": "symfony/service-contracts",
@@ -6716,16 +7051,16 @@
},
{
"name": "symfony/string",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7"
+ "reference": "ccf9b30251719567bfd46494138327522b9a9446"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/76792dbd99690a5ebef8050d9206c60c59e681d7",
- "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7",
+ "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446",
+ "reference": "ccf9b30251719567bfd46494138327522b9a9446",
"shasum": ""
},
"require": {
@@ -6782,7 +7117,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.4.9"
+ "source": "https://github.com/symfony/string/tree/v6.4.10"
},
"funding": [
{
@@ -6798,7 +7133,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T09:25:38+00:00"
+ "time": "2024-07-22T10:21:14+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -6880,16 +7215,16 @@
},
{
"name": "symfony/validator",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "ee0a4d6a327a963aee094f730da238f7ea18cb01"
+ "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/ee0a4d6a327a963aee094f730da238f7ea18cb01",
- "reference": "ee0a4d6a327a963aee094f730da238f7ea18cb01",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
+ "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
"shasum": ""
},
"require": {
@@ -6957,7 +7292,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v6.4.9"
+ "source": "https://github.com/symfony/validator/tree/v6.4.10"
},
"funding": [
{
@@ -6973,20 +7308,20 @@
"type": "tidelift"
}
],
- "time": "2024-06-22T07:42:41+00:00"
+ "time": "2024-07-26T12:30:32+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v6.4.9",
+ "version": "v6.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172"
+ "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
- "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4",
+ "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4",
"shasum": ""
},
"require": {
@@ -7042,7 +7377,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.4.9"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.10"
},
"funding": [
{
@@ -7058,7 +7393,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-27T13:23:14+00:00"
+ "time": "2024-07-26T12:30:32+00:00"
},
{
"name": "symfony/var-exporter",
diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml
index 8100ca5b..c984cc97 100644
--- a/config/sync/core.extension.yml
+++ b/config/sync/core.extension.yml
@@ -48,6 +48,7 @@ module:
text: 0
toolbar: 0
update: 0
+ upgrade_status: 0
user: 0
views_ui: 0
views: 10
diff --git a/config/sync/upgrade_status.settings.yml b/config/sync/upgrade_status.settings.yml
new file mode 100644
index 00000000..c5e87441
--- /dev/null
+++ b/config/sync/upgrade_status.settings.yml
@@ -0,0 +1,3 @@
+_core:
+ default_config_hash: BqkUHiXXGvu2L7NR_nblxtP6f03MdD16XSMWwVM0QEc
+paths_per_scan: 30
diff --git a/vendor/bin/phpstan b/vendor/bin/phpstan
new file mode 100755
index 00000000..d76c0be7
--- /dev/null
+++ b/vendor/bin/phpstan
@@ -0,0 +1,119 @@
+#!/usr/bin/env php
+realpath = realpath($opened_path) ?: $opened_path;
+ $opened_path = $this->realpath;
+ $this->handle = fopen($this->realpath, $mode);
+ $this->position = 0;
+
+ return (bool) $this->handle;
+ }
+
+ public function stream_read($count)
+ {
+ $data = fread($this->handle, $count);
+
+ if ($this->position === 0) {
+ $data = preg_replace('{^#!.*\r?\n}', '', $data);
+ }
+
+ $this->position += strlen($data);
+
+ return $data;
+ }
+
+ public function stream_cast($castAs)
+ {
+ return $this->handle;
+ }
+
+ public function stream_close()
+ {
+ fclose($this->handle);
+ }
+
+ public function stream_lock($operation)
+ {
+ return $operation ? flock($this->handle, $operation) : true;
+ }
+
+ public function stream_seek($offset, $whence)
+ {
+ if (0 === fseek($this->handle, $offset, $whence)) {
+ $this->position = ftell($this->handle);
+ return true;
+ }
+
+ return false;
+ }
+
+ public function stream_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return array();
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+
+ public function url_stat($path, $flags)
+ {
+ $path = substr($path, 17);
+ if (file_exists($path)) {
+ return stat($path);
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
+ return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan');
+ }
+}
+
+return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan';
diff --git a/vendor/bin/phpstan.phar b/vendor/bin/phpstan.phar
new file mode 100755
index 00000000..fecf96f6
--- /dev/null
+++ b/vendor/bin/phpstan.phar
@@ -0,0 +1,119 @@
+#!/usr/bin/env php
+realpath = realpath($opened_path) ?: $opened_path;
+ $opened_path = $this->realpath;
+ $this->handle = fopen($this->realpath, $mode);
+ $this->position = 0;
+
+ return (bool) $this->handle;
+ }
+
+ public function stream_read($count)
+ {
+ $data = fread($this->handle, $count);
+
+ if ($this->position === 0) {
+ $data = preg_replace('{^#!.*\r?\n}', '', $data);
+ }
+
+ $this->position += strlen($data);
+
+ return $data;
+ }
+
+ public function stream_cast($castAs)
+ {
+ return $this->handle;
+ }
+
+ public function stream_close()
+ {
+ fclose($this->handle);
+ }
+
+ public function stream_lock($operation)
+ {
+ return $operation ? flock($this->handle, $operation) : true;
+ }
+
+ public function stream_seek($offset, $whence)
+ {
+ if (0 === fseek($this->handle, $offset, $whence)) {
+ $this->position = ftell($this->handle);
+ return true;
+ }
+
+ return false;
+ }
+
+ public function stream_tell()
+ {
+ return $this->position;
+ }
+
+ public function stream_eof()
+ {
+ return feof($this->handle);
+ }
+
+ public function stream_stat()
+ {
+ return array();
+ }
+
+ public function stream_set_option($option, $arg1, $arg2)
+ {
+ return true;
+ }
+
+ public function url_stat($path, $flags)
+ {
+ $path = substr($path, 17);
+ if (file_exists($path)) {
+ return stat($path);
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if (
+ (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+ || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+ ) {
+ return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar');
+ }
+}
+
+return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar';
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 8014b9d8..21030523 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -26,5 +26,6 @@
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
'2f69d3914119f042cca9e44442d5ce95' => $baseDir . '/web/core/includes/bootstrap.inc',
'23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
+ '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php',
'801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php',
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index fdefb996..35a407cf 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -9,6 +9,8 @@
'phpowermove\\docblock\\' => array($vendorDir . '/phpowermove/docblock/src'),
'phootwork\\lang\\' => array($vendorDir . '/phootwork/lang'),
'phootwork\\collection\\' => array($vendorDir . '/phootwork/collection'),
+ 'mglaman\\PHPStanDrupal\\' => array($vendorDir . '/mglaman/phpstan-drupal/src'),
+ 'dekor\\' => array($vendorDir . '/dekor/php-array-table/src'),
'Twig\\' => array($vendorDir . '/twig/twig/src'),
'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'),
'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
@@ -54,8 +56,9 @@
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
'Peast\\' => array($vendorDir . '/mck89/peast/lib/Peast'),
+ 'PHPStan\\' => array($vendorDir . '/phpstan/phpstan-deprecation-rules/src'),
'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'),
- 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-google/src', $vendorDir . '/patrickbussmann/oauth2-apple/src', $vendorDir . '/league/oauth2-facebook/src'),
+ 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-facebook/src', $vendorDir . '/league/oauth2-google/src', $vendorDir . '/patrickbussmann/oauth2-apple/src'),
'League\\Container\\' => array($vendorDir . '/league/container/src'),
'Lcobucci\\JWT\\' => array($vendorDir . '/lcobucci/jwt/src'),
'Lcobucci\\Clock\\' => array($vendorDir . '/lcobucci/clock/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 3a97a872..2f7ff022 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -27,6 +27,7 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
'2f69d3914119f042cca9e44442d5ce95' => __DIR__ . '/../..' . '/web/core/includes/bootstrap.inc',
'23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
+ '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php',
'801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php',
);
@@ -37,6 +38,14 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
'phootwork\\lang\\' => 15,
'phootwork\\collection\\' => 21,
),
+ 'm' =>
+ array (
+ 'mglaman\\PHPStanDrupal\\' => 22,
+ ),
+ 'd' =>
+ array (
+ 'dekor\\' => 6,
+ ),
'T' =>
array (
'Twig\\' => 5,
@@ -93,6 +102,7 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
'Psr\\Cache\\' => 10,
'PhpParser\\' => 10,
'Peast\\' => 6,
+ 'PHPStan\\' => 8,
),
'M' =>
array (
@@ -166,6 +176,14 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
array (
0 => __DIR__ . '/..' . '/phootwork/collection',
),
+ 'mglaman\\PHPStanDrupal\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/mglaman/phpstan-drupal/src',
+ ),
+ 'dekor\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/dekor/php-array-table/src',
+ ),
'Twig\\' =>
array (
0 => __DIR__ . '/..' . '/twig/twig/src',
@@ -347,6 +365,10 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
array (
0 => __DIR__ . '/..' . '/mck89/peast/lib/Peast',
),
+ 'PHPStan\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpstan/phpstan-deprecation-rules/src',
+ ),
'Masterminds\\' =>
array (
0 => __DIR__ . '/..' . '/masterminds/html5/src',
@@ -354,9 +376,9 @@ class ComposerStaticInit7f462c0e1e81602f821b8b2f59a1a946
'League\\OAuth2\\Client\\' =>
array (
0 => __DIR__ . '/..' . '/league/oauth2-client/src',
- 1 => __DIR__ . '/..' . '/league/oauth2-google/src',
- 2 => __DIR__ . '/..' . '/patrickbussmann/oauth2-apple/src',
- 3 => __DIR__ . '/..' . '/league/oauth2-facebook/src',
+ 1 => __DIR__ . '/..' . '/league/oauth2-facebook/src',
+ 2 => __DIR__ . '/..' . '/league/oauth2-google/src',
+ 3 => __DIR__ . '/..' . '/patrickbussmann/oauth2-apple/src',
),
'League\\Container\\' =>
array (
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index cb485e1e..daeb6c2e 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -273,17 +273,17 @@
},
{
"name": "composer/semver",
- "version": "3.4.0",
- "version_normalized": "3.4.0.0",
+ "version": "3.4.2",
+ "version_normalized": "3.4.2.0",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32"
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32",
- "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32",
+ "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6",
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6",
"shasum": ""
},
"require": {
@@ -293,7 +293,7 @@
"phpstan/phpstan": "^1.4",
"symfony/phpunit-bridge": "^4.2 || ^5"
},
- "time": "2023-08-31T09:50:34+00:00",
+ "time": "2024-07-12T11:35:52+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -337,7 +337,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.0"
+ "source": "https://github.com/composer/semver/tree/3.4.2"
},
"funding": [
{
@@ -898,6 +898,58 @@
},
"install-path": "../consolidation/site-process"
},
+ {
+ "name": "dekor/php-array-table",
+ "version": "2.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/deniskoronets/php-array-table.git",
+ "reference": "ca40b21ba84eee6a9658a33fc5f897d76baaf8e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/deniskoronets/php-array-table/zipball/ca40b21ba84eee6a9658a33fc5f897d76baaf8e5",
+ "reference": "ca40b21ba84eee6a9658a33fc5f897d76baaf8e5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10"
+ },
+ "time": "2023-02-10T10:13:42+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "dekor\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Denis Koronets",
+ "email": "deniskoronets@woo.zp.ua",
+ "homepage": "https://woo.zp.ua/"
+ }
+ ],
+ "description": "PHP Library for printing associative arrays as text table (similar to mysql terminal console)",
+ "keywords": [
+ "library",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/deniskoronets/php-array-table/issues",
+ "source": "https://github.com/deniskoronets/php-array-table/tree/2.0"
+ },
+ "install-path": "../dekor/php-array-table"
+ },
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -1188,21 +1240,21 @@
},
{
"name": "drupal/admin_toolbar",
- "version": "3.4.2",
- "version_normalized": "3.4.2.0",
+ "version": "3.5.0",
+ "version_normalized": "3.5.0.0",
"source": {
"type": "git",
"url": "https://git.drupalcode.org/project/admin_toolbar.git",
- "reference": "3.4.2"
+ "reference": "3.5.0"
},
"dist": {
"type": "zip",
- "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.4.2.zip",
- "reference": "3.4.2",
- "shasum": "f5a008e5c73f5a11c6c8067c0ea6ebb76aa33854"
+ "url": "https://ftp.drupal.org/files/projects/admin_toolbar-3.5.0.zip",
+ "reference": "3.5.0",
+ "shasum": "099e8d4dc98e1d551b4f9cffdc39599eb8ad04e8"
},
"require": {
- "drupal/core": "^9.2 || ^10"
+ "drupal/core": "^9.5 || ^10 || ^11"
},
"require-dev": {
"drupal/admin_toolbar_tools": "*"
@@ -1210,8 +1262,8 @@
"type": "drupal-module",
"extra": {
"drupal": {
- "version": "3.4.2",
- "datestamp": "1696006195",
+ "version": "3.5.0",
+ "datestamp": "1722639094",
"security-coverage": {
"status": "covered",
"message": "Covered by Drupal's security advisory policy"
@@ -1245,6 +1297,10 @@
"homepage": "https://www.drupal.org/u/matio89",
"role": "Maintainer"
},
+ {
+ "name": "japerry",
+ "homepage": "https://www.drupal.org/user/45640"
+ },
{
"name": "matio89",
"homepage": "https://www.drupal.org/user/2320090"
@@ -1345,17 +1401,17 @@
},
{
"name": "drupal/core",
- "version": "10.3.1",
- "version_normalized": "10.3.1.0",
+ "version": "10.3.2",
+ "version_normalized": "10.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/drupal/core.git",
- "reference": "d137403a30d4154404e473785f48dfc889d77e23"
+ "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core/zipball/d137403a30d4154404e473785f48dfc889d77e23",
- "reference": "d137403a30d4154404e473785f48dfc889d77e23",
+ "url": "https://api.github.com/repos/drupal/core/zipball/10e79c67a903844bef02a5cf10475d9a8b623e7a",
+ "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a",
"shasum": ""
},
"require": {
@@ -1435,6 +1491,7 @@
"suggest": {
"ext-zip": "Needed to extend the plugin.manager.archiver service capability with the handling of files in the ZIP format."
},
+ "time": "2024-08-08T09:23:57+00:00",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
@@ -1467,6 +1524,9 @@
},
"installation-source": "dist",
"autoload": {
+ "files": [
+ "includes/bootstrap.inc"
+ ],
"psr-4": {
"Drupal\\Core\\": "lib/Drupal/Core",
"Drupal\\Component\\": "lib/Drupal/Component"
@@ -1494,26 +1554,22 @@
"lib/Drupal/Core/Installer/InstallerRedirectTrait.php",
"lib/Drupal/Core/Site/Settings.php",
"lib/Drupal/Component/Datetime/Time.php"
- ],
- "files": [
- "includes/bootstrap.inc"
- ]
- },
- "scripts": {
- "pre-autoload-dump": [
- "Drupal\\Core\\Composer\\Composer::preAutoloadDump"
]
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
"description": "Drupal is an open source content management platform powering millions of websites and applications.",
+ "support": {
+ "source": "https://github.com/drupal/core/tree/10.3.2"
+ },
"install-path": "../../web/core"
},
{
"name": "drupal/core-composer-scaffold",
- "version": "10.3.1",
- "version_normalized": "10.3.1.0",
+ "version": "10.3.2",
+ "version_normalized": "10.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-composer-scaffold.git",
@@ -1535,6 +1591,7 @@
"require-dev": {
"composer/composer": "^1.8@stable"
},
+ "time": "2024-05-11T08:21:39+00:00",
"type": "composer-plugin",
"extra": {
"class": "Drupal\\Composer\\Plugin\\Scaffold\\Plugin",
@@ -1548,6 +1605,7 @@
"Drupal\\Composer\\Plugin\\Scaffold\\": ""
}
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
@@ -1556,12 +1614,15 @@
"keywords": [
"drupal"
],
+ "support": {
+ "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.2"
+ },
"install-path": "../drupal/core-composer-scaffold"
},
{
"name": "drupal/core-project-message",
- "version": "10.3.1",
- "version_normalized": "10.3.1.0",
+ "version": "10.3.2",
+ "version_normalized": "10.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-project-message.git",
@@ -1577,6 +1638,7 @@
"composer-plugin-api": "^2",
"php": ">=7.3.0"
},
+ "time": "2023-07-24T07:55:25+00:00",
"type": "composer-plugin",
"extra": {
"class": "Drupal\\Composer\\Plugin\\ProjectMessage\\MessagePlugin"
@@ -1587,6 +1649,7 @@
"Drupal\\Composer\\Plugin\\ProjectMessage\\": "."
}
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
@@ -1595,21 +1658,24 @@
"keywords": [
"drupal"
],
+ "support": {
+ "source": "https://github.com/drupal/core-project-message/tree/11.0.1"
+ },
"install-path": "../drupal/core-project-message"
},
{
"name": "drupal/core-recommended",
- "version": "10.3.1",
- "version_normalized": "10.3.1.0",
+ "version": "10.3.2",
+ "version_normalized": "10.3.2.0",
"source": {
"type": "git",
"url": "https://github.com/drupal/core-recommended.git",
- "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57"
+ "reference": "18b7288d2e661afadfff4a714c5a166bf2554124"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drupal/core-recommended/zipball/a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
- "reference": "a5183f2be315b7e5deec89fdeafe9fc9a2e54f57",
+ "url": "https://api.github.com/repos/drupal/core-recommended/zipball/18b7288d2e661afadfff4a714c5a166bf2554124",
+ "reference": "18b7288d2e661afadfff4a714c5a166bf2554124",
"shasum": ""
},
"require": {
@@ -1618,7 +1684,7 @@
"doctrine/annotations": "~1.14.3",
"doctrine/deprecations": "~1.1.3",
"doctrine/lexer": "~2.1.1",
- "drupal/core": "10.3.1",
+ "drupal/core": "10.3.2",
"egulias/email-validator": "~4.0.2",
"guzzlehttp/guzzle": "~7.8.1",
"guzzlehttp/promises": "~2.0.2",
@@ -1672,11 +1738,16 @@
"conflict": {
"webflo/drupal-core-strict": "*"
},
+ "time": "2024-08-08T09:23:57+00:00",
"type": "metapackage",
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
"description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.",
+ "support": {
+ "source": "https://github.com/drupal/core-recommended/tree/10.3.2"
+ },
"install-path": null
},
{
@@ -2268,19 +2339,80 @@
},
"install-path": "../../web/modules/contrib/social_auth_google"
},
+ {
+ "name": "drupal/upgrade_status",
+ "version": "4.3.5",
+ "version_normalized": "4.3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://git.drupalcode.org/project/upgrade_status.git",
+ "reference": "4.3.5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://ftp.drupal.org/files/projects/upgrade_status-4.3.5.zip",
+ "reference": "4.3.5",
+ "shasum": "353c17f14c855f5ba0fe48c6a4f6486360c066a7"
+ },
+ "require": {
+ "dekor/php-array-table": "^2.0",
+ "drupal/core": "^9 || ^10 || ^11",
+ "mglaman/phpstan-drupal": "^1.2.11",
+ "nikic/php-parser": "^4.0.0|^5.0.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "symfony/process": "^3.4|^4.0|^5.0|^6.0|^7.0",
+ "webflo/drupal-finder": "^1.2"
+ },
+ "require-dev": {
+ "drush/drush": "^11|^12|^13"
+ },
+ "type": "drupal-module",
+ "extra": {
+ "drupal": {
+ "version": "4.3.5",
+ "datestamp": "1723044184",
+ "security-coverage": {
+ "status": "covered",
+ "message": "Covered by Drupal's security advisory policy"
+ }
+ },
+ "drush": {
+ "services": {
+ "drush.services.yml": "^9 || ^10"
+ }
+ }
+ },
+ "installation-source": "dist",
+ "notification-url": "https://packages.drupal.org/8/downloads",
+ "license": [
+ "GPL-2.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Gábor Hojtsy",
+ "homepage": "https://www.drupal.org/user/4166"
+ }
+ ],
+ "description": "Review Drupal major upgrade readiness of the environment and components of the site.",
+ "homepage": "http://drupal.org/project/upgrade_status",
+ "support": {
+ "source": "https://git.drupalcode.org/project/upgrade_status"
+ },
+ "install-path": "../../web/modules/contrib/upgrade_status"
+ },
{
"name": "drush/drush",
- "version": "12.5.2",
- "version_normalized": "12.5.2.0",
+ "version": "12.5.3",
+ "version_normalized": "12.5.3.0",
"source": {
"type": "git",
"url": "https://github.com/drush-ops/drush.git",
- "reference": "4aebed85dc818ff762f2e24a85b023d2a52050df"
+ "reference": "7fe0a492d5126c457c5fb184c4668a132b0aaac6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/drush-ops/drush/zipball/4aebed85dc818ff762f2e24a85b023d2a52050df",
- "reference": "4aebed85dc818ff762f2e24a85b023d2a52050df",
+ "url": "https://api.github.com/repos/drush-ops/drush/zipball/7fe0a492d5126c457c5fb184c4668a132b0aaac6",
+ "reference": "7fe0a492d5126c457c5fb184c4668a132b0aaac6",
"shasum": ""
},
"require": {
@@ -2321,7 +2453,7 @@
"rector/rector": "^0.12",
"squizlabs/php_codesniffer": "^3.7"
},
- "time": "2024-05-02T17:20:48+00:00",
+ "time": "2024-08-02T11:57:29+00:00",
"bin": [
"drush"
],
@@ -2405,7 +2537,7 @@
"issues": "https://github.com/drush-ops/drush/issues",
"security": "https://github.com/drush-ops/drush/security/advisories",
"slack": "https://drupal.slack.com/messages/C62H9CWQM",
- "source": "https://github.com/drush-ops/drush/tree/12.5.2"
+ "source": "https://github.com/drush-ops/drush/tree/12.5.3"
},
"funding": [
{
@@ -2667,23 +2799,23 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.8.1",
- "version_normalized": "7.8.1.0",
+ "version": "7.8.2",
+ "version_normalized": "7.8.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
+ "reference": "f4152d9eb85c445fe1f992001d1748e8bec070d2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
- "reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4152d9eb85c445fe1f992001d1748e8bec070d2",
+ "reference": "f4152d9eb85c445fe1f992001d1748e8bec070d2",
"shasum": ""
},
"require": {
"ext-json": "*",
- "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
- "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.6.3",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
@@ -2694,9 +2826,9 @@
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
- "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
@@ -2704,7 +2836,7 @@
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
- "time": "2023-12-03T20:35:24+00:00",
+ "time": "2024-07-18T11:12:18+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
@@ -2776,7 +2908,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.8.1"
+ "source": "https://github.com/guzzle/guzzle/tree/7.8.2"
},
"funding": [
{
@@ -2796,17 +2928,17 @@
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.2",
- "version_normalized": "2.0.2.0",
+ "version": "2.0.3",
+ "version_normalized": "2.0.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
- "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"shasum": ""
},
"require": {
@@ -2814,9 +2946,9 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
- "time": "2023-12-03T20:19:20+00:00",
+ "time": "2024-07-18T10:29:17+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
@@ -2862,7 +2994,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.2"
+ "source": "https://github.com/guzzle/promises/tree/2.0.3"
},
"funding": [
{
@@ -2882,17 +3014,17 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "2.6.2",
- "version_normalized": "2.6.2.0",
+ "version": "2.6.3",
+ "version_normalized": "2.6.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
+ "reference": "6de29867b18790c0d2c846af4c13a24cc3ad56f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
- "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/6de29867b18790c0d2c846af4c13a24cc3ad56f3",
+ "reference": "6de29867b18790c0d2c846af4c13a24cc3ad56f3",
"shasum": ""
},
"require": {
@@ -2907,13 +3039,13 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
- "time": "2023-12-03T20:05:35+00:00",
+ "time": "2024-07-18T09:59:12+00:00",
"type": "library",
"extra": {
"bamarni-bin": {
@@ -2981,7 +3113,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.6.2"
+ "source": "https://github.com/guzzle/psr7/tree/2.6.3"
},
"funding": [
{
@@ -3490,17 +3622,17 @@
},
{
"name": "mck89/peast",
- "version": "v1.16.2",
- "version_normalized": "1.16.2.0",
+ "version": "v1.16.3",
+ "version_normalized": "1.16.3.0",
"source": {
"type": "git",
"url": "https://github.com/mck89/peast.git",
- "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe"
+ "reference": "645ec21b650bc2aced18285c85f220d22afc1430"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mck89/peast/zipball/2791b08ffcc1862fe18eef85675da3aa58c406fe",
- "reference": "2791b08ffcc1862fe18eef85675da3aa58c406fe",
+ "url": "https://api.github.com/repos/mck89/peast/zipball/645ec21b650bc2aced18285c85f220d22afc1430",
+ "reference": "645ec21b650bc2aced18285c85f220d22afc1430",
"shasum": ""
},
"require": {
@@ -3510,11 +3642,11 @@
"require-dev": {
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
- "time": "2024-03-05T09:16:03+00:00",
+ "time": "2024-07-23T14:00:32+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.16.2-dev"
+ "dev-master": "1.16.3-dev"
}
},
"installation-source": "dist",
@@ -3536,10 +3668,117 @@
"description": "Peast is PHP library that generates AST for JavaScript code",
"support": {
"issues": "https://github.com/mck89/peast/issues",
- "source": "https://github.com/mck89/peast/tree/v1.16.2"
+ "source": "https://github.com/mck89/peast/tree/v1.16.3"
},
"install-path": "../mck89/peast"
},
+ {
+ "name": "mglaman/phpstan-drupal",
+ "version": "1.2.11",
+ "version_normalized": "1.2.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mglaman/phpstan-drupal.git",
+ "reference": "e624a4b64de5b91a0c56852635af2115e9a6e08c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/e624a4b64de5b91a0c56852635af2115e9a6e08c",
+ "reference": "e624a4b64de5b91a0c56852635af2115e9a6e08c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^1.10.56",
+ "phpstan/phpstan-deprecation-rules": "^1.1.4",
+ "symfony/finder": "^4.2 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/yaml": "^4.2|| ^5.0 || ^6.0 || ^7.0",
+ "webflo/drupal-finder": "^1.2"
+ },
+ "require-dev": {
+ "behat/mink": "^1.8",
+ "composer/installers": "^1.9",
+ "drupal/core-recommended": "^10",
+ "drush/drush": "^10.0 || ^11 || ^12 || ^13@beta",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^8.5 || ^9 || ^10 || ^11",
+ "slevomat/coding-standard": "^7.1",
+ "squizlabs/php_codesniffer": "^3.3",
+ "symfony/phpunit-bridge": "^4.4 || ^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "jangregor/phpstan-prophecy": "Provides a prophecy/prophecy extension for phpstan/phpstan.",
+ "phpstan/phpstan-deprecation-rules": "For catching deprecations, especially in Drupal core.",
+ "phpstan/phpstan-phpunit": "PHPUnit extensions and rules for PHPStan."
+ },
+ "time": "2024-05-10T17:22:10+00:00",
+ "type": "phpstan-extension",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.0-dev"
+ },
+ "installer-paths": {
+ "tests/fixtures/drupal/core": [
+ "type:drupal-core"
+ ],
+ "tests/fixtures/drupal/libraries/{$name}": [
+ "type:drupal-library"
+ ],
+ "tests/fixtures/drupal/modules/contrib/{$name}": [
+ "type:drupal-module"
+ ],
+ "tests/fixtures/drupal/profiles/contrib/{$name}": [
+ "type:drupal-profile"
+ ],
+ "tests/fixtures/drupal/themes/contrib/{$name}": [
+ "type:drupal-theme"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "mglaman\\PHPStanDrupal\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Glaman",
+ "email": "nmd.matt@gmail.com"
+ }
+ ],
+ "description": "Drupal extension and rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/mglaman/phpstan-drupal/issues",
+ "source": "https://github.com/mglaman/phpstan-drupal/tree/1.2.11"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/mglaman",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/phpstan-drupal",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/mglaman/phpstan-drupal",
+ "type": "tidelift"
+ }
+ ],
+ "install-path": "../mglaman/phpstan-drupal"
+ },
{
"name": "nikic/php-parser",
"version": "v5.1.0",
@@ -4127,6 +4366,117 @@
},
"install-path": "../phpowermove/docblock"
},
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.11.9",
+ "version_normalized": "1.11.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "e370bcddadaede0c1716338b262346f40d296f82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82",
+ "reference": "e370bcddadaede0c1716338b262346f40d296f82",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "time": "2024-08-01T16:25:18+00:00",
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "install-path": "../phpstan/phpstan"
+ },
+ {
+ "name": "phpstan/phpstan-deprecation-rules",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
+ "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
+ "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.11"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "time": "2024-04-20T06:39:48+00:00",
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0"
+ },
+ "install-path": "../phpstan/phpstan-deprecation-rules"
+ },
{
"name": "psr/cache",
"version": "3.0.0",
@@ -4761,17 +5111,17 @@
},
{
"name": "symfony/console",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9"
+ "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
- "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
+ "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc",
+ "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc",
"shasum": ""
},
"require": {
@@ -4804,7 +5154,7 @@
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-28T09:49:33+00:00",
+ "time": "2024-07-26T12:30:32+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4838,7 +5188,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.9"
+ "source": "https://github.com/symfony/console/tree/v6.4.10"
},
"funding": [
{
@@ -4858,17 +5208,17 @@
},
{
"name": "symfony/dependency-injection",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e"
+ "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a4df9dfe5da2d177af6643610c7bee2cb76a9f5e",
- "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
+ "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb",
"shasum": ""
},
"require": {
@@ -4894,7 +5244,7 @@
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-19T10:45:28+00:00",
+ "time": "2024-07-26T07:32:07+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -4922,7 +5272,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v6.4.9"
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10"
},
"funding": [
{
@@ -5012,17 +5362,17 @@
},
{
"name": "symfony/error-handler",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec"
+ "reference": "231f1b2ee80f72daa1972f7340297d67439224f0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/c9b7cc075b3ab484239855622ca05cb0b99c13ec",
- "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0",
+ "reference": "231f1b2ee80f72daa1972f7340297d67439224f0",
"shasum": ""
},
"require": {
@@ -5039,7 +5389,7 @@
"symfony/http-kernel": "^6.4|^7.0",
"symfony/serializer": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-21T16:04:15+00:00",
+ "time": "2024-07-26T12:30:32+00:00",
"bin": [
"Resources/bin/patch-type-declarations"
],
@@ -5070,7 +5420,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.9"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.10"
},
"funding": [
{
@@ -5321,17 +5671,17 @@
},
{
"name": "symfony/finder",
- "version": "v6.4.8",
- "version_normalized": "6.4.8.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "3ef977a43883215d560a2cecb82ec8e62131471c"
+ "reference": "af29198d87112bebdd397bd7735fbd115997824c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c",
- "reference": "3ef977a43883215d560a2cecb82ec8e62131471c",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c",
+ "reference": "af29198d87112bebdd397bd7735fbd115997824c",
"shasum": ""
},
"require": {
@@ -5340,7 +5690,7 @@
"require-dev": {
"symfony/filesystem": "^6.0|^7.0"
},
- "time": "2024-05-31T14:49:08+00:00",
+ "time": "2024-07-24T07:06:38+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -5368,7 +5718,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.8"
+ "source": "https://github.com/symfony/finder/tree/v6.4.10"
},
"funding": [
{
@@ -5388,17 +5738,17 @@
},
{
"name": "symfony/http-foundation",
- "version": "v6.4.8",
- "version_normalized": "6.4.8.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "27de8cc95e11db7a50b027e71caaab9024545947"
+ "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947",
- "reference": "27de8cc95e11db7a50b027e71caaab9024545947",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b",
+ "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b",
"shasum": ""
},
"require": {
@@ -5420,7 +5770,7 @@
"symfony/mime": "^5.4|^6.0|^7.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0"
},
- "time": "2024-05-31T14:49:08+00:00",
+ "time": "2024-07-26T12:36:27+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -5448,7 +5798,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.4.8"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.10"
},
"funding": [
{
@@ -5468,17 +5818,17 @@
},
{
"name": "symfony/http-kernel",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005"
+ "reference": "147e0daf618d7575b5007055340d09aece5cf068"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
- "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068",
+ "reference": "147e0daf618d7575b5007055340d09aece5cf068",
"shasum": ""
},
"require": {
@@ -5537,7 +5887,7 @@
"symfony/var-exporter": "^6.2|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
- "time": "2024-06-28T11:48:06+00:00",
+ "time": "2024-07-26T14:52:04+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -5565,7 +5915,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v6.4.9"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.10"
},
"funding": [
{
@@ -6638,17 +6988,17 @@
},
{
"name": "symfony/psr-http-message-bridge",
- "version": "v6.4.8",
- "version_normalized": "6.4.8.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "23a162bd446b93948a2c2f6909d80ad06195be10"
+ "reference": "89a24648d73e4eee30893b0da16abc454a65c53b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/23a162bd446b93948a2c2f6909d80ad06195be10",
- "reference": "23a162bd446b93948a2c2f6909d80ad06195be10",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/89a24648d73e4eee30893b0da16abc454a65c53b",
+ "reference": "89a24648d73e4eee30893b0da16abc454a65c53b",
"shasum": ""
},
"require": {
@@ -6670,7 +7020,7 @@
"symfony/framework-bundle": "^6.2|^7.0",
"symfony/http-kernel": "^6.2|^7.0"
},
- "time": "2024-05-31T14:51:39+00:00",
+ "time": "2024-07-15T09:36:38+00:00",
"type": "symfony-bridge",
"installation-source": "dist",
"autoload": {
@@ -6704,7 +7054,7 @@
"psr-7"
],
"support": {
- "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.8"
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.10"
},
"funding": [
{
@@ -6724,17 +7074,17 @@
},
{
"name": "symfony/routing",
- "version": "v6.4.8",
- "version_normalized": "6.4.8.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58"
+ "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
- "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87",
+ "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87",
"shasum": ""
},
"require": {
@@ -6756,7 +7106,7 @@
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
- "time": "2024-05-31T14:49:08+00:00",
+ "time": "2024-07-15T09:26:24+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -6790,7 +7140,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v6.4.8"
+ "source": "https://github.com/symfony/routing/tree/v6.4.10"
},
"funding": [
{
@@ -6810,17 +7160,17 @@
},
{
"name": "symfony/serializer",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
- "reference": "56ce31d19127e79647ac53387c7555bdcd5730ce"
+ "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/serializer/zipball/56ce31d19127e79647ac53387c7555bdcd5730ce",
- "reference": "56ce31d19127e79647ac53387c7555bdcd5730ce",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/9a67fcf320561e96f94d62bbe0e169ac534a5718",
+ "reference": "9a67fcf320561e96f94d62bbe0e169ac534a5718",
"shasum": ""
},
"require": {
@@ -6863,7 +7213,7 @@
"symfony/var-exporter": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-28T07:59:05+00:00",
+ "time": "2024-07-26T13:13:26+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -6891,7 +7241,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/serializer/tree/v6.4.9"
+ "source": "https://github.com/symfony/serializer/tree/v6.4.10"
},
"funding": [
{
@@ -6997,17 +7347,17 @@
},
{
"name": "symfony/string",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7"
+ "reference": "ccf9b30251719567bfd46494138327522b9a9446"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/76792dbd99690a5ebef8050d9206c60c59e681d7",
- "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7",
+ "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446",
+ "reference": "ccf9b30251719567bfd46494138327522b9a9446",
"shasum": ""
},
"require": {
@@ -7027,7 +7377,7 @@
"symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-28T09:25:38+00:00",
+ "time": "2024-07-22T10:21:14+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -7066,7 +7416,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.4.9"
+ "source": "https://github.com/symfony/string/tree/v6.4.10"
},
"funding": [
{
@@ -7167,17 +7517,17 @@
},
{
"name": "symfony/validator",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "ee0a4d6a327a963aee094f730da238f7ea18cb01"
+ "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/ee0a4d6a327a963aee094f730da238f7ea18cb01",
- "reference": "ee0a4d6a327a963aee094f730da238f7ea18cb01",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
+ "reference": "bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd",
"shasum": ""
},
"require": {
@@ -7218,7 +7568,7 @@
"symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
- "time": "2024-06-22T07:42:41+00:00",
+ "time": "2024-07-26T12:30:32+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -7247,7 +7597,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v6.4.9"
+ "source": "https://github.com/symfony/validator/tree/v6.4.10"
},
"funding": [
{
@@ -7267,17 +7617,17 @@
},
{
"name": "symfony/var-dumper",
- "version": "v6.4.9",
- "version_normalized": "6.4.9.0",
+ "version": "v6.4.10",
+ "version_normalized": "6.4.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172"
+ "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
- "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4",
+ "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4",
"shasum": ""
},
"require": {
@@ -7297,7 +7647,7 @@
"symfony/uid": "^5.4|^6.0|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
- "time": "2024-06-27T13:23:14+00:00",
+ "time": "2024-07-26T12:30:32+00:00",
"bin": [
"Resources/bin/var-dump-server"
],
@@ -7335,7 +7685,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.4.9"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.10"
},
"funding": [
{
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index b00912a9..a539093b 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -38,9 +38,9 @@
'dev_requirement' => false,
),
'composer/semver' => array(
- 'pretty_version' => '3.4.0',
- 'version' => '3.4.0.0',
- 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32',
+ 'pretty_version' => '3.4.2',
+ 'version' => '3.4.2.0',
+ 'reference' => 'c51258e759afdb17f1fd1fe83bc12baaef6309d6',
'type' => 'library',
'install_path' => __DIR__ . '/./semver',
'aliases' => array(),
@@ -127,6 +127,15 @@
'aliases' => array(),
'dev_requirement' => false,
),
+ 'dekor/php-array-table' => array(
+ 'pretty_version' => '2.0',
+ 'version' => '2.0.0.0',
+ 'reference' => 'ca40b21ba84eee6a9658a33fc5f897d76baaf8e5',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../dekor/php-array-table',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'dflydev/dot-access-data' => array(
'pretty_version' => 'v3.0.3',
'version' => '3.0.3.0',
@@ -164,9 +173,9 @@
'dev_requirement' => false,
),
'drupal/admin_toolbar' => array(
- 'pretty_version' => '3.4.2',
- 'version' => '3.4.2.0',
- 'reference' => '3.4.2',
+ 'pretty_version' => '3.5.0',
+ 'version' => '3.5.0.0',
+ 'reference' => '3.5.0',
'type' => 'drupal-module',
'install_path' => __DIR__ . '/../../web/modules/contrib/admin_toolbar',
'aliases' => array(),
@@ -182,9 +191,9 @@
'dev_requirement' => false,
),
'drupal/core' => array(
- 'pretty_version' => '10.3.1',
- 'version' => '10.3.1.0',
- 'reference' => 'd137403a30d4154404e473785f48dfc889d77e23',
+ 'pretty_version' => '10.3.2',
+ 'version' => '10.3.2.0',
+ 'reference' => '10e79c67a903844bef02a5cf10475d9a8b623e7a',
'type' => 'drupal-core',
'install_path' => __DIR__ . '/../../web/core',
'aliases' => array(),
@@ -193,24 +202,24 @@
'drupal/core-annotation' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-assertion' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-class-finder' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-composer-scaffold' => array(
- 'pretty_version' => '10.3.1',
- 'version' => '10.3.1.0',
+ 'pretty_version' => '10.3.2',
+ 'version' => '10.3.2.0',
'reference' => 'a1a186caeb89899143e0c6912ccee9d3d7181dbe',
'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../drupal/core-composer-scaffold',
@@ -220,90 +229,90 @@
'drupal/core-datetime' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-dependency-injection' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-diff' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-discovery' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-event-dispatcher' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-file-cache' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-file-security' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-filesystem' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-front-matter' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-gettext' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-graph' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-http-foundation' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-php-storage' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-plugin' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-project-message' => array(
- 'pretty_version' => '10.3.1',
- 'version' => '10.3.1.0',
+ 'pretty_version' => '10.3.2',
+ 'version' => '10.3.2.0',
'reference' => 'd1da83722735cb0f7ccabf9fef7b5607b442c3a8',
'type' => 'composer-plugin',
'install_path' => __DIR__ . '/../drupal/core-project-message',
@@ -313,13 +322,13 @@
'drupal/core-proxy-builder' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-recommended' => array(
- 'pretty_version' => '10.3.1',
- 'version' => '10.3.1.0',
- 'reference' => 'a5183f2be315b7e5deec89fdeafe9fc9a2e54f57',
+ 'pretty_version' => '10.3.2',
+ 'version' => '10.3.2.0',
+ 'reference' => '18b7288d2e661afadfff4a714c5a166bf2554124',
'type' => 'metapackage',
'install_path' => null,
'aliases' => array(),
@@ -328,37 +337,37 @@
'drupal/core-render' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-serialization' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-transliteration' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-utility' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-uuid' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/core-version' => array(
'dev_requirement' => false,
'replaced' => array(
- 0 => '10.3.1',
+ 0 => '10.3.2',
),
),
'drupal/gin' => array(
@@ -451,10 +460,19 @@
'aliases' => array(),
'dev_requirement' => false,
),
+ 'drupal/upgrade_status' => array(
+ 'pretty_version' => '4.3.5',
+ 'version' => '4.3.5.0',
+ 'reference' => '4.3.5',
+ 'type' => 'drupal-module',
+ 'install_path' => __DIR__ . '/../../web/modules/contrib/upgrade_status',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'drush/drush' => array(
- 'pretty_version' => '12.5.2',
- 'version' => '12.5.2.0',
- 'reference' => '4aebed85dc818ff762f2e24a85b023d2a52050df',
+ 'pretty_version' => '12.5.3',
+ 'version' => '12.5.3.0',
+ 'reference' => '7fe0a492d5126c457c5fb184c4668a132b0aaac6',
'type' => 'library',
'install_path' => __DIR__ . '/../drush/drush',
'aliases' => array(),
@@ -497,27 +515,27 @@
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
- 'pretty_version' => '7.8.1',
- 'version' => '7.8.1.0',
- 'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104',
+ 'pretty_version' => '7.8.2',
+ 'version' => '7.8.2.0',
+ 'reference' => 'f4152d9eb85c445fe1f992001d1748e8bec070d2',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
- 'pretty_version' => '2.0.2',
- 'version' => '2.0.2.0',
- 'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223',
+ 'pretty_version' => '2.0.3',
+ 'version' => '2.0.3.0',
+ 'reference' => '6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
'dev_requirement' => false,
),
'guzzlehttp/psr7' => array(
- 'pretty_version' => '2.6.2',
- 'version' => '2.6.2.0',
- 'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221',
+ 'pretty_version' => '2.6.3',
+ 'version' => '2.6.3.0',
+ 'reference' => '6de29867b18790c0d2c846af4c13a24cc3ad56f3',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(),
@@ -587,14 +605,23 @@
'dev_requirement' => false,
),
'mck89/peast' => array(
- 'pretty_version' => 'v1.16.2',
- 'version' => '1.16.2.0',
- 'reference' => '2791b08ffcc1862fe18eef85675da3aa58c406fe',
+ 'pretty_version' => 'v1.16.3',
+ 'version' => '1.16.3.0',
+ 'reference' => '645ec21b650bc2aced18285c85f220d22afc1430',
'type' => 'library',
'install_path' => __DIR__ . '/../mck89/peast',
'aliases' => array(),
'dev_requirement' => false,
),
+ 'mglaman/phpstan-drupal' => array(
+ 'pretty_version' => '1.2.11',
+ 'version' => '1.2.11.0',
+ 'reference' => 'e624a4b64de5b91a0c56852635af2115e9a6e08c',
+ 'type' => 'phpstan-extension',
+ 'install_path' => __DIR__ . '/../mglaman/phpstan-drupal',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'nikic/php-parser' => array(
'pretty_version' => 'v5.1.0',
'version' => '5.1.0.0',
@@ -691,6 +718,24 @@
'aliases' => array(),
'dev_requirement' => false,
),
+ 'phpstan/phpstan' => array(
+ 'pretty_version' => '1.11.9',
+ 'version' => '1.11.9.0',
+ 'reference' => 'e370bcddadaede0c1716338b262346f40d296f82',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../phpstan/phpstan',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
+ 'phpstan/phpstan-deprecation-rules' => array(
+ 'pretty_version' => '1.2.0',
+ 'version' => '1.2.0.0',
+ 'reference' => 'fa8cce7720fa782899a0aa97b6a41225d1bb7b26',
+ 'type' => 'phpstan-extension',
+ 'install_path' => __DIR__ . '/../phpstan/phpstan-deprecation-rules',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
'psr/cache' => array(
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
@@ -840,18 +885,18 @@
'dev_requirement' => false,
),
'symfony/console' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => '6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '504974cbe43d05f83b201d6498c206f16fc0cdbc',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/console',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/dependency-injection' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => 'a4df9dfe5da2d177af6643610c7bee2cb76a9f5e',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '5caf9c5f6085f13b27d70a236b776c07e4a1c3eb',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/dependency-injection',
'aliases' => array(),
@@ -867,9 +912,9 @@
'dev_requirement' => false,
),
'symfony/error-handler' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => 'c9b7cc075b3ab484239855622ca05cb0b99c13ec',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '231f1b2ee80f72daa1972f7340297d67439224f0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/error-handler',
'aliases' => array(),
@@ -909,27 +954,27 @@
'dev_requirement' => false,
),
'symfony/finder' => array(
- 'pretty_version' => 'v6.4.8',
- 'version' => '6.4.8.0',
- 'reference' => '3ef977a43883215d560a2cecb82ec8e62131471c',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => 'af29198d87112bebdd397bd7735fbd115997824c',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/finder',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/http-foundation' => array(
- 'pretty_version' => 'v6.4.8',
- 'version' => '6.4.8.0',
- 'reference' => '27de8cc95e11db7a50b027e71caaab9024545947',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '117f1f20a7ade7bcea28b861fb79160a21a1e37b',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-foundation',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/http-kernel' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => 'cc4a9bec6e1bdd2405f40277a68a6ed1bb393005',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '147e0daf618d7575b5007055340d09aece5cf068',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/http-kernel',
'aliases' => array(),
@@ -1053,27 +1098,27 @@
'dev_requirement' => false,
),
'symfony/psr-http-message-bridge' => array(
- 'pretty_version' => 'v6.4.8',
- 'version' => '6.4.8.0',
- 'reference' => '23a162bd446b93948a2c2f6909d80ad06195be10',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '89a24648d73e4eee30893b0da16abc454a65c53b',
'type' => 'symfony-bridge',
'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/routing' => array(
- 'pretty_version' => 'v6.4.8',
- 'version' => '6.4.8.0',
- 'reference' => '8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => 'aad19fe10753ba842f0d653a8db819c4b3affa87',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/routing',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/serializer' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => '56ce31d19127e79647ac53387c7555bdcd5730ce',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => '9a67fcf320561e96f94d62bbe0e169ac534a5718',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/serializer',
'aliases' => array(),
@@ -1095,9 +1140,9 @@
),
),
'symfony/string' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => '76792dbd99690a5ebef8050d9206c60c59e681d7',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => 'ccf9b30251719567bfd46494138327522b9a9446',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/string',
'aliases' => array(),
@@ -1113,18 +1158,18 @@
'dev_requirement' => false,
),
'symfony/validator' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => 'ee0a4d6a327a963aee094f730da238f7ea18cb01',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => 'bcf939a9d1acd7d2912e9474c0c3d7840a03cbcd',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/validator',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/var-dumper' => array(
- 'pretty_version' => 'v6.4.9',
- 'version' => '6.4.9.0',
- 'reference' => 'c31566e4ca944271cc8d8ac6887cbf31b8c6a172',
+ 'pretty_version' => 'v6.4.10',
+ 'version' => '6.4.10.0',
+ 'reference' => 'a71cc3374f5fb9759da1961d28c452373b343dd4',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-dumper',
'aliases' => array(),
diff --git a/vendor/composer/semver/CHANGELOG.md b/vendor/composer/semver/CHANGELOG.md
index 3b111612..7e441914 100644
--- a/vendor/composer/semver/CHANGELOG.md
+++ b/vendor/composer/semver/CHANGELOG.md
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
+### [3.4.2] 2024-07-12
+
+ * Fixed PHP 5.3 syntax error
+
+### [3.4.1] 2024-07-12
+
+ * Fixed normalizeStability's return type to enforce valid stabilities
+
### [3.4.0] 2023-08-31
* Support larger major version numbers (#149)
@@ -179,6 +187,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint`
* Changed: code style using php-cs-fixer.
+[3.4.2]: https://github.com/composer/semver/compare/3.4.1...3.4.2
+[3.4.1]: https://github.com/composer/semver/compare/3.4.0...3.4.1
[3.4.0]: https://github.com/composer/semver/compare/3.3.2...3.4.0
[3.3.2]: https://github.com/composer/semver/compare/3.3.1...3.3.2
[3.3.1]: https://github.com/composer/semver/compare/3.3.0...3.3.1
diff --git a/vendor/composer/semver/phpstan-baseline.neon b/vendor/composer/semver/phpstan-baseline.neon
deleted file mode 100644
index 933cf203..00000000
--- a/vendor/composer/semver/phpstan-baseline.neon
+++ /dev/null
@@ -1,11 +0,0 @@
-parameters:
- ignoreErrors:
- -
- message: "#^Parameter \\#1 \\$operator of class Composer\\\\Semver\\\\Constraint\\\\Constraint constructor expects '\\!\\='\\|'\\<'\\|'\\<\\='\\|'\\<\\>'\\|'\\='\\|'\\=\\='\\|'\\>'\\|'\\>\\=', non\\-falsy\\-string given\\.$#"
- count: 1
- path: src/VersionParser.php
-
- -
- message: "#^Strict comparison using \\=\\=\\= between null and non\\-empty\\-string will always evaluate to false\\.$#"
- count: 2
- path: src/VersionParser.php
diff --git a/vendor/composer/semver/src/VersionParser.php b/vendor/composer/semver/src/VersionParser.php
index 9318629a..305a0fae 100644
--- a/vendor/composer/semver/src/VersionParser.php
+++ b/vendor/composer/semver/src/VersionParser.php
@@ -82,11 +82,16 @@ public static function parseStability($version)
* @param string $stability
*
* @return string
+ * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev'
*/
public static function normalizeStability($stability)
{
$stability = strtolower((string) $stability);
+ if (!in_array($stability, array('stable', 'rc', 'beta', 'alpha', 'dev'), true)) {
+ throw new \InvalidArgumentException('Invalid stability string "'.$stability.'", expected one of stable, RC, beta, alpha or dev');
+ }
+
return $stability === 'rc' ? 'RC' : $stability;
}
diff --git a/vendor/dekor/php-array-table/.gitignore b/vendor/dekor/php-array-table/.gitignore
new file mode 100644
index 00000000..bc5cee98
--- /dev/null
+++ b/vendor/dekor/php-array-table/.gitignore
@@ -0,0 +1,5 @@
+phpunit.phar
+phpunit
+.phpunit.result.cache
+.idea
+vendor
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/README.md b/vendor/dekor/php-array-table/README.md
new file mode 100644
index 00000000..7172fbc1
--- /dev/null
+++ b/vendor/dekor/php-array-table/README.md
@@ -0,0 +1,153 @@
+# PHP Array To Text Table
+PHP-class, which allows to transform php associative arrays to cool ASCII tables.
+
+![Blue](https://placehold.co/15x15/005BBB/005BBB.png)![Yellow](https://placehold.co/15x15/FFD500/FFD500.png) [Ukraine ❤](https://woo.zp.ua/en/support-ukraine/)
+
+## Installation
+Simply run composer require:
+
composer require dekor/php-array-table
+
+or add to composer.json:
+"dekor/php-array-table": "^2.0"
+
+## Usage
+<?php
+use dekor\ArrayToTextTable;
+
+$data = [
+ [
+ 'id' => 1,
+ 'name' => 'Denis Koronets',
+ 'role' => 'php developer',
+ ],
+ [
+ 'id' => 2,
+ 'name' => 'Maxim Ambroskin',
+ 'role' => 'java developer',
+ ],
+ [
+ 'id' => 3,
+ 'name' => 'Andrew Sikorsky',
+ 'role' => 'php developer',
+ ]
+];
+
+echo (new ArrayToTextTable($data))->render();
+
+
+Will draw the next output:
+
+
++----+-----------------+----------------+
+| id | name | role |
++----+-----------------+----------------+
+| 1 | Denis Koronets | php developer |
+| 2 | Maxim Ambroskin | java developer |
+| 3 | Andrew Sikorsky | php developer |
++----+-----------------+----------------+
+
+
+## Formatters (since v2)
+New feature introduces way to pre and postprocess column data by applying some filters.
+You're able to develop your own formatters simply extending `BaseColumnFormatter` and implementing abstract methods.
+List of formatters out of the box:
+- `AlignFormatter` - allows to set text align for inner column (useful for numbers):
+
+<?php
+use dekor\ArrayToTextTable;
+use dekor\formatters\AlignFormatter;
+
+$data = [
+ [
+ 'left' => 2,
+ 'center' => 'Dummy one',
+ 'right' => 14.33,
+ ],
+ [
+ 'left' => 3,
+ 'center' => 'Another great day for a great inventers!',
+ 'right' => 1,
+ ],
+];
+
+$builder = new ArrayToTextTable($data);
+$builder->applyFormatter(new AlignFormatter(['center' => 'center', 'right' => 'right']));
+
+echo $builder->render();
+
+
+outputs:
+
++------+------------------------------------------+-------+
+| left | center | right |
++------+------------------------------------------+-------+
+| 2 | Dummy one | 14.33 |
+| 3 | Another great day for a great inventers! | 1 |
++------+------------------------------------------+-------+
+
+
+- `SprintfFormatter` - allows to format column value before rendering using sprintf function (ex: %01.3f)
+<?php
+use dekor\ArrayToTextTable;
+use dekor\formatters\SprintfFormatter;
+
+$data = [
+ [
+ 'left' => 1,
+ 'right' => 2.89,
+ ]
+];
+
+$builder = new ArrayToTextTable($data);
+$builder->applyFormatter(new SprintfFormatter(['left' => '%01.3f', 'right' => '%03.3f']));
+
+echo $builder->render();
+
+outputs:
+
++-------+-------+
+| left | right |
++-------+-------+
+| 1.000 | 2.890 |
++-------+-------+
+
+
+- `ColorFormatter` - allows to highlight text with specific color (only works in terminal):
+<?php
+use dekor\ArrayToTextTable;
+use dekor\formatters\ColorFormatter;
+
+$data = [
+ ['test' => 1],
+ ['test' => -1],
+];
+
+$builder = new ArrayToTextTable($data);
+$builder->applyFormatter(new ColorFormatter(['test' => fn ($value) => $value > 0 ? 'Red' : 'Green']));
+
+echo $builder->render() . PHP_EOL;
+
+outputs:
+
+![img.png](img.png)
+
+Allowed colors list (see `ColorFormatter::$colors`)
+- Black
+- Dark Grey
+- Red
+- Light Red
+- Green
+- Light Green
+- Brown
+- Yellow
+- Blue
+- Light Blue
+- Magenta
+- Light Magenta
+- Cyan
+- Light Cyan
+- Light Grey
+- White
+
+### Creds:
+Made with ❤ by Denys
diff --git a/vendor/dekor/php-array-table/composer.json b/vendor/dekor/php-array-table/composer.json
new file mode 100644
index 00000000..0bd0beae
--- /dev/null
+++ b/vendor/dekor/php-array-table/composer.json
@@ -0,0 +1,28 @@
+{
+ "name": "dekor/php-array-table",
+ "description": "PHP Library for printing associative arrays as text table (similar to mysql terminal console)",
+ "keywords": [
+ "php",
+ "library"
+ ],
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Denis Koronets",
+ "email": "deniskoronets@woo.zp.ua",
+ "homepage": "https://woo.zp.ua/"
+ }
+ ],
+ "require": {
+ "php": ">=5.6.0",
+ "ext-mbstring": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10"
+ },
+ "autoload": {
+ "psr-4" : {
+ "dekor\\" : "src"
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/composer.lock b/vendor/dekor/php-array-table/composer.lock
new file mode 100644
index 00000000..1942d609
--- /dev/null
+++ b/vendor/dekor/php-array-table/composer.lock
@@ -0,0 +1,1624 @@
+{
+ "_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": "4784b6944946c43bd4a8ec7dcd07e613",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T13:19:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.15.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3"
+ },
+ "time": "2023-01-16T22:05:37+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "10.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bf4fbc9c13af7da12b3ea807574fb460f255daba",
+ "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.14",
+ "php": ">=8.1",
+ "phpunit/php-file-iterator": "^4.0",
+ "phpunit/php-text-template": "^3.0",
+ "sebastian/code-unit-reverse-lookup": "^3.0",
+ "sebastian/complexity": "^3.0",
+ "sebastian/environment": "^6.0",
+ "sebastian/lines-of-code": "^2.0",
+ "sebastian/version": "^4.0",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:14:34+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "7d66d4e816d34e90acec9db9d8d94b5cfbfe926f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/7d66d4e816d34e90acec9db9d8d94b5cfbfe926f",
+ "reference": "7d66d4e816d34e90acec9db9d8d94b5cfbfe926f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:55:11+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:09+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+ "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:46+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:57:52+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "10.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "a6f61c5629dd95db79af72f1e94d56702187479a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6f61c5629dd95db79af72f1e94d56702187479a",
+ "reference": "a6f61c5629dd95db79af72f1e94d56702187479a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=8.1",
+ "phpunit/php-code-coverage": "^10.0",
+ "phpunit/php-file-iterator": "^4.0",
+ "phpunit/php-invoker": "^4.0",
+ "phpunit/php-text-template": "^3.0",
+ "phpunit/php-timer": "^6.0",
+ "sebastian/cli-parser": "^2.0",
+ "sebastian/code-unit": "^2.0",
+ "sebastian/comparator": "^5.0",
+ "sebastian/diff": "^5.0",
+ "sebastian/environment": "^6.0",
+ "sebastian/exporter": "^5.0",
+ "sebastian/global-state": "^6.0",
+ "sebastian/object-enumerator": "^5.0",
+ "sebastian/recursion-context": "^5.0",
+ "sebastian/type": "^4.0",
+ "sebastian/version": "^4.0"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "10.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.7"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-02-08T15:16:31+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:15+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:59:15+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c",
+ "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/diff": "^5.0",
+ "sebastian/exporter": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:07:16+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+ "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:59:47+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "70dd1b20bc198da394ad542e988381b44e64e39f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f",
+ "reference": "70dd1b20bc198da394ad542e988381b44e64e39f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:00:31+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b6f3694c6386c7959915a0037652e0c40f6f69cc",
+ "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "https://github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:03:04+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+ "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:49+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "aab257c712de87b90194febd52e4d184551c2d44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44",
+ "reference": "aab257c712de87b90194febd52e4d184551c2d44",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:07:38+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130",
+ "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:02+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:32+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:18+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:05:40+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:10:45+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-07T11:34:05+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.6.0",
+ "ext-mbstring": "*"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/vendor/dekor/php-array-table/img.png b/vendor/dekor/php-array-table/img.png
new file mode 100644
index 00000000..404a4789
Binary files /dev/null and b/vendor/dekor/php-array-table/img.png differ
diff --git a/vendor/dekor/php-array-table/phpunit.xml b/vendor/dekor/php-array-table/phpunit.xml
new file mode 100644
index 00000000..2fe97c60
--- /dev/null
+++ b/vendor/dekor/php-array-table/phpunit.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ ./tests/
+
+
+
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/src/ArrayToTextTable.php b/vendor/dekor/php-array-table/src/ArrayToTextTable.php
new file mode 100644
index 00000000..66d3cb63
--- /dev/null
+++ b/vendor/dekor/php-array-table/src/ArrayToTextTable.php
@@ -0,0 +1,276 @@
+data = $data;
+ }
+
+ public function applyFormatter(BaseColumnFormatter $formatter)
+ {
+ $this->columnFormatters[] = $formatter;
+ }
+
+ /**
+ * Set custom charset for columns values
+ *
+ * @param $charset
+ *
+ * @return \dekor\ArrayToTextTable
+ * @throws \Exception
+ */
+ public function charset($charset)
+ {
+ if (!in_array($charset, mb_list_encodings())) {
+ throw new \Exception(
+ 'This charset `' . $charset . '` is not supported by mbstring.' .
+ 'Please check it: http://php.net/manual/ru/function.mb-list-encodings.php'
+ );
+ }
+
+ $this->charset = $charset;
+
+ return $this;
+ }
+
+ /**
+ * Set mode to print no header in the table
+ *
+ * @return self
+ */
+ public function noHeader()
+ {
+ $this->renderHeader = false;
+
+ return $this;
+ }
+
+ /**
+ * Build your ascii table and return the result
+ *
+ * @return string
+ */
+ public function render()
+ {
+ if (empty($this->data)) {
+ return 'Empty';
+ }
+
+ $this->validateData();
+
+ $this->applyBeforeFormatters();
+ $this->calcColumnsList();
+ $this->calcColumnsLength();
+
+ /** render section **/
+ $this->renderHeader();
+ $this->renderBody();
+ $this->lineSeparator();
+ /** end render section **/
+
+ return str_replace(
+ ['++', '||'],
+ ['+', '|'],
+ implode(PHP_EOL, $this->result)
+ );
+ }
+
+ protected function validateData()
+ {
+ foreach ($this->data as $row) {
+ foreach ($row as $column) {
+ if (!is_scalar($column)) {
+ throw new ArrayToTextTableException(
+ 'Tried to render invalid data: ' . print_r($column, 1) . '. Only scalars allowed'
+ );
+ }
+ }
+ }
+ }
+
+ /**
+ * Apply formatters to data before calculating length
+ * @return void
+ */
+ protected function applyBeforeFormatters()
+ {
+ foreach ($this->data as $key => $row) {
+ foreach ($row as $columnKey => $value) {
+ foreach ($this->columnFormatters as $formatter) {
+ $this->data[$key][$columnKey] = $formatter->process($columnKey, $value, true);
+ }
+ }
+ }
+ }
+
+ /**
+ * Calculates list of columns in data
+ */
+ protected function calcColumnsList()
+ {
+ $this->columnsList = array_keys(reset($this->data));
+ }
+
+ /**
+ * Calculates length for string
+ *
+ * @param $str
+ *
+ * @return int
+ */
+ protected function length($str)
+ {
+ return mb_strlen($str, $this->charset);
+ }
+
+ /**
+ * Calculate maximum string length for each column
+ */
+ private function calcColumnsLength()
+ {
+ foreach ($this->data as $row) {
+ if ($row === '---') {
+ continue;
+ }
+
+ foreach ($this->columnsList as $column) {
+ $this->columnsLength[$column] = max(
+ isset($this->columnsLength[$column])
+ ? $this->columnsLength[$column]
+ : 0,
+ $this->length($row[$column]),
+ $this->length($column)
+ );
+ }
+ }
+ }
+
+ /**
+ * Append a line separator to result
+ */
+ private function lineSeparator()
+ {
+ $tmp = [];
+
+ foreach ($this->columnsList as $column) {
+ $tmp[] = str_repeat(self::H_LINE_CHAR, $this->columnsLength[$column] + 2);
+ }
+
+ $this->result[] = self::INTERSECT_CHAR . implode(self::INTERSECT_CHAR, $tmp) . self::INTERSECT_CHAR;
+ }
+
+ /**
+ * @param $columnKey
+ * @param $value
+ *
+ * @return string
+ */
+ private function column($columnKey, $value)
+ {
+ return ' ' . $value . str_repeat(
+ ' ',
+ $this->columnsLength[$columnKey] - $this->length($value)
+ ) . ' ';
+ }
+
+ /**
+ * Render header part
+ *
+ * @return void
+ */
+ private function renderHeader()
+ {
+ $this->lineSeparator();
+
+ if (!$this->renderHeader) {
+ return;
+ }
+
+ $tmp = [];
+
+ foreach ($this->columnsList as $column) {
+ $tmp[] = $this->column($column, $column);
+ }
+
+ $this->result[] = self::V_LINE_CHAR . implode(self::V_LINE_CHAR, $tmp) . self::V_LINE_CHAR;
+
+ $this->lineSeparator();
+ }
+
+ /**
+ * Render body section of table
+ *
+ * @return void
+ */
+ private function renderBody()
+ {
+ foreach ($this->data as $row) {
+ if ($row === '---') {
+ $this->lineSeparator();
+ continue;
+ }
+
+ $tmp = [];
+
+ foreach ($this->columnsList as $column) {
+ $value = $this->column($column, $row[$column]);
+
+ foreach ($this->columnFormatters as $formatter) {
+ $value = $formatter->process($column, $value, false);
+ }
+
+ $tmp[] = $value;
+ }
+
+ $this->result[] = self::V_LINE_CHAR . implode(self::V_LINE_CHAR, $tmp) . self::V_LINE_CHAR;
+ }
+ }
+}
diff --git a/vendor/dekor/php-array-table/src/ArrayToTextTableException.php b/vendor/dekor/php-array-table/src/ArrayToTextTableException.php
new file mode 100644
index 00000000..3744fe51
--- /dev/null
+++ b/vendor/dekor/php-array-table/src/ArrayToTextTableException.php
@@ -0,0 +1,8 @@
+config = $config;
+ }
+
+ /**
+ * @param string $columnName
+ * @param string $value
+ * @param bool $isBefore
+ * @return string
+ */
+ public function process($columnName, $value, $isBefore)
+ {
+ if (!isset($this->config[$columnName])) {
+ return $value;
+ }
+
+ $formatterValue = $this->config[$columnName];
+
+ // compute formatter value in case we accepted closure
+ if (is_callable($this->config[$columnName])) {
+ $formatterValue = call_user_func($formatterValue, $value);
+ }
+
+ if ($isBefore) {
+ return $this->applyBefore($value, $formatterValue);
+ }
+
+ return $this->applyAfter($value, $formatterValue);
+ }
+
+ /**
+ * Allows to apply some formatting to column value before calculating columns length.
+ * Just return $value in case you don't want to do anything with the column at this stage
+ * @param $value
+ * @param string $formatterValue
+ * @return string
+ */
+ abstract protected function applyBefore($value, $formatterValue);
+
+ /**
+ * Allows to apply some formatting to column value after adding spaces to column value
+ * Just return $value in case you don't want to do anything with the column at this stage
+ * @param $value
+ * @param string $formatterValue
+ * @return string
+ */
+ abstract protected function applyAfter($value, $formatterValue);
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/src/formatters/ColorFormatter.php b/vendor/dekor/php-array-table/src/formatters/ColorFormatter.php
new file mode 100644
index 00000000..ccddf791
--- /dev/null
+++ b/vendor/dekor/php-array-table/src/formatters/ColorFormatter.php
@@ -0,0 +1,51 @@
+ self::DEFAULT_COLOR,
+
+ 'Black' => '0;30',
+ 'Dark Grey' => '1;30',
+ 'Red' => '0;31',
+ 'Light Red' => '1;31',
+ 'Green' => '0;32',
+ 'Light Green' => '1;32',
+ 'Brown' => '0;33',
+ 'Yellow' => '1;33',
+ 'Blue' => '0;34',
+ 'Light Blue' => '1;34',
+ 'Magenta' => '0;35',
+ 'Light Magenta' => '1;35',
+ 'Cyan' => '0;36',
+ 'Light Cyan' => '1;36',
+ 'Light Grey' => '0;37',
+ 'White' => '1;37',
+ ];
+
+ const DEFAULT_COLOR = '0m';
+
+ protected function applyBefore($value, $formatterValue)
+ {
+ return $value;
+ }
+
+ protected function applyAfter($value, $formatterValue)
+ {
+ if ($formatterValue == 'Default') {
+ return $value;
+ }
+
+ if (!isset($this->colors[$formatterValue])) {
+ throw new ArrayToTextTableException('Unknown color to apply: ' . $formatterValue);
+ }
+
+ $color = $this->colors[$formatterValue];
+
+ return "\e[" . $color . "m" . $value . "\e[" . self::DEFAULT_COLOR;
+ }
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/src/formatters/SprintfFormatter.php b/vendor/dekor/php-array-table/src/formatters/SprintfFormatter.php
new file mode 100644
index 00000000..eec3ecad
--- /dev/null
+++ b/vendor/dekor/php-array-table/src/formatters/SprintfFormatter.php
@@ -0,0 +1,18 @@
+ 1],
+ ['test' => -1],
+];
+
+$builder = new ArrayToTextTable($data);
+$builder->applyFormatter(new ColorFormatter(['test' => fn ($value) => $value > 0 ? 'Red' : 'Green']));
+
+echo $builder->render() . PHP_EOL;
diff --git a/vendor/dekor/php-array-table/tests/AlignFormatterTest.php b/vendor/dekor/php-array-table/tests/AlignFormatterTest.php
new file mode 100644
index 00000000..74cd6349
--- /dev/null
+++ b/vendor/dekor/php-array-table/tests/AlignFormatterTest.php
@@ -0,0 +1,58 @@
+applyFormatter(new AlignFormatter(['center' => 'center', 'right' => 'right']));
+
+ $this->assertEquals($expectResult, $builder->render());
+ }
+
+ public static function getCases()
+ {
+ return [
+ [
+ 'data' => [
+ [
+ 'left' => 1,
+ 'center' => 'Denis Koronets',
+ 'right' => 2.89,
+ ],
+ [
+ 'left' => 2,
+ 'center' => 'Dummy one',
+ 'right' => 14.33,
+ ],
+ ],
+ 'expected' =>
+ '+------+----------------+-------+' . PHP_EOL .
+ '| left | center | right |' . PHP_EOL .
+ '+------+----------------+-------+' . PHP_EOL .
+ '| 1 | Denis Koronets | 2.89 |' . PHP_EOL .
+ '| 2 | Dummy one | 14.33 |' . PHP_EOL .
+ '+------+----------------+-------+',
+ ],
+ ];
+ }
+
+ public function testInCorrectBuilding()
+ {
+ $data = [['test' => 1]];
+
+ $builder = new ArrayToTextTable($data);
+ $builder->applyFormatter(new AlignFormatter(['test' => 'imposible']));
+
+ $this->expectException(ArrayToTextTableException::class);
+ $builder->render();
+ }
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/tests/ColorTest.php b/vendor/dekor/php-array-table/tests/ColorTest.php
new file mode 100644
index 00000000..282dd483
--- /dev/null
+++ b/vendor/dekor/php-array-table/tests/ColorTest.php
@@ -0,0 +1,52 @@
+applyFormatter(new ColorFormatter(['test' => fn ($value) => $value > 0 ? 'Red' : 'Green']));
+
+ $this->assertEquals($expectResult, $builder->render());
+ }
+
+ public static function getCases()
+ {
+ return [
+ [
+ 'data' => [
+ ['test' => 1],
+ ['test' => -1],
+ ],
+ 'expected' =>
+ '+------+' . PHP_EOL .
+ '| test |' . PHP_EOL .
+ '+------+' . PHP_EOL .
+ '|[0;31m 1 [0m|' . PHP_EOL .
+ '|[0;32m -1 [0m|' . PHP_EOL .
+ '+------+',
+ ],
+ ];
+ }
+
+ public function testInCorrectBuilding()
+ {
+ $data = [['test' => 1]];
+
+ $builder = new ArrayToTextTable($data);
+ $builder->applyFormatter(new AlignFormatter(['test' => 'imposible']));
+
+ $this->expectException(ArrayToTextTableException::class);
+ $builder->render();
+ }
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/tests/CombinedAlignSprintfFormatterTest.php b/vendor/dekor/php-array-table/tests/CombinedAlignSprintfFormatterTest.php
new file mode 100644
index 00000000..15eeb24b
--- /dev/null
+++ b/vendor/dekor/php-array-table/tests/CombinedAlignSprintfFormatterTest.php
@@ -0,0 +1,67 @@
+applyFormatter(new AlignFormatter(['center' => 'center', 'right' => 'right']));
+ $builder->applyFormatter(new SprintfFormatter(['right' => '%01.3f']));
+
+ $this->assertEquals($expectResult, $builder->render());
+ }
+
+ public static function getCases()
+ {
+ return [
+ [
+ 'data' => [
+ [
+ 'left' => 1,
+ 'center' => 'Denis Koronets',
+ 'right' => 2.89,
+ ],
+ [
+ 'left' => 2,
+ 'center' => 'Dummy one',
+ 'right' => 14.33,
+ ],
+ [
+ 'left' => 3,
+ 'center' => 'Another great day for a great inventors!',
+ 'right' => 1,
+ ],
+ ],
+ 'expected' =>
+ '+------+------------------------------------------+--------+' . PHP_EOL .
+ '| left | center | right |' . PHP_EOL .
+ '+------+------------------------------------------+--------+' . PHP_EOL .
+ '| 1 | Denis Koronets | 2.890 |' . PHP_EOL .
+ '| 2 | Dummy one | 14.330 |' . PHP_EOL .
+ '| 3 | Another great day for a great inventors! | 1.000 |' . PHP_EOL .
+ '+------+------------------------------------------+--------+',
+
+ ],
+ ];
+ }
+
+ public function testInCorrectBuilding()
+ {
+ $data = [['test' => 1]];
+
+ $builder = new ArrayToTextTable($data);
+ $builder->applyFormatter(new AlignFormatter(['test' => 'imposible']));
+
+ $this->expectException(ArrayToTextTableException::class);
+ $builder->render();
+ }
+}
\ No newline at end of file
diff --git a/vendor/dekor/php-array-table/tests/SimpleTest.php b/vendor/dekor/php-array-table/tests/SimpleTest.php
new file mode 100644
index 00000000..46872c40
--- /dev/null
+++ b/vendor/dekor/php-array-table/tests/SimpleTest.php
@@ -0,0 +1,112 @@
+assertEquals($expectResult, $builder->render());
+ }
+
+ public static function getCases()
+ {
+ return [
+ [
+ 'data' => [
+ [
+ 'id' => 1,
+ 'name' => 'Denis Koronets',
+ 'role' => 'php developer',
+ ],
+ [
+ 'id' => 2,
+ 'name' => 'Maxim Ambroskin',
+ 'role' => 'java developer',
+ ],
+ [
+ 'id' => 3,
+ 'name' => 'Andrew Sikorsky',
+ 'role' => 'php developer',
+ ]
+ ],
+ 'expected' =>
+ '+----+-----------------+----------------+' . PHP_EOL .
+ '| id | name | role |' . PHP_EOL .
+ '+----+-----------------+----------------+' . PHP_EOL .
+ '| 1 | Denis Koronets | php developer |' . PHP_EOL .
+ '| 2 | Maxim Ambroskin | java developer |' . PHP_EOL .
+ '| 3 | Andrew Sikorsky | php developer |' . PHP_EOL .
+ '+----+-----------------+----------------+',
+ ],
+ [
+ 'data' => [
+ [
+ 'singleColumn' => 'test value',
+ ],
+ ],
+ 'expected' =>
+ '+--------------+' . PHP_EOL .
+ '| singleColumn |' . PHP_EOL .
+ '+--------------+' . PHP_EOL .
+ '| test value |' . PHP_EOL .
+ '+--------------+',
+ ],
+ [
+ 'data' => [
+ [
+ 'id' => 1,
+ 'name' => 'Денис Коронец',
+ 'role' => 'Тест кириллических символов',
+ ],
+ ],
+ 'expected' =>
+ '+----+---------------+-----------------------------+' . PHP_EOL .
+ '| id | name | role |' . PHP_EOL .
+ '+----+---------------+-----------------------------+' . PHP_EOL .
+ '| 1 | Денис Коронец | Тест кириллических символов |' . PHP_EOL .
+ '+----+---------------+-----------------------------+',
+ ],
+ [
+ 'data' => [
+ [
+ 'id' => 1,
+ 'name' => 'Денис Коронец',
+ 'role' => 'Тест кириллических символов',
+ ],
+ '---',
+ [
+ 'id' => 2,
+ 'name' => 'Артем Малеев',
+ 'role' => 'Тест кириллических символов 2',
+ ],
+ ],
+ 'expected' =>
+ '+----+---------------+-------------------------------+' . PHP_EOL .
+ '| id | name | role |' . PHP_EOL .
+ '+----+---------------+-------------------------------+' . PHP_EOL .
+ '| 1 | Денис Коронец | Тест кириллических символов |' . PHP_EOL .
+ '+----+---------------+-------------------------------+' . PHP_EOL .
+ '| 2 | Артем Малеев | Тест кириллических символов 2 |' . PHP_EOL .
+ '+----+---------------+-------------------------------+',
+ ],
+ ];
+ }
+
+ public function testInCorrectDataBuilding()
+ {
+ $data = [['test' => []]];
+
+ $builder = new ArrayToTextTable($data);
+
+ $this->expectException(ArrayToTextTableException::class);
+ $builder->render();
+ }
+}
\ No newline at end of file
diff --git a/vendor/drush/drush/.ddev/config.yaml b/vendor/drush/drush/.ddev/config.yaml
index 1b2b901b..626ac4ec 100644
--- a/vendor/drush/drush/.ddev/config.yaml
+++ b/vendor/drush/drush/.ddev/config.yaml
@@ -15,6 +15,7 @@ composer_version: ""
disable_settings_management: true
webimage_extra_packages:
- bash-completion
+ - asciinema
# https://ddev.readthedocs.io/en/latest/users/extend/database-types/
# When switching DBs, use ddev delete --omit-snapshot
#database:
diff --git a/vendor/drush/drush/.ddev/web-build/Dockerfile b/vendor/drush/drush/.ddev/web-build/Dockerfile
index 08b2ca0c..0101bec1 100644
--- a/vendor/drush/drush/.ddev/web-build/Dockerfile
+++ b/vendor/drush/drush/.ddev/web-build/Dockerfile
@@ -1,9 +1,6 @@
ARG BASE_IMAGE
FROM $BASE_IMAGE
-# https://asciinema.org/docs/installation
-RUN pip3 install asciinema
-
# Install Autocast https://github.com/k9withabone/autocast/tree/main#installation
# https://stackoverflow.com/questions/67092242/how-can-i-add-to-the-path-in-the-ddev-web-container-for-drush-for-example
RUN echo 'export PATH="$PATH:$HOME/.cargo/bin"' >/etc/bashrc/commandline-addons.bashrc
diff --git a/vendor/drush/drush/docs/dependency-injection.md b/vendor/drush/drush/docs/dependency-injection.md
index 9b338b89..7b5b6147 100644
--- a/vendor/drush/drush/docs/dependency-injection.md
+++ b/vendor/drush/drush/docs/dependency-injection.md
@@ -11,7 +11,8 @@ Autowire
------------------
:octicons-tag-24: 12.5+
-Command files may inject Drush and Drupal services by adding the [AutowireTrait](https://github.com/drush-ops/drush/blob/12.x/src/Commands/AutowireTrait.php) to the class (example: [PmCommands](https://github.com/drush-ops/drush/blob/12.x/src/Commands/pm/MaintCommands.php)). This enables your [Constructor parameter type hints determine the the injected service](https://www.drupal.org/node/3396179). When a type hint is insufficient, an [#[Autowire] Attribute](https://www.drupal.org/node/3396179) on the constructor property (with _service:_ named argument) directs AutoWireTrait to the right service (example: [LoginCommands](https://github.com/drush-ops/drush/blob/12.x/src/Commands/core/LoginCommands.php)).
+Command files may inject Drush and Drupal services by adding the [AutowireTrait](https://github.com/drush-ops/drush/blob/12.x/src/Commands/AutowireTrait.php) to the class (example: [MaintCommands](https://github.com/drush-ops/drush/blob/12.x/src/Commands/core/MaintCommands.php)). This enables your [Constructor parameter type hints determine the the injected service](https://www.drupal.org/node/3396179). When a type hint is insufficient, an [#[Autowire] Attribute](https://www.drupal.org/node/3396179) on the constructor property (with
+_service:_ named argument) directs AutoWireTrait to the right service.
If your command is not found by Drush, add the `-vvv` option for debug info about any service instantiation errors. If Autowire is still insufficient, a commandfile may implement its own `create()` method (see below).
diff --git a/vendor/drush/drush/docs/using-drush-configuration.md b/vendor/drush/drush/docs/using-drush-configuration.md
index 5ebadff0..cceb8610 100644
--- a/vendor/drush/drush/docs/using-drush-configuration.md
+++ b/vendor/drush/drush/docs/using-drush-configuration.md
@@ -25,7 +25,7 @@ An alternative way to populate Drush configuration is to define environment vari
correspond to config keys. For example, to populate the `options.uri` config item,
create an environment variable `DRUSH_OPTIONS_URI=http://example.com`.
As you can see, variable names should be uppercased, prefixed with `DRUSH_`, and periods
-replaced with dashes.
+replaced with underscores.
### Config examples
diff --git a/vendor/drush/drush/src/Boot/DrupalBoot8.php b/vendor/drush/drush/src/Boot/DrupalBoot8.php
index 9fdff8ff..02f2fdaf 100644
--- a/vendor/drush/drush/src/Boot/DrupalBoot8.php
+++ b/vendor/drush/drush/src/Boot/DrupalBoot8.php
@@ -25,7 +25,6 @@
class DrupalBoot8 extends DrupalBoot
{
- protected ?LoggrInterface $drupalLoggerAdapter = null;
protected ?DrupalKernelInterface $kernel = null;
protected Request $request;
@@ -49,23 +48,6 @@ public function getKernel(): DrupalKernelInterface
return $this->kernel;
}
- /**
- * Sometimes (e.g. in the integration tests), the DrupalBoot
- * object will be cached, and re-injected into a fresh set
- * of preflight / bootstrap objects. When this happens, the
- * new Drush logger will be injected into the boot object. If
- * this happens after we have created the Drupal logger adapter
- * (i.e., after bootstrapping Drupal), then we also need to
- * update the logger reference in that adapter.
- */
- public function setLogger(LoggerInterface $logger): void
- {
- if ($this->drupalLoggerAdapter) {
- $this->drupalLoggerAdapter->setLogger($logger);
- }
- parent::setLogger($logger);
- }
-
public function validRoot(?string $path): bool
{
if (!empty($path) && is_dir($path) && file_exists($path . '/autoload.php')) {
diff --git a/vendor/drush/drush/src/Commands/core/ArchiveDumpCommands.php b/vendor/drush/drush/src/Commands/core/ArchiveDumpCommands.php
index 58873744..e6138750 100644
--- a/vendor/drush/drush/src/Commands/core/ArchiveDumpCommands.php
+++ b/vendor/drush/drush/src/Commands/core/ArchiveDumpCommands.php
@@ -5,6 +5,7 @@
namespace Drush\Commands\core;
use Drupal;
+use Drupal\Core\StreamWrapper\PublicStream;
use Drush\Attributes as CLI;
use Drush\Boot\DrupalBootLevels;
use Drush\Commands\DrushCommands;
@@ -67,6 +68,7 @@ final class ArchiveDumpCommands extends DrushCommands
#[CLI\Option(name: 'destination', description: 'The full path and filename in which the archive should be stored. Any relative path will be calculated from Drupal root (usually web for drupal/recommended-project projects). If omitted, it will be saved to the configured temp directory.')]
#[CLI\Option(name: 'overwrite', description: 'Overwrite destination file if exists.')]
#[CLI\Option(name: 'code', description: 'Archive codebase.')]
+ #[CLI\Option(name: 'convert-symlinks', description: 'Replace all symlinks with copies of the files/directories that they point to. Default is to only convert symlinks that point outside the project root.')]
#[CLI\Option(name: 'exclude-code-paths', description: 'Comma-separated list of paths (or regular expressions matching paths) to exclude from the code archive.')]
#[CLI\Option(name: 'extra-dump', description: 'Add custom arguments/options to the dumping of the database (e.g. mysqldump command).')]
#[CLI\Option(name: 'files', description: 'Archive Drupal files.')]
@@ -98,6 +100,7 @@ public function dump(array $options = [
'generatorversion' => InputOption::VALUE_REQUIRED,
'exclude-code-paths' => InputOption::VALUE_REQUIRED,
'extra-dump' => self::REQ,
+ 'convert-symlinks' => false,
]): string
{
$this->prepareArchiveDir();
@@ -129,6 +132,8 @@ public function dump(array $options = [
];
}
+ $this->convertSymlinks($options['convert-symlinks']);
+
return $this->createArchiveFile($components, $options);
}
@@ -146,9 +151,9 @@ protected function prepareArchiveDir(): void
/**
* Creates the archive file and returns the absolute path.
*
- * @param array $archiveComponents
+ * @param $archiveComponents
* The list of components (files) to include into the archive file.
- * @param array $options
+ * @param $options
* The command options.
*
* @return string
@@ -169,6 +174,7 @@ private function createArchiveFile(array $archiveComponents, array $options): st
$archive = new PharData($archivePath);
$this->createManifestFile($options);
+
$archive->buildFromDirectory($this->archiveDir);
$this->logger()->info(dt('Compressing archive...'));
@@ -237,6 +243,64 @@ private function createManifestFile(array $options): void
);
}
+ /**
+ * Converts symlinks to the linked files/folders for an archive.
+ *
+ * @param bool $convert_symlinks
+ * Whether to convert all symlinks.
+ *
+ */
+ public function convertSymlinks(
+ bool $convert_symlinks,
+ ): void {
+ // If symlinks are disabled, convert symlinks to full content.
+ $this->logger()->info(dt('Converting symlinks...'));
+
+ $iterator = new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($this->archiveDir),
+ RecursiveIteratorIterator::SELF_FIRST
+ );
+
+ foreach ($iterator as $file) {
+ if (
+ $file->isLink() && ($convert_symlinks || strpos(
+ $file->getLinkTarget(),
+ $this->archiveDir
+ ) !== 0)
+ ) {
+ $target = readlink($file->getPathname());
+
+ if (is_file($target)) {
+ $content = file_get_contents($target);
+ unlink($file->getPathname());
+ file_put_contents($file->getPathname(), $content);
+ } elseif (is_dir($target)) {
+ $path = $file->getPathname();
+ unlink($path);
+ mkdir($path, 0755);
+ foreach (
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator(
+ $target,
+ \RecursiveDirectoryIterator::SKIP_DOTS
+ ),
+ \RecursiveIteratorIterator::SELF_FIRST
+ ) as $item
+ ) {
+ if ($item->isDir()) {
+ mkdir($path . DIRECTORY_SEPARATOR . $iterator->getSubPathname());
+ } else {
+ copy(
+ $item->getPathname(),
+ $path . DIRECTORY_SEPARATOR . $iterator->getSubPathname()
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+
/**
* Returns TRUE if the site is a "web" docroot site.
*
@@ -321,6 +385,10 @@ private function getCodeComponentPath(array $options): string
$process->mustRun();
$composerInfoRaw = $process->getOutput();
$installedPackages = json_decode($composerInfoRaw, true)['installed'] ?? [];
+ // Remove path projects ('source' is empty for path projects)
+ $installedPackages = array_filter($installedPackages, function ($dependency) {
+ return !empty($dependency['source']);
+ });
$installedPackagesPaths = array_filter(array_column($installedPackages, 'path'));
$installedPackagesRelativePaths = array_map(
fn($path) => ltrim(str_replace([$this->getComposerRoot()], '', $path), '/'),
@@ -404,7 +472,7 @@ private function getDrupalFilesDir(): string
}
Drush::bootstrapManager()->doBootstrap(DrupalBootLevels::FULL);
- $drupalFilesPath = Drupal::service('file_system')->realpath('public://');
+ $drupalFilesPath = Path::join($this->getRoot(), PublicStream::basePath());
if (!$drupalFilesPath) {
throw new Exception(dt('Path to Drupal files is empty.'));
}
diff --git a/vendor/drush/drush/src/Commands/core/DrupalCommands.php b/vendor/drush/drush/src/Commands/core/DrupalCommands.php
index da2ce4c2..2d35a0a8 100644
--- a/vendor/drush/drush/src/Commands/core/DrupalCommands.php
+++ b/vendor/drush/drush/src/Commands/core/DrupalCommands.php
@@ -101,7 +101,7 @@ public function requirements($options = ['format' => 'table', 'severity' => -1,
foreach ($requirements as $key => $info) {
if (is_numeric($key)) {
unset($requirements[$key]);
- $new_key = strtolower(str_replace(' ', '_', $info['title']));
+ $new_key = strtolower(str_replace(' ', '_', (string) $info['title']));
$requirements[$new_key] = $info;
}
}
diff --git a/vendor/drush/drush/src/Commands/core/EntityCommands.php b/vendor/drush/drush/src/Commands/core/EntityCommands.php
index fe7c6a93..1772aa98 100644
--- a/vendor/drush/drush/src/Commands/core/EntityCommands.php
+++ b/vendor/drush/drush/src/Commands/core/EntityCommands.php
@@ -115,7 +115,7 @@ public function loadSave(string $entity_type, $ids = null, array $options = ['bu
$this->logger()->success(dt('No matching entities found.'));
} else {
$this->io()->progressStart(count($result));
- foreach (array_chunk($result, $options['chunks'], true) as $chunk) {
+ foreach (array_chunk($result, (int) $options['chunks'], true) as $chunk) {
drush_op([$this, 'doSave'], $entity_type, $chunk);
$this->io()->progressAdvance(count($chunk));
}
diff --git a/vendor/drush/drush/src/Commands/core/MigrateRunnerCommands.php b/vendor/drush/drush/src/Commands/core/MigrateRunnerCommands.php
index 76b9e755..793f1add 100644
--- a/vendor/drush/drush/src/Commands/core/MigrateRunnerCommands.php
+++ b/vendor/drush/drush/src/Commands/core/MigrateRunnerCommands.php
@@ -661,7 +661,7 @@ public function fieldsSource(string $migrationId, $options = ['format' => 'table
foreach ($source->fields() as $machineName => $description) {
$table[] = [
'machine_name' => $machineName,
- 'description' => strip_tags($description),
+ 'description' => strip_tags((string) $description),
];
}
return new RowsOfFields($table);
diff --git a/vendor/drush/drush/src/Commands/help/HelpCLIFormatter.php b/vendor/drush/drush/src/Commands/help/HelpCLIFormatter.php
index e56f19d1..fbc4a489 100644
--- a/vendor/drush/drush/src/Commands/help/HelpCLIFormatter.php
+++ b/vendor/drush/drush/src/Commands/help/HelpCLIFormatter.php
@@ -26,7 +26,7 @@ public function write(OutputInterface $output, $data, FormatterOptions $options)
{
$formatterManager = new FormatterManager();
- $output->writeln($data['description']);
+ $output->writeln((string)$data['description']);
if (array_key_exists('help', $data) && $data['help'] != $data['description']) {
$output->writeln('');
$output->writeln($data['help']);
diff --git a/vendor/drush/drush/src/Drupal/Commands/sql/SanitizeSessionsCommands.php b/vendor/drush/drush/src/Drupal/Commands/sql/SanitizeSessionsCommands.php
index b5147601..f748e273 100644
--- a/vendor/drush/drush/src/Drupal/Commands/sql/SanitizeSessionsCommands.php
+++ b/vendor/drush/drush/src/Drupal/Commands/sql/SanitizeSessionsCommands.php
@@ -35,13 +35,22 @@ public function getDatabase()
#[CLI\Hook(type: HookManager::POST_COMMAND_HOOK, target: SanitizeCommands::SANITIZE)]
public function sanitize($result, CommandData $commandData): void
{
- $this->getDatabase()->truncate('sessions')->execute();
- $this->logger()->success(dt('Sessions table truncated.'));
+ if ($this->applies()) {
+ $this->database->truncate('sessions')->execute();
+ $this->logger()->success(dt('Sessions table truncated.'));
+ }
}
#[CLI\Hook(type: HookManager::ON_EVENT, target: SanitizeCommands::CONFIRMS)]
public function messages(&$messages, InputInterface $input): void
{
- $messages[] = dt('Truncate sessions table.');
+ if ($this->applies()) {
+ $messages[] = dt('Truncate sessions table.');
+ }
+ }
+
+ private function applies(): bool
+ {
+ return $this->database->schema()->tableExists('sessions');
}
}
diff --git a/vendor/drush/drush/src/Sql/SqlBase.php b/vendor/drush/drush/src/Sql/SqlBase.php
index 5ca85373..9f9296c8 100644
--- a/vendor/drush/drush/src/Sql/SqlBase.php
+++ b/vendor/drush/drush/src/Sql/SqlBase.php
@@ -121,7 +121,7 @@ public static function getInstance($db_spec, $options): ?self
$driver = $db_spec['driver'];
$class_name = !empty($driver) ? 'Drush\Sql\Sql' . ucfirst($driver) : null;
if ($class_name && class_exists($class_name)) {
- $instance = new $class_name($db_spec, $options);
+ $instance = method_exists($class_name, 'make') ? $class_name::make($db_spec, $options) : new $class_name($db_spec, $options);
// Inject config
$instance->setConfig(Drush::config());
return $instance;
diff --git a/vendor/drush/drush/src/Sql/SqlMysql.php b/vendor/drush/drush/src/Sql/SqlMysql.php
index 6c2b7dfb..15d62b1f 100644
--- a/vendor/drush/drush/src/Sql/SqlMysql.php
+++ b/vendor/drush/drush/src/Sql/SqlMysql.php
@@ -229,7 +229,7 @@ public function dumpCmd($table_selection): string
// Run mysqldump again and append output if we need some structure only tables.
if (!empty($structure_tables)) {
- $exec .= " && mysqldump " . $only_db_name . " --no-data $extra " . implode(' ', $structure_tables);
+ $exec .= " && " . $this->dumpProgram() . " " . $only_db_name . " --no-data $extra " . implode(' ', $structure_tables);
$parens = true;
}
}
diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md
index 13709d1b..c1470eb1 100644
--- a/vendor/guzzlehttp/guzzle/CHANGELOG.md
+++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md
@@ -3,6 +3,13 @@
Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
+## 7.8.2 - 2024-07-18
+
+### Added
+
+- Support for PHP 8.4
+
+
## 7.8.1 - 2023-12-03
### Changed
diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md
index 6d78a930..cdaebee3 100644
--- a/vendor/guzzlehttp/guzzle/README.md
+++ b/vendor/guzzlehttp/guzzle/README.md
@@ -62,11 +62,11 @@ composer require guzzlehttp/guzzle
| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |
|---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------|
-| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 |
-| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 |
-| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |
-| 6.x | Security fixes only | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |
-| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.4 |
+| 3.x | EOL (2016-10-31) | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 |
+| 4.x | EOL (2016-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 |
+| 5.x | EOL (2019-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |
+| 6.x | EOL (2023-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |
+| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.5 |
[guzzle-3-repo]: https://github.com/guzzle/guzzle3
[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json
index 69583d7c..9d54cf16 100644
--- a/vendor/guzzlehttp/guzzle/composer.json
+++ b/vendor/guzzlehttp/guzzle/composer.json
@@ -50,11 +50,39 @@
"homepage": "https://github.com/Tobion"
}
],
+ "repositories": [
+ {
+ "type": "package",
+ "package": {
+ "name": "guzzle/client-integration-tests",
+ "version": "v3.0.2",
+ "dist": {
+ "url": "https://codeload.github.com/guzzle/client-integration-tests/zip/2c025848417c1135031fdf9c728ee53d0a7ceaee",
+ "type": "zip"
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.11",
+ "php-http/message": "^1.0 || ^2.0",
+ "guzzlehttp/psr7": "^1.7 || ^2.0",
+ "th3n3rd/cartesian-product": "^0.3"
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Tests\\": "src/"
+ }
+ },
+ "bin": [
+ "bin/http_test_server"
+ ]
+ }
+ }
+ ],
"require": {
"php": "^7.2.5 || ^8.0",
"ext-json": "*",
- "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
- "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.6.3",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
@@ -64,9 +92,9 @@
"require-dev": {
"ext-curl": "*",
"bamarni/composer-bin-plugin": "^1.8.2",
- "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
diff --git a/vendor/guzzlehttp/guzzle/src/BodySummarizer.php b/vendor/guzzlehttp/guzzle/src/BodySummarizer.php
index 6eca94ef..761506dd 100644
--- a/vendor/guzzlehttp/guzzle/src/BodySummarizer.php
+++ b/vendor/guzzlehttp/guzzle/src/BodySummarizer.php
@@ -11,7 +11,7 @@ final class BodySummarizer implements BodySummarizerInterface
*/
private $truncateAt;
- public function __construct(int $truncateAt = null)
+ public function __construct(?int $truncateAt = null)
{
$this->truncateAt = $truncateAt;
}
@@ -22,7 +22,7 @@ public function __construct(int $truncateAt = null)
public function summarize(MessageInterface $message): ?string
{
return $this->truncateAt === null
- ? \GuzzleHttp\Psr7\Message::bodySummary($message)
- : \GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt);
+ ? Psr7\Message::bodySummary($message)
+ : Psr7\Message::bodySummary($message, $this->truncateAt);
}
}
diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php
index bc6efc90..c78919a4 100644
--- a/vendor/guzzlehttp/guzzle/src/Client.php
+++ b/vendor/guzzlehttp/guzzle/src/Client.php
@@ -52,7 +52,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
*
* @param array $config Client configuration settings.
*
- * @see \GuzzleHttp\RequestOptions for a list of available request options.
+ * @see RequestOptions for a list of available request options.
*/
public function __construct(array $config = [])
{
@@ -202,7 +202,7 @@ public function request(string $method, $uri = '', array $options = []): Respons
*
* @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.
*/
- public function getConfig(string $option = null)
+ public function getConfig(?string $option = null)
{
return $option === null
? $this->config
diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
index 1788e16a..6aaee61a 100644
--- a/vendor/guzzlehttp/guzzle/src/ClientInterface.php
+++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -80,5 +80,5 @@ public function requestAsync(string $method, $uri, array $options = []): Promise
*
* @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0.
*/
- public function getConfig(string $option = null);
+ public function getConfig(?string $option = null);
}
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
index c29b4b7e..b616cf2e 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
@@ -103,7 +103,7 @@ public function toArray(): array
}, $this->getIterator()->getArrayCopy());
}
- public function clear(string $domain = null, string $path = null, string $name = null): void
+ public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
{
if (!$domain) {
$this->cookies = [];
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
index 8c55cc6f..93ada58d 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php
@@ -62,7 +62,7 @@ public function setCookie(SetCookie $cookie): bool;
* @param string|null $path Clears cookies matching a domain and path
* @param string|null $name Clears cookies matching a domain, path, and name
*/
- public function clear(string $domain = null, string $path = null, string $name = null): void;
+ public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void;
/**
* Discard all sessions cookies.
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
index a80956c9..ba67ad49 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php
@@ -14,7 +14,7 @@ public function __construct(
string $message,
RequestInterface $request,
ResponseInterface $response,
- \Throwable $previous = null,
+ ?\Throwable $previous = null,
array $handlerContext = []
) {
parent::__construct($message, $request, $response, $previous, $handlerContext);
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php b/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
index e1a31519..eab51ca1 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php
@@ -25,7 +25,7 @@ class ConnectException extends TransferException implements NetworkExceptionInte
public function __construct(
string $message,
RequestInterface $request,
- \Throwable $previous = null,
+ ?\Throwable $previous = null,
array $handlerContext = []
) {
parent::__construct($message, 0, $previous);
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
index c2d0a9cc..ae05ccfa 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
@@ -32,8 +32,8 @@ class RequestException extends TransferException implements RequestExceptionInte
public function __construct(
string $message,
RequestInterface $request,
- ResponseInterface $response = null,
- \Throwable $previous = null,
+ ?ResponseInterface $response = null,
+ ?\Throwable $previous = null,
array $handlerContext = []
) {
// Set the code of the exception if the response is set and not future.
@@ -63,10 +63,10 @@ public static function wrapException(RequestInterface $request, \Throwable $e):
*/
public static function create(
RequestInterface $request,
- ResponseInterface $response = null,
- \Throwable $previous = null,
+ ?ResponseInterface $response = null,
+ ?\Throwable $previous = null,
array $handlerContext = [],
- BodySummarizerInterface $bodySummarizer = null
+ ?BodySummarizerInterface $bodySummarizer = null
): self {
if (!$response) {
return new self(
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
index 77ffed52..3ecd5964 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php
@@ -52,21 +52,21 @@ class MockHandler implements \Countable
* @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.
* @param callable|null $onRejected Callback to invoke when the return value is rejected.
*/
- public static function createWithMiddleware(array $queue = null, callable $onFulfilled = null, callable $onRejected = null): HandlerStack
+ public static function createWithMiddleware(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null): HandlerStack
{
return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
}
/**
* The passed in value must be an array of
- * {@see \Psr\Http\Message\ResponseInterface} objects, Exceptions,
+ * {@see ResponseInterface} objects, Exceptions,
* callables, or Promises.
*
* @param array|null $queue The parameters to be passed to the append function, as an indexed array.
* @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.
* @param callable|null $onRejected Callback to invoke when the return value is rejected.
*/
- public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null)
+ public function __construct(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null)
{
$this->onFulfilled = $onFulfilled;
$this->onRejected = $onRejected;
@@ -200,7 +200,7 @@ public function reset(): void
private function invokeStats(
RequestInterface $request,
array $options,
- ResponseInterface $response = null,
+ ?ResponseInterface $response = null,
$reason = null
): void {
if (isset($options['on_stats'])) {
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
index 61632f56..baae465c 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
@@ -83,8 +83,8 @@ private function invokeStats(
array $options,
RequestInterface $request,
?float $startTime,
- ResponseInterface $response = null,
- \Throwable $error = null
+ ?ResponseInterface $response = null,
+ ?\Throwable $error = null
): void {
if (isset($options['on_stats'])) {
$stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []);
diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
index 6cb12f07..03f9a18f 100644
--- a/vendor/guzzlehttp/guzzle/src/HandlerStack.php
+++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
@@ -44,7 +44,7 @@ class HandlerStack
* handler is provided, the best handler for your
* system will be utilized.
*/
- public static function create(callable $handler = null): self
+ public static function create(?callable $handler = null): self
{
$stack = new self($handler ?: Utils::chooseHandler());
$stack->push(Middleware::httpErrors(), 'http_errors');
@@ -58,7 +58,7 @@ public static function create(callable $handler = null): self
/**
* @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler.
*/
- public function __construct(callable $handler = null)
+ public function __construct(?callable $handler = null)
{
$this->handler = $handler;
}
@@ -131,7 +131,7 @@ public function hasHandler(): bool
* @param callable(callable): callable $middleware Middleware function
* @param string $name Name to register for this middleware.
*/
- public function unshift(callable $middleware, string $name = null): void
+ public function unshift(callable $middleware, ?string $name = null): void
{
\array_unshift($this->stack, [$middleware, $name]);
$this->cached = null;
diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
index 04e9eb37..9b77eee8 100644
--- a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
+++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
@@ -68,7 +68,7 @@ public function __construct(?string $template = self::CLF)
* @param ResponseInterface|null $response Response that was received
* @param \Throwable|null $error Exception that was received
*/
- public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null): string
+ public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string
{
$cache = [];
diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php b/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php
index 47934614..a39ac248 100644
--- a/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php
+++ b/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php
@@ -14,5 +14,5 @@ interface MessageFormatterInterface
* @param ResponseInterface|null $response Response that was received
* @param \Throwable|null $error Exception that was received
*/
- public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null): string;
+ public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string;
}
diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php
index 7e3eb6b3..6edbb3fe 100644
--- a/vendor/guzzlehttp/guzzle/src/Middleware.php
+++ b/vendor/guzzlehttp/guzzle/src/Middleware.php
@@ -55,7 +55,7 @@ static function (ResponseInterface $response) use ($cookieJar, $request): Respon
*
* @return callable(callable): callable Returns a function that accepts the next handler.
*/
- public static function httpErrors(BodySummarizerInterface $bodySummarizer = null): callable
+ public static function httpErrors(?BodySummarizerInterface $bodySummarizer = null): callable
{
return static function (callable $handler) use ($bodySummarizer): callable {
return static function ($request, array $options) use ($handler, $bodySummarizer) {
@@ -132,7 +132,7 @@ static function ($reason) use ($request, &$container, $options) {
*
* @return callable Returns a function that accepts the next handler.
*/
- public static function tap(callable $before = null, callable $after = null): callable
+ public static function tap(?callable $before = null, ?callable $after = null): callable
{
return static function (callable $handler) use ($before, $after): callable {
return static function (RequestInterface $request, array $options) use ($handler, $before, $after) {
@@ -176,7 +176,7 @@ public static function redirect(): callable
*
* @return callable Returns a function that accepts the next handler.
*/
- public static function retry(callable $decider, callable $delay = null): callable
+ public static function retry(callable $decider, ?callable $delay = null): callable
{
return static function (callable $handler) use ($decider, $delay): RetryMiddleware {
return new RetryMiddleware($decider, $handler, $delay);
diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
index a38768c0..84a3500e 100644
--- a/vendor/guzzlehttp/guzzle/src/RequestOptions.php
+++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php
@@ -61,7 +61,7 @@ final class RequestOptions
* Specifies whether or not cookies are used in a request or what cookie
* jar to use or what cookies to send. This option only works if your
* handler has the `cookie` middleware. Valid values are `false` and
- * an instance of {@see \GuzzleHttp\Cookie\CookieJarInterface}.
+ * an instance of {@see Cookie\CookieJarInterface}.
*/
public const COOKIES = 'cookies';
diff --git a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
index 8f4d93ac..65f49cb7 100644
--- a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
+++ b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php
@@ -40,7 +40,7 @@ class RetryMiddleware
* and returns the number of
* milliseconds to delay.
*/
- public function __construct(callable $decider, callable $nextHandler, callable $delay = null)
+ public function __construct(callable $decider, callable $nextHandler, ?callable $delay = null)
{
$this->decider = $decider;
$this->nextHandler = $nextHandler;
@@ -110,7 +110,7 @@ private function onRejected(RequestInterface $req, array $options): callable
};
}
- private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null): PromiseInterface
+ private function doRetry(RequestInterface $request, array $options, ?ResponseInterface $response = null): PromiseInterface
{
$options['delay'] = ($this->delay)(++$options['retries'], $response, $request);
diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php
index 2ce9e38f..93fa334c 100644
--- a/vendor/guzzlehttp/guzzle/src/TransferStats.php
+++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php
@@ -46,8 +46,8 @@ final class TransferStats
*/
public function __construct(
RequestInterface $request,
- ResponseInterface $response = null,
- float $transferTime = null,
+ ?ResponseInterface $response = null,
+ ?float $transferTime = null,
$handlerErrorData = null,
array $handlerStats = []
) {
diff --git a/vendor/guzzlehttp/guzzle/src/Utils.php b/vendor/guzzlehttp/guzzle/src/Utils.php
index 93d6d39c..140cb6fe 100644
--- a/vendor/guzzlehttp/guzzle/src/Utils.php
+++ b/vendor/guzzlehttp/guzzle/src/Utils.php
@@ -71,7 +71,7 @@ public static function debugResource($value = null)
return \STDOUT;
}
- return \GuzzleHttp\Psr7\Utils::tryFopen('php://output', 'w');
+ return Psr7\Utils::tryFopen('php://output', 'w');
}
/**
diff --git a/vendor/guzzlehttp/promises/CHANGELOG.md b/vendor/guzzlehttp/promises/CHANGELOG.md
index c73afb90..707925a0 100644
--- a/vendor/guzzlehttp/promises/CHANGELOG.md
+++ b/vendor/guzzlehttp/promises/CHANGELOG.md
@@ -1,6 +1,13 @@
# CHANGELOG
+## 2.0.3 - 2024-07-18
+
+### Changed
+
+- PHP 8.4 support
+
+
## 2.0.2 - 2023-12-03
### Changed
diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md
index a32d3d29..d1c814fe 100644
--- a/vendor/guzzlehttp/promises/README.md
+++ b/vendor/guzzlehttp/promises/README.md
@@ -38,10 +38,10 @@ composer require guzzlehttp/promises
## Version Guidance
-| Version | Status | PHP Version |
-|---------|------------------------|--------------|
-| 1.x | Bug and security fixes | >=5.5,<8.3 |
-| 2.x | Latest | >=7.2.5,<8.4 |
+| Version | Status | PHP Version |
+|---------|---------------------|--------------|
+| 1.x | Security fixes only | >=5.5,<8.3 |
+| 2.x | Latest | >=7.2.5,<8.5 |
## Quick Start
diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json
index 6c5bdd66..f64ed771 100644
--- a/vendor/guzzlehttp/promises/composer.json
+++ b/vendor/guzzlehttp/promises/composer.json
@@ -30,7 +30,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"autoload": {
"psr-4": {
diff --git a/vendor/guzzlehttp/promises/src/Coroutine.php b/vendor/guzzlehttp/promises/src/Coroutine.php
index 0b5b9c0a..0da02283 100644
--- a/vendor/guzzlehttp/promises/src/Coroutine.php
+++ b/vendor/guzzlehttp/promises/src/Coroutine.php
@@ -84,8 +84,8 @@ public static function of(callable $generatorFn): self
}
public function then(
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
return $this->result->then($onFulfilled, $onRejected);
}
diff --git a/vendor/guzzlehttp/promises/src/Each.php b/vendor/guzzlehttp/promises/src/Each.php
index c09d23c6..dd72c831 100644
--- a/vendor/guzzlehttp/promises/src/Each.php
+++ b/vendor/guzzlehttp/promises/src/Each.php
@@ -23,8 +23,8 @@ final class Each
*/
public static function of(
$iterable,
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled,
@@ -46,8 +46,8 @@ public static function of(
public static function ofLimit(
$iterable,
$concurrency,
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled,
@@ -67,7 +67,7 @@ public static function ofLimit(
public static function ofLimitAll(
$iterable,
$concurrency,
- callable $onFulfilled = null
+ ?callable $onFulfilled = null
): PromiseInterface {
return self::ofLimit(
$iterable,
diff --git a/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/vendor/guzzlehttp/promises/src/FulfilledPromise.php
index ab712965..727ec315 100644
--- a/vendor/guzzlehttp/promises/src/FulfilledPromise.php
+++ b/vendor/guzzlehttp/promises/src/FulfilledPromise.php
@@ -31,8 +31,8 @@ public function __construct($value)
}
public function then(
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
// Return itself if there is no onFulfilled function.
if (!$onFulfilled) {
diff --git a/vendor/guzzlehttp/promises/src/Promise.php b/vendor/guzzlehttp/promises/src/Promise.php
index 1b07bdc9..c0c5be2c 100644
--- a/vendor/guzzlehttp/promises/src/Promise.php
+++ b/vendor/guzzlehttp/promises/src/Promise.php
@@ -25,16 +25,16 @@ class Promise implements PromiseInterface
* @param callable $cancelFn Fn that when invoked cancels the promise.
*/
public function __construct(
- callable $waitFn = null,
- callable $cancelFn = null
+ ?callable $waitFn = null,
+ ?callable $cancelFn = null
) {
$this->waitFn = $waitFn;
$this->cancelFn = $cancelFn;
}
public function then(
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
if ($this->state === self::PENDING) {
$p = new Promise(null, [$this, 'cancel']);
diff --git a/vendor/guzzlehttp/promises/src/PromiseInterface.php b/vendor/guzzlehttp/promises/src/PromiseInterface.php
index 2824802b..c11721e4 100644
--- a/vendor/guzzlehttp/promises/src/PromiseInterface.php
+++ b/vendor/guzzlehttp/promises/src/PromiseInterface.php
@@ -27,8 +27,8 @@ interface PromiseInterface
* @param callable $onRejected Invoked when the promise is rejected.
*/
public function then(
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface;
/**
diff --git a/vendor/guzzlehttp/promises/src/RejectedPromise.php b/vendor/guzzlehttp/promises/src/RejectedPromise.php
index d947da1f..1ebf0b2a 100644
--- a/vendor/guzzlehttp/promises/src/RejectedPromise.php
+++ b/vendor/guzzlehttp/promises/src/RejectedPromise.php
@@ -31,8 +31,8 @@ public function __construct($reason)
}
public function then(
- callable $onFulfilled = null,
- callable $onRejected = null
+ ?callable $onFulfilled = null,
+ ?callable $onRejected = null
): PromiseInterface {
// If there's no onRejected callback then just return self.
if (!$onRejected) {
diff --git a/vendor/guzzlehttp/promises/src/RejectionException.php b/vendor/guzzlehttp/promises/src/RejectionException.php
index 72a81ba2..47dca862 100644
--- a/vendor/guzzlehttp/promises/src/RejectionException.php
+++ b/vendor/guzzlehttp/promises/src/RejectionException.php
@@ -18,7 +18,7 @@ class RejectionException extends \RuntimeException
* @param mixed $reason Rejection reason.
* @param string|null $description Optional description.
*/
- public function __construct($reason, string $description = null)
+ public function __construct($reason, ?string $description = null)
{
$this->reason = $reason;
diff --git a/vendor/guzzlehttp/promises/src/Utils.php b/vendor/guzzlehttp/promises/src/Utils.php
index e1570d72..45b0893f 100644
--- a/vendor/guzzlehttp/promises/src/Utils.php
+++ b/vendor/guzzlehttp/promises/src/Utils.php
@@ -21,7 +21,7 @@ final class Utils
*
* @param TaskQueueInterface|null $assign Optionally specify a new queue instance.
*/
- public static function queue(TaskQueueInterface $assign = null): TaskQueueInterface
+ public static function queue(?TaskQueueInterface $assign = null): TaskQueueInterface
{
static $queue;
diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md
index fe3eda70..fcf1d274 100644
--- a/vendor/guzzlehttp/psr7/CHANGELOG.md
+++ b/vendor/guzzlehttp/psr7/CHANGELOG.md
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## 2.6.3 - 2024-07-18
+
+### Fixed
+
+- Make `StreamWrapper::stream_stat()` return `false` if inner stream's size is `null`
+
+### Changed
+
+- PHP 8.4 support
+
## 2.6.2 - 2023-12-03
### Fixed
diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md
index 850fa9d7..12f96252 100644
--- a/vendor/guzzlehttp/psr7/README.md
+++ b/vendor/guzzlehttp/psr7/README.md
@@ -24,8 +24,8 @@ composer require guzzlehttp/psr7
| Version | Status | PHP Version |
|---------|---------------------|--------------|
-| 1.x | Security fixes only | >=5.4,<8.1 |
-| 2.x | Latest | >=7.2.5,<8.4 |
+| 1.x | EOL (2024-06-30) | >=5.4,<8.2 |
+| 2.x | Latest | >=7.2.5,<8.5 |
## AppendStream
@@ -498,7 +498,7 @@ a message.
## `GuzzleHttp\Psr7\Utils::readLine`
-`public static function readLine(StreamInterface $stream, int $maxLength = null): string`
+`public static function readLine(StreamInterface $stream, ?int $maxLength = null): string`
Read a line from the stream up to the maximum allowed buffer length.
@@ -674,7 +674,7 @@ termed a relative-path reference.
### `GuzzleHttp\Psr7\Uri::isSameDocumentReference`
-`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`
+`public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool`
Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its
fragment component, identical to the base URI. When no base URI is given, only an empty URI reference
diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json
index 70293fc4..28d15f57 100644
--- a/vendor/guzzlehttp/psr7/composer.json
+++ b/vendor/guzzlehttp/psr7/composer.json
@@ -61,8 +61,8 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.36 || ^9.6.15"
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php
index f34722cf..7e4554d5 100644
--- a/vendor/guzzlehttp/psr7/src/CachingStream.php
+++ b/vendor/guzzlehttp/psr7/src/CachingStream.php
@@ -33,7 +33,7 @@ final class CachingStream implements StreamInterface
*/
public function __construct(
StreamInterface $stream,
- StreamInterface $target = null
+ ?StreamInterface $target = null
) {
$this->remoteStream = $stream;
$this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));
diff --git a/vendor/guzzlehttp/psr7/src/HttpFactory.php b/vendor/guzzlehttp/psr7/src/HttpFactory.php
index 73d17e33..3ef15103 100644
--- a/vendor/guzzlehttp/psr7/src/HttpFactory.php
+++ b/vendor/guzzlehttp/psr7/src/HttpFactory.php
@@ -27,10 +27,10 @@ final class HttpFactory implements RequestFactoryInterface, ResponseFactoryInter
{
public function createUploadedFile(
StreamInterface $stream,
- int $size = null,
+ ?int $size = null,
int $error = \UPLOAD_ERR_OK,
- string $clientFilename = null,
- string $clientMediaType = null
+ ?string $clientFilename = null,
+ ?string $clientMediaType = null
): UploadedFileInterface {
if ($size === null) {
$size = $stream->getSize();
diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php
index d23fba8a..43d718f6 100644
--- a/vendor/guzzlehttp/psr7/src/MultipartStream.php
+++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php
@@ -32,7 +32,7 @@ final class MultipartStream implements StreamInterface
*
* @throws \InvalidArgumentException
*/
- public function __construct(array $elements = [], string $boundary = null)
+ public function __construct(array $elements = [], ?string $boundary = null)
{
$this->boundary = $boundary ?: bin2hex(random_bytes(20));
$this->stream = $this->createStream($elements);
diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php
index 00f16e2d..34e612fd 100644
--- a/vendor/guzzlehttp/psr7/src/Response.php
+++ b/vendor/guzzlehttp/psr7/src/Response.php
@@ -96,7 +96,7 @@ public function __construct(
array $headers = [],
$body = null,
string $version = '1.1',
- string $reason = null
+ ?string $reason = null
) {
$this->assertStatusCodeRange($status);
diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
index ae853881..77b04d74 100644
--- a/vendor/guzzlehttp/psr7/src/StreamWrapper.php
+++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
@@ -69,7 +69,7 @@ public static function register(): void
}
}
- public function stream_open(string $path, string $mode, int $options, string &$opened_path = null): bool
+ public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool
{
$options = stream_context_get_options($this->context);
@@ -136,10 +136,14 @@ public function stream_cast(int $cast_as)
* ctime: int,
* blksize: int,
* blocks: int
- * }
+ * }|false
*/
- public function stream_stat(): array
+ public function stream_stat()
{
+ if ($this->stream->getSize() === null) {
+ return false;
+ }
+
static $modeMap = [
'r' => 33060,
'rb' => 33060,
diff --git a/vendor/guzzlehttp/psr7/src/UploadedFile.php b/vendor/guzzlehttp/psr7/src/UploadedFile.php
index b2671993..9c9ea49f 100644
--- a/vendor/guzzlehttp/psr7/src/UploadedFile.php
+++ b/vendor/guzzlehttp/psr7/src/UploadedFile.php
@@ -64,8 +64,8 @@ public function __construct(
$streamOrFile,
?int $size,
int $errorStatus,
- string $clientFilename = null,
- string $clientMediaType = null
+ ?string $clientFilename = null,
+ ?string $clientMediaType = null
) {
$this->setError($errorStatus);
$this->size = $size;
diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php
index f1feee87..481dfca9 100644
--- a/vendor/guzzlehttp/psr7/src/Uri.php
+++ b/vendor/guzzlehttp/psr7/src/Uri.php
@@ -279,7 +279,7 @@ public static function isRelativePathReference(UriInterface $uri): bool
*
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4
*/
- public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool
+ public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool
{
if ($base !== null) {
$uri = UriResolver::resolve($base, $uri);
diff --git a/vendor/guzzlehttp/psr7/src/Utils.php b/vendor/guzzlehttp/psr7/src/Utils.php
index bf5ea9db..b81dab35 100644
--- a/vendor/guzzlehttp/psr7/src/Utils.php
+++ b/vendor/guzzlehttp/psr7/src/Utils.php
@@ -231,7 +231,7 @@ public static function modifyRequest(RequestInterface $request, array $changes):
* @param StreamInterface $stream Stream to read from
* @param int|null $maxLength Maximum buffer length
*/
- public static function readLine(StreamInterface $stream, int $maxLength = null): string
+ public static function readLine(StreamInterface $stream, ?int $maxLength = null): string
{
$buffer = '';
$size = 0;
diff --git a/vendor/mck89/peast/composer.json b/vendor/mck89/peast/composer.json
index d343493e..7a7e9912 100644
--- a/vendor/mck89/peast/composer.json
+++ b/vendor/mck89/peast/composer.json
@@ -27,7 +27,7 @@
},
"extra": {
"branch-alias": {
- "dev-master": "1.16.2-dev"
+ "dev-master": "1.16.3-dev"
}
}
}
diff --git a/vendor/mck89/peast/doc/changelog.md b/vendor/mck89/peast/doc/changelog.md
index e6d7a95c..81cfb8d5 100644
--- a/vendor/mck89/peast/doc/changelog.md
+++ b/vendor/mck89/peast/doc/changelog.md
@@ -1,6 +1,9 @@
Changelog
==========
+#### 1.16.3
+* Removed implicitly nullable parameter declarations for PHP 8.4 compatibility
+
#### 1.16.2
* Fixed bug where a regex that started with `/=` raised a syntax error
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Matches.php b/vendor/mck89/peast/lib/Peast/Selector/Matches.php
index b3f64dff..2afa70ba 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Matches.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Matches.php
@@ -41,7 +41,7 @@ public function __construct($matches = array())
* @param Node $node
* @param Node|null $parent
*/
- public function addMatch(Node $node, Node $parent = null)
+ public function addMatch(Node $node, $parent = null)
{
$this->matches[] = array($node, $parent);
}
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Attribute.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Attribute.php
index 419d6332..27a489de 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Attribute.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Attribute.php
@@ -135,7 +135,7 @@ public function setRegex($regex)
*
* @return bool
*/
- public function check(Node $node, Node $parent = null)
+ public function check(Node $node, $parent = null)
{
$attr = $node;
foreach ($this->names as $name) {
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Part.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Part.php
index e53f083a..7256d881 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Part.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Part.php
@@ -43,5 +43,5 @@ public function getPriority()
*
* @abstract
*/
- abstract public function check(Node $node, Node $parent = null);
+ abstract public function check(Node $node, $parent = null);
}
\ No newline at end of file
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoIndex.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoIndex.php
index 952c9193..6bd3e769 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoIndex.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoIndex.php
@@ -75,7 +75,7 @@ public function setOffset($offset)
*
* @return bool
*/
- public function check(Node $node, Node $parent = null)
+ public function check(Node $node, $parent = null)
{
$props = Utils::getExpandedNodeProperties($parent);
$count = count($props);
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSelector.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSelector.php
index 966568e0..dd9532a5 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSelector.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSelector.php
@@ -56,7 +56,7 @@ public function setSelector(Selector $selector)
*
* @return bool
*/
- public function check(Node $node, Node $parent = null)
+ public function check(Node $node, $parent = null)
{
$match = new Matches();
$match->addMatch($node, $parent);
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSimple.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSimple.php
index dcf48603..38eb3d91 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSimple.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/PseudoSimple.php
@@ -39,7 +39,7 @@ class PseudoSimple extends Pseudo
*
* @return bool
*/
- public function check(Node $node, Node $parent = null)
+ public function check(Node $node, $parent = null)
{
switch ($this->name) {
case "pattern":
diff --git a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Type.php b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Type.php
index ffb64c40..487f634b 100644
--- a/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Type.php
+++ b/vendor/mck89/peast/lib/Peast/Selector/Node/Part/Type.php
@@ -47,7 +47,7 @@ public function setType($type)
*
* @return bool
*/
- public function check(Node $node, Node $parent = null)
+ public function check(Node $node, $parent = null)
{
return $node->getType() === $this->type;
}
diff --git a/vendor/mck89/peast/lib/Peast/Syntax/CommentsRegistry.php b/vendor/mck89/peast/lib/Peast/Syntax/CommentsRegistry.php
index 5fa46e03..f5ca0a01 100644
--- a/vendor/mck89/peast/lib/Peast/Syntax/CommentsRegistry.php
+++ b/vendor/mck89/peast/lib/Peast/Syntax/CommentsRegistry.php
@@ -107,7 +107,7 @@ public function onScannerResetState(&$state)
*
* @return void
*/
- public function onTokenConsumed(Token $token = null)
+ public function onTokenConsumed($token = null)
{
//Check if it's a comment
if ($token && $token->type === Token::TYPE_COMMENT) {
diff --git a/vendor/mck89/peast/lib/Peast/Syntax/Scanner.php b/vendor/mck89/peast/lib/Peast/Syntax/Scanner.php
index 890753cd..86678b3d 100644
--- a/vendor/mck89/peast/lib/Peast/Syntax/Scanner.php
+++ b/vendor/mck89/peast/lib/Peast/Syntax/Scanner.php
@@ -614,7 +614,7 @@ public function getPosition($scanPosition = false)
*
* @return $this
*/
- public function setScanPosition(Position $position = null)
+ public function setScanPosition(Position $position)
{
$this->line = $position->getLine();
$this->column = $position->getColumn();
diff --git a/vendor/mglaman/phpstan-drupal/.circleci/config.yml b/vendor/mglaman/phpstan-drupal/.circleci/config.yml
new file mode 100644
index 00000000..cba47814
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.circleci/config.yml
@@ -0,0 +1,148 @@
+version: 2.1
+defaults: &defaults
+ docker:
+ - image: circleci/php:7.4-cli
+ working_directory: ~/repo
+aliases:
+ - &composer-cache
+ v4-composer-cache
+commands:
+ start-project:
+ steps:
+ - run: sudo apt-get update && sudo apt-get install -y libpng-dev libjpeg62-turbo-dev
+ - run:
+ name: Install PHP Extensions
+ command: sudo docker-php-ext-install gd
+ - run:
+ name: Disable Xdebug PHP extension
+ command: sudo rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
+ - checkout
+ - restore_cache:
+ keys:
+ - *composer-cache
+ install-dependencies:
+ steps:
+ - run: composer install -n --prefer-dist
+ - save_cache:
+ key: *composer-cache
+ paths:
+ - ~/.composer/cache
+ create-drupal-project:
+ parameters:
+ project:
+ type: string
+ default: 'drupal/recommended-project:^9.0@alpha'
+ steps:
+ - run: composer create-project << parameters.project >> /tmp/drupal --no-interaction --prefer-dist --ignore-platform-reqs
+ - run: composer require zaporylie/composer-drupal-optimizations:^1.1 --dev --working-dir=/tmp/drupal
+ local-require:
+ steps:
+ - run:
+ name: Add as local
+ command: |
+ cd /tmp/drupal
+ composer require --dev drupal/core-dev:^9.0
+ composer config repositories.1 '{"type": "path", "url": "'${CIRCLE_WORKING_DIRECTORY}'", "options": { "symlink": false }}'
+ composer require --dev mglaman/phpstan-drupal "*" phpstan/extension-installer
+ cat composer.json
+ cp ~/repo/tests/fixtures/config/drupal-phpstan.neon /tmp/drupal/phpstan.neon
+ ./vendor/bin/phpstan --version
+jobs:
+ build:
+ <<: *defaults
+ steps:
+ - start-project
+ - install-dependencies
+ - run:
+ name: phpspec/prophecy-phpunit fix
+ command: composer require --dev phpspec/prophecy-phpunit:^2
+ - run:
+ name: CodeSniffer
+ command: ./vendor/bin/phpcs src
+ - run:
+ name: PHPStan Analyze
+ command: php -dmemory_limit=-1 vendor/bin/phpstan.phar
+ - run:
+ name: PHPUnit
+ command: ./vendor/bin/phpunit
+ test_drupal:
+ <<: *defaults
+ steps:
+ - start-project
+ - create-drupal-project:
+ project: 'drupal/legacy-project:^9.0'
+ - local-require
+ - run:
+ name: Run against a file
+ command: |
+ cd /tmp/drupal
+ ./vendor/bin/phpstan analyze core/install.php --debug
+ - run:
+ name: Run against a module
+ command: |
+ cd /tmp/drupal
+ ./vendor/bin/phpstan analyze --memory-limit=256M core/modules/dynamic_page_cache --debug
+ test_drupal_project:
+ <<: *defaults
+ steps:
+ - start-project
+ - create-drupal-project
+ - local-require
+ - run:
+ name: Run against a file
+ command: |
+ cd /tmp/drupal
+ ./vendor/bin/phpstan analyze web/core/install.php --debug
+ - run:
+ name: Run against a module
+ command: |
+ cd /tmp/drupal
+ ./vendor/bin/phpstan analyze --memory-limit=256M web/core/modules/dynamic_page_cache --debug
+ test_upgrade_status:
+ <<: *defaults
+ steps:
+ - start-project
+ - create-drupal-project:
+ project: 'drupal/legacy-project:^9@alpha'
+ - local-require
+ # Composer constraints prevent requiring via compser, but this helps test drupalci's phpstan build step as well.
+ - run:
+ name: Add upgrade_status
+ command: |
+ cd /tmp/drupal
+ composer require phpstan/phpstan-deprecation-rules drupal/git_deploy
+ curl -L https://ftp.drupal.org/files/projects/upgrade_status-8.x-1.x-dev.tar.gz | tar -zx -C /tmp/drupal/modules
+ - run:
+ name: Start builtin
+ command: php -S 127.0.0.1:8080 -t /tmp/drupal
+ background: true
+ - run:
+ name: Wait for web server
+ command: dockerize -wait http://127.0.0.1:8080 -timeout 120s
+ - run:
+ name: Upgrade Status PHPUnit
+ command: |
+ cp ~/repo/tests/fixtures/config/circleci-phpunit.xml /tmp/drupal/core/phpunit.xml
+ cd /tmp/drupal
+ ./vendor/bin/phpunit -c core modules/upgrade_status --debug --stop-on-failure
+workflows:
+ version: 2
+ tests:
+ jobs:
+ - build
+ - test_drupal
+ - test_drupal_project
+ # - test_upgrade_status
+ weekly:
+ triggers:
+ - schedule:
+ # Every thursday to run soon after patch and security updates on wednesdays.
+ cron: "0 0 * * 4"
+ filters:
+ branches:
+ only:
+ - master
+ jobs:
+ - build
+ - test_drupal
+ - test_drupal_project
diff --git a/vendor/mglaman/phpstan-drupal/.circleci/generate-local-config.sh b/vendor/mglaman/phpstan-drupal/.circleci/generate-local-config.sh
new file mode 100755
index 00000000..204120d9
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.circleci/generate-local-config.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+# Note: must be run from the root of the project.
+circleci config process .circleci/config.yml > .circleci/config_local.yml
diff --git a/vendor/mglaman/phpstan-drupal/.circleci/run-local-config.sh b/vendor/mglaman/phpstan-drupal/.circleci/run-local-config.sh
new file mode 100755
index 00000000..5555487a
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.circleci/run-local-config.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+# Note: must be run from the root of the project.
+source .circleci/generate-local-config.sh
+circleci local execute --job ${1:-build} --config .circleci/config_local.yml
diff --git a/vendor/mglaman/phpstan-drupal/.editorconfig b/vendor/mglaman/phpstan-drupal/.editorconfig
new file mode 100644
index 00000000..304c687c
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.editorconfig
@@ -0,0 +1,18 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# PHP PSR-2 Coding Standards
+# http://www.php-fig.org/psr/psr-2/
+
+root = true
+
+[*.php]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
+
+[*.neon]
+indent_style = tab
diff --git a/vendor/mglaman/phpstan-drupal/.github/FUNDING.yml b/vendor/mglaman/phpstan-drupal/.github/FUNDING.yml
new file mode 100644
index 00000000..92ae83bf
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: mglaman
+patreon: # Replace with a single Patreon username
+open_collective: phpstan-drupal
+tidelift: "packagist/mglaman/phpstan-drupal"
+ko_fi: #
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: #
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000..90167445
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,19 @@
+---
+name: Bug report
+about: Something isn't working right
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+# Bug report
+
+
+
+
+
+
+### Code snippet that reproduces the problem
+
+
diff --git a/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/config.yml b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000..8e534bc2
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,4 @@
+contact_links:
+ - name: Support question ❓
+ url: https://github.com/mglaman/phpstan-drupal/discussions/new/choose
+ about: Please open a new discussion instead. Thank you.
diff --git a/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000..92137d02
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,12 @@
+---
+name: Feature request
+about: It'd be great if...
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+# Feature request
+
+
diff --git a/vendor/mglaman/phpstan-drupal/.github/SECURITY.md b/vendor/mglaman/phpstan-drupal/.github/SECURITY.md
new file mode 100644
index 00000000..da9c516d
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/SECURITY.md
@@ -0,0 +1,5 @@
+## Security contact information
+
+To report a security vulnerability, please use the
+[Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
diff --git a/vendor/mglaman/phpstan-drupal/.github/dependabot.yml b/vendor/mglaman/phpstan-drupal/.github/dependabot.yml
new file mode 100644
index 00000000..5ace4600
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/vendor/mglaman/phpstan-drupal/.github/workflows/php.yml b/vendor/mglaman/phpstan-drupal/.github/workflows/php.yml
new file mode 100644
index 00000000..2d5b830e
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/workflows/php.yml
@@ -0,0 +1,270 @@
+name: Tests
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: 0 0 * * *
+
+jobs:
+ lint:
+ runs-on: "ubuntu-latest"
+ name: "Linting | PHP ${{ matrix.php-version }}"
+ strategy:
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, gd
+ - name: "Downgrade drupal/core to ^9"
+ run: "composer require drupal/core-recommended:^9 --with-all-dependencies --dev --no-update"
+ if: ${{ matrix.php-version == '7.4' }}
+ - name: "Add phpspec/prophecy-phpunit"
+ run: "composer require phpspec/prophecy-phpunit:^2 --dev --no-update"
+ if: ${{ matrix.php-version == '7.4' }}
+ - name: "Install dependencies"
+ uses: "ramsey/composer-install@v3"
+ - name: "PHPCS"
+ run: "php vendor/bin/phpcs"
+ - name: "PHPStan"
+ run: "php vendor/bin/phpstan analyze"
+ tests:
+ continue-on-error: ${{ matrix.experimental }}
+ runs-on: "ubuntu-latest"
+ name: "Tests | PHP ${{ matrix.php-version }} | Drupal ${{ matrix.drupal }}"
+ strategy:
+ matrix:
+ experimental: [false]
+ php-version:
+ - "8.1"
+ - "8.2"
+ drupal:
+ - "^10"
+ include:
+ - php-version: "7.4"
+ drupal: "^9.0"
+ experimental: false
+ - php-version: "8.0"
+ drupal: "^9.0"
+ experimental: false
+ - php-version: "8.3"
+ drupal: "11.x-dev"
+ experimental: true
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "xdebug"
+ php-version: "${{ matrix.php-version }}"
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, gd
+ - name: "Set drupal/core to ${{ matrix.drupal }}"
+ run: "composer require drupal/core-recommended:${{ matrix.drupal }} --with-all-dependencies --dev --no-update"
+ - name: "Add phpspec/prophecy-phpunit"
+ run: "composer require phpspec/prophecy-phpunit:^2 --dev --no-update"
+ if: ${{ matrix.drupal == '^9.0' }}
+ - name: "Install dependencies"
+ uses: "ramsey/composer-install@v3"
+ - name: "PHPUnit"
+ run: "php vendor/bin/phpunit"
+
+ build_integration:
+ needs:
+ - lint
+ - tests
+ continue-on-error: ${{ matrix.experimental }}
+ runs-on: "ubuntu-latest"
+ name: "Build Integration | PHP ${{ matrix.php-version }} | Drupal ${{ matrix.drupal }}"
+ strategy:
+ matrix:
+ experimental: [false]
+ php-version:
+ - "8.1"
+ - "8.2"
+ drupal:
+ - "^10"
+ include:
+ - php-version: "8.0"
+ drupal: "^9.0"
+ experimental: false
+ - php-version: "8.3"
+ drupal: "11.x-dev"
+ experimental: true
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, bcmath, gd, exif, iconv
+ - name: Setup Drupal
+ uses: bluehorndigital/setup-drupal@v1.1.0
+ with:
+ version: ${{ matrix.drupal }}
+ path: ~/drupal
+ - name: "set the version alias for self"
+ run: |
+ if [ "${{ github.event_name }}" == 'pull_request' ]; then
+ echo "VERSION_ALIAS=dev-"${{ github.sha }}"" >> $GITHUB_OUTPUT
+ else
+ echo "VERSION_ALIAS=dev-main" >> $GITHUB_OUTPUT
+ fi
+ id: branch_alias
+ - name: "require phpstan-drupal"
+ run: |
+ cd ~/drupal
+ COMPOSER_MEMORY_LIMIT=-1 composer require mglaman/phpstan-drupal "${{ steps.branch_alias.outputs.VERSION_ALIAS }} as 1.2.99" phpstan/extension-installer --with-all-dependencies
+ cp $GITHUB_WORKSPACE/tests/fixtures/config/drupal-phpstan.neon phpstan.neon
+ - name: "Test core/install.php"
+ run: |
+ cd ~/drupal
+ ./vendor/bin/phpstan analyze web/core/install.php --debug
+ - name: "Test BrowserTestBase is autoloaded"
+ run: |
+ cd ~/drupal
+ ./vendor/bin/phpstan analyze web/core/modules/dynamic_page_cache | grep -q "Class Drupal\Tests\BrowserTestBase not found and could not be autoloaded." && false || true
+ - name: "Verify test fixtures are ignored."
+ run: |
+ cd ~/drupal
+ ./vendor/bin/phpstan analyze web/core/modules/migrate_drupal --no-progress | grep -q "tests/fixtures" && false || true
+ - name: 'Check "Cannot redeclare token_theme() due to blazy_test.module"'
+ if: ${{ matrix.drupal != '11.x-dev' }}
+ run: |
+ cd ~/drupal
+ COMPOSER_MEMORY_LIMIT=-1 composer require drupal/token drupal/blazy
+ ./vendor/bin/phpstan analyze web/modules/contrib/blazy --no-progress || if (($? == 255)); then false; else true; fi
+ COMPOSER_MEMORY_LIMIT=-1 composer remove drupal/token drupal/blazy
+ - name: 'Check "Cannot redeclare video_embed_media_media_bundle_insert()"'
+ if: ${{ matrix.drupal != '11.x-dev' }}
+ run: |
+ cd ~/drupal
+ COMPOSER_MEMORY_LIMIT=-1 composer require drupal/video_embed_field drupal/slick
+ ./vendor/bin/phpstan analyze web/modules/contrib --no-progress || if (($? == 255)); then false; else true; fi
+ COMPOSER_MEMORY_LIMIT=-1 composer remove drupal/video_embed_field drupal/slick
+ build_integration_no_phpunit:
+ needs:
+ - lint
+ - tests
+ continue-on-error: ${{ matrix.experimental }}
+ runs-on: "ubuntu-latest"
+ name: "Build Integration (No PHPUnit) | PHP ${{ matrix.php-version }} | Drupal ${{ matrix.drupal }}"
+ strategy:
+ matrix:
+ experimental: [false]
+ php-version:
+ - "8.1"
+ - "8.2"
+ drupal:
+ - "^10"
+ include:
+ - php-version: "8.0"
+ drupal: "^9.0"
+ experimental: false
+ - php-version: "8.3"
+ drupal: "11.x-dev"
+ experimental: true
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, bcmath, gd, exif, iconv
+ - name: Setup Drupal
+ uses: bluehorndigital/setup-drupal@v1.1.0
+ with:
+ version: ${{ matrix.drupal }}
+ path: ~/drupal
+ - name: "Remove PHPUnit"
+ run: |
+ cd ~/drupal
+ composer --dev remove phpspec/prophecy-phpunit drupal/core-dev
+ - name: "require phpstan-drupal"
+ run: |
+ cd ~/drupal
+ COMPOSER_MEMORY_LIMIT=-1 composer require mglaman/phpstan-drupal *@dev
+ cp $GITHUB_WORKSPACE/tests/fixtures/config/drupal-no-dev-phpstan.neon phpstan.neon
+ - name: "Test core/install.php"
+ run: |
+ cd ~/drupal
+ ./vendor/bin/phpstan analyze web/core/install.php --debug
+ - name: "Test no crash"
+ run: |
+ cd ~/drupal
+ ./vendor/bin/phpstan analyze web/core/modules/dynamic_page_cache --debug
+
+ core_baseline:
+ needs:
+ - lint
+ - tests
+ continue-on-error: true
+ runs-on: "ubuntu-latest"
+ name: "Drupal core HEAD baseline check"
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "set the version alias for self"
+ run: |
+ if [ "${{ github.event_name }}" == 'pull_request' ]; then
+ echo "VERSION_ALIAS=dev-"${{ github.sha }}"" >> $GITHUB_OUTPUT
+ else
+ echo "VERSION_ALIAS=dev-main" >> $GITHUB_OUTPUT
+ fi
+ id: branch_alias
+ - name: determine phpstan cache directory
+ run: echo PHPSTAN_TMP_DIR=$(php -r "print sys_get_temp_dir() . '/phpstan';") >> $GITHUB_OUTPUT
+ id: phpstan_tmp_dir
+ - name: cache phpstan
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.phpstan_tmp_dir.outputs.PHPSTAN_TMP_DIR }}
+ key: ${{ runner.os }}-phpstan-core-baseline
+ restore-keys: ${{ runner.os }}-phpstan-core-baseline
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, gd, apcu
+ - name: "Checkout Drupal core"
+ run: |
+ cd ${{ runner.temp }}
+ git clone https://git.drupalcode.org/project/drupal.git
+ cd drupal
+ composer config repositories.0 composer https://packages.drupal.org/8
+ composer config repositories.1 path $GITHUB_WORKSPACE
+
+ - name: "Install Drupal core dependencies"
+ uses: "ramsey/composer-install@v3"
+ with:
+ working-directory: "${{ runner.temp }}/drupal"
+ - name: "require phpstan-drupal"
+ run: |
+ cd ${{ runner.temp }}/drupal
+ composer require --dev mglaman/phpstan-drupal "${{ steps.branch_alias.outputs.VERSION_ALIAS }} as 1.1.99" --with-all-dependencies
+ - name: "Check baseline"
+ run: |
+ cd ${{ runner.temp }}/drupal
+ ./vendor/bin/phpstan analyze --configuration=core/phpstan.neon.dist
diff --git a/vendor/mglaman/phpstan-drupal/.github/workflows/phpstan-dev.yml b/vendor/mglaman/phpstan-drupal/.github/workflows/phpstan-dev.yml
new file mode 100644
index 00000000..a168f59e
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/workflows/phpstan-dev.yml
@@ -0,0 +1,37 @@
+name: PHPStan other versions
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: 0 0 * * *
+jobs:
+ dev:
+ runs-on: "ubuntu-latest"
+ name: "PHPStan ${{ matrix.phpstan }}"
+ strategy:
+ matrix:
+ phpstan:
+ - '1.10.x-dev'
+ - '1.11.x-dev'
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v4"
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: 8.1
+ tools: composer:v2
+ extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, gd
+ - name: "Bump PHPStan"
+ run: "composer require --no-update phpstan/phpstan:${{ matrix.phpstan }}"
+ - name: "Add phpspec/prophecy-phpunit"
+ run: "composer require phpspec/prophecy-phpunit:^2 --dev --no-update"
+ - name: "Install dependencies"
+ run: "composer update --no-progress --prefer-dist"
+ - name: "PHPStan"
+ run: "php vendor/bin/phpstan analyze"
+ - name: "PHPUnit"
+ run: "php vendor/bin/phpunit"
diff --git a/vendor/mglaman/phpstan-drupal/.github/workflows/release-post.yml b/vendor/mglaman/phpstan-drupal/.github/workflows/release-post.yml
new file mode 100644
index 00000000..29da146f
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/workflows/release-post.yml
@@ -0,0 +1,24 @@
+name: Post release
+
+# More triggers
+# https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#release
+on:
+ release:
+ types: [published]
+
+jobs:
+ tweet:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: Eomm/why-don-t-you-tweet@v1
+ if: ${{ !github.event.repository.private }}
+ with:
+ # GitHub event payload
+ # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release
+ tweet-message: "New release: phpstan-drupal ${{ github.event.release.tag_name }} ${{ github.event.release.html_url }} #drupal"
+ env:
+ # Get your tokens from https://developer.twitter.com/apps
+ TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
+ TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
+ TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
+ TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
diff --git a/vendor/mglaman/phpstan-drupal/.github/workflows/release-toot.yml b/vendor/mglaman/phpstan-drupal/.github/workflows/release-toot.yml
new file mode 100644
index 00000000..3b253370
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/.github/workflows/release-toot.yml
@@ -0,0 +1,21 @@
+name: Toot release
+
+# More triggers
+# https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#release
+on:
+ release:
+ types: [published]
+
+jobs:
+ toot:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: cbrgm/mastodon-github-action@v2
+ if: ${{ !github.event.repository.private }}
+ with:
+ # GitHub event payload
+ # https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#release
+ message: "New release: phpstan-drupal ${{ github.event.release.tag_name }} ${{ github.event.release.html_url }} #drupal"
+ env:
+ MASTODON_URL: https://phpc.social
+ MASTODON_ACCESS_TOKEN: ${{ secrets.MASTODON_ACCESS_TOKEN }}
diff --git a/vendor/mglaman/phpstan-drupal/CODE_OF_CONDUCT.md b/vendor/mglaman/phpstan-drupal/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..d86e6734
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+matt@mglaman.dev.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/vendor/mglaman/phpstan-drupal/LICENSE b/vendor/mglaman/phpstan-drupal/LICENSE
new file mode 100644
index 00000000..d8510250
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Matt Glaman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/mglaman/phpstan-drupal/README.md b/vendor/mglaman/phpstan-drupal/README.md
new file mode 100644
index 00000000..d108716d
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/README.md
@@ -0,0 +1,236 @@
+# phpstan-drupal
+
+[![Tests](https://github.com/mglaman/phpstan-drupal/actions/workflows/php.yml/badge.svg)](https://github.com/mglaman/phpstan-drupal/actions/workflows/php.yml) [![CircleCI](https://circleci.com/gh/mglaman/phpstan-drupal.svg?style=svg)](https://circleci.com/gh/mglaman/phpstan-drupal)
+
+Extension for [PHPStan](https://phpstan.org/) to allow analysis of Drupal code.
+
+PHPStan is able to [discover symbols](https://phpstan.org/user-guide/discovering-symbols) by using autoloading provided
+by Composer. However, Drupal does not provide autoloading information for modules and themes. This project registers
+those namespaces so that PHPStan can properly discover symbols in your Drupal code base automatically.
+
+## Sponsors
+
+
+
+[Would you like to sponsor?](https://github.com/sponsors/mglaman)
+
+## Usage
+
+When you are using [`phpstan/extension-installer`](https://github.com/phpstan/extension-installer), `phpstan.neon` will be automatically included.
+
+
+ Manual installation
+
+If you don't want to use `phpstan/extension-installer`, include `extension.neon` in your project's PHPStan config:
+
+```
+includes:
+ - vendor/mglaman/phpstan-drupal/extension.neon
+```
+
+To include Drupal specific analysis rules, include this file:
+
+```
+includes:
+ - vendor/mglaman/phpstan-drupal/rules.neon
+```
+
+
+## Getting help
+
+Ask for assistance in the [discussions](https://github.com/mglaman/phpstan-drupal/discussions) or [#phpstan](https://drupal.slack.com/archives/C033S2JUMLJ) channel on Drupal Slack.
+
+## Excluding tests from analysis
+
+To exclude tests from analysis, add the following parameter
+
+```
+parameters:
+ excludePaths:
+ - *Test.php
+ - *TestBase.php
+```
+
+## Deprecation testing
+
+This project depends on `phpstan/phpstan-deprecation-rules` which adds deprecation rules. We provide Drupal-specific
+deprecated scope resolvers.
+
+To only handle deprecation testing, use a `phpstan.neon` like this:
+
+```
+parameters:
+ customRulesetUsed: true
+ reportUnmatchedIgnoredErrors: false
+ # Ignore phpstan-drupal extension's rules.
+ ignoreErrors:
+ - '#\Drupal calls should be avoided in classes, use dependency injection instead#'
+ - '#Plugin definitions cannot be altered.#'
+ - '#Missing cache backend declaration for performance.#'
+ - '#Plugin manager has cache backend specified but does not declare cache tags.#'
+includes:
+ - vendor/mglaman/phpstan-drupal/extension.neon
+ - vendor/phpstan/phpstan-deprecation-rules/rules.neon
+```
+
+To disable deprecation rules while using `phpstan/extension-installer`, you can do the following:
+
+```json
+{
+ "extra": {
+ "phpstan/extension-installer": {
+ "ignore": [
+ "phpstan/phpstan-deprecation-rules"
+ ]
+ }
+ }
+}
+```
+
+See the `extension-installer` documentation for more information: https://github.com/phpstan/extension-installer#ignoring-a-particular-extension
+
+## Adapting to your project
+
+### Customizing rules
+
+#### Disabling checks for extending `@internal` classes
+
+You can disable the `ClassExtendsInternalClassRule` rule by adding the following to your `phpstan.neon`:
+
+```neon
+parameters:
+ drupal:
+ rules:
+ classExtendsInternalClassRule: false
+```
+
+### Specifying your Drupal project's root
+
+By default, the PHPStan Drupal extension will try to determine your Drupal project's root directory based on the working
+directory that PHPStan is checking. If this is not working properly, you can explicitly define the Drupal project's root
+directory using the `drupal.drupal_root` parameter.
+
+```
+parameters:
+ drupal:
+ drupal_root: /path/to/drupal
+```
+
+You can also use container parameters. For instance you can always set it to the current working directory.
+
+```
+parameters:
+ drupal:
+ drupal_root: %currentWorkingDirectory%
+```
+
+### Entity storage mappings.
+
+The `EntityTypeManagerGetStorageDynamicReturnTypeExtension` service helps map dynamic return types. This inspects the
+passed entity type ID and tries to return a known storage class, besides the default `EntityStorageInterface`. The
+default mapping can be found in `extension.neon`. For example:
+
+```
+parameters:
+ drupal:
+ entityMapping:
+ block:
+ class: Drupal\block\Entity\Block
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+ node:
+ class: Drupal\node\Entity\Node
+ storage: Drupal\node\NodeStorage
+ taxonomy_term:
+ class: Drupal\taxonomy\Entity\Term
+ storage: Drupal\taxonomy\TermStorage
+ user:
+ class: Drupal\user\Entity\User
+ storage: Drupal\user\UserStorage
+```
+
+To add support for custom entities, you may add the same definition in your project's `phpstan.neon`. See the following
+example for adding a mapping for Search API:
+
+```
+parameters:
+ drupal:
+ entityMapping:
+ search_api_index:
+ class: Drupal\search_api\Entity\Index
+ storage: Drupal\search_api\Entity\SearchApiConfigEntityStorage
+ search_api_server:
+ class: Drupal\search_api\Entity\Server
+ storage: Drupal\search_api\Entity\SearchApiConfigEntityStorage
+```
+
+Similarly, the `EntityStorageDynamicReturnTypeExtension` service helps to determine the type of the entity which is
+loaded, created etc.. when using an entity storage.
+For instance when using
+
+```php
+$node = \Drupal::entityTypeManager()->getStorage('node')->create(['type' => 'page', 'title' => 'foo']);
+```
+
+It helps with knowing the type of the `$node` variable is `Drupal\node\Entity\Node`.
+
+The default mapping can be found in `extension.neon`:
+
+```neon
+parameters:
+ drupal:
+ entityMapping:
+ block:
+ class: Drupal\block\Entity\Block
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+ node:
+ class: Drupal\node\Entity\Node
+ storage: Drupal\node\NodeStorage
+ taxonomy_term:
+ class: Drupal\taxonomy\Entity\Term
+ storage: Drupal\taxonomy\TermStorage
+ user:
+ class: Drupal\user\Entity\User
+ storage: Drupal\user\UserStorage
+```
+
+To add support for custom entities, you may add the same definition in your project's `phpstan.neon` likewise.
+
+### Providing entity type mappings for a contrib module
+
+Contributed modules can provide their own mapping that can be automatically registered with a user's code base when
+they use the `phpstan/extension-installer`. The extension installer scans installed package's `composer.json` for a
+value in `extra.phpstan`. This will automatically bundle the defined include that contains an entity mapping
+configuration.
+
+For example, the Paragraphs module could have the following `entity_mapping.neon` file:
+
+```neon
+parameters:
+ entityMapping:
+ paragraph:
+ class: Drupal\paragraphs\Entity\Paragraph
+ paragraphs_type:
+ class: Drupal\paragraphs\Entity\ParagraphsType
+```
+
+Then in the `composer.json` for Paragraphs, the `entity_mapping.neon` would be provided as a PHPStan include
+
+```json
+{
+ "name": "drupal/paragraphs",
+ "description": "Enables the creation of Paragraphs entities.",
+ "type": "drupal-module",
+ "license": "GPL-2.0-or-later",
+ "require": {
+ "drupal/entity_reference_revisions": "~1.3"
+ },
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "entity_mapping.neon"
+ ]
+ }
+ }
+}
+
+```
diff --git a/vendor/mglaman/phpstan-drupal/bleedingEdge.neon b/vendor/mglaman/phpstan-drupal/bleedingEdge.neon
new file mode 100644
index 00000000..78ddf140
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/bleedingEdge.neon
@@ -0,0 +1,8 @@
+parameters:
+ drupal:
+ bleedingEdge:
+ checkDeprecatedHooksInApiFiles: true
+ rules:
+ testClassSuffixNameRule: true
+ dependencySerializationTraitPropertyRule: true
+ accessResultConditionRule: true
diff --git a/vendor/mglaman/phpstan-drupal/composer.json b/vendor/mglaman/phpstan-drupal/composer.json
new file mode 100644
index 00000000..5f305512
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/composer.json
@@ -0,0 +1,78 @@
+{
+ "name": "mglaman/phpstan-drupal",
+ "description": "Drupal extension and rules for PHPStan",
+ "license": "MIT",
+ "type": "phpstan-extension",
+ "authors": [
+ {
+ "name": "Matt Glaman",
+ "email": "nmd.matt@gmail.com"
+ }
+ ],
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^1.10.56",
+ "phpstan/phpstan-deprecation-rules": "^1.1.4",
+ "symfony/finder": "^4.2 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/yaml": "^4.2|| ^5.0 || ^6.0 || ^7.0",
+ "webflo/drupal-finder": "^1.2"
+ },
+ "require-dev": {
+ "behat/mink": "^1.8",
+ "composer/installers": "^1.9",
+ "drupal/core-recommended": "^10",
+ "drush/drush": "^10.0 || ^11 || ^12 || ^13@beta",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^8.5 || ^9 || ^10 || ^11",
+ "slevomat/coding-standard": "^7.1",
+ "squizlabs/php_codesniffer": "^3.3",
+ "symfony/phpunit-bridge": "^4.4 || ^5.4 || ^6.0 || ^7.0"
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "suggest": {
+ "phpstan/phpstan-deprecation-rules": "For catching deprecations, especially in Drupal core.",
+ "jangregor/phpstan-prophecy": "Provides a prophecy/prophecy extension for phpstan/phpstan.",
+ "phpstan/phpstan-phpunit": "PHPUnit extensions and rules for PHPStan."
+ },
+ "autoload": {
+ "psr-4": {
+ "mglaman\\PHPStanDrupal\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "mglaman\\PHPStanDrupal\\Tests\\": "tests/src/"
+ },
+ "classmap": [
+ "tests/src/Type/data",
+ "tests/src/Rules/data"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.0-dev"
+ },
+ "installer-paths": {
+ "tests/fixtures/drupal/core": ["type:drupal-core"],
+ "tests/fixtures/drupal/libraries/{$name}": ["type:drupal-library"],
+ "tests/fixtures/drupal/modules/contrib/{$name}": ["type:drupal-module"],
+ "tests/fixtures/drupal/profiles/contrib/{$name}": ["type:drupal-profile"],
+ "tests/fixtures/drupal/themes/contrib/{$name}": ["type:drupal-theme"]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "config": {
+ "allow-plugins": {
+ "composer/installers": true,
+ "phpstan/extension-installer": true,
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/drupal-autoloader.php b/vendor/mglaman/phpstan-drupal/drupal-autoloader.php
new file mode 100644
index 00000000..d5aa9462
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/drupal-autoloader.php
@@ -0,0 +1,18 @@
+register($container);
diff --git a/vendor/mglaman/phpstan-drupal/extension.neon b/vendor/mglaman/phpstan-drupal/extension.neon
new file mode 100644
index 00000000..dfce4a75
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/extension.neon
@@ -0,0 +1,327 @@
+parameters:
+ bootstrapFiles:
+ - drupal-autoloader.php
+ excludePaths:
+ - '*.api.php'
+ - '*/tests/fixtures/*.php'
+ fileExtensions:
+ - module
+ - theme
+ - inc
+ - install
+ - profile
+ - engine
+ dynamicConstantNames:
+ - Drupal::VERSION
+ scanFiles:
+ - stubs/Twig/functions.stub
+ drupal:
+ drupal_root: '%currentWorkingDirectory%'
+ bleedingEdge:
+ checkDeprecatedHooksInApiFiles: false
+ rules:
+ testClassSuffixNameRule: false
+ dependencySerializationTraitPropertyRule: false
+ accessResultConditionRule: false
+ classExtendsInternalClassRule: true
+ entityMapping:
+ aggregator_feed:
+ class: Drupal\aggregator\Entity\Feed
+ storage: Drupal\aggregator\FeedStorage
+
+ aggregator_item:
+ class: Drupal\aggregator\Entity\Item
+ storage: Drupal\aggregator\ItemStorage
+
+ block:
+ class: Drupal\block\Entity\Block
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ block_content:
+ class: Drupal\block_content\Entity\BlockContent
+ storage: Drupal\Core\Entity\Sql\SqlContentEntityStorage
+
+ block_content_type:
+ class: Drupal\block_content\Entity\BlockContentType
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ comment_type:
+ class: Drupal\comment\Entity\CommentType
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ comment:
+ class: Drupal\comment\Entity\Comment
+ storage: Drupal\comment\CommentStorage
+
+ contact_form:
+ class: Drupal\contact\Entity\ContactForm
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ contact_message:
+ class: Drupal\contact\Entity\Message
+ storage: Drupal\Core\Entity\ContentEntityNullStorage
+
+ content_moderation_state:
+ class: Drupal\content_moderation\Entity\ContentModerationState
+ storage: Drupal\Core\Entity\Sql\SqlContentEntityStorage
+
+ editor:
+ class: Drupal\editor\Entity\Editor
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ field_config:
+ class: Drupal\field\Entity\FieldConfig
+ storage: Drupal\field\FieldConfigStorage
+
+ field_storage_config:
+ class: Drupal\field\Entity\FieldStorageConfig
+ storage: Drupal\field\FieldStorageConfigStorage
+
+ file:
+ class: Drupal\file\Entity\File
+ storage: Drupal\file\FileStorage
+
+ filter_format:
+ class: Drupal\filter\Entity\FilterFormat
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ image_style:
+ class: Drupal\image\Entity\ImageStyle
+ storage: Drupal\image\ImageStyleStorage
+
+ imce_profile:
+ class: Drupal\imce\Entity\ImceProfile
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ configurable_language:
+ class: Drupal\language\Entity\ConfigurableLanguage
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ language_content_settings:
+ class: Drupal\language\Entity\ContentLanguageSettings
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ media_type:
+ class: Drupal\media\Entity\MediaType
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ media:
+ class: Drupal\media\Entity\Media
+ storage: Drupal\media\MediaStorage
+
+ menu_link_content:
+ class: Drupal\menu_link_content\Entity\MenuLinkContent
+ storage: \Drupal\menu_link_content\MenuLinkContentStorage
+
+ metatag_defaults:
+ class: Drupal\metatag\Entity\MetatagDefaults
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ node_type:
+ class: Drupal\node\Entity\NodeType
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ node:
+ class: Drupal\node\Entity\Node
+ storage: Drupal\node\NodeStorage
+
+ path_alias:
+ class: Drupal\path_alias\Entity\PathAlias
+ storage: Drupal\path_alias\PathAliasStorage
+
+ rdf_mapping:
+ class: Drupal\rdf\Entity\RdfMapping
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ responsive_image_style:
+ class: Drupal\responsive_image\Entity\ResponsiveImageStyle
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ search_page:
+ class: Drupal\search\Entity\SearchPage
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ search_api_server:
+ class: Drupal\search_api\Entity\Server
+ storage: Drupal\search_api\Entity\SearchApiConfigEntityStorage
+
+ search_api_index:
+ class: Drupal\search_api\Entity\Index
+ storage: Drupal\search_api\Entity\SearchApiConfigEntityStorage
+
+ search_api_task:
+ class: Drupal\search_api\Entity\Task
+ storage: Drupal\Core\Entity\Sql\SqlContentEntityStorage
+
+ shortcut_set:
+ class: Drupal\shortcut\Entity\ShortcutSet
+ storage: Drupal\shortcut\ShortcutSetStorage
+
+ shortcut:
+ class: Drupal\shortcut\Entity\Shortcut
+ storage: Drupal\Core\Entity\Sql\SqlContentEntityStorage
+
+ action:
+ class: Drupal\system\Entity\Action
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ menu:
+ class: Drupal\system\Entity\Menu
+ storage: Drupal\system\MenuStorage
+
+ taxonomy_term:
+ class: Drupal\taxonomy\Entity\Term
+ storage: Drupal\taxonomy\TermStorage
+
+ taxonomy_vocabulary:
+ class: Drupal\taxonomy\Entity\Vocabulary
+ storage: Drupal\taxonomy\VocabularyStorage
+
+ tour:
+ class: Drupal\tour\Entity\Tour
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ user:
+ class: Drupal\user\Entity\User
+ storage: Drupal\user\UserStorage
+
+ user_role:
+ class: Drupal\user\Entity\Role
+ storage: Drupal\user\RoleStorage
+
+ webform:
+ class: Drupal\webform\Entity\Webform
+ storage: \Drupal\webform\WebformEntityStorage
+
+ webform_submission:
+ class: Drupal\webform\Entity\WebformSubmission
+ storage: Drupal\webform\WebformSubmissionStorage
+
+ webform_options:
+ class: Drupal\webform\Entity\WebformOptions
+ storage: \Drupal\webform\WebformOptionsStorage
+
+ workflow:
+ class: Drupal\workflows\Entity\Workflow
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ pathauto_pattern:
+ class: Drupal\pathauto\Entity\PathautoPattern
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ view:
+ class: Drupal\views\Entity\View
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ date_format:
+ class: Drupal\Core\Datetime\Entity\DateFormat
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ entity_form_mode:
+ class: Drupal\Core\Entity\Entity\EntityFormMode
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ entity_view_display:
+ class: Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay
+ storage: Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplayStorage
+
+ entity_form_display:
+ class: Drupal\Core\Entity\Entity\EntityFormDisplay
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ entity_view_mode:
+ class: Drupal\Core\Entity\Entity\EntityViewMode
+ storage: Drupal\Core\Config\Entity\ConfigEntityStorage
+
+ base_field_override:
+ class: Drupal\Core\Field\Entity\BaseFieldOverride
+ storage: Drupal\Core\Field\BaseFieldOverrideStorage
+
+parametersSchema:
+ drupal: structure([
+ drupal_root: string()
+ bleedingEdge: structure([
+ checkDeprecatedHooksInApiFiles: boolean()
+ ])
+ rules: structure([
+ testClassSuffixNameRule: boolean()
+ dependencySerializationTraitPropertyRule: boolean()
+ accessResultConditionRule: boolean()
+ classExtendsInternalClassRule: boolean()
+ ])
+ entityMapping: arrayOf(anyOf(
+ structure([
+ class: string()
+ ]),
+ structure([
+ class: string()
+ storage: string()
+ ])
+ ))
+ ])
+services:
+ -
+ class: mglaman\PHPStanDrupal\Drupal\ServiceMap
+ -
+ class: mglaman\PHPStanDrupal\Drupal\ExtensionMap
+ -
+ class: mglaman\PHPStanDrupal\Drupal\EntityDataRepository
+ arguments:
+ entityMapping: %drupal.entityMapping%
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityTypeManagerGetStorageDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityStorage\EntityStorageDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityRepositoryReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityStorage\GetQueryReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\ContainerDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\DrupalClassResolverDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityQuery\EntityQueryDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityQuery\EntityQueryAccessCheckDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityAccessControlHandlerReturnTypeExtension
+ tags: [phpstan.broker.dynamicMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\DrupalClassResolverDynamicStaticReturnTypeExtension
+ tags: [phpstan.broker.dynamicStaticMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\DrupalServiceDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicStaticMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\DrupalStaticEntityQueryDynamicReturnTypeExtension
+ tags: [phpstan.broker.dynamicStaticMethodReturnTypeExtension]
+ -
+ class: mglaman\PHPStanDrupal\Reflection\EntityFieldsViaMagicReflectionExtension
+ tags: [phpstan.broker.propertiesClassReflectionExtension]
+ -
+ class: mglaman\PHPStanDrupal\Reflection\EntityFieldMethodsViaMagicReflectionExtension
+ tags: [phpstan.broker.methodsClassReflectionExtension]
+ -
+ class: mglaman\PHPStanDrupal\Drupal\DrupalStubFilesExtension
+ tags: [phpstan.stubFilesExtension]
+ -
+ class: mglaman\PHPStanDrupal\Type\EntityQuery\AccessCheckTypeSpecifyingExtension
+ tags:
+ - phpstan.typeSpecifier.methodTypeSpecifyingExtension
+ -
+ class: mglaman\PHPStanDrupal\DeprecatedScope\GroupLegacyScope
+ tags:
+ - phpstan.deprecations.deprecatedScopeResolver
+ -
+ class: mglaman\PHPStanDrupal\DeprecatedScope\DeprecationHelperScope
+ tags:
+ - phpstan.deprecations.deprecatedScopeResolver
diff --git a/vendor/mglaman/phpstan-drupal/lock.yml b/vendor/mglaman/phpstan-drupal/lock.yml
new file mode 100644
index 00000000..94e829e9
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/lock.yml
@@ -0,0 +1,28 @@
+name: 'Lock Threads'
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+concurrency:
+ group: lock
+
+jobs:
+ action:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v3
+ with:
+ issue-inactive-days: '31'
+ issue-comment: >
+ This thread has been automatically locked since there has not been
+ any recent activity after it was closed. Please open a new issue for
+ related bugs.
+ issue-lock-reason: 'resolved'
+ process-only: 'issues'
+ log-output: true
diff --git a/vendor/mglaman/phpstan-drupal/phpstan-baseline.neon b/vendor/mglaman/phpstan-drupal/phpstan-baseline.neon
new file mode 100644
index 00000000..6f99c653
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/phpstan-baseline.neon
@@ -0,0 +1,90 @@
+parameters:
+ ignoreErrors:
+ -
+ message: """
+ #^Call to deprecated method locateRoot\\(\\) of class DrupalFinder\\\\DrupalFinder\\:
+ Will be removed in v2\\. Future usage should instantiate
+ a new DrupalFinder object by passing the starting path to its
+ constructor\\.$#
+ """
+ count: 1
+ path: src/Drupal/DrupalAutoloader.php
+
+ -
+ message: """
+ #^Instantiation of deprecated class DrupalFinder\\\\DrupalFinder\\:
+ in drupal\\-finder\\:1\\.3\\.0 and is removed from drupal\\-finder\\:2\\.0\\.0\\.
+ Use \\\\DrupalFinder\\\\DrupalFinderComposerRuntime instead\\.$#
+ """
+ count: 1
+ path: src/Drupal/DrupalAutoloader.php
+
+ -
+ message: "#^Parameter \\#1 \\$root of class mglaman\\\\PHPStanDrupal\\\\Drupal\\\\ExtensionDiscovery constructor expects string, bool\\|string given\\.$#"
+ count: 1
+ path: src/Drupal/DrupalAutoloader.php
+
+ -
+ message: "#^Parameter \\#1 \\$start_path of method DrupalFinder\\\\DrupalFinder\\:\\:locateRoot\\(\\) expects string, string\\|false given\\.$#"
+ count: 1
+ path: src/Drupal/DrupalAutoloader.php
+
+ -
+ message: "#^Property mglaman\\\\PHPStanDrupal\\\\Drupal\\\\DrupalAutoloader\\:\\:\\$drupalRoot \\(string\\) does not accept bool\\|string\\.$#"
+ count: 1
+ path: src/Drupal/DrupalAutoloader.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\Constant\\\\ConstantArrayType is error\\-prone and deprecated\\. Use Type\\:\\:getConstantArrays\\(\\) instead\\.$#"
+ count: 1
+ path: src/Rules/Deprecations/ConditionManagerCreateInstanceContextConfigurationRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\Constant\\\\ConstantStringType is error\\-prone and deprecated\\. Use Type\\:\\:getConstantStrings\\(\\) instead\\.$#"
+ count: 1
+ path: src/Rules/Deprecations/ConditionManagerCreateInstanceContextConfigurationRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\Constant\\\\ConstantStringType is error\\-prone and deprecated\\. Use Type\\:\\:getConstantStrings\\(\\) instead\\.$#"
+ count: 2
+ path: src/Rules/Drupal/RenderCallbackRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\Generic\\\\GenericClassStringType is error\\-prone and deprecated\\. Use Type\\:\\:isClassStringType\\(\\) and Type\\:\\:getClassStringObjectType\\(\\) instead\\.$#"
+ count: 1
+ path: src/Rules/Drupal/RenderCallbackRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\IntersectionType is error\\-prone and deprecated\\.$#"
+ count: 1
+ path: src/Rules/Drupal/RenderCallbackRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Rules/Drupal/Tests/BrowserTestBaseDefaultThemeRule.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Type/DrupalStaticEntityQueryDynamicReturnTypeExtension.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Type/EntityQuery/EntityQueryDynamicReturnTypeExtension.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Type/EntityStorage/EntityStorageDynamicReturnTypeExtension.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Type/EntityStorage/GetQueryReturnTypeExtension.php
+
+ -
+ message: "#^Doing instanceof PHPStan\\\\Type\\\\ObjectType is error\\-prone and deprecated\\. Use Type\\:\\:isObject\\(\\) or Type\\:\\:getObjectClassNames\\(\\) instead\\.$#"
+ count: 1
+ path: src/Type/EntityTypeManagerGetStorageDynamicReturnTypeExtension.php
diff --git a/vendor/mglaman/phpstan-drupal/phpunit.xml b/vendor/mglaman/phpstan-drupal/phpunit.xml
new file mode 100644
index 00000000..7cc1cc82
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/phpunit.xml
@@ -0,0 +1,31 @@
+
+
+
+
+ src
+
+
+ ./vendor
+ ./tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tests/src
+
+
+
+
diff --git a/vendor/mglaman/phpstan-drupal/rules.neon b/vendor/mglaman/phpstan-drupal/rules.neon
new file mode 100644
index 00000000..69f89abe
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/rules.neon
@@ -0,0 +1,42 @@
+rules:
+ - mglaman\PHPStanDrupal\Rules\Drupal\Coder\DiscouragedFunctionsRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\GlobalDrupalDependencyInjectionRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\PluginManager\PluginManagerSetsCacheBackendRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\AccessDeprecatedConstant
+ - mglaman\PHPStanDrupal\Rules\Classes\PluginManagerInspectionRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\ConditionManagerCreateInstanceContextConfigurationRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\RenderCallbackRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\StaticServiceDeprecatedServiceRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\GetDeprecatedServiceRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\Tests\BrowserTestBaseDefaultThemeRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\ConfigEntityConfigExportRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\PluginAnnotationContextDefinitionsRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\ModuleLoadInclude
+ - mglaman\PHPStanDrupal\Rules\Drupal\LoadIncludes
+ - mglaman\PHPStanDrupal\Rules\Drupal\EntityQuery\EntityQueryHasAccessCheckRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\SymfonyCmfRouteObjectInterfaceConstantsRule
+ - mglaman\PHPStanDrupal\Rules\Deprecations\SymfonyCmfRoutingInClassMethodSignatureRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\RequestStackGetMainRequestRule
+ - mglaman\PHPStanDrupal\Rules\Drupal\TestClassesProtectedPropertyModulesRule
+
+conditionalTags:
+ mglaman\PHPStanDrupal\Rules\Drupal\Tests\TestClassSuffixNameRule:
+ phpstan.rules.rule: %drupal.rules.testClassSuffixNameRule%
+ mglaman\PHPStanDrupal\Rules\Drupal\DependencySerializationTraitPropertyRule:
+ phpstan.rules.rule: %drupal.rules.dependencySerializationTraitPropertyRule%
+ mglaman\PHPStanDrupal\Rules\Drupal\AccessResultConditionRule:
+ phpstan.rules.rule: %drupal.rules.accessResultConditionRule%
+ mglaman\PHPStanDrupal\Rules\Classes\ClassExtendsInternalClassRule:
+ phpstan.rules.rule: %drupal.rules.classExtendsInternalClassRule%
+
+services:
+ -
+ class: mglaman\PHPStanDrupal\Rules\Drupal\Tests\TestClassSuffixNameRule
+ -
+ class: mglaman\PHPStanDrupal\Rules\Drupal\DependencySerializationTraitPropertyRule
+ -
+ class: mglaman\PHPStanDrupal\Rules\Drupal\AccessResultConditionRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ -
+ class: mglaman\PHPStanDrupal\Rules\Classes\ClassExtendsInternalClassRule
diff --git a/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/DeprecationHelperScope.php b/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/DeprecationHelperScope.php
new file mode 100644
index 00000000..e9f30b28
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/DeprecationHelperScope.php
@@ -0,0 +1,36 @@
+getFunctionCallStackWithParameters();
+ if (count($callStack) === 0) {
+ return false;
+ }
+ [$function, $parameter] = $callStack[0];
+ if (!$function instanceof MethodReflection) {
+ return false;
+ }
+ if ($function->getName() !== 'backwardsCompatibleCall'
+ || $function->getDeclaringClass()->getName() !== DeprecationHelper::class
+ ) {
+ return false;
+ }
+ return $parameter !== null && $parameter->getName() === 'deprecatedCallable';
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/GroupLegacyScope.php b/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/GroupLegacyScope.php
new file mode 100644
index 00000000..cb8068a4
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/DeprecatedScope/GroupLegacyScope.php
@@ -0,0 +1,29 @@
+isInClass()) {
+ $class = $scope->getClassReflection();
+ $phpDoc = $class->getResolvedPhpDoc();
+ if ($phpDoc !== null && strpos($phpDoc->getPhpDocString(), '@group legacy') !== false) {
+ return true;
+ }
+ }
+
+ $function = $scope->getFunction();
+ return $function !== null
+ && $function->getDocComment() !== null
+ && strpos($function->getDocComment(), '@group legacy') !== false;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalAutoloader.php b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalAutoloader.php
new file mode 100644
index 00000000..7b58e2b6
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalAutoloader.php
@@ -0,0 +1,365 @@
+>
+ */
+ private $serviceMap = [];
+
+ /**
+ * @var array
+ */
+ private $serviceYamls = [];
+
+ /**
+ * @var array
+ */
+ private $serviceClassProviders = [];
+
+ /**
+ * @var array
+ */
+ private $namespaces = [];
+
+ public function register(Container $container): void
+ {
+ /**
+ * @var array{drupal_root: string, bleedingEdge: array{checkDeprecatedHooksInApiFiles: bool}} $drupalParams
+ */
+ $drupalParams = $container->getParameter('drupal');
+ $drupalRoot = realpath($drupalParams['drupal_root']);
+ $finder = new DrupalFinder();
+ $finder->locateRoot($drupalRoot);
+
+ $drupalRoot = $finder->getDrupalRoot();
+ $drupalVendorRoot = $finder->getVendorDir();
+ if (! (bool) $drupalRoot || ! (bool) $drupalVendorRoot) {
+ throw new RuntimeException("Unable to detect Drupal at {$drupalParams['drupal_root']}");
+ }
+
+ $this->drupalRoot = $drupalRoot;
+
+ $this->autoloader = include $drupalVendorRoot . '/autoload.php';
+
+ $this->serviceYamls['core'] = $drupalRoot . '/core/core.services.yml';
+ $this->serviceClassProviders['core'] = '\Drupal\Core\CoreServiceProvider';
+ $this->serviceMap['service_provider.core.service_provider'] = ['class' => $this->serviceClassProviders['core']];
+ // Attach synthetic services
+ // @see \Drupal\Core\DrupalKernel::attachSynthetic
+ $this->serviceMap['kernel'] = ['class' => DrupalKernelInterface::class];
+ $this->serviceMap['class_loader'] = ['class' => ClassLoader::class];
+
+ $extensionDiscovery = new ExtensionDiscovery($this->drupalRoot);
+ $extensionDiscovery->setProfileDirectories([]);
+ $profiles = $extensionDiscovery->scan('profile');
+ $profile_directories = array_map(static function (Extension $profile) : string {
+ return $profile->getPath();
+ }, $profiles);
+ $extensionDiscovery->setProfileDirectories($profile_directories);
+
+ $this->moduleData = array_merge($extensionDiscovery->scan('module'), $profiles);
+ usort($this->moduleData, static function (Extension $a, Extension $b) {
+ return strpos($a->getName(), '_test') !== false ? 10 : 0;
+ });
+ $this->themeData = $extensionDiscovery->scan('theme');
+ $this->addCoreTestNamespaces();
+ $this->addModuleNamespaces();
+ $this->addThemeNamespaces();
+ $this->registerPs4Namespaces($this->namespaces);
+ $this->loadLegacyIncludes();
+ $checkDeprecatedHooksInApiFiles = $drupalParams['bleedingEdge']['checkDeprecatedHooksInApiFiles'];
+
+ foreach ($this->moduleData as $extension) {
+ $this->loadExtension($extension);
+
+ $module_name = $extension->getName();
+ $module_dir = $this->drupalRoot . '/' . $extension->getPath();
+ // Add .install
+ if (file_exists($module_dir . '/' . $module_name . '.install')) {
+ $ignored_install_files = ['entity_test', 'entity_test_update', 'update_test_schema'];
+ if (!in_array($module_name, $ignored_install_files, true)) {
+ $this->loadAndCatchErrors($module_dir . '/' . $module_name . '.install');
+ }
+ }
+ // Add .post_update.php
+ if (file_exists($module_dir . '/' . $module_name . '.post_update.php')) {
+ $this->loadAndCatchErrors($module_dir . '/' . $module_name . '.post_update.php');
+ }
+ // Add .api.php
+ if ($checkDeprecatedHooksInApiFiles && file_exists($module_dir . '/' . $module_name . '.api.php')) {
+ $this->loadAndCatchErrors($module_dir . '/' . $module_name . '.api.php');
+ }
+ // Add misc .inc that are magically allowed via hook_hook_info.
+ $magic_hook_info_includes = [
+ 'views',
+ 'views_execution',
+ 'tokens',
+ 'search_api',
+ 'pathauto',
+ ];
+ foreach ($magic_hook_info_includes as $hook_info_include) {
+ if (file_exists($module_dir . "/$module_name.$hook_info_include.inc")) {
+ $this->loadAndCatchErrors($module_dir . "/$module_name.$hook_info_include.inc");
+ }
+ }
+ }
+ foreach ($this->themeData as $extension) {
+ $this->loadExtension($extension);
+ $theme_dir = $this->drupalRoot . '/' . $extension->getPath();
+ $theme_settings_file = $theme_dir . '/theme-settings.php';
+ if (file_exists($theme_settings_file)) {
+ $this->loadAndCatchErrors($theme_settings_file);
+ }
+ }
+
+ if (class_exists(Drush::class)) {
+ $reflect = new ReflectionClass(Drush::class);
+ if ($reflect->getFileName() !== false) {
+ $levels = 2;
+ if (Drush::getMajorVersion() < 9) {
+ $levels = 3;
+ }
+ $drushDir = dirname($reflect->getFileName(), $levels);
+ /** @var \SplFileInfo $file */
+ foreach (Finder::create()->files()->name('*.inc')->in($drushDir . '/includes') as $file) {
+ require_once $file->getPathname();
+ }
+ }
+ }
+
+ foreach ($this->serviceYamls as $extension => $serviceYaml) {
+ $yaml = Yaml::parseFile($serviceYaml, Yaml::PARSE_CUSTOM_TAGS);
+ // Weed out service files which only provide parameters.
+ if (!isset($yaml['services']) || !is_array($yaml['services'])) {
+ continue;
+ }
+ foreach ($yaml['services'] as $serviceId => $serviceDefinition) {
+ // Check if this is an alias shortcut.
+ // @link https://symfony.com/doc/4.4/service_container/alias_private.html#aliasing
+ if (is_string($serviceDefinition)) {
+ $serviceDefinition = [
+ 'alias' => str_replace('@', '', $serviceDefinition),
+ ];
+ }
+ // Prevent \Nette\DI\ContainerBuilder::completeStatement from array_walk_recursive into the arguments
+ // and thinking these are real services for PHPStan's container.
+ if (isset($serviceDefinition['arguments']) && is_array($serviceDefinition['arguments'])) {
+ array_walk($serviceDefinition['arguments'], function (&$argument) : void {
+ if (is_array($argument) || !is_string($argument)) {
+ // @todo fix for @http_kernel.controller.argument_metadata_factory
+ $argument = '';
+ } else {
+ $argument = str_replace('@', '', $argument);
+ }
+ });
+ }
+ // @todo sanitize "calls" and "configurator" and "factory"
+ /**
+ jsonapi.params.enhancer:
+ class: Drupal\jsonapi\Routing\JsonApiParamEnhancer
+ calls:
+ - [setContainer, ['@service_container']]
+ tags:
+ - { name: route_enhancer }
+ */
+ unset($serviceDefinition['tags'], $serviceDefinition['calls'], $serviceDefinition['configurator'], $serviceDefinition['factory']);
+ $this->serviceMap[$serviceId] = $serviceDefinition;
+ }
+ }
+
+ $service_map = $container->getByType(ServiceMap::class);
+ $service_map->setDrupalServices($this->serviceMap);
+
+ if (interface_exists(Test::class)
+ && class_exists('Drupal\TestTools\PhpUnitCompatibility\PhpUnit8\ClassWriter')) {
+ ClassWriter::mutateTestBase($this->autoloader);
+ }
+
+ $extension_map = $container->getByType(ExtensionMap::class);
+ $extension_map->setExtensions($this->moduleData, $this->themeData, $profiles);
+ }
+
+ protected function loadLegacyIncludes(): void
+ {
+ /** @var \SplFileInfo $file */
+ foreach (Finder::create()->files()->name('*.inc')->in($this->drupalRoot . '/core/includes') as $file) {
+ require_once $file->getPathname();
+ }
+ }
+
+ protected function addCoreTestNamespaces(): void
+ {
+ // Add core test namespaces.
+ $core_tests_dir = $this->drupalRoot . '/core/tests/Drupal';
+ $this->namespaces['Drupal\\BuildTests'] = $core_tests_dir . '/BuildTests';
+ $this->namespaces['Drupal\\FunctionalJavascriptTests'] = $core_tests_dir . '/FunctionalJavascriptTests';
+ $this->namespaces['Drupal\\FunctionalTests'] = $core_tests_dir . '/FunctionalTests';
+ $this->namespaces['Drupal\\KernelTests'] = $core_tests_dir . '/KernelTests';
+ $this->namespaces['Drupal\\Tests'] = $core_tests_dir . '/Tests';
+ $this->namespaces['Drupal\\TestSite'] = $core_tests_dir . '/TestSite';
+ $this->namespaces['Drupal\\TestTools'] = $core_tests_dir . '/TestTools';
+ $this->namespaces['Drupal\\Tests\\TestSuites'] = $this->drupalRoot . '/core/tests/TestSuites';
+ }
+
+ protected function addModuleNamespaces(): void
+ {
+ foreach ($this->moduleData as $module) {
+ $module_name = $module->getName();
+ $module_dir = $this->drupalRoot . '/' . $module->getPath();
+ $this->namespaces["Drupal\\$module_name"] = $module_dir . '/src';
+
+ // Extensions can have a \Drupal\Tests\extension namespace for test cases, traits, and other classes such
+ // as those that extend \Drupal\TestSite\TestSetupInterface.
+ // @see drupal_phpunit_get_extension_namespaces()
+ $module_test_dir = $module_dir . '/tests/src';
+ if (is_dir($module_test_dir)) {
+ $this->namespaces["Drupal\\Tests\\$module_name"] = $module_test_dir;
+ }
+
+ $servicesFileName = $module_dir . '/' . $module_name . '.services.yml';
+ if (file_exists($servicesFileName)) {
+ $this->serviceYamls[$module_name] = $servicesFileName;
+ }
+ $camelized = $this->camelize($module_name);
+ $name = "{$camelized}ServiceProvider";
+ $class = "Drupal\\{$module_name}\\{$name}";
+
+ $this->serviceClassProviders[$module_name] = $class;
+ $serviceId = "service_provider.$module_name.service_provider";
+ $this->serviceMap[$serviceId] = ['class' => $class];
+
+ $this->registerExtensionTestNamespace($module);
+ }
+ }
+ protected function addThemeNamespaces(): void
+ {
+ foreach ($this->themeData as $theme_name => $theme) {
+ $theme_dir = $this->drupalRoot . '/' . $theme->getPath();
+ $this->namespaces["Drupal\\$theme_name"] = $theme_dir . '/src';
+ $this->registerExtensionTestNamespace($theme);
+ }
+ }
+
+ protected function registerExtensionTestNamespace(Extension $extension): void
+ {
+ $suite_names = ['Unit', 'Kernel', 'Functional', 'Build', 'FunctionalJavascript'];
+ $dir = $this->drupalRoot . '/' . $extension->getPath();
+ $test_dir = $dir . '/tests/src';
+ if (is_dir($test_dir)) {
+ foreach ($suite_names as $suite_name) {
+ $suite_dir = $test_dir . '/' . $suite_name;
+ if (is_dir($suite_dir)) {
+ // Register the PSR-4 directory for PHPUnit-based suites.
+ $this->namespaces['Drupal\\Tests\\' . $extension->getName() . '\\' . $suite_name . '\\'][] = $suite_dir;
+ }
+ }
+ // Extensions can have a \Drupal\Tests\extension\Traits namespace for
+ // cross-suite trait code.
+ $trait_dir = $test_dir . '/Traits';
+ if (is_dir($trait_dir)) {
+ $this->namespaces['Drupal\\Tests\\' . $extension->getName() . '\\Traits\\'][] = $trait_dir;
+ }
+ }
+ }
+
+ protected function registerPs4Namespaces(array $namespaces): void
+ {
+ foreach ($namespaces as $prefix => $paths) {
+ if (is_array($paths)) {
+ foreach ($paths as $key => $value) {
+ $paths[$key] = $value;
+ }
+ }
+ $this->autoloader->addPsr4($prefix . '\\', $paths);
+ }
+ }
+ protected function loadExtension(Extension $extension): void
+ {
+ try {
+ $extension->load();
+ } catch (Throwable $e) {
+ // Something prevented the extension file from loading.
+ // This can happen when drupal_get_path or drupal_get_filename are used outside of the scope of a function.
+ }
+ }
+
+ protected function loadAndCatchErrors(string $path): void
+ {
+ try {
+ require_once $path;
+ } catch (ContainerNotInitializedException $e) {
+ $path = str_replace(dirname($this->drupalRoot) . '/', '', $path);
+ // This can happen when drupal_get_path or drupal_get_filename are used outside the scope of a function.
+ @trigger_error("$path invoked the Drupal container outside of the scope of a function or class method. It was not loaded.", E_USER_WARNING);
+ } catch (Throwable $e) {
+ $path = str_replace(dirname($this->drupalRoot) . '/', '', $path);
+ // Something prevented the extension file from loading.
+ @trigger_error("$path failed loading due to {$e->getMessage()}", E_USER_WARNING);
+ }
+ }
+
+ protected function camelize(string $id): string
+ {
+ return strtr(ucwords(strtr($id, ['_' => ' ', '.' => '_ ', '\\' => '_ '])), [' ' => '']);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalServiceDefinition.php b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalServiceDefinition.php
new file mode 100644
index 00000000..cf8cfd00
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalServiceDefinition.php
@@ -0,0 +1,144 @@
+
+ */
+ private $decorators = [];
+
+ public function __construct(string $id, ?string $class, bool $public = true, ?string $alias = null)
+ {
+ $this->id = $id;
+ $this->class = $class;
+ $this->public = $public;
+ $this->alias = $alias;
+ }
+
+ public function setDeprecated(bool $status = true, ?string $template = null): void
+ {
+ $this->deprecated = $status;
+ $this->deprecationTemplate = $template;
+ }
+
+ /**
+ * @return string
+ */
+ public function getId(): string
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getClass(): ?string
+ {
+ return $this->class;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isPublic(): bool
+ {
+ return $this->public;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getAlias(): ?string
+ {
+ return $this->alias;
+ }
+
+ public function isDeprecated(): bool
+ {
+ return $this->deprecated;
+ }
+
+ public function getDeprecatedDescription(): string
+ {
+ return str_replace('%service_id%', $this->id, $this->deprecationTemplate ?? self::$defaultDeprecationTemplate);
+ }
+
+ public function getType(): Type
+ {
+ // Work around Drupal misusing the SplString class for string
+ // pseudo-services such as 'app.root'.
+ // @see https://www.drupal.org/project/drupal/issues/3074585
+ if ($this->getClass() === 'SplString') {
+ return new StringType();
+ }
+
+ $decorating_services = $this->getDecorators();
+ if (count($decorating_services) !== 0) {
+ $combined_services = [];
+ $combined_services[] = new ObjectType($this->getClass() ?? $this->id);
+ foreach ($decorating_services as $service_id => $service_definition) {
+ $combined_services[] = $service_definition->getType();
+ }
+ return TypeCombinator::union(...$combined_services);
+ }
+ return new ObjectType($this->getClass() ?? $this->id);
+ }
+
+ public function addDecorator(DrupalServiceDefinition $definition): void
+ {
+ $this->decorators[$definition->getId()] = $definition;
+ }
+
+ /**
+ * @return array
+ */
+ public function getDecorators(): array
+ {
+ return $this->decorators;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalStubFilesExtension.php b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalStubFilesExtension.php
new file mode 100644
index 00000000..579c6a26
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/DrupalStubFilesExtension.php
@@ -0,0 +1,19 @@
+files()->name('*.stub')->in(__DIR__ . '/../../stubs');
+ foreach ($finder as $file) {
+ $files[] = $file->getPathname();
+ }
+ return $files;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/EntityData.php b/vendor/mglaman/phpstan-drupal/src/Drupal/EntityData.php
new file mode 100644
index 00000000..674876e3
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/EntityData.php
@@ -0,0 +1,73 @@
+entityTypeId = $entityTypeId;
+ $this->className = $definition['class'] ?? null;
+ $this->storageClassName = $definition['storage'] ?? null;
+ }
+
+ public function getClassType(): ?ObjectType
+ {
+ return $this->className === null ? null : new ObjectType($this->className);
+ }
+
+ public function getStorageType(): ?EntityStorageType
+ {
+ if ($this->storageClassName === null) {
+ $classType = $this->getClassType();
+ if ($classType === null) {
+ return null;
+ }
+ if ((new ObjectType(ConfigEntityInterface::class))->isSuperTypeOf($classType)->yes()) {
+ $this->storageClassName = 'Drupal\Core\Config\Entity\ConfigEntityStorage';
+ } elseif ((new ObjectType(ContentEntityInterface::class))->isSuperTypeOf($classType)->yes()) {
+ $this->storageClassName = 'Drupal\Core\Entity\Sql\SqlContentEntityStorage';
+ } else {
+ return null;
+ }
+ }
+
+ $storageType = new ObjectType($this->storageClassName);
+ if ((new ObjectType(EntityStorageInterface::class))->isSuperTypeOf($storageType)->no()) {
+ return null;
+ }
+ if ((new ObjectType(ConfigEntityStorageInterface::class))->isSuperTypeOf($storageType)->yes()) {
+ return new ConfigEntityStorageType($this->entityTypeId, $this->storageClassName);
+ }
+ if ((new ObjectType(ContentEntityStorageInterface::class))->isSuperTypeOf($storageType)->yes()) {
+ return new ContentEntityStorageType($this->entityTypeId, $this->storageClassName);
+ }
+ return new EntityStorageType($this->entityTypeId, $this->storageClassName);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/EntityDataRepository.php b/vendor/mglaman/phpstan-drupal/src/Drupal/EntityDataRepository.php
new file mode 100644
index 00000000..44f4d309
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/EntityDataRepository.php
@@ -0,0 +1,57 @@
+
+ */
+ private $entityData;
+
+ public function __construct(array $entityMapping)
+ {
+ foreach ($entityMapping as $entityTypeId => $entityData) {
+ $this->entityData[$entityTypeId] = new EntityData(
+ $entityTypeId,
+ $entityData
+ );
+ }
+ }
+
+ public function get(string $entityTypeId): EntityData
+ {
+ if (!isset($this->entityData[$entityTypeId])) {
+ $this->entityData[$entityTypeId] = new EntityData(
+ $entityTypeId,
+ []
+ );
+ }
+ return $this->entityData[$entityTypeId];
+ }
+
+ public function resolveFromStorage(ObjectType $callerType): ?EntityData
+ {
+ if ($callerType->equals(new ObjectType(EntityStorageInterface::class))) {
+ return null;
+ }
+ if ($callerType->equals(new ObjectType(ConfigEntityStorageInterface::class))) {
+ return null;
+ }
+ if ($callerType->equals(new ObjectType(ContentEntityStorageInterface::class))) {
+ return null;
+ }
+ foreach ($this->entityData as $entityData) {
+ $storageType = $entityData->getStorageType();
+ if ($storageType !== null && $callerType->isSuperTypeOf($storageType)->yes()) {
+ return $entityData;
+ }
+ }
+ return null;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/Extension.php b/vendor/mglaman/phpstan-drupal/src/Drupal/Extension.php
new file mode 100644
index 00000000..c43c6370
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/Extension.php
@@ -0,0 +1,239 @@
+root = $root;
+ $this->type = $type;
+ $this->pathname = $pathname;
+ $this->filename = $filename;
+ }
+
+ /**
+ * Returns the type of the extension.
+ *
+ * @return string
+ */
+ public function getType(): string
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns the internal name of the extension.
+ *
+ * @return string
+ */
+ public function getName(): string
+ {
+ return basename($this->pathname, '.info.yml');
+ }
+
+ /**
+ * Returns the relative path of the extension.
+ *
+ * @return string
+ */
+ public function getPath(): string
+ {
+ return dirname($this->pathname);
+ }
+
+ public function getAbsolutePath(): string
+ {
+ return $this->root . DIRECTORY_SEPARATOR . $this->getPath();
+ }
+
+ /**
+ * Returns the relative path and filename of the extension's info file.
+ *
+ * @return string
+ */
+ public function getPathname(): string
+ {
+ return $this->pathname;
+ }
+
+ /**
+ * Returns the filename of the extension's info file.
+ *
+ * @return string
+ */
+ public function getFilename(): string
+ {
+ return basename($this->pathname);
+ }
+
+ /**
+ * Returns the relative path of the main extension file, if any.
+ *
+ * @return string|null
+ */
+ public function getExtensionPathname(): ?string
+ {
+ if ($this->filename !== null) {
+ return $this->getPath() . '/' . $this->filename;
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the name of the main extension file, if any.
+ *
+ * @return string|null
+ */
+ public function getExtensionFilename(): ?string
+ {
+ return $this->filename;
+ }
+
+ /**
+ * Loads the main extension file, if any.
+ *
+ * @return bool
+ * TRUE if this extension has a main extension file, FALSE otherwise.
+ */
+ public function load(): bool
+ {
+ if ($this->filename !== null) {
+ include_once $this->root . '/' . $this->getPath() . '/' . $this->filename;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getDependencies(): array
+ {
+ if (is_array($this->dependencies)) {
+ return $this->dependencies;
+ }
+
+ $info = $this->parseInfo();
+ $dependencies = $info['dependencies'] ?? [];
+
+ if ($dependencies === []) {
+ return $this->dependencies = $dependencies;
+ }
+
+ $this->dependencies = [];
+
+ // @see \Drupal\Core\Extension\Dependency::createFromString().
+ foreach ($dependencies as $dependency) {
+ if (strpos($dependency, ':') !== false) {
+ [, $dependency] = explode(':', $dependency);
+ }
+
+ $parts = explode('(', $dependency, 2);
+ $this->dependencies[] = trim($parts[0]);
+ }
+
+ return $this->dependencies;
+ }
+
+ private function parseInfo(): array
+ {
+ if (is_array($this->info)) {
+ return $this->info;
+ }
+
+ $infoContent = file_get_contents(sprintf('%s/%s', $this->root, $this->getPathname()));
+ if (false === $infoContent) {
+ throw new RuntimeException(sprintf('Cannot read "%s', $this->getPathname()));
+ }
+
+ return $this->info = Yaml::parse($infoContent);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionDiscovery.php b/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionDiscovery.php
new file mode 100644
index 00000000..0d65a845
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionDiscovery.php
@@ -0,0 +1,427 @@
+root = $root;
+ $this->profileDirectories = [
+ $root . '/core/profiles/standard'
+ ];
+ $this->sitePath = 'sites/default';
+ }
+
+ /**
+ * Discovers available extensions of a given type.
+ *
+ * Finds all extensions (modules, themes, etc) that exist on the site. It
+ * searches in several locations. For instance, to discover all available
+ * modules:
+ * @code
+ * $listing = new ExtensionDiscovery(\Drupal::root());
+ * $modules = $listing->scan('module');
+ * @endcode
+ *
+ * The following directories will be searched (in the order stated):
+ * - the core directory; i.e., /core
+ * - the installation profile directory; e.g., /core/profiles/standard
+ * - the legacy site-wide directory; i.e., /sites/all
+ * - the site-wide directory; i.e., /
+ * - the site-specific directory; e.g., /sites/example.com
+ *
+ * To also find test modules, add
+ * @code
+ * $settings['extension_discovery_scan_tests'] = TRUE;
+ * @endcode
+ * to your settings.php.
+ *
+ * The information is returned in an associative array, keyed by the extension
+ * name (without .info.yml extension). Extensions found later in the search
+ * will take precedence over extensions found earlier - unless they are not
+ * compatible with the current version of Drupal core.
+ *
+ * @param string $type
+ * The extension type to search for. One of 'profile', 'module', 'theme', or
+ * 'theme_engine'.
+ *
+ * @return \mglaman\PHPStanDrupal\Drupal\Extension[]
+ * An associative array of Extension objects, keyed by extension name.
+ */
+ public function scan($type)
+ {
+ static $scanresult;
+ if (!$scanresult) {
+ $scanresult = [];
+ }
+
+ if (isset($scanresult[$type])) {
+ return $scanresult[$type];
+ }
+
+ $searchdirs = [];
+ // Search the core directory.
+ $searchdirs[self::ORIGIN_CORE] = 'core';
+
+ // Search the legacy sites/all directory.
+ $searchdirs[self::ORIGIN_SITES_ALL] = 'sites/all';
+
+ // Search for contributed and custom extensions in top-level directories.
+ // The scan uses a whitelist to limit recursion to the expected extension
+ // type specific directory names only.
+ $searchdirs[self::ORIGIN_ROOT] = '';
+
+ $searchdirs[self::ORIGIN_SITE] = $this->sitePath;
+
+ $files = [];
+ foreach ($searchdirs as $dir) {
+ // Discover all extensions in the directory, unless we did already.
+ if (!isset(static::$files[$this->root][$dir])) {
+ static::$files[$this->root][$dir] = $this->scanDirectory($dir);
+ }
+ // Only return extensions of the requested type.
+ if (isset(static::$files[$this->root][$dir][$type])) {
+ $files += static::$files[$this->root][$dir][$type];
+ }
+ }
+
+ // If applicable, filter out extensions that do not belong to the current
+ // installation profiles.
+ $files = $this->filterByProfileDirectories($files);
+ // Sort the discovered extensions by their originating directories.
+ $origin_weights = array_flip($searchdirs);
+ $files = $this->sort($files, $origin_weights);
+
+ // Process and return the list of extensions keyed by extension name.
+ $scanresult[$type] = $this->process($files);
+ return $scanresult[$type];
+ }
+
+ /**
+ * Gets the installation profile directories to be scanned.
+ *
+ * @return array
+ * A list of installation profile directory paths relative to the system
+ * root directory.
+ */
+ public function getProfileDirectories()
+ {
+ return $this->profileDirectories;
+ }
+
+ /**
+ * Sets explicit profile directories to scan.
+ *
+ * @param array $paths
+ * A list of installation profile directory paths relative to the system
+ * root directory (without trailing slash) to search for extensions.
+ *
+ * @return $this
+ */
+ public function setProfileDirectories(array $paths = [])
+ {
+ $this->profileDirectories = $paths;
+ return $this;
+ }
+
+ /**
+ * Filters out extensions not belonging to the scanned installation profiles.
+ *
+ * @param \mglaman\PHPStanDrupal\Drupal\Extension[] $all_files
+ * The list of all extensions.
+ *
+ * @return \mglaman\PHPStanDrupal\Drupal\Extension[]
+ * The filtered list of extensions.
+ */
+ protected function filterByProfileDirectories(array $all_files)
+ {
+ if ($this->profileDirectories === []) {
+ return $all_files;
+ }
+
+ return array_filter($all_files, function (Extension $file) : bool {
+ if (strpos($file->subpath, 'profiles') !== 0) {
+ // This extension doesn't belong to a profile, ignore it.
+ return true;
+ }
+
+ foreach ($this->profileDirectories as $weight => $profile_path) {
+ if (strpos($file->getPath(), $profile_path) === 0) {
+ // Parent profile found.
+ return true;
+ }
+ }
+
+ return false;
+ });
+ }
+
+ /**
+ * Sorts the discovered extensions.
+ *
+ * @param \mglaman\PHPStanDrupal\Drupal\Extension[] $all_files
+ * The list of all extensions.
+ * @param array $weights
+ * An array of weights, keyed by originating directory.
+ *
+ * @return \mglaman\PHPStanDrupal\Drupal\Extension[]
+ * The sorted list of extensions.
+ */
+ protected function sort(array $all_files, array $weights)
+ {
+ $origins = [];
+ $profiles = [];
+ foreach ($all_files as $key => $file) {
+ // If the extension does not belong to a profile, just apply the weight
+ // of the originating directory.
+ if (strpos($file->subpath, 'profiles') !== 0) {
+ $origins[$key] = $weights[$file->origin];
+ $profiles[$key] = null;
+ } elseif ($this->profileDirectories === []) {
+ // If the extension belongs to a profile but no profile directories are
+ // defined, then we are scanning for installation profiles themselves.
+ // In this case, profiles are sorted by origin only.
+ $origins[$key] = self::ORIGIN_PROFILE;
+ $profiles[$key] = null;
+ } else {
+ // Apply the weight of the originating profile directory.
+ foreach ($this->profileDirectories as $weight => $profile_path) {
+ if (strpos($file->getPath(), $profile_path) === 0) {
+ $origins[$key] = self::ORIGIN_PROFILE;
+ $profiles[$key] = $weight;
+ continue 2;
+ }
+ }
+ }
+ }
+ // Now sort the extensions by origin and installation profile(s).
+ // The result of this multisort can be depicted like the following matrix,
+ // whereas the first integer is the weight of the originating directory and
+ // the second is the weight of the originating installation profile:
+ // 0 core/modules/node/node.module
+ // 1 0 profiles/parent_profile/modules/parent_module/parent_module.module
+ // 1 1 core/profiles/testing/modules/compatible_test/compatible_test.module
+ // 2 sites/all/modules/common/common.module
+ // 3 modules/devel/devel.module
+ // 4 sites/default/modules/custom/custom.module
+ array_multisort($origins, SORT_ASC, $profiles, SORT_ASC, $all_files);
+
+ return $all_files;
+ }
+
+ /**
+ * Processes the filtered and sorted list of extensions.
+ *
+ * Extensions discovered in later search paths override earlier, unless they
+ * are not compatible with the current version of Drupal core.
+ *
+ * @param \mglaman\PHPStanDrupal\Drupal\Extension[] $all_files
+ * The sorted list of all extensions that were found.
+ *
+ * @return \mglaman\PHPStanDrupal\Drupal\Extension[]
+ * The filtered list of extensions, keyed by extension name.
+ */
+ protected function process(array $all_files)
+ {
+ $files = [];
+ // Duplicate files found in later search directories take precedence over
+ // earlier ones; they replace the extension in the existing $files array.
+ foreach ($all_files as $file) {
+ $files[$file->getName()] = $file;
+ }
+ return $files;
+ }
+
+ /**
+ * Recursively scans a base directory for the extensions it contains.
+ *
+ * @param string $dir
+ * A relative base directory path to scan, without trailing slash.
+ *
+ * @return array
+ * An associative array whose keys are extension type names and whose values
+ * are associative arrays of \Drupal\Core\Extension\Extension objects, keyed
+ * by absolute path name.
+ *
+ * @see \mglaman\PHPStanDrupal\Drupal\RecursiveExtensionFilterIterator
+ */
+ protected function scanDirectory($dir): array
+ {
+ $files = [];
+
+ // In order to scan top-level directories, absolute directory paths have to
+ // be used (which also improves performance, since any configured PHP
+ // include_paths will not be consulted). Retain the relative originating
+ // directory being scanned, so relative paths can be reconstructed below
+ // (all paths are expected to be relative to $this->root).
+ $dir_prefix = ($dir === '' ? '' : "$dir/");
+ $absolute_dir = ($dir === '' ? $this->root : $this->root . "/$dir");
+
+ if (!is_dir($absolute_dir)) {
+ return $files;
+ }
+ // Use Unix paths regardless of platform, skip dot directories, follow
+ // symlinks (to allow extensions to be linked from elsewhere), and return
+ // the RecursiveDirectoryIterator instance to have access to getSubPath(),
+ // since SplFileInfo does not support relative paths.
+ $flags = FilesystemIterator::UNIX_PATHS;
+ $flags |= FilesystemIterator::SKIP_DOTS;
+ $flags |= FilesystemIterator::FOLLOW_SYMLINKS;
+ $flags |= FilesystemIterator::CURRENT_AS_SELF;
+ $directory_iterator = new RecursiveDirectoryIterator($absolute_dir, $flags);
+
+ // Allow directories specified in settings.php to be ignored. You can use
+ // this to not check for files in common special-purpose directories. For
+ // example, node_modules and bower_components. Ignoring irrelevant
+ // directories is a performance boost.
+ $ignore_directories = ['node_modules', 'bower_components'];
+
+ // Filter the recursive scan to discover extensions only.
+ // Important: Without a RecursiveFilterIterator, RecursiveDirectoryIterator
+ // would recurse into the entire filesystem directory tree without any kind
+ // of limitations.
+ $filter = new RecursiveExtensionFilterIterator($directory_iterator, $ignore_directories);
+
+ // The actual recursive filesystem scan is only invoked by instantiating the
+ // RecursiveIteratorIterator.
+ $iterator = new RecursiveIteratorIterator(
+ $filter,
+ RecursiveIteratorIterator::LEAVES_ONLY,
+ // Suppress filesystem errors in case a directory cannot be accessed.
+ RecursiveIteratorIterator::CATCH_GET_CHILD
+ );
+
+ foreach ($iterator as $key => $fileinfo) {
+ // All extension names in Drupal have to be valid PHP function names due
+ // to the module hook architecture.
+ if (preg_match(self::PHP_FUNCTION_PATTERN, $fileinfo->getBasename('.info.yml')) !== 1) {
+ continue;
+ }
+
+ // This test module has a function declaration that conflicts with another module. Explicitly skip it.
+ // @see https://www.drupal.org/project/drupal/issues/3020142
+ // @todo remove when Drupal core fixed.
+ if ($fileinfo->getBasename('.info.yml') === 'no_transitions_css') {
+ continue;
+ }
+
+ // Determine extension type from info file.
+ $type = false;
+ $file = $fileinfo->openFile('r');
+ while ($type === false && !$file->eof()) {
+ if ($line = $file->fgets()) {
+ preg_match('@^type:\s*(\'|")?(\w+)\1?\s*$@', $line, $matches);
+ if (isset($matches[2])) {
+ $type = $matches[2];
+ }
+ }
+ }
+ if ($type === false) {
+ continue;
+ }
+ $name = $fileinfo->getBasename('.info.yml');
+ $pathname = $dir_prefix . $fileinfo->getSubPathname();
+
+ // Determine whether the extension has a main extension file.
+ // For theme engines, the file extension is .engine.
+ if ($type === 'theme_engine') {
+ $filename = $name . '.engine';
+ } else {
+ $filename = $name . '.' . $type;
+ }
+ if (!file_exists($this->root . '/' . dirname($pathname) . '/' . $filename)) {
+ $filename = null;
+ }
+
+ $extension = new Extension($this->root, $type, $pathname, $filename);
+
+ // Track the originating directory for sorting purposes.
+ $extension->subpath = $fileinfo->getSubPath();
+ $extension->origin = $dir;
+
+ $files[$type][$key] = $extension;
+ }
+ return $files;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionMap.php b/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionMap.php
new file mode 100644
index 00000000..819c23b0
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/ExtensionMap.php
@@ -0,0 +1,87 @@
+ */
+ private static $modules = [];
+
+ /** @var array */
+ private static $themes = [];
+
+ /** @var array */
+ private static $profiles = [];
+
+ /**
+ * @return Extension[]
+ */
+ public function getModules(): array
+ {
+ return self::$modules;
+ }
+
+ public function getModule(string $name): ?Extension
+ {
+ return self::$modules[$name] ?? null;
+ }
+
+ /**
+ * @return Extension[]
+ */
+ public function getThemes(): array
+ {
+ return self::$themes;
+ }
+
+ public function getTheme(string $name): ?Extension
+ {
+ return self::$themes[$name] ?? null;
+ }
+
+ /**
+ * @return Extension[]
+ */
+ public function getProfiles(): array
+ {
+ return self::$profiles;
+ }
+
+ public function getProfile(string $name): ?Extension
+ {
+ return self::$profiles[$name] ?? null;
+ }
+
+ /**
+ * @param array $modules
+ * @param array $themes
+ * @param array $profiles
+ */
+ public function setExtensions(array $modules, array $themes, array $profiles): void
+ {
+ self::$modules = self::keyByExtensionName($modules);
+ self::$themes = self::keyByExtensionName($themes);
+ self::$profiles = self::keyByExtensionName($profiles);
+ }
+
+ /**
+ * @param array $extensions
+ * @return array
+ */
+ private static function keyByExtensionName(array $extensions): array
+ {
+ // PHP 7.4 returns array|false, PHP 8.0 only returns an array.
+ // Make PHPStan happy. When PHP 7.4 is dropped, reduce to a single
+ // return.
+ $combined = array_combine(array_map(static function (Extension $extension) {
+ return $extension->getName();
+ }, $extensions), $extensions);
+ // @phpstan-ignore-next-line
+ assert(is_array($combined));
+ return $combined;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/RecursiveExtensionFilterIterator.php b/vendor/mglaman/phpstan-drupal/src/Drupal/RecursiveExtensionFilterIterator.php
new file mode 100644
index 00000000..94cd90fb
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/RecursiveExtensionFilterIterator.php
@@ -0,0 +1,131 @@
+blacklist = array_merge($this->blacklist, $blacklist);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getChildren(): RecursiveFilterIterator
+ {
+ $filter = parent::getChildren();
+ if ($filter instanceof self) {
+ // Pass on the blacklist.
+ $filter->blacklist = $this->blacklist;
+ }
+ return $filter;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function accept(): bool
+ {
+ $name = $this->current()->getFilename();
+ // FilesystemIterator::SKIP_DOTS only skips '.' and '..', but not hidden
+ // directories (like '.git').
+ if ($name[0] === '.') {
+ return false;
+ }
+ if ($this->isDir()) {
+ // If this is a subdirectory of a base search path, only recurse into the
+ // fixed list of expected extension type directory names. Required for
+ // scanning the top-level/root directory; without this condition, we would
+ // recurse into the whole filesystem tree that possibly contains other
+ // files aside from Drupal.
+ if ($this->current()->getSubPath() === '') {
+ return in_array($name, $this->whitelist, true);
+ }
+ // 'config' directories are special-cased here, because every extension
+ // contains one. However, those default configuration directories cannot
+ // contain extensions. The directory name cannot be globally skipped,
+ // because core happens to have a directory of an actual module that is
+ // named 'config'. By explicitly testing for that case, we can skip all
+ // other config directories, and at the same time, still allow the core
+ // config module to be overridden/replaced in a profile/site directory
+ // (whereas it must be located directly in a modules directory).
+ if ($name === 'config') {
+ return substr($this->current()->getPathname(), -14) === 'modules/config';
+ }
+ // Accept the directory unless the name is blacklisted.
+ return !in_array($name, $this->blacklist, true);
+ }
+
+ // Only accept extension info files.
+ return substr($name, -9) === '.info.yml';
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Drupal/ServiceMap.php b/vendor/mglaman/phpstan-drupal/src/Drupal/ServiceMap.php
new file mode 100644
index 00000000..b27c5e4b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Drupal/ServiceMap.php
@@ -0,0 +1,97 @@
+ $serviceDefinition) {
+ if (isset($serviceDefinition['alias'], $drupalServices[$serviceDefinition['alias']])) {
+ $serviceDefinition = $drupalServices[$serviceDefinition['alias']];
+ }
+ if (isset($serviceDefinition['parent'], $drupalServices[$serviceDefinition['parent']])) {
+ $serviceDefinition = $this->resolveParentDefinition($serviceDefinition['parent'], $serviceDefinition, $drupalServices);
+ }
+
+ if (isset($serviceDefinition['decorates'])) {
+ $decorators[$serviceDefinition['decorates']][] = $serviceId;
+ }
+
+ // @todo support factories
+ if (!isset($serviceDefinition['class'])) {
+ if (class_exists($serviceId)) {
+ $serviceDefinition['class'] = $serviceId;
+ } else {
+ continue;
+ }
+ }
+ self::$services[$serviceId] = new DrupalServiceDefinition(
+ (string) $serviceId,
+ $serviceDefinition['class'],
+ $serviceDefinition['public'] ?? true,
+ $serviceDefinition['alias'] ?? null
+ );
+ $deprecated = $serviceDefinition['deprecated'] ?? null;
+ if ($deprecated) {
+ self::$services[$serviceId]->setDeprecated(true, $deprecated);
+ }
+ }
+
+ foreach ($decorators as $decorated_service_id => $services) {
+ foreach ($services as $dcorating_service_id) {
+ if (!isset(self::$services[$decorated_service_id])) {
+ continue;
+ }
+ self::$services[$decorated_service_id]->addDecorator(self::$services[$dcorating_service_id]);
+ }
+ }
+ }
+
+ private function resolveParentDefinition(string $parentId, array $serviceDefinition, array $drupalServices): array
+ {
+ $parentDefinition = $drupalServices[$parentId] ?? [];
+ if ([] === $parentDefinition) {
+ return $serviceDefinition;
+ }
+
+ if (isset($parentDefinition['parent'])) {
+ if (!isset($drupalServices[$parentDefinition['parent']])) {
+ return $serviceDefinition;
+ }
+
+ $parentDefinition = $this->resolveParentDefinition($parentDefinition['parent'], $drupalServices[$parentDefinition['parent']], $drupalServices);
+ }
+
+ if (isset($parentDefinition['class']) && !isset($serviceDefinition['class'])) {
+ $serviceDefinition['class'] = $parentDefinition['class'];
+ }
+
+ if (isset($parentDefinition['public']) && !isset($serviceDefinition['public'])) {
+ $serviceDefinition['public'] = $parentDefinition['public'];
+ }
+
+ return $serviceDefinition;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Internal/DeprecatedScopeCheck.php b/vendor/mglaman/phpstan-drupal/src/Internal/DeprecatedScopeCheck.php
new file mode 100644
index 00000000..3cde039f
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Internal/DeprecatedScopeCheck.php
@@ -0,0 +1,22 @@
+getClassReflection();
+ if ($class !== null && $class->isDeprecated()) {
+ return true;
+ }
+ $trait = $scope->getTraitReflection();
+ if ($trait !== null && $trait->isDeprecated()) {
+ return true;
+ }
+ $function = $scope->getFunction();
+ return $function !== null && $function->isDeprecated()->yes();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Internal/NamespaceCheck.php b/vendor/mglaman/phpstan-drupal/src/Internal/NamespaceCheck.php
new file mode 100644
index 00000000..52cfd946
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Internal/NamespaceCheck.php
@@ -0,0 +1,39 @@
+namespacedName)) {
+ return false;
+ }
+
+ return 'Drupal' === (string) $class->namespacedName->slice(0, 1);
+ }
+
+ public static function isSharedNamespace(Class_ $class): bool
+ {
+ if (!isset($class->extends)) {
+ return false;
+ }
+
+ // @phpstan-ignore-next-line
+ if (!isset($class->namespacedName)) {
+ return false;
+ }
+
+ if (!self::isDrupalNamespace($class)) {
+ return false;
+ }
+
+ return (string) $class->namespacedName->slice(0, 2) === (string) $class->extends->slice(0, 2);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldMethodsViaMagicReflectionExtension.php b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldMethodsViaMagicReflectionExtension.php
new file mode 100644
index 00000000..d177ac62
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldMethodsViaMagicReflectionExtension.php
@@ -0,0 +1,49 @@
+hasNativeMethod($methodName) || array_key_exists($methodName, $classReflection->getMethodTags())) {
+ // Let other parts of PHPStan handle this.
+ return false;
+ }
+ $interfaceObject = new ObjectType('Drupal\Core\Field\FieldItemListInterface');
+ $objectType = new ObjectType($classReflection->getName());
+ if (!$interfaceObject->isSuperTypeOf($objectType)->yes()) {
+ return false;
+ }
+
+ if ($methodName === 'referencedEntities') {
+ return true;
+ }
+
+ return false;
+ }
+
+ public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
+ {
+ if ($methodName === 'referencedEntities') {
+ $entityReferenceFieldItemListInterfaceType = new ObjectType('Drupal\Core\Field\EntityReferenceFieldItemListInterface');
+ $classReflection = $entityReferenceFieldItemListInterfaceType->getClassReflection();
+ assert($classReflection !== null);
+ }
+
+ return new FieldItemListMethodReflection(
+ $classReflection,
+ $methodName
+ );
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldReflection.php b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldReflection.php
new file mode 100644
index 00000000..dd6c45ac
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldReflection.php
@@ -0,0 +1,129 @@
+declaringClass = $declaringClass;
+ $this->propertyName = $propertyName;
+ }
+
+ public function getReadableType(): Type
+ {
+ if ($this->propertyName === 'original') {
+ if ($this->declaringClass->isSubclassOf('Drupal\Core\Entity\ContentEntityInterface')) {
+ $objectType = 'Drupal\Core\Entity\ContentEntityInterface';
+ } elseif ($this->declaringClass->isSubclassOf('Drupal\Core\Config\Entity\ConfigEntityInterface')) {
+ $objectType = 'Drupal\Core\Config\Entity\ConfigEntityInterface';
+ } else {
+ $objectType = 'Drupal\Core\Entity\EntityInterface';
+ }
+ return new ObjectType($objectType);
+ }
+
+ if ($this->declaringClass->isSubclassOf('Drupal\Core\Entity\ContentEntityInterface')) {
+ // Assume the property is a field.
+ return new ObjectType('Drupal\Core\Field\FieldItemListInterface');
+ }
+
+ return new MixedType();
+ }
+
+ public function getWritableType(): Type
+ {
+ if ($this->propertyName === 'original') {
+ if ($this->declaringClass->isSubclassOf('Drupal\Core\Entity\ContentEntityInterface')) {
+ $objectType = 'Drupal\Core\Entity\ContentEntityInterface';
+ } elseif ($this->declaringClass->isSubclassOf('Drupal\Core\Config\Entity\ConfigEntityInterface')) {
+ $objectType = 'Drupal\Core\Config\Entity\ConfigEntityInterface';
+ } else {
+ $objectType = 'Drupal\Core\Entity\EntityInterface';
+ }
+ return new ObjectType($objectType);
+ }
+
+ // @todo Drupal allows $entity->field_myfield = 'string'; does this break that?
+ if ($this->declaringClass->isSubclassOf('Drupal\Core\Entity\ContentEntityInterface')) {
+ // Assume the property is a field.
+ return new ObjectType('Drupal\Core\Field\FieldItemListInterface');
+ }
+
+ return new MixedType();
+ }
+
+ public function canChangeTypeAfterAssignment(): bool
+ {
+ return true;
+ }
+
+ public function getDeclaringClass(): ClassReflection
+ {
+ return $this->declaringClass;
+ }
+
+ public function isStatic(): bool
+ {
+ return false;
+ }
+
+ public function isPrivate(): bool
+ {
+ return false;
+ }
+
+ public function isPublic(): bool
+ {
+ return true;
+ }
+
+ public function isReadable(): bool
+ {
+ return true;
+ }
+
+ public function isWritable(): bool
+ {
+ return true;
+ }
+
+ public function getDeprecatedDescription(): ?string
+ {
+ return null;
+ }
+
+ public function getDocComment(): ?string
+ {
+ return null;
+ }
+
+ public function isDeprecated(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+
+ public function isInternal(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldsViaMagicReflectionExtension.php b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldsViaMagicReflectionExtension.php
new file mode 100644
index 00000000..5261e926
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Reflection/EntityFieldsViaMagicReflectionExtension.php
@@ -0,0 +1,75 @@
+hasNativeProperty($propertyName) || array_key_exists($propertyName, $classReflection->getPropertyTags())) {
+ // Let other parts of PHPStan handle this.
+ return false;
+ }
+
+ foreach ($classReflection->getAncestors() as $ancestor) {
+ if (array_key_exists($propertyName, $ancestor->getPropertyTags())) {
+ return false;
+ }
+ }
+
+ // We need to find a way to parse the entity annotation so that at the minimum the `entity_keys` are
+ // supported. The real fix is Drupal developers _really_ need to start writing @property definitions in the
+ // class doc if they don't get `get` methods.
+ if ($classReflection->implementsInterface('Drupal\Core\Entity\ContentEntityInterface')) {
+ // @todo revisit if it's a good idea to be true.
+ // Content entities have magical __get... so it is kind of true.
+ return true;
+ }
+ if (self::classObjectIsSuperOfInterface($classReflection->getName(), self::getFieldItemListInterfaceObject())->yes()) {
+ return FieldItemListPropertyReflection::canHandleProperty($classReflection, $propertyName);
+ }
+
+ return false;
+ }
+
+ public function getProperty(ClassReflection $classReflection, string $propertyName): PropertyReflection
+ {
+ if ($classReflection->implementsInterface('Drupal\Core\Entity\EntityInterface')) {
+ return new EntityFieldReflection($classReflection, $propertyName);
+ }
+ if (self::classObjectIsSuperOfInterface($classReflection->getName(), self::getFieldItemListInterfaceObject())->yes()) {
+ return new FieldItemListPropertyReflection($classReflection, $propertyName);
+ }
+
+ throw new LogicException($classReflection->getName() . "::$propertyName should be handled earlier.");
+ }
+
+ public static function classObjectIsSuperOfInterface(string $name, ObjectType $interfaceObject) : TrinaryLogic
+ {
+ return $interfaceObject->isSuperTypeOf(new ObjectType($name));
+ }
+
+ protected static function getFieldItemListInterfaceObject() : ObjectType
+ {
+ return new ObjectType('Drupal\Core\Field\FieldItemListInterface');
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListMethodReflection.php b/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListMethodReflection.php
new file mode 100644
index 00000000..7204279f
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListMethodReflection.php
@@ -0,0 +1,102 @@
+declaringClass = $declaringClass;
+ $this->methodName = $methodName;
+ }
+
+ public function getDeclaringClass(): ClassReflection
+ {
+ return $this->declaringClass;
+ }
+
+ public function isStatic(): bool
+ {
+ return false;
+ }
+
+ public function isPrivate(): bool
+ {
+ return false;
+ }
+
+ public function isPublic(): bool
+ {
+ return true;
+ }
+
+ public function getDocComment(): ?string
+ {
+ return null;
+ }
+
+ public function getName(): string
+ {
+ return $this->methodName;
+ }
+
+ public function getPrototype(): ClassMemberReflection
+ {
+ return $this;
+ }
+
+ /**
+ * @return \PHPStan\Reflection\ParametersAcceptor[]
+ */
+ public function getVariants(): array
+ {
+ return [
+ new TrivialParametersAcceptor(),
+ ];
+ }
+
+ public function isDeprecated(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+
+ public function getDeprecatedDescription(): ?string
+ {
+ return '';
+ }
+
+ public function isFinal(): TrinaryLogic
+ {
+ return TrinaryLogic::createYes();
+ }
+
+ public function isInternal(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+
+ public function getThrowType(): ?Type
+ {
+ return null;
+ }
+
+ public function hasSideEffects(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListPropertyReflection.php b/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListPropertyReflection.php
new file mode 100644
index 00000000..53583b43
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Reflection/FieldItemListPropertyReflection.php
@@ -0,0 +1,130 @@
+declaringClass = $declaringClass;
+ $this->propertyName = $propertyName;
+ }
+
+ public static function canHandleProperty(ClassReflection $classReflection, string $propertyName): bool
+ {
+ // @todo use the class reflection and be more specific about handled properties.
+ // Currently \PHPStan\Reflection\EntityFieldReflection::getType always passes FieldItemListInterface.
+ $names = ['entity', 'value', 'target_id'];
+ return in_array($propertyName, $names, true);
+ }
+
+ public function getReadableType(): Type
+ {
+ if ($this->propertyName === 'entity') {
+ return new ObjectType('Drupal\Core\Entity\EntityInterface');
+ }
+ if ($this->propertyName === 'target_id') {
+ // @todo needs to be union type.
+ return new StringType();
+ }
+ // @todo this is wrong, integer/bool/decimal/etc all use single value property.
+ if ($this->propertyName === 'value') {
+ return new StringType();
+ }
+
+ // Fallback.
+ return new NullType();
+ }
+
+ public function getWritableType(): Type
+ {
+ if ($this->propertyName === 'entity') {
+ return new ObjectType('Drupal\Core\Entity\EntityInterface');
+ }
+ if ($this->propertyName === 'target_id') {
+ return new StringType();
+ }
+ if ($this->propertyName === 'value') {
+ return new StringType();
+ }
+
+ // Fallback.
+ return new NullType();
+ }
+
+ public function canChangeTypeAfterAssignment(): bool
+ {
+ return true;
+ }
+
+ public function getDeclaringClass(): ClassReflection
+ {
+ return $this->declaringClass;
+ }
+
+ public function isStatic(): bool
+ {
+ return false;
+ }
+
+ public function isPrivate(): bool
+ {
+ return false;
+ }
+
+ public function isPublic(): bool
+ {
+ return true;
+ }
+
+ public function isReadable(): bool
+ {
+ return true;
+ }
+
+ public function isWritable(): bool
+ {
+ return true;
+ }
+
+ public function getDocComment(): ?string
+ {
+ return null;
+ }
+
+ public function isDeprecated(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+
+ public function getDeprecatedDescription(): ?string
+ {
+ return null;
+ }
+
+ public function isInternal(): TrinaryLogic
+ {
+ return TrinaryLogic::createNo();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Classes/ClassExtendsInternalClassRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Classes/ClassExtendsInternalClassRule.php
new file mode 100644
index 00000000..175f44ec
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Classes/ClassExtendsInternalClassRule.php
@@ -0,0 +1,82 @@
+
+ */
+class ClassExtendsInternalClassRule implements Rule
+{
+ /**
+ * @var ReflectionProvider
+ */
+ private $reflectionProvider;
+
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!isset($node->extends)) {
+ return [];
+ }
+
+ $extendedClassName = $node->extends->toString();
+ if (!$this->reflectionProvider->hasClass($extendedClassName)) {
+ return [];
+ }
+
+ $extendedClassReflection = $this->reflectionProvider->getClass($extendedClassName);
+ if (!$extendedClassReflection->isInternal()) {
+ return [];
+ }
+
+ // @phpstan-ignore-next-line
+ if (!isset($node->namespacedName)) {
+ return [$this->buildError(null, $extendedClassName)->build()];
+ }
+
+ $currentClassName = $node->namespacedName->toString();
+
+ if (!NamespaceCheck::isDrupalNamespace($node)) {
+ return [$this->buildError($currentClassName, $extendedClassName)->build()];
+ }
+
+ if (NamespaceCheck::isSharedNamespace($node)) {
+ return [];
+ }
+
+ $errorBuilder = $this->buildError($currentClassName, $extendedClassName);
+ if ($extendedClassName === 'Drupal\Core\Entity\ContentEntityDeleteForm') {
+ $errorBuilder->tip('Extend \Drupal\Core\Entity\ContentEntityConfirmFormBase. See https://www.drupal.org/node/2491057');
+ } elseif ((string) $node->extends->slice(0, 2) === 'Drupal\Core') {
+ $errorBuilder->tip('Read the Drupal core backwards compatibility and internal API policy: https://www.drupal.org/about/core/policies/core-change-policies/drupal-8-and-9-backwards-compatibility-and-internal-api#internal');
+ }
+ return [$errorBuilder->build()];
+ }
+
+ private function buildError(?string $currentClassName, string $extendedClassName): RuleErrorBuilder
+ {
+ return RuleErrorBuilder::message(sprintf(
+ '%s extends @internal class %s.',
+ $currentClassName !== null ? sprintf('Class %s', $currentClassName) : 'Anonymous class',
+ $extendedClassName
+ ));
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Classes/PluginManagerInspectionRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Classes/PluginManagerInspectionRule.php
new file mode 100644
index 00000000..98871f9d
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Classes/PluginManagerInspectionRule.php
@@ -0,0 +1,141 @@
+
+ */
+class PluginManagerInspectionRule implements Rule
+{
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($node->namespacedName === null) {
+ // anonymous class
+ return [];
+ }
+ if ($node->extends === null) {
+ return [];
+ }
+ $className = (string) $node->namespacedName;
+ $pluginManagerType = new ObjectType($className);
+ $pluginManagerInterfaceType = new ObjectType('\Drupal\Component\Plugin\PluginManagerInterface');
+ if (!$pluginManagerInterfaceType->isSuperTypeOf($pluginManagerType)->yes()) {
+ return [];
+ }
+
+ $errors = [];
+ if ($this->isYamlDiscovery($node)) {
+ $errors = $this->inspectYamlPluginManager($node);
+ } else {
+ // @todo inspect annotated plugin managers.
+ }
+
+ $hasAlterInfoSet = false;
+
+ foreach ($node->stmts as $stmt) {
+ if ($stmt instanceof Node\Stmt\ClassMethod && $stmt->name->toString() === '__construct') {
+ foreach ($stmt->stmts ?? [] as $statement) {
+ if ($statement instanceof Node\Stmt\Expression) {
+ $statement = $statement->expr;
+ }
+ if ($statement instanceof Node\Expr\MethodCall
+ && $statement->name instanceof Node\Identifier
+ && $statement->name->name === 'alterInfo') {
+ $hasAlterInfoSet = true;
+ }
+ }
+ }
+ }
+
+ if (!$hasAlterInfoSet) {
+ $errors[] = 'Plugin definitions cannot be altered.';
+ }
+
+ return $errors;
+ }
+
+ private function isYamlDiscovery(Node\Stmt\Class_ $class): bool
+ {
+ foreach ($class->stmts as $stmt) {
+ // YAML discovery plugin managers must override getDiscovery.
+ if ($stmt instanceof Node\Stmt\ClassMethod && $stmt->name->toString() === 'getDiscovery') {
+ foreach ($stmt->stmts ?? [] as $methodStmt) {
+ if ($methodStmt instanceof Node\Stmt\If_) {
+ foreach ($methodStmt->stmts as $ifStmt) {
+ if ($ifStmt instanceof Node\Stmt\Expression) {
+ $ifStmtExpr = $ifStmt->expr;
+ if ($ifStmtExpr instanceof Node\Expr\Assign) {
+ $ifStmtExprVar = $ifStmtExpr->var;
+ if ($ifStmtExprVar instanceof Node\Expr\PropertyFetch
+ && $ifStmtExprVar->var instanceof Node\Expr\Variable
+ && $ifStmtExprVar->name instanceof Node\Identifier
+ && $ifStmtExprVar->name->name === 'discovery'
+ ) {
+ $ifStmtExprExpr = $ifStmtExpr->expr;
+ if ($ifStmtExprExpr instanceof Node\Expr\New_
+ && ($ifStmtExprExpr->class instanceof Node\Name)
+ && $ifStmtExprExpr->class->toString() === 'Drupal\Core\Plugin\Discovery\YamlDiscovery') {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private function inspectYamlPluginManager(Node\Stmt\Class_ $class): array
+ {
+ $errors = [];
+
+ $fqn = (string) $class->namespacedName;
+ $reflection = $this->reflectionProvider->getClass($fqn);
+ $constructor = $reflection->getConstructor();
+
+ if ($constructor->getDeclaringClass()->getName() !== $fqn) {
+ $errors[] = sprintf('%s must override __construct if using YAML plugins.', $fqn);
+ } else {
+ foreach ($class->stmts as $stmt) {
+ if ($stmt instanceof Node\Stmt\ClassMethod && $stmt->name->toString() === '__construct') {
+ foreach ($stmt->stmts ?? [] as $constructorStmt) {
+ if ($constructorStmt instanceof Node\Stmt\Expression) {
+ $constructorStmt = $constructorStmt->expr;
+ }
+ if ($constructorStmt instanceof Node\Expr\StaticCall
+ && $constructorStmt->class instanceof Node\Name
+ && ((string)$constructorStmt->class === 'parent')
+ && $constructorStmt->name instanceof Node\Identifier
+ && $constructorStmt->name->name === '__construct') {
+ $errors[] = sprintf('YAML plugin managers should not invoke its parent constructor.');
+ }
+ }
+ }
+ }
+ }
+ return $errors;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/AccessDeprecatedConstant.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/AccessDeprecatedConstant.php
new file mode 100644
index 00000000..e7e0fd83
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/AccessDeprecatedConstant.php
@@ -0,0 +1,132 @@
+
+ */
+class AccessDeprecatedConstant implements Rule
+{
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\ConstFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (DeprecatedScopeCheck::inDeprecatedScope($scope)) {
+ return [];
+ }
+
+ // nikic/php-parser does not let us access phpdoc comments from deprecated constants, so
+ // here goes a list of hardcoded core constants. List is available at
+ // https://api.drupal.org/api/drupal/deprecated/8.9.x?order=object_type&sort=asc&page=5
+ $deprecatedConstants = [
+ 'DATETIME_STORAGE_TIMEZONE' => 'Deprecated in drupal:8.5.0 and is removed from drupal:9.0.0. Use \Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::STORAGE_TIMEZONE instead.',
+ 'DATETIME_DATETIME_STORAGE_FORMAT' => 'Deprecated in drupal:8.5.0 and is removed from drupal:9.0.0. Use \Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::DATETIME_STORAGE_FORMAT instead.',
+ 'DATETIME_DATE_STORAGE_FORMAT' => 'Deprecated in drupal:8.5.0 and is removed from drupal:9.0.0. Use \Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface::DATE_STORAGE_FORMAT instead.',
+ 'DRUPAL_ANONYMOUS_RID' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use Drupal\Core\Session\AccountInterface::ANONYMOUS_ROLE or \Drupal\user\RoleInterface::ANONYMOUS_ID instead.',
+ 'DRUPAL_AUTHENTICATED_RID' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use Drupal\Core\Session\AccountInterface::AUTHENTICATED_ROLE or \Drupal\user\RoleInterface::AUTHENTICATED_ID instead.',
+ 'REQUEST_TIME' => 'Deprecated in drupal:8.3.0 and is removed from drupal:11.0.0. Use \Drupal::time()->getRequestTime(); ',
+ 'DRUPAL_PHP_FUNCTION_PATTERN' => 'Deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\Core\Extension\ExtensionDiscovery::PHP_FUNCTION_PATTERN instead.',
+ 'CONFIG_ACTIVE_DIRECTORY' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Drupal core no longer creates an active directory.',
+ 'CONFIG_SYNC_DIRECTORY' => 'Deprecated in drupal:8.8.0 and is removed from drupal:9.0.0. Use \Drupal\Core\Site\Settings::get(\'config_sync_directory\') instead.',
+ 'CONFIG_STAGING_DIRECTORY' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. The staging directory was renamed to sync.',
+ 'LOCALE_PLURAL_DELIMITER' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use Drupal\Component\Gettext\PoItem::DELIMITER instead.',
+ 'FILE_CHMOD_DIRECTORY' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystem::CHMOD_DIRECTORY.',
+ 'FILE_CHMOD_FILE' => 'Deprecated in drupal:8.0.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystem::CHMOD_FILE.',
+ 'FILE_CREATE_DIRECTORY' => 'Deprecated in drupal:8.7.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystemInterface::CREATE_DIRECTORY.',
+ 'FILE_MODIFY_PERMISSIONS' => 'Deprecated in drupal:8.7.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystemInterface::MODIFY_PERMISSIONS.',
+ 'FILE_EXISTS_RENAME' => 'Deprecated in drupal:8.7.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystemInterface::EXISTS_RENAME.',
+ 'FILE_EXISTS_REPLACE' => 'Deprecated in drupal:8.7.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystemInterface::EXISTS_REPLACE.',
+ 'FILE_EXISTS_ERROR' => 'Deprecated in drupal:8.7.0 and is removed from drupal:9.0.0. Use \Drupal\Core\File\FileSystemInterface::EXISTS_ERROR.',
+ 'AGGREGATOR_CLEAR_NEVER' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\aggregator\FeedStorageInterface::CLEAR_NEVER instead.',
+ 'COMMENT_ANONYMOUS_MAYNOT_CONTACT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\comment\CommentInterface::ANONYMOUS_MAYNOT_CONTACT instead.',
+ 'COMMENT_ANONYMOUS_MAY_CONTACT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\comment\CommentInterface::ANONYMOUS_MAY_CONTACT instead.',
+ 'COMMENT_ANONYMOUS_MUST_CONTACT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\comment\CommentInterface::ANONYMOUS_MUST_CONTACT instead.',
+ 'IMAGE_STORAGE_NORMAL' => 'Deprecated in drupal:8.1.0 and is removed from drupal:9.0.0.',
+ 'IMAGE_STORAGE_OVERRIDE' => 'Deprecated in drupal:8.1.0 and is removed from drupal:9.0.0.',
+ 'IMAGE_STORAGE_DEFAULT' => 'Deprecated in drupal:8.1.0 and is removed from drupal:9.0.0.',
+ 'IMAGE_STORAGE_EDITABLE' => 'Deprecated in drupal:8.1.0 and is removed from drupal:9.0.0.',
+ 'IMAGE_STORAGE_MODULE' => 'Deprecated in drupal:8.1.0 and is removed from drupal:9.0.0.',
+ 'MENU_MAX_MENU_NAME_LENGTH_UI' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\system\MenuStorage::MAX_ID_LENGTH instead.',
+ 'NODE_NOT_PUBLISHED' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::NOT_PUBLISHED instead.',
+ 'NODE_PUBLISHED' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::PUBLISHED instead.',
+ 'NODE_NOT_PROMOTED' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::NOT_PROMOTED instead.',
+ 'NODE_PROMOTED' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::PROMOTED instead.',
+ 'NODE_NOT_STICKY' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::NOT_STICKY instead.',
+ 'NODE_STICKY' => 'Deprecated in drupal:8.?.? and is removed from drupal:9.0.0. Use \Drupal\node\NodeInterface::STICKY instead.',
+ 'RESPONSIVE_IMAGE_EMPTY_IMAGE' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use Drupal\responsive_image\ResponsiveImageStyleInterface::EMPTY_IMAGE instead.',
+ 'RESPONSIVE_IMAGE_ORIGINAL_IMAGE' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\responsive_image\ResponsiveImageStyleInterface::ORIGINAL_IMAGE instead.',
+ 'DRUPAL_USER_TIMEZONE_DEFAULT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::TIMEZONE_DEFAULT instead.',
+ 'DRUPAL_USER_TIMEZONE_EMPTY' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::TIMEZONE_EMPTY instead.',
+ 'DRUPAL_USER_TIMEZONE_SELECT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::TIMEZONE_SELECT instead.',
+ 'TAXONOMY_HIERARCHY_DISABLED' => 'Deprecated in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\taxonomy\VocabularyInterface::HIERARCHY_DISABLED instead.',
+ 'TAXONOMY_HIERARCHY_SINGLE' => 'Deprecated in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\taxonomy\VocabularyInterface::HIERARCHY_SINGLE instead.',
+ 'TAXONOMY_HIERARCHY_MULTIPLE' => 'Deprecated in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\taxonomy\VocabularyInterface::HIERARCHY_MULTIPLE instead.',
+ 'UPDATE_NOT_SECURE' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateManagerInterface::NOT_SECURE instead.',
+ 'UPDATE_REVOKED' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateManagerInterface::REVOKED instead.',
+ 'UPDATE_NOT_SUPPORTED' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateManagerInterface::NOT_SUPPORTED instead.',
+ 'UPDATE_NOT_CURRENT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateManagerInterface::NOT_CURRENT instead.',
+ 'UPDATE_CURRENT' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateManagerInterface::CURRENT instead.',
+ 'UPDATE_NOT_CHECKED' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateFetcherInterface::NOT_CHECKED instead.',
+ 'UPDATE_UNKNOWN' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateFetcherInterface::UNKNOWN instead.',
+ 'UPDATE_NOT_FETCHED' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateFetcherInterface::NOT_FETCHED instead.',
+ 'UPDATE_FETCH_PENDING' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\update\UpdateFetcherInterface::FETCH_PENDING instead.',
+ 'USERNAME_MAX_LENGTH' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::USERNAME_MAX_LENGTH instead.',
+ 'USER_REGISTER_ADMINISTRATORS_ONLY' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::REGISTER_ADMINISTRATORS_ONLY instead.',
+ 'USER_REGISTER_VISITORS' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::REGISTER_VISITORS instead.',
+ 'USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL' => 'Deprecated in drupal:8.3.0 and is removed from drupal:9.0.0. Use \Drupal\user\UserInterface::REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL instead.',
+ ];
+ [$major, $minor] = explode('.', Drupal::VERSION, 3);
+ if ($major === '9') {
+ if ((int) $minor >= 1) {
+ $deprecatedConstants = array_merge($deprecatedConstants, [
+ 'DRUPAL_MINIMUM_PHP' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal::MINIMUM_PHP instead.',
+ 'DRUPAL_MINIMUM_PHP_MEMORY_LIMIT' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal::MINIMUM_PHP_MEMORY_LIMIT instead.',
+ 'DRUPAL_MINIMUM_SUPPORTED_PHP' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal::MINIMUM_SUPPORTED_PHP instead.',
+ 'DRUPAL_RECOMMENDED_PHP' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal::RECOMMENDED_PHP instead.',
+ 'PREG_CLASS_CJK' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal\search\SearchTextProcessorInterface::PREG_CLASS_CJK instead.',
+ 'PREG_CLASS_NUMBERS' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal\search\SearchTextProcessorInterface::PREG_CLASS_NUMBERS',
+ 'PREG_CLASS_PUNCTUATION' => 'Deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use \Drupal\search\SearchTextProcessorInterface::PREG_CLASS_PUNCTUATION',
+ ]);
+ }
+ if ((int) $minor >= 2) {
+ $deprecatedConstants = array_merge($deprecatedConstants, [
+ 'FILE_INSECURE_EXTENSION_REGEX' => 'Deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use \Drupal\Core\File\FileSystemInterface::INSECURE_EXTENSION_REGEX.',
+ ]);
+ }
+ if ((int) $minor >= 3) {
+ $deprecatedConstants = array_merge($deprecatedConstants, [
+ 'FILE_STATUS_PERMANENT' => 'Deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Drupal\file\FileInterface::STATUS_PERMANENT or \Drupal\file\FileInterface::setPermanent().',
+ 'SCHEMA_UNINSTALLED' => 'Deprecated in drupal:9.3.0 and is removed from drupal:10.0.0. Use \Drupal\Core\Update\UpdateHookRegistry::SCHEMA_UNINSTALLED',
+ ]);
+ }
+ }
+
+ $constantName = $this->reflectionProvider->resolveConstantName($node->name, $scope);
+ if (isset($deprecatedConstants[$constantName])) {
+ return [
+ sprintf('Call to deprecated constant %s: %s', $constantName, $deprecatedConstants[$constantName])
+ ];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConditionManagerCreateInstanceContextConfigurationRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConditionManagerCreateInstanceContextConfigurationRule.php
new file mode 100644
index 00000000..d8a26cb9
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConditionManagerCreateInstanceContextConfigurationRule.php
@@ -0,0 +1,61 @@
+
+ */
+final class ConditionManagerCreateInstanceContextConfigurationRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node\Expr\MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ if ($node->name->toString() !== 'createInstance') {
+ return [];
+ }
+ $args = $node->getArgs();
+ if (count($args) !== 2) {
+ return [];
+ }
+ $conditionManagerType = new ObjectType(ConditionManager::class);
+ $type = $scope->getType($node->var);
+ if (!$conditionManagerType->isSuperTypeOf($type)->yes()) {
+ return [];
+ }
+ $configuration = $args[1];
+ $configurationType = $scope->getType($configuration->value);
+ // Must be an array, return [] and allow parameter inspection rule to report error.
+ if (!$configurationType instanceof ConstantArrayType) {
+ return [];
+ }
+
+ foreach ($configurationType->getKeyTypes() as $keyType) {
+ if ($keyType instanceof ConstantStringType && $keyType->getValue() === 'context') {
+ return [
+ RuleErrorBuilder::message('Passing context values to plugins via configuration is deprecated in drupal:9.1.0 and will be removed before drupal:10.0.0. Instead, call ::setContextValue() on the plugin itself. See https://www.drupal.org/node/3120980')
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ }
+ }
+
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConfigEntityConfigExportRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConfigEntityConfigExportRule.php
new file mode 100644
index 00000000..1c4bcf5a
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/ConfigEntityConfigExportRule.php
@@ -0,0 +1,52 @@
+getResolvedPhpDoc();
+ // Plugins should always be annotated, but maybe this class is missing its
+ // annotation since it swaps an existing one.
+ if ($phpDoc === null || !$this->isAnnotated($phpDoc)) {
+ return [];
+ }
+ $hasMatch = preg_match('/config_export\s?=\s?{/', $phpDoc->getPhpDocString());
+ if ($hasMatch === false) {
+ throw new ShouldNotHappenException('Unexpected error when trying to run match on phpDoc string.');
+ }
+ if ($hasMatch === 0) {
+ return [
+ 'Configuration entity must define a `config_export` key. See https://www.drupal.org/node/2481909',
+ ];
+ }
+ return [];
+ }
+
+ private function isAnnotated(ResolvedPhpDocBlock $phpDoc): bool
+ {
+ foreach ($phpDoc->getPhpDocNodes() as $docNode) {
+ foreach ($docNode->children as $childNode) {
+ if (($childNode instanceof PhpDocTagNode) && $childNode->name === '@ConfigEntityType') {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedAnnotationsRuleBase.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedAnnotationsRuleBase.php
new file mode 100644
index 00000000..8f94f969
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedAnnotationsRuleBase.php
@@ -0,0 +1,67 @@
+
+ */
+abstract class DeprecatedAnnotationsRuleBase implements Rule
+{
+
+ /**
+ * @var \PHPStan\Reflection\ReflectionProvider
+ */
+ protected $reflectionProvider;
+
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ abstract protected function getExpectedInterface(): string;
+
+ abstract protected function doProcessNode(
+ ClassReflection $reflection,
+ Node\Stmt\Class_ $node,
+ Scope $scope
+ ): array;
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($node->extends === null) {
+ return [];
+ }
+ if ($node->name === null) {
+ return [];
+ }
+ if ($node->isAbstract()) {
+ return [];
+ }
+ // PHPStan gives anonymous classes a name, so we cannot determine if
+ // a class is truly anonymous using the normal methods from php-parser.
+ // @see \PHPStan\Reflection\BetterReflection\BetterReflectionProvider::getAnonymousClassReflection
+ if ($node->hasAttribute('anonymousClass') && $node->getAttribute('anonymousClass') === true) {
+ return [];
+ }
+ $className = $node->name->name;
+ $namespace = $scope->getNamespace();
+ $reflection = $this->reflectionProvider->getClass($namespace . '\\' . $className);
+ $implementsExpectedInterface = $reflection->implementsInterface($this->getExpectedInterface());
+ if (!$implementsExpectedInterface) {
+ return [];
+ }
+
+ return $this->doProcessNode($reflection, $node, $scope);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedHookImplementation.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedHookImplementation.php
new file mode 100644
index 00000000..a40425dc
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/DeprecatedHookImplementation.php
@@ -0,0 +1,104 @@
+
+ */
+class DeprecatedHookImplementation implements Rule
+{
+
+ protected ReflectionProvider $reflectionProvider;
+
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Function_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope) : array
+ {
+ if (!str_ends_with($scope->getFile(), ".module") && !str_ends_with($scope->getFile(), ".inc")) {
+ return [];
+ }
+
+ // We want both name.module and name.views.inc, to resolve to name.
+ $module_name = explode(".", basename($scope->getFile()))[0];
+
+ // Hooks start with their own module's name.
+ if (!str_starts_with($node->name->toString(), "{$module_name}_")) {
+ return [];
+ }
+
+ $function_name = $node->name->toString();
+ $hook_name = substr_replace($function_name, "hook", 0, strlen($module_name));
+
+ $hook_name_node = new Name($hook_name);
+ if (!$this->reflectionProvider->hasFunction($hook_name_node, $scope)) {
+ // @todo replace this hardcoded logic with something more intelligent and extensible.
+ if ($hook_name === 'hook_field_widget_form_alter') {
+ return $this->buildError(
+ $function_name,
+ $hook_name,
+ 'in drupal:9.2.0 and is removed from drupal:10.0.0. Use hook_field_widget_single_element_form_alter instead.'
+ );
+ }
+ if (str_starts_with($hook_name, 'hook_field_widget_') && str_ends_with($hook_name, '_form_alter')) {
+ return $this->buildError(
+ $function_name,
+ 'hook_field_widget_WIDGET_TYPE_form_alter',
+ 'in drupal:9.2.0 and is removed from drupal:10.0.0. Use hook_field_widget_single_element_WIDGET_TYPE_form_alter instead.'
+ );
+ }
+ if ($hook_name === 'hook_field_widget_multivalue_form_alter') {
+ return $this->buildError(
+ $function_name,
+ $hook_name,
+ 'in drupal:9.2.0 and is removed from drupal:10.0.0. Use hook_field_widget_complete_form_alter instead.'
+ );
+ }
+ if (str_starts_with($hook_name, 'hook_field_widget_multivalue_') && str_ends_with($hook_name, '_form_alter')) {
+ return $this->buildError(
+ $function_name,
+ 'hook_field_widget_multivalue_WIDGET_TYPE_form_alter',
+ 'in drupal:9.2.0 and is removed from drupal:10.0.0. Use hook_field_widget_complete_WIDGET_TYPE_form_alter instead.'
+ );
+ }
+
+ return [];
+ }
+
+ $reflection = $this->reflectionProvider->getFunction($hook_name_node, $scope);
+ if (!$reflection->isDeprecated()->yes()) {
+ return [];
+ }
+
+ return $this->buildError($function_name, $hook_name, $reflection->getDeprecatedDescription());
+ }
+
+ private function buildError(string $function_name, string $hook_name, ?string $deprecated_description): array
+ {
+ $deprecated_description = $deprecated_description !== null ? " $deprecated_description" : ".";
+ return [
+ RuleErrorBuilder::message(
+ "Function $function_name implements $hook_name which is deprecated$deprecated_description",
+ )->build()
+ ];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/GetDeprecatedServiceRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/GetDeprecatedServiceRule.php
new file mode 100644
index 00000000..237563c6
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/GetDeprecatedServiceRule.php
@@ -0,0 +1,65 @@
+
+ */
+final class GetDeprecatedServiceRule implements Rule
+{
+
+ /**
+ * @var ServiceMap
+ */
+ private $serviceMap;
+
+ public function __construct(ServiceMap $serviceMap)
+ {
+ $this->serviceMap = $serviceMap;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ $method_name = $node->name->toString();
+ if ($method_name !== 'get') {
+ return [];
+ }
+ $methodReflection = $scope->getMethodReflection($scope->getType($node->var), $node->name->toString());
+ if ($methodReflection === null) {
+ return [];
+ }
+ $declaringClass = $methodReflection->getDeclaringClass();
+ if ($declaringClass->getName() !== 'Symfony\Component\DependencyInjection\ContainerInterface') {
+ return [];
+ }
+ $serviceNameArg = $node->args[0];
+ assert($serviceNameArg instanceof Node\Arg);
+ $serviceName = $serviceNameArg->value;
+ // @todo check if var, otherwise throw.
+ // ACTUALLY what if it was a constant? can we use a resolver.
+ if (!$serviceName instanceof Node\Scalar\String_) {
+ return [];
+ }
+
+ $service = $this->serviceMap->getService($serviceName->value);
+ if (($service instanceof DrupalServiceDefinition) && $service->isDeprecated()) {
+ return [$service->getDeprecatedDescription()];
+ }
+
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/PluginAnnotationContextDefinitionsRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/PluginAnnotationContextDefinitionsRule.php
new file mode 100644
index 00000000..814ae8e8
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/PluginAnnotationContextDefinitionsRule.php
@@ -0,0 +1,38 @@
+getResolvedPhpDoc();
+ // Plugins should always be annotated, but maybe this class is missing its
+ // annotation since it swaps an existing one.
+ if ($annotation === null) {
+ return [];
+ }
+ $hasMatch = preg_match('/context\s?=\s?{/', $annotation->getPhpDocString());
+ if ($hasMatch === false) {
+ throw new ShouldNotHappenException('Unexpected error when trying to run match on phpDoc string.');
+ }
+ if ($hasMatch === 1) {
+ return [
+ 'Providing context definitions via the "context" key is deprecated in Drupal 8.7.x and will be removed before Drupal 9.0.0. Use the "context_definitions" key instead.',
+ ];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/StaticServiceDeprecatedServiceRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/StaticServiceDeprecatedServiceRule.php
new file mode 100644
index 00000000..7637f8bc
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/StaticServiceDeprecatedServiceRule.php
@@ -0,0 +1,74 @@
+
+ */
+final class StaticServiceDeprecatedServiceRule implements Rule
+{
+
+ /**
+ * @var ServiceMap
+ */
+ private $serviceMap;
+
+ public function __construct(ServiceMap $serviceMap)
+ {
+ $this->serviceMap = $serviceMap;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\StaticCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ $method_name = $node->name->toString();
+ if ($method_name !== 'service') {
+ return [];
+ }
+
+ $class = $node->class;
+ if ($class instanceof Node\Name) {
+ $calledOnType = $scope->resolveTypeByName($class);
+ } else {
+ $calledOnType = $scope->getType($class);
+ }
+ $methodReflection = $scope->getMethodReflection($calledOnType, $node->name->toString());
+
+ if ($methodReflection === null) {
+ return [];
+ }
+ $declaringClass = $methodReflection->getDeclaringClass();
+ if ($declaringClass->getName() !== 'Drupal') {
+ return [];
+ }
+
+ $serviceNameArg = $node->args[0];
+ assert($serviceNameArg instanceof Node\Arg);
+ $serviceName = $serviceNameArg->value;
+ // @todo check if var, otherwise throw.
+ // ACTUALLY what if it was a constant? can we use a resolver.
+ if (!$serviceName instanceof Node\Scalar\String_) {
+ return [];
+ }
+
+ $service = $this->serviceMap->getService($serviceName->value);
+ if (($service instanceof DrupalServiceDefinition) && $service->isDeprecated()) {
+ return [$service->getDeprecatedDescription()];
+ }
+
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRouteObjectInterfaceConstantsRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRouteObjectInterfaceConstantsRule.php
new file mode 100644
index 00000000..7236f836
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRouteObjectInterfaceConstantsRule.php
@@ -0,0 +1,73 @@
+
+ */
+final class SymfonyCmfRouteObjectInterfaceConstantsRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\ClassConstFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ if (!$node->class instanceof Node\Name) {
+ return [];
+ }
+ $constantName = $node->name->name;
+ $className = $node->class;
+ $classType = $scope->resolveTypeByName($className);
+ if (!$classType->hasConstant($constantName)->yes()) {
+ return [];
+ }
+ if (DeprecatedScopeCheck::inDeprecatedScope($scope)) {
+ return [];
+ }
+ [$major, $minor] = explode('.', Drupal::VERSION, 3);
+ if ($major !== '9') {
+ return [];
+ }
+ if ((int) $minor < 1) {
+ return [];
+ }
+
+ // @phpstan-ignore-next-line
+ $cmfRouteObjectInterfaceType = new ObjectType(SymfonyRouteObjectInterface::class);
+ if (!$classType->isSuperTypeOf($cmfRouteObjectInterfaceType)->yes()) {
+ return [];
+ }
+
+ $coreRouteObjectInterfaceType = new ObjectType(RouteObjectInterface::class);
+ if (!$coreRouteObjectInterfaceType->hasConstant($constantName)->yes()) {
+ return [
+ RuleErrorBuilder::message(
+ sprintf('The core dependency symfony-cmf/routing is deprecated and %s::%s is not supported.', $className, $constantName)
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(
+ sprintf('%s::%s is deprecated and removed in Drupal 10. Use \Drupal\Core\Routing\RouteObjectInterface::%2$s instead.', $className, $constantName)
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build(),
+ ];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRoutingInClassMethodSignatureRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRoutingInClassMethodSignatureRule.php
new file mode 100644
index 00000000..663014fb
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Deprecations/SymfonyCmfRoutingInClassMethodSignatureRule.php
@@ -0,0 +1,128 @@
+
+ */
+final class SymfonyCmfRoutingInClassMethodSignatureRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return InClassMethodNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (DeprecatedScopeCheck::inDeprecatedScope($scope)) {
+ return [];
+ }
+ [$major, $minor] = explode('.', Drupal::VERSION, 3);
+ if ($major !== '9' || (int) $minor < 1) {
+ return [];
+ }
+ $method = $node->getMethodReflection();
+
+ // @phpstan-ignore-next-line
+ $cmfRouteObjectInterfaceType = new ObjectType(RouteObjectInterface::class);
+ // @phpstan-ignore-next-line
+ $cmfRouteProviderInterfaceType = new ObjectType(RouteProviderInterface::class);
+ // @phpstan-ignore-next-line
+ $cmfLazyRouteCollectionType = new ObjectType(LazyRouteCollection::class);
+
+ $methodSignature = ParametersAcceptorSelector::selectSingle($method->getVariants());
+
+ $errors = [];
+ $errorMessage = 'Parameter $%s of method %s() uses deprecated %s and removed in Drupal 10. Use %s instead.';
+ foreach ($methodSignature->getParameters() as $parameter) {
+ foreach ($parameter->getType()->getReferencedClasses() as $referencedClass) {
+ $referencedClassType = new ObjectType($referencedClass);
+ if ($cmfRouteObjectInterfaceType->equals($referencedClassType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $parameter->getName(),
+ $method->getName(),
+ $referencedClass,
+ '\Drupal\Core\Routing\RouteObjectInterface'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ } elseif ($cmfRouteProviderInterfaceType->equals($referencedClassType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $parameter->getName(),
+ $method->getName(),
+ $referencedClass,
+ '\Drupal\Core\Routing\RouteProviderInterface'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ } elseif ($cmfLazyRouteCollectionType->equals($referencedClassType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $parameter->getName(),
+ $method->getName(),
+ $referencedClass,
+ '\Drupal\Core\Routing\LazyRouteCollection'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ }
+ }
+ }
+
+ $errorMessage = 'Return type of method %s::%s() has typehint with deprecated %s and is removed in Drupal 10. Use %s instead.';
+ $returnClasses = $methodSignature->getReturnType()->getReferencedClasses();
+ foreach ($returnClasses as $returnClass) {
+ $returnType = new ObjectType($returnClass);
+ if ($cmfRouteObjectInterfaceType->equals($returnType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $method->getDeclaringClass()->getName(),
+ $method->getName(),
+ $returnClass,
+ '\Drupal\Core\Routing\RouteObjectInterface'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ } elseif ($cmfRouteProviderInterfaceType->equals($returnType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $method->getDeclaringClass()->getName(),
+ $method->getName(),
+ $returnClass,
+ '\Drupal\Core\Routing\RouteProviderInterface'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ } elseif ($cmfLazyRouteCollectionType->equals($returnType)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ $errorMessage,
+ $method->getDeclaringClass()->getName(),
+ $method->getName(),
+ $returnClass,
+ '\Drupal\Core\Routing\LazyRouteCollection'
+ )
+ )->tip('Change record: https://www.drupal.org/node/3151009')->build();
+ }
+ }
+ return $errors;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/AccessResultConditionRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/AccessResultConditionRule.php
new file mode 100644
index 00000000..25c894b8
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/AccessResultConditionRule.php
@@ -0,0 +1,79 @@
+
+ */
+final class AccessResultConditionRule implements Rule
+{
+
+ /** @var bool */
+ private $treatPhpDocTypesAsCertain;
+
+ /**
+ * @param bool $treatPhpDocTypesAsCertain
+ */
+ public function __construct($treatPhpDocTypesAsCertain)
+ {
+ $this->treatPhpDocTypesAsCertain = $treatPhpDocTypesAsCertain;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\StaticCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ $methodName = $node->name->toString();
+ if (!in_array($methodName, ['allowedIf', 'forbiddenIf'], true)) {
+ return [];
+ }
+ if (!$node->class instanceof Node\Name) {
+ return [];
+ }
+ $className = $scope->resolveName($node->class);
+ if ($className !== AccessResult::class) {
+ return [];
+ }
+ $args = $node->getArgs();
+ if (count($args) === 0) {
+ return [];
+ }
+ $condition = $args[0]->value;
+ if (!$condition instanceof Node\Expr\BinaryOp\Identical && !$condition instanceof Node\Expr\BinaryOp\NotIdentical) {
+ return [];
+ }
+ $conditionType = $this->treatPhpDocTypesAsCertain ? $scope->getType($condition) : $scope->getNativeType($condition);
+ $bool = $conditionType->toBoolean();
+
+ if ($bool->isTrue()->or($bool->isFalse())->yes()) {
+ $leftType = $this->treatPhpDocTypesAsCertain ? $scope->getType($condition->left) : $scope->getNativeType($condition->left);
+ $rightType = $this->treatPhpDocTypesAsCertain ? $scope->getType($condition->right) : $scope->getNativeType($condition->right);
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Strict comparison using %s between %s and %s will always evaluate to %s.',
+ $condition->getOperatorSigil(),
+ $leftType->describe(VerbosityLevel::value()),
+ $rightType->describe(VerbosityLevel::value()),
+ $bool->describe(VerbosityLevel::value()),
+ ))->identifier(sprintf('%s.alwaysFalse', $condition instanceof Node\Expr\BinaryOp\Identical ? 'identical' : 'notIdentical'))->build(),
+ ];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Coder/DiscouragedFunctionsRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Coder/DiscouragedFunctionsRule.php
new file mode 100644
index 00000000..f6e9c119
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Coder/DiscouragedFunctionsRule.php
@@ -0,0 +1,63 @@
+
+ */
+class DiscouragedFunctionsRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return FuncCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!($node->name instanceof Node\Name)) {
+ return [];
+ }
+ $name = strtolower((string)$node->name);
+
+ $discouragedFunctions = [
+ // Devel module debugging functions.
+ 'dargs',
+ 'dcp',
+ 'dd',
+ 'dfb',
+ 'dfbt',
+ 'dpm',
+ 'dpq',
+ 'dpr',
+ 'dprint_r',
+ 'drupal_debug',
+ 'dsm',
+ 'dvm',
+ 'dvr',
+ 'kdevel_print_object',
+ 'kpr',
+ 'kprint_r',
+ 'sdpm',
+ // Functions which are not available on all
+ // PHP builds.
+ 'fnmatch',
+ // Functions which are a security risk.
+ 'eval',
+ ];
+
+ if (in_array($name, $discouragedFunctions, true)) {
+ return [sprintf('Calls to function %s should not exist.', $name)];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/DependencySerializationTraitPropertyRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/DependencySerializationTraitPropertyRule.php
new file mode 100644
index 00000000..5d35c955
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/DependencySerializationTraitPropertyRule.php
@@ -0,0 +1,50 @@
+
+ */
+final class DependencySerializationTraitPropertyRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return ClassPropertyNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->getClassReflection()->hasTraitUse(DependencySerializationTrait::class)) {
+ return [];
+ }
+
+ $errors = [];
+ if ($node->isPrivate()) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ '%s does not support private properties.',
+ DependencySerializationTrait::class
+ )
+ )->tip('See https://www.drupal.org/node/3110266')->build();
+ }
+ if ($node->isReadOnly()) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ 'Read-only properties are incompatible with %s.',
+ DependencySerializationTrait::class
+ )
+ )->tip('See https://www.drupal.org/node/3110266')->build();
+ }
+ return $errors;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/EntityQuery/EntityQueryHasAccessCheckRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/EntityQuery/EntityQueryHasAccessCheckRule.php
new file mode 100644
index 00000000..46915b4e
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/EntityQuery/EntityQueryHasAccessCheckRule.php
@@ -0,0 +1,52 @@
+
+ */
+final class EntityQueryHasAccessCheckRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node\Expr\MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $name = $node->name;
+ if (!$name instanceof Node\Identifier) {
+ return [];
+ }
+ if ($name->toString() !== 'execute') {
+ return [];
+ }
+
+ $type = $scope->getType($node);
+
+ if (!$type instanceof EntityQueryExecuteWithoutAccessCheckCountType && !$type instanceof EntityQueryExecuteWithoutAccessCheckType) {
+ return [];
+ }
+
+ $parent = $scope->getType($node->var);
+ if ($parent instanceof ConfigEntityQueryType) {
+ return [];
+ }
+
+ return [
+ RuleErrorBuilder::message(
+ 'Relying on entity queries to check access by default is deprecated in drupal:9.2.0 and an error will be thrown from drupal:10.0.0. Call \Drupal\Core\Entity\Query\QueryInterface::accessCheck() with TRUE or FALSE to specify whether access should be checked.'
+ )->tip('See https://www.drupal.org/node/3201242')->build(),
+ ];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/GlobalDrupalDependencyInjectionRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/GlobalDrupalDependencyInjectionRule.php
new file mode 100644
index 00000000..068197cd
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/GlobalDrupalDependencyInjectionRule.php
@@ -0,0 +1,78 @@
+
+ */
+class GlobalDrupalDependencyInjectionRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node\Expr\StaticCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ // Only check static calls to \Drupal
+ if (!($node->class instanceof Node\Name\FullyQualified) || (string) $node->class !== 'Drupal') {
+ return [];
+ }
+ // Do not raise if called inside a trait.
+ if (!$scope->isInClass() || $scope->isInTrait()) {
+ return [];
+ }
+ $scopeClassReflection = $scope->getClassReflection();
+
+ // Enums cannot have dependency injection.
+ if ($scopeClassReflection->isEnum()) {
+ return [];
+ }
+
+ $allowed_list = [
+ // Ignore tests.
+ 'PHPUnit\Framework\Test',
+ // Typed data objects cannot use dependency injection.
+ 'Drupal\Core\TypedData\TypedDataInterface',
+ // Render elements cannot use dependency injection.
+ 'Drupal\Core\Render\Element\ElementInterface',
+ 'Drupal\Core\Render\Element\FormElementInterface',
+ 'Drupal\config_translation\FormElement\ElementInterface',
+ // Entities don't use services for now
+ // @see https://www.drupal.org/project/drupal/issues/2913224
+ 'Drupal\Core\Entity\EntityInterface',
+ // Stream wrappers are only registered as a service for their tags
+ // and cannot use dependency injection. Function calls like
+ // file_exists, stat, etc. will construct the class directly.
+ 'Drupal\Core\StreamWrapper\StreamWrapperInterface',
+ // Ignore Nightwatch test setup classes.
+ 'Drupal\TestSite\TestSetupInterface',
+ ];
+
+ foreach ($allowed_list as $item) {
+ if ($scopeClassReflection->implementsInterface($item)) {
+ return [];
+ }
+ }
+
+ $scopeFunction = $scope->getFunction();
+ if ($scopeFunction === null) {
+ return [];
+ }
+ if (!$scopeFunction instanceof ExtendedMethodReflection) {
+ return [];
+ }
+ if ($scopeFunction->isStatic()) {
+ return [];
+ }
+
+ return [
+ '\Drupal calls should be avoided in classes, use dependency injection instead'
+ ];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludeBase.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludeBase.php
new file mode 100644
index 00000000..627556d5
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludeBase.php
@@ -0,0 +1,61 @@
+
+ */
+abstract class LoadIncludeBase implements Rule
+{
+
+ /**
+ * @var \mglaman\PHPStanDrupal\Drupal\ExtensionMap
+ */
+ protected $extensionMap;
+
+ public function __construct(ExtensionMap $extensionMap)
+ {
+ $this->extensionMap = $extensionMap;
+ }
+
+ private function getStringArgValue(Node\Expr $expr, Scope $scope): ?string
+ {
+ $type = $scope->getType($expr);
+ $stringTypes = $type->getConstantStrings();
+ if (count($stringTypes) > 0) {
+ return $stringTypes[0]->getValue();
+ }
+ return null;
+ }
+
+ protected function parseLoadIncludeArgs(Node\Arg $module, Node\Arg $type, ?Node\Arg $name, Scope $scope): array
+ {
+ $moduleName = $this->getStringArgValue($module->value, $scope);
+ if ($moduleName === null) {
+ return [false, false];
+ }
+ $fileType = $this->getStringArgValue($type->value, $scope);
+ if ($fileType === null) {
+ return [false, false];
+ }
+ $baseName = null;
+ if ($name !== null) {
+ $baseName = $this->getStringArgValue($name->value, $scope);
+ if ($baseName === null) {
+ return [false, false];
+ }
+ }
+ if ($baseName === null) {
+ $baseName = $moduleName;
+ }
+
+ return [$moduleName, "$baseName.$fileType"];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludes.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludes.php
new file mode 100644
index 00000000..2c2f4a6e
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/LoadIncludes.php
@@ -0,0 +1,92 @@
+
+ */
+class LoadIncludes extends LoadIncludeBase
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ $method_name = $node->name->toString();
+ if ($method_name !== 'loadInclude') {
+ return [];
+ }
+ $args = $node->getArgs();
+ if (count($args) < 2) {
+ return [];
+ }
+ $type = $scope->getType($node->var);
+ $moduleHandlerInterfaceType = new ObjectType(ModuleHandlerInterface::class);
+ if (!$type->isSuperTypeOf($moduleHandlerInterfaceType)->yes()) {
+ return [];
+ }
+
+ try {
+ // Try to invoke it similarly as the module handler itself.
+ [$moduleName, $filename] = $this->parseLoadIncludeArgs($args[0], $args[1], $args[2] ?? null, $scope);
+ if (!$moduleName && !$filename) {
+ // Couldn't determine module- nor file-name, most probably
+ // because it's a variable. Nothing to load, bail now.
+ return [];
+ }
+ $module = $this->extensionMap->getModule($moduleName);
+ if ($module === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'File %s could not be loaded from %s::loadInclude because %s module is not found.',
+ $filename,
+ ModuleHandlerInterface::class,
+ $moduleName
+ ))
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ }
+
+ $file = $module->getAbsolutePath() . DIRECTORY_SEPARATOR . $filename;
+ if (is_file($file)) {
+ require_once $file;
+ return [];
+ }
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'File %s could not be loaded from %s::loadInclude',
+ $module->getPath() . '/' . $filename,
+ ModuleHandlerInterface::class
+ ))
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ } catch (Throwable $e) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'A file could not be loaded from %s::loadInclude',
+ ModuleHandlerInterface::class
+ ))
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ }
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/ModuleLoadInclude.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/ModuleLoadInclude.php
new file mode 100644
index 00000000..2170bff1
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/ModuleLoadInclude.php
@@ -0,0 +1,80 @@
+
+ */
+class ModuleLoadInclude extends LoadIncludeBase
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\FuncCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$node->name instanceof Name) {
+ return [];
+ }
+ $name = (string) $node->name;
+ if ($name !== 'module_load_include') {
+ return [];
+ }
+ $args = $node->getArgs();
+ if (count($args) < 2) {
+ return [];
+ }
+
+ try {
+ // Try to invoke it similarly as the module handler itself.
+ [$moduleName, $filename] = $this->parseLoadIncludeArgs($args[1], $args[0], $args[2] ?? null, $scope);
+ $module = $this->extensionMap->getModule($moduleName);
+ if ($module === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'File %s could not be loaded from module_load_include because %s module is not found.',
+ $filename,
+ $moduleName
+ ))
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ }
+ $file = $module->getAbsolutePath() . DIRECTORY_SEPARATOR . $filename;
+ if (is_file($file)) {
+ require_once $file;
+ return [];
+ }
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'File %s could not be loaded from module_load_include.',
+ $module->getPath() . '/' . $filename
+ ))
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ } catch (Throwable $e) {
+ return [
+ RuleErrorBuilder::message('A file could not be loaded from module_load_include')
+ ->line($node->getStartLine())
+ ->build()
+ ];
+ }
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/AbstractPluginManagerRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/AbstractPluginManagerRule.php
new file mode 100644
index 00000000..00e34aa5
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/AbstractPluginManagerRule.php
@@ -0,0 +1,22 @@
+
+ */
+abstract class AbstractPluginManagerRule implements Rule
+{
+
+ protected function isPluginManager(ClassReflection $classReflection): bool
+ {
+ return
+ !$classReflection->isInterface() &&
+ !$classReflection->isAnonymous() &&
+ $classReflection->implementsInterface('Drupal\Component\Plugin\PluginManagerInterface');
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/PluginManagerSetsCacheBackendRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/PluginManagerSetsCacheBackendRule.php
new file mode 100644
index 00000000..b053e105
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/PluginManager/PluginManagerSetsCacheBackendRule.php
@@ -0,0 +1,99 @@
+
+ */
+class PluginManagerSetsCacheBackendRule extends AbstractPluginManagerRule
+{
+ public function getNodeType(): string
+ {
+ return ClassMethod::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!$scope->isInClass()) {
+ throw new ShouldNotHappenException();
+ }
+
+ if ($scope->isInTrait()) {
+ return [];
+ }
+
+ if ($node->name->name !== '__construct') {
+ return [];
+ }
+
+ $scopeClassReflection = $scope->getClassReflection();
+
+ if (!$this->isPluginManager($scopeClassReflection)) {
+ return [];
+ }
+
+ $hasCacheBackendSet = false;
+ $misnamedCacheTagWarnings = [];
+
+ foreach ($node->stmts ?? [] as $statement) {
+ if ($statement instanceof Node\Stmt\Expression) {
+ $statement = $statement->expr;
+ }
+ if (($statement instanceof Node\Expr\MethodCall) &&
+ ($statement->name instanceof Node\Identifier) &&
+ $statement->name->name === 'setCacheBackend') {
+ // setCacheBackend accepts a cache backend, the cache key, and optional (but suggested) cache tags.
+ $setCacheBackendArgs = $statement->getArgs();
+ if (count($setCacheBackendArgs) < 2) {
+ continue;
+ }
+ $hasCacheBackendSet = true;
+
+ $cacheKey = array_map(
+ static fn (Type $type) => $type->getValue(),
+ $scope->getType($setCacheBackendArgs[1]->value)->getConstantStrings()
+ );
+ if (count($cacheKey) === 0) {
+ continue;
+ }
+
+ if (isset($setCacheBackendArgs[2])) {
+ $cacheTagsType = $scope->getType($setCacheBackendArgs[2]->value);
+ foreach ($cacheTagsType->getConstantArrays() as $constantArray) {
+ foreach ($constantArray->getValueTypes() as $valueType) {
+ foreach ($valueType->getConstantStrings() as $cacheTagConstantString) {
+ foreach ($cacheKey as $cacheKeyValue) {
+ if (strpos($cacheTagConstantString->getValue(), $cacheKeyValue) === false) {
+ $misnamedCacheTagWarnings[] = $cacheTagConstantString->getValue();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ }
+
+ $errors = [];
+ if (!$hasCacheBackendSet) {
+ $errors[] = 'Missing cache backend declaration for performance.';
+ }
+ foreach ($misnamedCacheTagWarnings as $cacheTagWarning) {
+ $errors[] = sprintf('%s cache tag might be unclear and does not contain the cache key in it.', $cacheTagWarning);
+ }
+
+ return $errors;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RenderCallbackRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RenderCallbackRule.php
new file mode 100644
index 00000000..413d943e
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RenderCallbackRule.php
@@ -0,0 +1,317 @@
+
+ */
+final class RenderCallbackRule implements Rule
+{
+
+ private ReflectionProvider $reflectionProvider;
+
+ private ServiceMap $serviceMap;
+
+ private array $supportedKeys = [
+ '#pre_render',
+ '#post_render',
+ '#access_callback',
+ '#lazy_builder',
+ '#date_time_callbacks',
+ '#date_date_callbacks',
+ ];
+
+ public function __construct(ReflectionProvider $reflectionProvider, ServiceMap $serviceMap)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->serviceMap = $serviceMap;
+ }
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\ArrayItem::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $key = $node->key;
+ if (!$key instanceof Node\Scalar\String_) {
+ return [];
+ }
+
+ // @see https://www.drupal.org/node/2966725
+ $keySearch = array_search($key->value, $this->supportedKeys, true);
+ if ($keySearch === false) {
+ return [];
+ }
+ $keyChecked = $this->supportedKeys[$keySearch];
+ $value = $node->value;
+
+ if ($keyChecked === '#access_callback') {
+ return $this->doProcessNode($node->value, $scope, $keyChecked, 0);
+ }
+
+ if ($keyChecked === '#lazy_builder') {
+ if ($scope->isInClass()) {
+ $classReflection = $scope->getClassReflection();
+ $classType = new ObjectType($classReflection->getName());
+ // These classes use #lazy_builder in array_intersect_key. With
+ // PHPStan 1.6, nodes do not track their parent/next/prev which
+ // saves a lot of memory. But makes it harder to detect if we're
+ // in a call to array_intersect_key. This is an easier workaround.
+ $allowedTypes = new UnionType([
+ new ObjectType(PlaceholderGenerator::class),
+ new ObjectType(Renderer::class),
+ new ObjectType('Drupal\Tests\Core\Render\RendererPlaceholdersTest'),
+ ]);
+ if ($allowedTypes->isSuperTypeOf($classType)->yes()) {
+ return [];
+ }
+ }
+
+ if (!$value instanceof Node\Expr\Array_) {
+ return [
+ RuleErrorBuilder::message(sprintf('The "%s" expects a callable array with arguments.', $keyChecked))
+ ->line($node->getStartLine())->build()
+ ];
+ }
+ if (count($value->items) === 0) {
+ return [];
+ }
+ // @todo take $value->items[1] and validate parameters against the callback.
+ return $this->doProcessNode($value->items[0]->value, $scope, $keyChecked, 0);
+ }
+
+ if (!$value instanceof Node\Expr\Array_) {
+ return [
+ RuleErrorBuilder::message(sprintf('The "%s" render array value expects an array of callbacks.', $keyChecked))
+ ->line($node->getStartLine())->build()
+ ];
+ }
+ if (count($value->items) === 0) {
+ return [];
+ }
+ $errors = [];
+ foreach ($value->items as $pos => $item) {
+ $errors[] = $this->doProcessNode($item->value, $scope, $keyChecked, $pos);
+ }
+ return array_merge(...$errors);
+ }
+
+ /**
+ @return (string|\PHPStan\Rules\RuleError)[] errors
+ */
+ private function doProcessNode(Node\Expr $node, Scope $scope, string $keyChecked, int $pos): array
+ {
+ $checkIsCallable = true;
+
+ $trustedCallbackType = new UnionType([
+ new ObjectType(TrustedCallbackInterface::class),
+ new ObjectType(RenderCallbackInterface::class),
+ ]);
+
+ $errors = [];
+ $errorLine = $node->getStartLine();
+ $type = $this->getType($node, $scope);
+
+ foreach ($type->getConstantStrings() as $constantStringType) {
+ if (!$constantStringType->isCallable()->yes()) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s callback %s at key '%s' is not callable.", $keyChecked, $constantStringType->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)->build();
+ } elseif ($this->reflectionProvider->hasFunction(new Name($constantStringType->getValue()), null)) {
+ // We can determine if the callback is callable through the type system. However, we cannot determine
+ // if it is just a function or a static class call (MyClass::staticFunc).
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s callback %s at key '%s' is not trusted.", $keyChecked, $constantStringType->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)
+ ->tip('Change record: https://www.drupal.org/node/2966725.')
+ ->build();
+ } else {
+ // @see \PHPStan\Type\Constant\ConstantStringType::isCallable
+ preg_match('#^([a-zA-Z_\\x7f-\\xff\\\\][a-zA-Z0-9_\\x7f-\\xff\\\\]*)::([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\z#', $constantStringType->getValue(), $matches);
+ if (count($matches) === 0) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s callback %s at key '%s' is not callable.", $keyChecked, $constantStringType->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)->build();
+ } elseif (!$trustedCallbackType->isSuperTypeOf(new ObjectType($matches[1]))->yes()) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s callback class %s at key '%s' does not implement Drupal\Core\Security\TrustedCallbackInterface.", $keyChecked, $constantStringType->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)->tip('Change record: https://www.drupal.org/node/2966725.')->build();
+ }
+ }
+ }
+
+ foreach ($type->getConstantArrays() as $constantArrayType) {
+ if (!$constantArrayType->isCallable()->yes()) {
+ // If the right-hand side of the array is a variable, we cannot
+ // determine if it is callable. Bail now.
+ $itemType = $constantArrayType->getItemType();
+ if ($itemType instanceof UnionType) {
+ $unionConstantStrings = array_merge(...array_map(static function (Type $type) {
+ return $type->getConstantStrings();
+ }, $itemType->getTypes()));
+ if (count($unionConstantStrings) === 0) {
+ // Right-hand side of UnionType is not a constant string. We cannot determine if the dynamic
+ // value is callable or not.
+ $checkIsCallable = false;
+ break;
+ }
+ }
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s callback %s at key '%s' is not callable.", $keyChecked, $constantArrayType->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)->build();
+ continue;
+ }
+ $typeAndMethodNames = $constantArrayType->findTypeAndMethodNames();
+ if ($typeAndMethodNames === []) {
+ continue;
+ }
+
+ foreach ($typeAndMethodNames as $typeAndMethodName) {
+ $isTrustedCallbackAttribute = TrinaryLogic::createNo()->lazyOr(
+ $typeAndMethodName->getType()->getObjectClassReflections(),
+ function (ClassReflection $reflection) use ($typeAndMethodName) {
+ if (!class_exists(TrustedCallback::class)) {
+ return TrinaryLogic::createNo();
+ }
+ $hasAttribute = $reflection->getNativeReflection()
+ ->getMethod($typeAndMethodName->getMethod())
+ ->getAttributes(TrustedCallback::class);
+ return TrinaryLogic::createFromBoolean(count($hasAttribute) > 0);
+ }
+ );
+
+ $isTrustedCallbackInterfaceType = $trustedCallbackType->isSuperTypeOf($typeAndMethodName->getType())->yes();
+ if (!$isTrustedCallbackInterfaceType && !$isTrustedCallbackAttribute->yes()) {
+ if (class_exists(TrustedCallback::class)) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ "%s callback method '%s' at key '%s' does not implement attribute \Drupal\Core\Security\Attribute\TrustedCallback.",
+ $keyChecked,
+ $constantArrayType->describe(VerbosityLevel::value()),
+ $pos
+ )
+ )->line($errorLine)->tip('Change record: https://www.drupal.org/node/3349470')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf(
+ "%s callback class '%s' at key '%s' does not implement Drupal\Core\Security\TrustedCallbackInterface.",
+ $keyChecked,
+ $typeAndMethodName->getType()->describe(VerbosityLevel::value()),
+ $pos
+ )
+ )->line($errorLine)->tip('Change record: https://www.drupal.org/node/2966725.')->build();
+ }
+ }
+ }
+ }
+ // @todo move to its own rule for 1.2.0, FormClosureSerializationRule.
+ if (($type instanceof ClosureType) && $scope->isInClass()) {
+ $classReflection = $scope->getClassReflection();
+ $classType = new ObjectType($classReflection->getName());
+ $formType = new ObjectType('\Drupal\Core\Form\FormInterface');
+ if ($formType->isSuperTypeOf($classType)->yes()) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s may not contain a closure at key '%s' as forms may be serialized and serialization of closures is not allowed.", $keyChecked, $pos)
+ )->line($errorLine)->build();
+ }
+ }
+
+ if (count($errors) === 0 && ($checkIsCallable && !$type->isCallable()->yes())) {
+ $errors[] = RuleErrorBuilder::message(
+ sprintf("%s value '%s' at key '%s' is invalid.", $keyChecked, $type->describe(VerbosityLevel::value()), $pos)
+ )->line($errorLine)->build();
+ }
+
+ return $errors;
+ }
+
+ // @todo move to a helper, as Drupal uses `service:method` references a lot.
+ private function getType(Node\Expr $node, Scope $scope): Type
+ {
+ $type = $scope->getType($node);
+ if ($type instanceof IntersectionType) {
+ // Covers concatenation of static::class . '::methodName'.
+ if ($node instanceof Node\Expr\BinaryOp\Concat) {
+ $leftType = $scope->getType($node->left);
+ $rightType = $scope->getType($node->right);
+ if ($rightType instanceof ConstantStringType && $leftType instanceof GenericClassStringType && $leftType->getGenericType() instanceof StaticType) {
+ return new ConstantArrayType(
+ [new ConstantIntegerType(0), new ConstantIntegerType(1)],
+ [
+ $leftType->getGenericType(),
+ new ConstantStringType(ltrim($rightType->getValue(), ':'))
+ ]
+ );
+ }
+ }
+ } elseif ($type instanceof ConstantStringType) {
+ if ($type->isClassStringType()->yes()) {
+ return $type;
+ }
+ // Covers \Drupal\Core\Controller\ControllerResolver::createController.
+ if (substr_count($type->getValue(), ':') === 1) {
+ [$class_or_service, $method] = explode(':', $type->getValue(), 2);
+
+ $serviceDefinition = $this->serviceMap->getService($class_or_service);
+ if ($serviceDefinition === null || $serviceDefinition->getClass() === null) {
+ return $type;
+ }
+ return new ConstantArrayType(
+ [new ConstantIntegerType(0), new ConstantIntegerType(1)],
+ [
+ new ObjectType($serviceDefinition->getClass()),
+ new ConstantStringType($method)
+ ]
+ );
+ }
+ // @see \PHPStan\Type\Constant\ConstantStringType::isCallable
+ preg_match('#^([a-zA-Z_\\x7f-\\xff\\\\][a-zA-Z0-9_\\x7f-\\xff\\\\]*)::([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\z#', $type->getValue(), $matches);
+ if (count($matches) > 0) {
+ return new ConstantArrayType(
+ [new ConstantIntegerType(0), new ConstantIntegerType(1)],
+ [
+ new StaticType($this->reflectionProvider->getClass($matches[1])),
+ new ConstantStringType($matches[2])
+ ]
+ );
+ }
+ }
+ return $type;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RequestStackGetMainRequestRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RequestStackGetMainRequestRule.php
new file mode 100644
index 00000000..b4f78665
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/RequestStackGetMainRequestRule.php
@@ -0,0 +1,60 @@
+
+ */
+final class RequestStackGetMainRequestRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Expr\MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (DeprecatedScopeCheck::inDeprecatedScope($scope)) {
+ return [];
+ }
+ [$major, $minor] = explode('.', Drupal::VERSION, 3);
+ // Only valid for 9.3 -> 9.5. Deprecated in Drupal 10.
+ if (($major !== '9' || (int) $minor < 3)) {
+ return [];
+ }
+ if (!$node->name instanceof Node\Identifier) {
+ return [];
+ }
+ $method_name = $node->name->toString();
+ if ($method_name !== 'getMasterRequest') {
+ return [];
+ }
+ $type = $scope->getType($node->var);
+ $symfonyRequestStackType = new ObjectType(SymfonyRequestStack::class);
+ if ($symfonyRequestStackType->isSuperTypeOf($type)->yes()) {
+ $message = sprintf(
+ '%s::getMasterRequest() is deprecated in drupal:9.3.0 and is removed from drupal:10.0.0 for Symfony 6 compatibility. Use the forward compatibility shim class %s and its getMainRequest() method instead.',
+ SymfonyRequestStack::class,
+ 'Drupal\Core\Http\RequestStack'
+ );
+ return [
+ RuleErrorBuilder::message($message)
+ ->tip('Change record: https://www.drupal.org/node/3253744')
+ ->build(),
+ ];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/TestClassesProtectedPropertyModulesRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/TestClassesProtectedPropertyModulesRule.php
new file mode 100644
index 00000000..8194b327
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/TestClassesProtectedPropertyModulesRule.php
@@ -0,0 +1,55 @@
+
+ */
+class TestClassesProtectedPropertyModulesRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return ClassPropertyNode::class;
+ }
+
+ /**
+ * @throws \PHPStan\ShouldNotHappenException
+ */
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($node->getName() !== 'modules') {
+ return [];
+ }
+
+ $scopeClassReflection = $node->getClassReflection();
+ if ($scopeClassReflection->isAnonymous()) {
+ return [];
+ }
+
+ if (!in_array(TestCase::class, $scopeClassReflection->getParentClassesNames(), true)) {
+ return [];
+ }
+
+ if ($node->isPublic()) {
+ return [
+ RuleErrorBuilder::message(
+ sprintf('Property %s::$modules property must be protected.', $scopeClassReflection->getDisplayName())
+ )->tip('Change record: https://www.drupal.org/node/2909426')->build(),
+ ];
+ }
+
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/BrowserTestBaseDefaultThemeRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/BrowserTestBaseDefaultThemeRule.php
new file mode 100644
index 00000000..3f8fc4be
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/BrowserTestBaseDefaultThemeRule.php
@@ -0,0 +1,111 @@
+
+ */
+final class BrowserTestBaseDefaultThemeRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if (!interface_exists(Test::class)) {
+ return [];
+ }
+ if ($node->extends === null) {
+ return [];
+ }
+ if ($node->namespacedName === null) {
+ return [];
+ }
+
+ // Only inspect tests.
+ // @todo replace this str_ends_with() when php 8 is required.
+ if (0 !== substr_compare($node->namespacedName->getLast(), 'Test', -4)) {
+ return [];
+ }
+
+ // Do some cheap preflight tests to make sure the class is in a
+ // namespace that makes sense to inspect.
+ // @phpstan-ignore-next-line
+ $parts = method_exists($node->namespacedName, 'getParts') ? $node->namespacedName->getParts() : $node->namespacedName->parts;
+ // The namespace is too short to be a test so skip inspection.
+ if (count($parts) < 3) {
+ return [];
+ }
+ // If the 4th component matches it's a module test. If the 2nd, core.
+ if ($parts[3] !== 'Functional'
+ && $parts [3] !== 'FunctionalJavascript'
+ && $parts[1] !== 'FunctionalTests'
+ && $parts[1] !== 'FunctionalJavascriptTests') {
+ return [];
+ }
+
+
+ $classType = $scope->resolveTypeByName($node->namespacedName);
+ assert($classType instanceof ObjectType);
+
+ $browserTestBaseType = new ObjectType('Drupal\\Tests\\BrowserTestBase');
+ if (!$browserTestBaseType->isSuperTypeOf($classType)->yes()) {
+ return [];
+ }
+
+ $excludedTestTypes = TypeCombinator::union(
+ new ObjectType('Drupal\\FunctionalTests\\Update\\UpdatePathTestBase'),
+ new ObjectType('Drupal\\FunctionalTests\\Installer\\InstallerExistingConfigTestBase')
+ );
+ if ($excludedTestTypes->isSuperTypeOf($classType)->yes()) {
+ return [];
+ }
+
+ $reflection = $classType->getClassReflection();
+ assert($reflection !== null);
+ if ($reflection->isAbstract()) {
+ return [];
+ }
+ $defaultProperties = $reflection->getNativeReflection()->getDefaultProperties();
+ $profile = $defaultProperties['profile'] ?? null;
+
+ $testingProfilesWithoutThemes = [
+ 'testing',
+ 'nightwatch_testing',
+ 'testing_config_overrides',
+ 'testing_missing_dependencies',
+ 'testing_multilingual',
+ 'testing_multilingual_with_english',
+ 'testing_requirements',
+ ];
+ if ($profile !== null && !in_array($profile, $testingProfilesWithoutThemes, true)) {
+ return [];
+ }
+
+ $defaultTheme = $defaultProperties['defaultTheme'] ?? null;
+
+ if ($defaultTheme === null || $defaultTheme === '') {
+ return [
+ RuleErrorBuilder::message('Drupal\Tests\BrowserTestBase::$defaultTheme is required. See https://www.drupal.org/node/3083055, which includes recommendations on which theme to use.')
+ ->line($node->getStartLine())->build(),
+ ];
+ }
+ return [];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/TestClassSuffixNameRule.php b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/TestClassSuffixNameRule.php
new file mode 100644
index 00000000..6f8b83ea
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Rules/Drupal/Tests/TestClassSuffixNameRule.php
@@ -0,0 +1,69 @@
+
+ */
+final class TestClassSuffixNameRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ // We're not interested in non-extending classes.
+ if ($node->extends === null) {
+ return [];
+ }
+
+ // We're not interested in abstract classes.
+ if ($node->isAbstract()) {
+ return [];
+ }
+
+ // We need a namespaced class name.
+ if ($node->namespacedName === null) {
+ return [];
+ }
+
+ // We're only interested in \PHPUnit\Framework\TestCase subtype classes.
+ $classType = $scope->resolveTypeByName($node->namespacedName);
+ $phpUnitFrameworkTestCaseType = new ObjectType(TestCase::class);
+ if (!$phpUnitFrameworkTestCaseType->isSuperTypeOf($classType)->yes()) {
+ return [];
+ }
+
+ // Check class name has suffix "Test".
+ // @todo replace this str_ends_with() when php 8 is required.
+ if (substr_compare($node->namespacedName->getLast(), 'Test', -4) === 0) {
+ return [];
+ }
+
+ return [
+ RuleErrorBuilder::message(
+ sprintf(
+ 'Non-abstract test classes names should always have the suffix "Test", found incorrect class name "%s".',
+ $node->name,
+ )
+ )
+ ->line($node->getStartLine())
+ ->tip('See https://www.drupal.org/docs/develop/standards/php/object-oriented-code#naming')
+ ->build()
+ ];
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/ContainerDynamicReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/ContainerDynamicReturnTypeExtension.php
new file mode 100644
index 00000000..c556712b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/ContainerDynamicReturnTypeExtension.php
@@ -0,0 +1,97 @@
+serviceMap = $serviceMap;
+ }
+
+ public function getClass(): string
+ {
+ return ContainerInterface::class;
+ }
+
+ public function isMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return in_array($methodReflection->getName(), ['get', 'has'], true);
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ $methodName = $methodReflection->getName();
+
+ if ($methodName === 'has') {
+ $args = $methodCall->getArgs();
+ if (count($args) !== 1) {
+ return $returnType;
+ }
+
+ $types = [];
+ $argType = $scope->getType($args[0]->value);
+
+ foreach ($argType->getConstantStrings() as $constantStringType) {
+ $serviceId = $constantStringType->getValue();
+ $service = $this->serviceMap->getService($serviceId);
+ $types[] = new ConstantBooleanType($service !== null);
+ }
+
+ return TypeCombinator::union(...$types);
+ } elseif ($methodName === 'get') {
+ $args = $methodCall->getArgs();
+ if (count($args) === 0) {
+ return $returnType;
+ }
+
+ $types = [];
+
+ if (isset($args[1])) {
+ $invalidBehaviour = $scope->getType($args[1]->value);
+
+ foreach ($invalidBehaviour->getConstantScalarValues() as $value) {
+ if ($value === ContainerInterface::NULL_ON_INVALID_REFERENCE) {
+ $types[] = new NullType();
+ break;
+ }
+ }
+ }
+
+ $argType = $scope->getType($args[0]->value);
+
+ foreach ($argType->getConstantStrings() as $constantStringType) {
+ $serviceId = $constantStringType->getValue();
+ $service = $this->serviceMap->getService($serviceId);
+ $types[] = $service !== null ? $service->getType() : $returnType;
+ }
+
+ return TypeCombinator::union(...$types);
+ }
+
+ return $returnType;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicReturnTypeExtension.php
new file mode 100644
index 00000000..b34158be
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicReturnTypeExtension.php
@@ -0,0 +1,48 @@
+serviceMap = $serviceMap;
+ }
+
+ public function getClass(): string
+ {
+ return ClassResolverInterface::class;
+ }
+
+ public function isMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return $methodReflection->getName() === 'getInstanceFromDefinition';
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ if (0 === count($methodCall->getArgs())) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+
+ return DrupalClassResolverReturnType::getType($methodReflection, $methodCall, $scope, $this->serviceMap);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicStaticReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicStaticReturnTypeExtension.php
new file mode 100644
index 00000000..d66bf66b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverDynamicStaticReturnTypeExtension.php
@@ -0,0 +1,49 @@
+serviceMap = $serviceMap;
+ }
+
+ public function getClass(): string
+ {
+ return Drupal::class;
+ }
+
+ public function isStaticMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return $methodReflection->getName() === 'classResolver';
+ }
+
+ public function getTypeFromStaticMethodCall(
+ MethodReflection $methodReflection,
+ StaticCall $methodCall,
+ Scope $scope
+ ): Type {
+ if (0 === count($methodCall->getArgs())) {
+ return new ObjectType(ClassResolverInterface::class);
+ }
+
+ return DrupalClassResolverReturnType::getType($methodReflection, $methodCall, $scope, $this->serviceMap);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverReturnType.php b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverReturnType.php
new file mode 100644
index 00000000..8884cb04
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/DrupalClassResolverReturnType.php
@@ -0,0 +1,39 @@
+getType($methodCall->getArgs()[0]->value);
+ if (count($arg1->getConstantStrings()) === 0) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+
+ $serviceName = $arg1->getConstantStrings()[0];
+ $serviceDefinition = $serviceMap->getService($serviceName->getValue());
+ if ($serviceDefinition instanceof DrupalServiceDefinition) {
+ return $serviceDefinition->getType();
+ }
+
+ return new ObjectType($serviceName->getValue());
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/DrupalServiceDynamicReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/DrupalServiceDynamicReturnTypeExtension.php
new file mode 100644
index 00000000..920f3638
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/DrupalServiceDynamicReturnTypeExtension.php
@@ -0,0 +1,81 @@
+serviceMap = $serviceMap;
+ }
+
+ public function getClass(): string
+ {
+ return Drupal::class;
+ }
+
+ public function isStaticMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return $methodReflection->getName() === 'service';
+ }
+
+ public function getTypeFromStaticMethodCall(
+ MethodReflection $methodReflection,
+ StaticCall $methodCall,
+ Scope $scope
+ ): Type {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ if (!isset($methodCall->args[0])) {
+ return $returnType;
+ }
+
+ $arg1 = $methodCall->args[0];
+ if ($arg1 instanceof VariadicPlaceholder) {
+ throw new ShouldNotHappenException();
+ }
+
+ $arg1 = $arg1->value;
+
+ if ($arg1 instanceof String_) {
+ $serviceId = $arg1->value;
+ return $this->getServiceType($serviceId) ?? $returnType;
+ }
+
+ if ($arg1 instanceof ClassConstFetch && $arg1->class instanceof FullyQualified) {
+ $serviceId = (string) $arg1->class;
+ return $this->getServiceType($serviceId) ?? $returnType;
+ }
+
+ return $returnType;
+ }
+
+ protected function getServiceType(string $serviceId): ?Type
+ {
+ $service = $this->serviceMap->getService($serviceId);
+ if ($service instanceof DrupalServiceDefinition) {
+ return $service->getType();
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/DrupalStaticEntityQueryDynamicReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/DrupalStaticEntityQueryDynamicReturnTypeExtension.php
new file mode 100644
index 00000000..587d086b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/DrupalStaticEntityQueryDynamicReturnTypeExtension.php
@@ -0,0 +1,95 @@
+entityDataRepository = $entityDataRepository;
+ }
+
+ public function getClass(): string
+ {
+ return Drupal::class;
+ }
+
+ public function isStaticMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return $methodReflection->getName() === 'entityQuery';
+ }
+
+ public function getTypeFromStaticMethodCall(
+ MethodReflection $methodReflection,
+ StaticCall $methodCall,
+ Scope $scope
+ ): Type {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ if (!$returnType instanceof ObjectType) {
+ return $returnType;
+ }
+ $args = $methodCall->getArgs();
+ if (count($args) !== 1) {
+ return $returnType;
+ }
+ $type = $scope->getType($args[0]->value);
+
+ if (count($type->getConstantStrings()) === 0) {
+ // We're unsure what specific EntityQueryType it is, so let's stick
+ // with the general class itself to ensure it gets access checked.
+ return new EntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+ $entityTypeId = $type->getConstantStrings()[0]->getValue();
+ $entityType = $this->entityDataRepository->get($entityTypeId);
+ $entityStorageType = $entityType->getStorageType();
+ if ($entityStorageType === null) {
+ return $returnType;
+ }
+
+ if ((new ObjectType(ContentEntityStorageInterface::class))->isSuperTypeOf($entityStorageType)->yes()) {
+ return new ContentEntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+ if ((new ObjectType(ConfigEntityStorageInterface::class))->isSuperTypeOf($entityStorageType)->yes()) {
+ return new ConfigEntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+
+ return new EntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityAccessControlHandlerReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityAccessControlHandlerReturnTypeExtension.php
new file mode 100644
index 00000000..066fe3b0
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityAccessControlHandlerReturnTypeExtension.php
@@ -0,0 +1,56 @@
+getName(), ['access', 'createAccess', 'fieldAccess'], true);
+ }
+
+ public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
+ {
+ $returnType = new BooleanType();
+
+ $args = $methodCall->getArgs();
+ $arg = null;
+ if ($methodReflection->getName() === 'access' && count($args) === 4) {
+ $arg = $args[3];
+ }
+ if ($methodReflection->getName() === 'createAccess' && count($args) === 4) {
+ $arg = $args[3];
+ }
+ if ($methodReflection->getName() === 'fieldAccess' && count($args) === 5) {
+ $arg = $args[4];
+ }
+
+ if ($arg === null) {
+ return $returnType;
+ }
+
+ $returnAsObjectArg = $scope->getType($arg->value);
+ if (!$returnAsObjectArg->isBoolean()->yes()) {
+ return $returnType;
+ }
+ return $returnAsObjectArg->isTrue()->yes() ? new ObjectType(AccessResultInterface::class) : new BooleanType();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/AccessCheckTypeSpecifyingExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/AccessCheckTypeSpecifyingExtension.php
new file mode 100644
index 00000000..3ced2702
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/AccessCheckTypeSpecifyingExtension.php
@@ -0,0 +1,55 @@
+typeSpecifier = $typeSpecifier;
+ }
+
+ public function getClass(): string
+ {
+ return QueryInterface::class;
+ }
+
+ public function isMethodSupported(
+ MethodReflection $methodReflection,
+ MethodCall $node,
+ TypeSpecifierContext $context
+ ): bool {
+ return $methodReflection->getName() === 'accessCheck';
+ }
+
+ public function specifyTypes(
+ MethodReflection $methodReflection,
+ MethodCall $node,
+ Scope $scope,
+ TypeSpecifierContext $context
+ ): SpecifiedTypes {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ $expr = $node->var;
+ if (!$returnType instanceof EntityQueryType) {
+ return new SpecifiedTypes([]);
+ }
+ return $this->typeSpecifier->create(
+ $expr,
+ $returnType->withAccessCheck(),
+ TypeSpecifierContext::createTruthy(),
+ true
+ );
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/ConfigEntityQueryType.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/ConfigEntityQueryType.php
new file mode 100644
index 00000000..0a322338
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/ConfigEntityQueryType.php
@@ -0,0 +1,11 @@
+getName();
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $varType = $scope->getType($methodCall->var);
+
+ if (!$varType instanceof EntityQueryType) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+
+ return $varType->withAccessCheck();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryCountType.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryCountType.php
new file mode 100644
index 00000000..5ac08a98
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryCountType.php
@@ -0,0 +1,11 @@
+getName(), [
+ 'count',
+ 'execute',
+ ], true);
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $defaultReturnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ $varType = $scope->getType($methodCall->var);
+ $methodName = $methodReflection->getName();
+
+ if (!$varType instanceof ObjectType) {
+ return $defaultReturnType;
+ }
+
+ if ($methodName === 'count') {
+ if ($varType instanceof EntityQueryType) {
+ return $varType->asCount();
+ }
+ // By now we are sure we can't determine anything about what query
+ // the count method is on, so we ignore it.
+ return $defaultReturnType;
+ }
+
+ if ($methodName === 'execute') {
+ if (!$varType instanceof EntityQueryType) {
+ return $defaultReturnType;
+ }
+ if ($varType->isCount()) {
+ return $varType->hasAccessCheck()
+ ? new IntegerType()
+ : new EntityQueryExecuteWithoutAccessCheckCountType();
+ }
+ if ($varType instanceof ConfigEntityQueryType) {
+ return $varType->hasAccessCheck()
+ ? new ArrayType(new StringType(), new StringType())
+ : new EntityQueryExecuteWithoutAccessCheckType(new StringType(), new StringType());
+ }
+ if ($varType instanceof ContentEntityQueryType) {
+ return $varType->hasAccessCheck()
+ ? new ArrayType(new IntegerType(), new StringType())
+ : new EntityQueryExecuteWithoutAccessCheckType(new IntegerType(), new StringType());
+ }
+ return $varType->hasAccessCheck()
+ ? new ArrayType(new IntegerType(), new StringType())
+ : new EntityQueryExecuteWithoutAccessCheckType(new IntegerType(), new StringType());
+ }
+
+ return $defaultReturnType;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryExecuteWithoutAccessCheckCountType.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryExecuteWithoutAccessCheckCountType.php
new file mode 100644
index 00000000..8c42c5ea
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityQuery/EntityQueryExecuteWithoutAccessCheckCountType.php
@@ -0,0 +1,12 @@
+hasAccessCheck;
+ }
+
+ public function isCount(): bool
+ {
+ return $this->isCount;
+ }
+
+ public function withAccessCheck(): self
+ {
+ // The constructor of ObjectType is under backward compatibility promise.
+ // @see https://phpstan.org/developing-extensions/backward-compatibility-promise
+ // @phpstan-ignore-next-line
+ $type = new static(
+ $this->getClassName(),
+ $this->getSubtractedType(),
+ $this->getClassReflection()
+ );
+ $type->hasAccessCheck = true;
+ $type->isCount = $this->isCount;
+ return $type;
+ }
+
+ public function asCount(): self
+ {
+ // @phpstan-ignore-next-line
+ $type = new static(
+ $this->getClassName(),
+ $this->getSubtractedType(),
+ $this->getClassReflection()
+ );
+ $type->hasAccessCheck = $this->hasAccessCheck;
+ $type->isCount = true;
+ return $type;
+ }
+
+ protected function describeAdditionalCacheKey(): string
+ {
+ $parts = [
+ $this->hasAccessCheck ? 'with-access-check' : 'without-access-check',
+ $this->isCount ? '' : 'count'
+ ];
+ return implode('-', $parts);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityRepositoryReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityRepositoryReturnTypeExtension.php
new file mode 100644
index 00000000..215bcfc7
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityRepositoryReturnTypeExtension.php
@@ -0,0 +1,96 @@
+entityDataRepository = $entityDataRepository;
+ }
+
+ public function getClass(): string
+ {
+ return EntityRepositoryInterface::class;
+ }
+
+ public function isMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return in_array(
+ $methodReflection->getName(),
+ [
+ 'getTranslationFromContext',
+ 'loadEntityByUuid',
+ 'loadEntityByConfigTarget',
+ 'getActive',
+ 'getActiveMultiple',
+ 'getCanonical',
+ 'getCanonicalMultiple',
+ ],
+ true
+ );
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): ?Type {
+ $methodName = $methodReflection->getName();
+ $methodArgs = $methodCall->getArgs();
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+
+ if (count($methodArgs) === 0) {
+ return $returnType;
+ }
+
+ if ($methodName === 'getTranslationFromContext') {
+ return $scope->getType($methodArgs[0]->value);
+ }
+
+ $entityObjectTypes = [];
+ $entityIdArg = $scope->getType($methodArgs[0]->value);
+ foreach ($entityIdArg->getConstantStrings() as $constantStringType) {
+ $entityObjectTypes[] = $this->entityDataRepository->get($constantStringType->getValue())->getClassType() ?? $returnType;
+ }
+ $entityTypes = TypeCombinator::union(...$entityObjectTypes);
+
+ if ($returnType->isArray()->no()) {
+ if ($returnType->isNull()->maybe()) {
+ $entityTypes = TypeCombinator::addNull($entityTypes);
+ }
+ return $entityTypes;
+ }
+
+ if ((new ObjectType(ConfigEntityInterface::class))->isSuperTypeOf($entityTypes)->yes()) {
+ $keyType = new StringType();
+ } else {
+ $keyType = new IntegerType();
+ }
+
+ return new ArrayType($keyType, $entityTypes);
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/ConfigEntityStorageType.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/ConfigEntityStorageType.php
new file mode 100644
index 00000000..6a48e663
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/ConfigEntityStorageType.php
@@ -0,0 +1,10 @@
+entityDataRepository = $entityDataRepository;
+ }
+
+ public function getClass(): string
+ {
+ return EntityStorageInterface::class;
+ }
+
+ public function isMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return in_array(
+ $methodReflection->getName(),
+ [
+ 'create',
+ 'load',
+ 'loadMultiple',
+ 'loadByProperties',
+ 'loadUnchanged',
+ ],
+ true
+ );
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $callerType = $scope->getType($methodCall->var);
+ if (!$callerType instanceof ObjectType) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+
+ if (!$callerType instanceof EntityStorageType) {
+ $resolvedEntityType = $this->entityDataRepository->resolveFromStorage($callerType);
+ if ($resolvedEntityType === null) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+ $type = $resolvedEntityType->getClassType();
+ } else {
+ $type = $this->entityDataRepository->get($callerType->getEntityTypeId())->getClassType();
+ }
+
+ if ($type === null) {
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+ if (in_array($methodReflection->getName(), ['load', 'loadUnchanged'], true)) {
+ return TypeCombinator::addNull($type);
+ }
+
+ if (in_array($methodReflection->getName(), ['loadMultiple', 'loadByProperties'], true)) {
+ if ((new ObjectType(ConfigEntityStorageInterface::class))->isSuperTypeOf($callerType)->yes()) {
+ return new ArrayType(new StringType(), $type);
+ }
+
+ return new ArrayType(new IntegerType(), $type);
+ }
+
+ if ($methodReflection->getName() === 'create') {
+ return $type;
+ }
+
+ return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/EntityStorageType.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/EntityStorageType.php
new file mode 100644
index 00000000..06fa9370
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/EntityStorageType.php
@@ -0,0 +1,33 @@
+entityTypeId = $entityTypeId;
+ }
+
+ public function getEntityTypeId(): string
+ {
+ return $this->entityTypeId;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/GetQueryReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/GetQueryReturnTypeExtension.php
new file mode 100644
index 00000000..b6f8769a
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityStorage/GetQueryReturnTypeExtension.php
@@ -0,0 +1,71 @@
+getName(), [
+ 'getQuery',
+ 'getAggregateQuery',
+ ], true);
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ if (!$returnType instanceof ObjectType) {
+ return $returnType;
+ }
+
+ $callerType = $scope->getType($methodCall->var);
+ if (!$callerType->isObject()->yes()) {
+ return $returnType;
+ }
+
+ if ((new ObjectType(ContentEntityStorageInterface::class))->isSuperTypeOf($callerType)->yes()) {
+ return new ContentEntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+ if ((new ObjectType(ConfigEntityStorageInterface::class))->isSuperTypeOf($callerType)->yes()) {
+ return new ConfigEntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+ return new EntityQueryType(
+ $returnType->getClassName(),
+ $returnType->getSubtractedType(),
+ $returnType->getClassReflection()
+ );
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/src/Type/EntityTypeManagerGetStorageDynamicReturnTypeExtension.php b/vendor/mglaman/phpstan-drupal/src/Type/EntityTypeManagerGetStorageDynamicReturnTypeExtension.php
new file mode 100644
index 00000000..ae22ca9b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/src/Type/EntityTypeManagerGetStorageDynamicReturnTypeExtension.php
@@ -0,0 +1,89 @@
+entityDataRepository = $entityDataRepository;
+ }
+
+ public function getClass(): string
+ {
+ return 'Drupal\Core\Entity\EntityTypeManagerInterface';
+ }
+
+ public function isMethodSupported(MethodReflection $methodReflection): bool
+ {
+ return $methodReflection->getName() === 'getStorage';
+ }
+
+ public function getTypeFromMethodCall(
+ MethodReflection $methodReflection,
+ MethodCall $methodCall,
+ Scope $scope
+ ): Type {
+ $returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ if (!isset($methodCall->args[0])) {
+ // Parameter is required.
+ throw new ShouldNotHappenException();
+ }
+
+ $arg1 = $methodCall->args[0];
+ if ($arg1 instanceof VariadicPlaceholder) {
+ throw new ShouldNotHappenException();
+ }
+ $arg1 = $arg1->value;
+
+ // @todo handle where the first param is EntityTypeInterface::id()
+ if ($arg1 instanceof MethodCall) {
+ // There may not be much that can be done, since it's a generic EntityTypeInterface.
+ return $returnType;
+ }
+ // @todo handle concat ie: entity_{$display_context}_display for entity_form_display or entity_view_display
+ if ($arg1 instanceof Concat) {
+ return $returnType;
+ }
+
+ $type = $scope->getType($arg1);
+ if (count($type->getConstantStrings()) === 0) {
+ return $returnType;
+ }
+
+ $entityTypeId = $type->getConstantStrings()[0]->getValue();
+ $storageType = $this->entityDataRepository->get($entityTypeId)->getStorageType();
+ if ($storageType !== null) {
+ return $storageType;
+ }
+
+ if ($returnType instanceof ObjectType) {
+ return new EntityStorageType($entityTypeId, $returnType->getClassName());
+ }
+ return $returnType;
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Component/Plugin/PluginInspectionInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Component/Plugin/PluginInspectionInterface.stub
new file mode 100644
index 00000000..4e67512a
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Component/Plugin/PluginInspectionInterface.stub
@@ -0,0 +1,6 @@
+
+ *
+ * @see \Drupal\Core\Entity\FieldableEntityInterface::getFields
+ */
+interface ContentEntityInterface extends \Traversable, FieldableEntityInterface, TranslatableRevisionableInterface, SynchronizableInterface {
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/ContentEntityStorageBase.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/ContentEntityStorageBase.stub
new file mode 100644
index 00000000..7f7ea370
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/ContentEntityStorageBase.stub
@@ -0,0 +1,7 @@
+
+ */
+ public function get(string $field_name);
+
+ /**
+ * @return array
+ */
+ public static function baseFieldDefinitions(EntityTypeInterface $entity_type): array;
+
+ /**
+ * @param array $base_field_definitions
+ * @return array
+ */
+ public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, string $bundle, array $base_field_definitions): array;
+
+ /**
+ * @return array
+ */
+ public function getFieldDefinitions(): array;
+
+ /**
+ * @return array
+ */
+ public function toArray(): array;
+
+ /**
+ * @return array>
+ */
+ public function getFields(bool $include_computed = TRUE): array;
+
+ /**
+ * @return array>
+ */
+ public function getTranslatableFields(bool $include_computed = TRUE): array;
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/FieldableEntityStorageInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/FieldableEntityStorageInterface.stub
new file mode 100644
index 00000000..31849a5d
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/FieldableEntityStorageInterface.stub
@@ -0,0 +1,7 @@
+ $values
+ * @return static
+ */
+ public function addTranslation(string $langcode, array $values = []): static;
+
+}
\ No newline at end of file
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/TranslatableRevisionableStorageInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/TranslatableRevisionableStorageInterface.stub
new file mode 100644
index 00000000..c2d46354
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Entity/TranslatableRevisionableStorageInterface.stub
@@ -0,0 +1,12 @@
+>
+ * @property int|string|null $target_id
+ * @property ?T $entity
+ */
+interface EntityReferenceFieldItemListInterface extends FieldItemListInterface {
+
+ /**
+ * @return array
+ */
+ public function referencedEntities();
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldDefinitionInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldDefinitionInterface.stub
new file mode 100644
index 00000000..79c709d6
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldDefinitionInterface.stub
@@ -0,0 +1,7 @@
+
+ * @implements FieldItemListInterface
+ */
+class FieldItemList extends ItemList implements FieldItemListInterface {
+
+ /**
+ * @return \Drupal\Core\Field\FieldItemInterface
+ */
+ protected function createItem(int $offset = 0, ?mixed $value = NULL): \Drupal\Core\Field\FieldItemInterface {
+ }
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldItemListInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldItemListInterface.stub
new file mode 100644
index 00000000..473ae449
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/FieldItemListInterface.stub
@@ -0,0 +1,15 @@
+
+ * @property mixed $value
+ */
+interface FieldItemListInterface extends ListInterface {
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.stub
new file mode 100644
index 00000000..595e1fe8
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.stub
@@ -0,0 +1,12 @@
+ $value
+ */
+class MapItem extends FieldItemBase {
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.stub
new file mode 100644
index 00000000..f14c776b
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/Field/Plugin/Field/FieldType/NumericItemBase.stub
@@ -0,0 +1,8 @@
+
+ */
+interface ComplexDataInterface extends TraversableTypedDataInterface {
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/ListInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/ListInterface.stub
new file mode 100644
index 00000000..c3859dc1
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/ListInterface.stub
@@ -0,0 +1,22 @@
+
+ * @extends \ArrayAccess
+ */
+interface ListInterface extends TraversableTypedDataInterface, \ArrayAccess, \Countable {
+
+ /**
+ * @return ?T
+ */
+ public function first();
+
+ /**
+ * @return ?T
+ */
+ public function get(int $index);
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/OptionsProviderInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/OptionsProviderInterface.stub
new file mode 100644
index 00000000..88725124
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/OptionsProviderInterface.stub
@@ -0,0 +1,6 @@
+
+ * @implements ListInterface
+ */
+class ItemList extends TypedData implements \IteratorAggregate, ListInterface {
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/Plugin/DataType/Map.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/Plugin/DataType/Map.stub
new file mode 100644
index 00000000..b6b1fee9
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/Plugin/DataType/Map.stub
@@ -0,0 +1,12 @@
+
+ */
+class Map extends TypedData implements \IteratorAggregate, ComplexDataInterface {
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TraversableTypedDataInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TraversableTypedDataInterface.stub
new file mode 100644
index 00000000..e22e9407
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TraversableTypedDataInterface.stub
@@ -0,0 +1,11 @@
+
+ */
+interface TraversableTypedDataInterface extends TypedDataInterface, \Traversable {
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TypedData.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TypedData.stub
new file mode 100644
index 00000000..334ea3ba
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/Core/TypedData/TypedData.stub
@@ -0,0 +1,8 @@
+
+ * @property bool $display
+ * @property string $description
+ */
+class FileItem extends EntityReferenceItem {
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/file/Plugin/Field/FieldType/FileUriItem.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/file/Plugin/Field/FieldType/FileUriItem.stub
new file mode 100644
index 00000000..bee97299
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/file/Plugin/Field/FieldType/FileUriItem.stub
@@ -0,0 +1,12 @@
+ $args
+ */
+ public function createPlaceholder($callback, array $args): string {
+
+ }
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/link/LinkItemInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/link/LinkItemInterface.stub
new file mode 100644
index 00000000..c57145f9
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/link/LinkItemInterface.stub
@@ -0,0 +1,8 @@
+ $options
+ */
+class LinkItem extends FieldItemBase implements LinkItemInterface {
+
+}
diff --git a/vendor/mglaman/phpstan-drupal/stubs/Drupal/node/NodeInterface.stub b/vendor/mglaman/phpstan-drupal/stubs/Drupal/node/NodeInterface.stub
new file mode 100644
index 00000000..0659b8cf
--- /dev/null
+++ b/vendor/mglaman/phpstan-drupal/stubs/Drupal/node/NodeInterface.stub
@@ -0,0 +1,38 @@
+
+ Manual installation
+
+If you don't want to use `phpstan/extension-installer`, include rules.neon in your project's PHPStan config:
+
+```
+includes:
+ - vendor/phpstan/phpstan-deprecation-rules/rules.neon
+```
+
+
+## Deprecating code you don't own
+
+This extension emits deprecation warnings on code, which uses properties/functions/methods/classes which are annotated as `@deprecated`.
+
+In case you don't own the code which you want to be considered deprecated, use [PHPStan Stub Files](https://phpstan.org/user-guide/stub-files) to declare deprecations for vendor files like:
+```
+/** @deprecated */
+class ThirdPartyClass {}
+```
+
+
+## Custom deprecated scopes
+
+Usage of deprecated code is not reported in code that is also deprecated:
+
+```php
+/** @deprecated */
+function doFoo(): void
+{
+ // not reported:
+ anotherDeprecatedFunction();
+}
+```
+
+If you have [a different way](https://github.com/phpstan/phpstan-deprecation-rules/issues/64) of marking code that calls deprecated symbols on purpose and you don't want these calls to be reported either, you can write an extension by implementing the [`DeprecatedScopeResolver`](https://github.com/phpstan/phpstan-deprecation-rules/blob/1.1.x/src/Rules/Deprecations/DeprecatedScopeResolver.php) interface.
+
+For example if you mark your PHPUnit tests that test deprecated code with `@group legacy`, you can implement the extension this way:
+
+```php
+class GroupLegacyScopeResolver implements DeprecatedScopeResolver
+{
+
+ public function isScopeDeprecated(Scope $scope): bool
+ {
+ $function = $scope->getFunction();
+ return $function !== null
+ && $function->getDocComment() !== null
+ && strpos($function->getDocComment(), '@group legacy') !== false;
+ }
+
+}
+```
+
+And register it in your [configuration file](https://phpstan.org/config-reference):
+
+```neon
+services:
+ -
+ class: GroupLegacyScopeResolver
+ tags:
+ - phpstan.deprecations.deprecatedScopeResolver
+```
+
+[Learn more about Scope](https://phpstan.org/developing-extensions/scope), a core concept for implementing custom PHPStan extensions.
diff --git a/vendor/phpstan/phpstan-deprecation-rules/composer.json b/vendor/phpstan/phpstan-deprecation-rules/composer.json
new file mode 100644
index 00000000..c51d2854
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/composer.json
@@ -0,0 +1,42 @@
+{
+ "name": "phpstan/phpstan-deprecation-rules",
+ "type": "phpstan-extension",
+ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "license": [
+ "MIT"
+ ],
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.11"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "config": {
+ "platform": {
+ "php": "7.4.6"
+ },
+ "sort-packages": true
+ },
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "classmap": [
+ "tests/"
+ ]
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/rules.neon b/vendor/phpstan/phpstan-deprecation-rules/rules.neon
new file mode 100644
index 00000000..704579b7
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/rules.neon
@@ -0,0 +1,35 @@
+parameters:
+ deprecationRulesInstalled: true
+
+services:
+ -
+ class: PHPStan\Rules\Deprecations\DeprecatedClassHelper
+
+ -
+ class: PHPStan\DependencyInjection\LazyDeprecatedScopeResolverProvider
+ -
+ class: PHPStan\Rules\Deprecations\DeprecatedScopeHelper
+ factory: @PHPStan\DependencyInjection\LazyDeprecatedScopeResolverProvider::get
+
+ -
+ class: PHPStan\Rules\Deprecations\DefaultDeprecatedScopeResolver
+ tags:
+ - phpstan.deprecations.deprecatedScopeResolver
+
+rules:
+ - PHPStan\Rules\Deprecations\AccessDeprecatedPropertyRule
+ - PHPStan\Rules\Deprecations\AccessDeprecatedStaticPropertyRule
+ - PHPStan\Rules\Deprecations\CallToDeprecatedFunctionRule
+ - PHPStan\Rules\Deprecations\CallToDeprecatedMethodRule
+ - PHPStan\Rules\Deprecations\CallToDeprecatedStaticMethodRule
+ - PHPStan\Rules\Deprecations\FetchingClassConstOfDeprecatedClassRule
+ - PHPStan\Rules\Deprecations\FetchingDeprecatedConstRule
+ - PHPStan\Rules\Deprecations\ImplementationOfDeprecatedInterfaceRule
+ - PHPStan\Rules\Deprecations\InheritanceOfDeprecatedClassRule
+ - PHPStan\Rules\Deprecations\InheritanceOfDeprecatedInterfaceRule
+ - PHPStan\Rules\Deprecations\InstantiationOfDeprecatedClassRule
+ - PHPStan\Rules\Deprecations\TypeHintDeprecatedInClassMethodSignatureRule
+ - PHPStan\Rules\Deprecations\TypeHintDeprecatedInClosureSignatureRule
+ - PHPStan\Rules\Deprecations\TypeHintDeprecatedInFunctionSignatureRule
+ - PHPStan\Rules\Deprecations\UsageOfDeprecatedCastRule
+ - PHPStan\Rules\Deprecations\UsageOfDeprecatedTraitRule
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/DependencyInjection/LazyDeprecatedScopeResolverProvider.php b/vendor/phpstan/phpstan-deprecation-rules/src/DependencyInjection/LazyDeprecatedScopeResolverProvider.php
new file mode 100644
index 00000000..467ca511
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/DependencyInjection/LazyDeprecatedScopeResolverProvider.php
@@ -0,0 +1,33 @@
+container = $container;
+ }
+
+ public function get(): DeprecatedScopeHelper
+ {
+ if ($this->scopeHelper === null) {
+ $this->scopeHelper = new DeprecatedScopeHelper(
+ $this->container->getServicesByTag(self::EXTENSION_TAG)
+ );
+ }
+ return $this->scopeHelper;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedPropertyRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedPropertyRule.php
new file mode 100644
index 00000000..9fe699b7
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedPropertyRule.php
@@ -0,0 +1,92 @@
+
+ */
+class AccessDeprecatedPropertyRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return PropertyFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$node->name instanceof Identifier) {
+ return [];
+ }
+
+ $propertyName = $node->name->name;
+ $propertyAccessedOnType = $scope->getType($node->var);
+ $referencedClasses = $propertyAccessedOnType->getObjectClassNames();
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $classReflection = $this->reflectionProvider->getClass($referencedClass);
+ $propertyReflection = $classReflection->getProperty($propertyName, $scope);
+
+ if ($propertyReflection->isDeprecated()->yes()) {
+ $description = $propertyReflection->getDeprecatedDescription();
+ if ($description === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Access to deprecated property $%s of %s %s.',
+ $propertyName,
+ strtolower($propertyReflection->getDeclaringClass()->getClassTypeDescription()),
+ $propertyReflection->getDeclaringClass()->getName()
+ ))->identifier('property.deprecated')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ "Access to deprecated property $%s of %s %s:\n%s",
+ $propertyName,
+ strtolower($propertyReflection->getDeclaringClass()->getClassTypeDescription()),
+ $propertyReflection->getDeclaringClass()->getName(),
+ $description
+ ))->identifier('property.deprecated')->build(),
+ ];
+ }
+ } catch (ClassNotFoundException $e) {
+ // Other rules will notify if the class is not found
+ } catch (MissingPropertyFromReflectionException $e) {
+ // Other rules will notify if the property is not found
+ }
+ }
+
+ return [];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php
new file mode 100644
index 00000000..1e0d9876
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/AccessDeprecatedStaticPropertyRule.php
@@ -0,0 +1,118 @@
+
+ */
+class AccessDeprecatedStaticPropertyRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var RuleLevelHelper */
+ private $ruleLevelHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, RuleLevelHelper $ruleLevelHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->ruleLevelHelper = $ruleLevelHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return StaticPropertyFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$node->name instanceof Identifier) {
+ return [];
+ }
+
+ $propertyName = $node->name->name;
+ $referencedClasses = [];
+
+ if ($node->class instanceof Name) {
+ $referencedClasses[] = $scope->resolveName($node->class);
+ } else {
+ $classTypeResult = $this->ruleLevelHelper->findTypeToCheck(
+ $scope,
+ $node->class,
+ '', // We don't care about the error message
+ static function (Type $type) use ($propertyName): bool {
+ return $type->canAccessProperties()->yes() && $type->hasProperty($propertyName)->yes();
+ }
+ );
+
+ if ($classTypeResult->getType() instanceof ErrorType) {
+ return [];
+ }
+
+ $referencedClasses = $classTypeResult->getReferencedClasses();
+ }
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $class = $this->reflectionProvider->getClass($referencedClass);
+ $property = $class->getProperty($propertyName, $scope);
+ } catch (ClassNotFoundException $e) {
+ continue;
+ } catch (MissingPropertyFromReflectionException $e) {
+ continue;
+ }
+
+ if ($property->isDeprecated()->yes()) {
+ $description = $property->getDeprecatedDescription();
+ if ($description === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Access to deprecated static property $%s of %s %s.',
+ $propertyName,
+ strtolower($property->getDeclaringClass()->getClassTypeDescription()),
+ $property->getDeclaringClass()->getName()
+ ))->identifier('staticProperty.deprecated')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ "Access to deprecated static property $%s of %s %s:\n%s",
+ $propertyName,
+ strtolower($property->getDeclaringClass()->getClassTypeDescription()),
+ $property->getDeclaringClass()->getName(),
+ $description
+ ))->identifier('staticProperty.deprecated')->build(),
+ ];
+ }
+ }
+
+ return [];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedFunctionRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedFunctionRule.php
new file mode 100644
index 00000000..fcc75613
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedFunctionRule.php
@@ -0,0 +1,78 @@
+
+ */
+class CallToDeprecatedFunctionRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return FuncCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!($node->name instanceof Name)) {
+ return [];
+ }
+
+ try {
+ $function = $this->reflectionProvider->getFunction($node->name, $scope);
+ } catch (FunctionNotFoundException $e) {
+ // Other rules will notify if the function is not found
+ return [];
+ }
+
+ if ($function->isDeprecated()->yes()) {
+ $description = $function->getDeprecatedDescription();
+ if ($description === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Call to deprecated function %s().',
+ $function->getName()
+ ))->identifier('function.deprecated')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ "Call to deprecated function %s():\n%s",
+ $function->getName(),
+ $description
+ ))->identifier('function.deprecated')->build(),
+ ];
+ }
+
+ return [];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedMethodRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedMethodRule.php
new file mode 100644
index 00000000..2db84f2b
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedMethodRule.php
@@ -0,0 +1,94 @@
+
+ */
+class CallToDeprecatedMethodRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return MethodCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$node->name instanceof Identifier) {
+ return [];
+ }
+
+ $methodName = $node->name->name;
+ $methodCalledOnType = $scope->getType($node->var);
+ $referencedClasses = $methodCalledOnType->getObjectClassNames();
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $classReflection = $this->reflectionProvider->getClass($referencedClass);
+ $methodReflection = $classReflection->getMethod($methodName, $scope);
+
+ if (!$methodReflection->isDeprecated()->yes()) {
+ continue;
+ }
+
+ $description = $methodReflection->getDeprecatedDescription();
+ if ($description === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Call to deprecated method %s() of %s %s.',
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName()
+ ))->identifier('method.deprecated')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ "Call to deprecated method %s() of %s %s:\n%s",
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName(),
+ $description
+ ))->identifier('method.deprecated')->build(),
+ ];
+ } catch (ClassNotFoundException $e) {
+ // Other rules will notify if the class is not found
+ } catch (MissingMethodFromReflectionException $e) {
+ // Other rules will notify if the the method is not found
+ }
+ }
+
+ return [];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedStaticMethodRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedStaticMethodRule.php
new file mode 100644
index 00000000..b24c8141
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/CallToDeprecatedStaticMethodRule.php
@@ -0,0 +1,138 @@
+
+ */
+class CallToDeprecatedStaticMethodRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var RuleLevelHelper */
+ private $ruleLevelHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, RuleLevelHelper $ruleLevelHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->ruleLevelHelper = $ruleLevelHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return StaticCall::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$node->name instanceof Identifier) {
+ return [];
+ }
+
+ $methodName = $node->name->name;
+ $referencedClasses = [];
+
+ if ($node->class instanceof Name) {
+ $referencedClasses[] = $scope->resolveName($node->class);
+ } else {
+ $classTypeResult = $this->ruleLevelHelper->findTypeToCheck(
+ $scope,
+ $node->class,
+ '', // We don't care about the error message
+ static function (Type $type) use ($methodName): bool {
+ return $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes();
+ }
+ );
+
+ if ($classTypeResult->getType() instanceof ErrorType) {
+ return [];
+ }
+
+ $referencedClasses = $classTypeResult->getReferencedClasses();
+ }
+
+ $errors = [];
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $class = $this->reflectionProvider->getClass($referencedClass);
+ $methodReflection = $class->getMethod($methodName, $scope);
+ } catch (ClassNotFoundException $e) {
+ continue;
+ } catch (MissingMethodFromReflectionException $e) {
+ continue;
+ }
+
+ if ($class->isDeprecated()) {
+ $classDescription = $class->getDeprecatedDescription();
+ if ($classDescription === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Call to method %s() of deprecated %s %s.',
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName()
+ ))->identifier(sprintf('staticMethod.deprecated%s', $methodReflection->getDeclaringClass()->getClassTypeDescription()))->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Call to method %s() of deprecated %s %s:\n%s",
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName(),
+ $classDescription
+ ))->identifier(sprintf('staticMethod.deprecated%s', $methodReflection->getDeclaringClass()->getClassTypeDescription()))->build();
+ }
+ }
+
+ if (!$methodReflection->isDeprecated()->yes()) {
+ continue;
+ }
+
+ $description = $methodReflection->getDeprecatedDescription();
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Call to deprecated method %s() of %s %s.',
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName()
+ ))->identifier('staticMethod.deprecated')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Call to deprecated method %s() of %s %s:\n%s",
+ $methodReflection->getName(),
+ strtolower($methodReflection->getDeclaringClass()->getClassTypeDescription()),
+ $methodReflection->getDeclaringClass()->getName(),
+ $description
+ ))->identifier('staticMethod.deprecated')->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DefaultDeprecatedScopeResolver.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DefaultDeprecatedScopeResolver.php
new file mode 100644
index 00000000..14807272
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DefaultDeprecatedScopeResolver.php
@@ -0,0 +1,30 @@
+getClassReflection();
+ if ($class !== null && $class->isDeprecated()) {
+ return true;
+ }
+
+ $trait = $scope->getTraitReflection();
+ if ($trait !== null && $trait->isDeprecated()) {
+ return true;
+ }
+
+ $function = $scope->getFunction();
+ if ($function !== null && $function->isDeprecated()->yes()) {
+ return true;
+ }
+
+ return false;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedClassHelper.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedClassHelper.php
new file mode 100644
index 00000000..022bc97f
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedClassHelper.php
@@ -0,0 +1,55 @@
+reflectionProvider = $reflectionProvider;
+ }
+
+ public function getClassDeprecationDescription(ClassReflection $class): string
+ {
+ $description = $class->getDeprecatedDescription();
+ if ($description === null) {
+ return '.';
+ }
+
+ return sprintf(":\n%s", $description);
+ }
+
+ /**
+ * @param string[] $referencedClasses
+ * @return ClassReflection[]
+ */
+ public function filterDeprecatedClasses(array $referencedClasses): array
+ {
+ $deprecatedClasses = [];
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $class = $this->reflectionProvider->getClass($referencedClass);
+ } catch (ClassNotFoundException $e) {
+ continue;
+ }
+
+ if (!$class->isDeprecated()) {
+ continue;
+ }
+
+ $deprecatedClasses[] = $class;
+ }
+
+ return $deprecatedClasses;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeHelper.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeHelper.php
new file mode 100644
index 00000000..dda31721
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeHelper.php
@@ -0,0 +1,32 @@
+resolvers = $checkers;
+ }
+
+ public function isScopeDeprecated(Scope $scope): bool
+ {
+ foreach ($this->resolvers as $checker) {
+ if ($checker->isScopeDeprecated($scope)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeResolver.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeResolver.php
new file mode 100644
index 00000000..27d4b878
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/DeprecatedScopeResolver.php
@@ -0,0 +1,27 @@
+
+ */
+class FetchingClassConstOfDeprecatedClassRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var RuleLevelHelper */
+ private $ruleLevelHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, RuleLevelHelper $ruleLevelHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->ruleLevelHelper = $ruleLevelHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return ClassConstFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$node->name instanceof Identifier) {
+ return [];
+ }
+
+ $constantName = $node->name->name;
+ $referencedClasses = [];
+
+ if ($node->class instanceof Name) {
+ $referencedClasses[] = $scope->resolveName($node->class);
+ } else {
+ $classTypeResult = $this->ruleLevelHelper->findTypeToCheck(
+ $scope,
+ $node->class,
+ '', // We don't care about the error message
+ static function (Type $type) use ($constantName): bool {
+ return $type->canAccessConstants()->yes() && $type->hasConstant($constantName)->yes();
+ }
+ );
+
+ if ($classTypeResult->getType() instanceof ErrorType) {
+ return [];
+ }
+
+ $referencedClasses = $classTypeResult->getReferencedClasses();
+ }
+
+ $errors = [];
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $class = $this->reflectionProvider->getClass($referencedClass);
+ } catch (ClassNotFoundException $e) {
+ continue;
+ }
+
+ if ($class->isDeprecated()) {
+ $classDescription = $class->getDeprecatedDescription();
+ if ($classDescription === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Fetching class constant %s of deprecated %s %s.',
+ $constantName,
+ strtolower($class->getClassTypeDescription()),
+ $referencedClass
+ ))->identifier(sprintf('classConstant.deprecated%s', $class->getClassTypeDescription()))->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Fetching class constant %s of deprecated %s %s:\n%s",
+ $constantName,
+ strtolower($class->getClassTypeDescription()),
+ $referencedClass,
+ $classDescription
+ ))->identifier(sprintf('classConstant.deprecated%s', $class->getClassTypeDescription()))->build();
+ }
+ }
+
+ if (strtolower($constantName) === 'class') {
+ continue;
+ }
+
+ if (!$class->hasConstant($constantName)) {
+ continue;
+ }
+
+ $constantReflection = $class->getConstant($constantName);
+
+ if (!$constantReflection->isDeprecated()->yes()) {
+ continue;
+ }
+
+ $description = $constantReflection->getDeprecatedDescription();
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Fetching deprecated class constant %s of %s %s.',
+ $constantName,
+ strtolower($class->getClassTypeDescription()),
+ $referencedClass
+ ))->identifier('classConstant.deprecated')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Fetching deprecated class constant %s of %s %s:\n%s",
+ $constantName,
+ strtolower($class->getClassTypeDescription()),
+ $referencedClass,
+ $description
+ ))->identifier('classConstant.deprecated')->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/FetchingDeprecatedConstRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/FetchingDeprecatedConstRule.php
new file mode 100644
index 00000000..05eb34c8
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/FetchingDeprecatedConstRule.php
@@ -0,0 +1,60 @@
+
+ */
+class FetchingDeprecatedConstRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return ConstFetch::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if (!$this->reflectionProvider->hasConstant($node->name, $scope)) {
+ return [];
+ }
+
+ $constantReflection = $this->reflectionProvider->getConstant($node->name, $scope);
+
+ if ($constantReflection->isDeprecated()->yes()) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ $constantReflection->getDeprecatedDescription() ?? 'Use of constant %s is deprecated.',
+ $constantReflection->getName()
+ ))->identifier('constant.deprecated')->build(),
+ ];
+ }
+
+ return [];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/ImplementationOfDeprecatedInterfaceRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/ImplementationOfDeprecatedInterfaceRule.php
new file mode 100644
index 00000000..dce7b46e
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/ImplementationOfDeprecatedInterfaceRule.php
@@ -0,0 +1,105 @@
+
+ */
+class ImplementationOfDeprecatedInterfaceRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $errors = [];
+
+ $className = isset($node->namespacedName)
+ ? (string) $node->namespacedName
+ : (string) $node->name;
+
+ try {
+ $class = $this->reflectionProvider->getClass($className);
+ } catch (ClassNotFoundException $e) {
+ return [];
+ }
+
+ if ($class->isDeprecated()) {
+ return [];
+ }
+
+ foreach ($node->implements as $implement) {
+ $interfaceName = (string) $implement;
+
+ try {
+ $interface = $this->reflectionProvider->getClass($interfaceName);
+
+ if ($interface->isDeprecated()) {
+ $description = $interface->getDeprecatedDescription();
+ if (!$class->isAnonymous()) {
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Class %s implements deprecated interface %s.',
+ $className,
+ $interfaceName
+ ))->identifier('class.implementsDeprecatedInterface')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Class %s implements deprecated interface %s:\n%s",
+ $className,
+ $interfaceName,
+ $description
+ ))->identifier('class.implementsDeprecatedInterface')->build();
+ }
+ } else {
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Anonymous class implements deprecated interface %s.',
+ $interfaceName
+ ))->identifier('class.implementsDeprecatedInterface')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Anonymous class implements deprecated interface %s:\n%s",
+ $interfaceName,
+ $description
+ ))->identifier('class.implementsDeprecatedInterface')->build();
+ }
+ }
+ }
+ } catch (ClassNotFoundException $e) {
+ // Other rules will notify if the interface is not found
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedClassRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedClassRule.php
new file mode 100644
index 00000000..b3e99acf
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedClassRule.php
@@ -0,0 +1,102 @@
+
+ */
+class InheritanceOfDeprecatedClassRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ if ($node->extends === null) {
+ return [];
+ }
+
+ $errors = [];
+
+ $className = isset($node->namespacedName)
+ ? (string) $node->namespacedName
+ : (string) $node->name;
+
+ try {
+ $class = $this->reflectionProvider->getClass($className);
+ } catch (ClassNotFoundException $e) {
+ return [];
+ }
+
+ $parentClassName = (string) $node->extends;
+
+ try {
+ $parentClass = $this->reflectionProvider->getClass($parentClassName);
+ $description = $parentClass->getDeprecatedDescription();
+ if ($parentClass->isDeprecated()) {
+ if (!$class->isAnonymous()) {
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Class %s extends deprecated class %s.',
+ $className,
+ $parentClassName
+ ))->identifier('class.extendsDeprecatedClass')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Class %s extends deprecated class %s:\n%s",
+ $className,
+ $parentClassName,
+ $description
+ ))->identifier('class.extendsDeprecatedClass')->build();
+ }
+ } else {
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Anonymous class extends deprecated class %s.',
+ $parentClassName
+ ))->identifier('class.extendsDeprecatedClass')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Anonymous class extends deprecated class %s:\n%s",
+ $parentClassName,
+ $description
+ ))->identifier('class.extendsDeprecatedClass')->build();
+ }
+ }
+ }
+ } catch (ClassNotFoundException $e) {
+ // Other rules will notify if the interface is not found
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedInterfaceRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedInterfaceRule.php
new file mode 100644
index 00000000..2f79fb83
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InheritanceOfDeprecatedInterfaceRule.php
@@ -0,0 +1,84 @@
+
+ */
+class InheritanceOfDeprecatedInterfaceRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ public function __construct(ReflectionProvider $reflectionProvider)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ }
+
+ public function getNodeType(): string
+ {
+ return Interface_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $interfaceName = isset($node->namespacedName)
+ ? (string) $node->namespacedName
+ : (string) $node->name;
+
+ try {
+ $interface = $this->reflectionProvider->getClass($interfaceName);
+ } catch (ClassNotFoundException $e) {
+ return [];
+ }
+
+ if ($interface->isDeprecated()) {
+ return [];
+ }
+
+ $errors = [];
+
+ foreach ($node->extends as $parentInterfaceName) {
+ $parentInterfaceName = (string) $parentInterfaceName;
+
+ try {
+ $parentInterface = $this->reflectionProvider->getClass($parentInterfaceName);
+
+ if (!$parentInterface->isDeprecated()) {
+ continue;
+ }
+
+ $description = $parentInterface->getDeprecatedDescription();
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Interface %s extends deprecated interface %s.',
+ $interfaceName,
+ $parentInterfaceName
+ ))->identifier('interface.extendsDeprecatedInterface')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Interface %s extends deprecated interface %s:\n%s",
+ $interfaceName,
+ $parentInterfaceName,
+ $description
+ ))->identifier('interface.extendsDeprecatedInterface')->build();
+ }
+ } catch (ClassNotFoundException $e) {
+ // Other rules will notify if the interface is not found
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InstantiationOfDeprecatedClassRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InstantiationOfDeprecatedClassRule.php
new file mode 100644
index 00000000..6e06e665
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/InstantiationOfDeprecatedClassRule.php
@@ -0,0 +1,109 @@
+
+ */
+class InstantiationOfDeprecatedClassRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var RuleLevelHelper */
+ private $ruleLevelHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, RuleLevelHelper $ruleLevelHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->ruleLevelHelper = $ruleLevelHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return New_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $referencedClasses = [];
+
+ if ($node->class instanceof Name) {
+ $referencedClasses[] = $scope->resolveName($node->class);
+ } elseif ($node->class instanceof Class_) {
+ if (!isset($node->class->namespacedName)) {
+ return [];
+ }
+
+ $referencedClasses[] = $scope->resolveName($node->class->namespacedName);
+ } else {
+ $classTypeResult = $this->ruleLevelHelper->findTypeToCheck(
+ $scope,
+ $node->class,
+ '', // We don't care about the error message
+ static function (): bool {
+ return true;
+ }
+ );
+
+ if ($classTypeResult->getType() instanceof ErrorType) {
+ return [];
+ }
+
+ $referencedClasses = $classTypeResult->getReferencedClasses();
+ }
+
+ $errors = [];
+
+ foreach ($referencedClasses as $referencedClass) {
+ try {
+ $class = $this->reflectionProvider->getClass($referencedClass);
+ } catch (ClassNotFoundException $e) {
+ continue;
+ }
+
+ if (!$class->isDeprecated()) {
+ continue;
+ }
+
+ $description = $class->getDeprecatedDescription();
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Instantiation of deprecated class %s.',
+ $referencedClass
+ ))->identifier('new.deprecated')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Instantiation of deprecated class %s:\n%s",
+ $referencedClass,
+ $description
+ ))->identifier('new.deprecated')->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClassMethodSignatureRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClassMethodSignatureRule.php
new file mode 100644
index 00000000..5bbcf13b
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClassMethodSignatureRule.php
@@ -0,0 +1,98 @@
+
+ */
+class TypeHintDeprecatedInClassMethodSignatureRule implements Rule
+{
+
+ /** @var DeprecatedClassHelper */
+ private $deprecatedClassHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(DeprecatedClassHelper $deprecatedClassHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->deprecatedClassHelper = $deprecatedClassHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return InClassMethodNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $method = $node->getMethodReflection();
+ $methodSignature = ParametersAcceptorSelector::selectSingle($method->getVariants());
+
+ $errors = [];
+ foreach ($methodSignature->getParameters() as $parameter) {
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($parameter->getType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ if ($method->getDeclaringClass()->isAnonymous()) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Parameter $%s of method %s() in anonymous class has typehint with deprecated %s %s%s',
+ $parameter->getName(),
+ $method->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('parameter.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Parameter $%s of method %s::%s() has typehint with deprecated %s %s%s',
+ $parameter->getName(),
+ $method->getDeclaringClass()->getName(),
+ $method->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('parameter.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+ }
+ }
+
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($methodSignature->getReturnType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ if ($method->getDeclaringClass()->isAnonymous()) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Return type of method %s() in anonymous class has typehint with deprecated %s %s%s',
+ $method->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('return.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Return type of method %s::%s() has typehint with deprecated %s %s%s',
+ $method->getDeclaringClass()->getName(),
+ $method->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('return.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClosureSignatureRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClosureSignatureRule.php
new file mode 100644
index 00000000..90d2a95a
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInClosureSignatureRule.php
@@ -0,0 +1,75 @@
+
+ */
+class TypeHintDeprecatedInClosureSignatureRule implements Rule
+{
+
+ /** @var DeprecatedClassHelper */
+ private $deprecatedClassHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(DeprecatedClassHelper $deprecatedClassHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->deprecatedClassHelper = $deprecatedClassHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return InClosureNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $functionSignature = $scope->getAnonymousFunctionReflection();
+ if ($functionSignature === null) {
+ throw new ShouldNotHappenException();
+ }
+
+ $errors = [];
+ foreach ($functionSignature->getParameters() as $parameter) {
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($parameter->getType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Parameter $%s of anonymous function has typehint with deprecated %s %s%s',
+ $parameter->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('parameter.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+ }
+
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($functionSignature->getReturnType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Return type of anonymous function has typehint with deprecated %s %s%s',
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('return.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInFunctionSignatureRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInFunctionSignatureRule.php
new file mode 100644
index 00000000..9d39bf03
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/TypeHintDeprecatedInFunctionSignatureRule.php
@@ -0,0 +1,79 @@
+
+ */
+class TypeHintDeprecatedInFunctionSignatureRule implements Rule
+{
+
+ /** @var DeprecatedClassHelper */
+ private $deprecatedClassHelper;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(DeprecatedClassHelper $deprecatedClassHelper, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->deprecatedClassHelper = $deprecatedClassHelper;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return InFunctionNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $function = $scope->getFunction();
+ if ($function === null) {
+ throw new ShouldNotHappenException();
+ }
+ $functionSignature = ParametersAcceptorSelector::selectSingle($function->getVariants());
+
+ $errors = [];
+ foreach ($functionSignature->getParameters() as $parameter) {
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($parameter->getType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Parameter $%s of function %s() has typehint with deprecated %s %s%s',
+ $parameter->getName(),
+ $function->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('parameter.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+ }
+
+ $deprecatedClasses = $this->deprecatedClassHelper->filterDeprecatedClasses($functionSignature->getReturnType()->getReferencedClasses());
+ foreach ($deprecatedClasses as $deprecatedClass) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Return type of function %s() has typehint with deprecated %s %s%s',
+ $function->getName(),
+ strtolower($deprecatedClass->getClassTypeDescription()),
+ $deprecatedClass->getName(),
+ $this->deprecatedClassHelper->getClassDeprecationDescription($deprecatedClass)
+ ))->identifier(sprintf('return.deprecated%s', $deprecatedClass->getClassTypeDescription()))->build();
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedCastRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedCastRule.php
new file mode 100644
index 00000000..f078e4de
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedCastRule.php
@@ -0,0 +1,65 @@
+
+ */
+class UsageOfDeprecatedCastRule implements Rule
+{
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return Cast::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $castedType = $scope->getType($node->expr);
+ if (! $castedType->hasMethod('__toString')->yes()) {
+ return [];
+ }
+ $method = $castedType->getMethod('__toString', $scope);
+
+ if (! $method->isDeprecated()->yes()) {
+ return [];
+ }
+ $description = $method->getDeprecatedDescription();
+ if ($description === null) {
+ return [
+ RuleErrorBuilder::message(sprintf(
+ 'Casting class %s to string is deprecated.',
+ $method->getDeclaringClass()->getName()
+ ))->identifier('class.toStringDeprecated')->build(),
+ ];
+ }
+
+ return [
+ RuleErrorBuilder::message(sprintf(
+ "Casting class %s to string is deprecated.:\n%s",
+ $method->getDeclaringClass()->getName(),
+ $description
+ ))->identifier('class.toStringDeprecated')->build(),
+ ];
+ }
+
+}
diff --git a/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedTraitRule.php b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedTraitRule.php
new file mode 100644
index 00000000..dd01c650
--- /dev/null
+++ b/vendor/phpstan/phpstan-deprecation-rules/src/Rules/Deprecations/UsageOfDeprecatedTraitRule.php
@@ -0,0 +1,84 @@
+
+ */
+class UsageOfDeprecatedTraitRule implements Rule
+{
+
+ /** @var ReflectionProvider */
+ private $reflectionProvider;
+
+ /** @var DeprecatedScopeHelper */
+ private $deprecatedScopeHelper;
+
+ public function __construct(ReflectionProvider $reflectionProvider, DeprecatedScopeHelper $deprecatedScopeHelper)
+ {
+ $this->reflectionProvider = $reflectionProvider;
+ $this->deprecatedScopeHelper = $deprecatedScopeHelper;
+ }
+
+ public function getNodeType(): string
+ {
+ return TraitUse::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ if ($this->deprecatedScopeHelper->isScopeDeprecated($scope)) {
+ return [];
+ }
+
+ $classReflection = $scope->getClassReflection();
+ if ($classReflection === null) {
+ throw new ShouldNotHappenException();
+ }
+
+ $errors = [];
+ $className = $classReflection->getName();
+
+ foreach ($node->traits as $traitNameNode) {
+ $traitName = (string) $traitNameNode;
+
+ try {
+ $trait = $this->reflectionProvider->getClass($traitName);
+ if (!$trait->isDeprecated()) {
+ continue;
+ }
+
+ $description = $trait->getDeprecatedDescription();
+ if ($description === null) {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ 'Usage of deprecated trait %s in class %s.',
+ $traitName,
+ $className
+ ))->identifier('traitUse.deprecated')->build();
+ } else {
+ $errors[] = RuleErrorBuilder::message(sprintf(
+ "Usage of deprecated trait %s in class %s:\n%s",
+ $traitName,
+ $className,
+ $description
+ ))->identifier('traitUse.deprecated')->build();
+ }
+ } catch (ClassNotFoundException $e) {
+ continue;
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/vendor/phpstan/phpstan/LICENSE b/vendor/phpstan/phpstan/LICENSE
new file mode 100644
index 00000000..7c0f2b7b
--- /dev/null
+++ b/vendor/phpstan/phpstan/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Ondřej Mirtes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/phpstan/phpstan/README.md b/vendor/phpstan/phpstan/README.md
new file mode 100644
index 00000000..a14f10df
--- /dev/null
+++ b/vendor/phpstan/phpstan/README.md
@@ -0,0 +1,104 @@
+PHPStan - PHP Static Analysis Tool
+
+
+
+
+
+
+
+
+
+
+
+
+
+------
+
+PHPStan focuses on finding errors in your code without actually running it. It catches whole classes of bugs
+even before you write tests for the code. It moves PHP closer to compiled languages in the sense that the correctness of each line of the code
+can be checked before you run the actual line.
+
+**[Read more about PHPStan »](https://phpstan.org/)**
+
+**[Try out PHPStan on the on-line playground! »](https://phpstan.org/try)**
+
+## Sponsors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes)
+
+Does GitHub already have your 💳? Do you use PHPStan to find 🐛 before they reach production? [Send a couple of 💸 a month my way too.](https://github.com/sponsors/ondrejmirtes) Thank you!
+
+One-time donations [through Revolut.me](https://revolut.me/ondrejmirtes) are also accepted. To request an invoice, [contact me](mailto:ondrej@mirtes.cz) through e-mail.
+
+## Documentation
+
+All the documentation lives on the [phpstan.org website](https://phpstan.org/):
+
+* [Getting Started & User Guide](https://phpstan.org/user-guide/getting-started)
+* [Config Reference](https://phpstan.org/config-reference)
+* [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types)
+* [Extension Library](https://phpstan.org/user-guide/extension-library)
+* [Developing Extensions](https://phpstan.org/developing-extensions/extension-types)
+* [API Reference](https://apiref.phpstan.org/)
+
+## PHPStan Pro
+
+PHPStan Pro is a paid add-on on top of open-source PHPStan Static Analysis Tool with these premium features:
+
+* Web UI for browsing found errors, you can click and open your editor of choice on the offending line.
+* Continuous analysis (watch mode): scans changed files in the background, refreshes the UI automatically.
+
+Try it on PHPStan 0.12.45 or later by running it with the `--pro` option. You can create an account either by following the on-screen instructions, or by visiting [account.phpstan.com](https://account.phpstan.com/).
+
+After 30-day free trial period it costs 7 EUR for individuals monthly, 70 EUR for teams (up to 25 members). By paying for PHPStan Pro, you're supporting the development of open-source PHPStan.
+
+You can read more about it on [PHPStan's website](https://phpstan.org/blog/introducing-phpstan-pro).
+
+## Code of Conduct
+
+This project adheres to a [Contributor Code of Conduct](https://github.com/phpstan/phpstan/blob/master/CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code.
+
+## Contributing
+
+Any contributions are welcome. PHPStan's source code open to pull requests lives at [`phpstan/phpstan-src`](https://github.com/phpstan/phpstan-src).
diff --git a/vendor/phpstan/phpstan/bootstrap.php b/vendor/phpstan/phpstan/bootstrap.php
new file mode 100644
index 00000000..2d950b09
--- /dev/null
+++ b/vendor/phpstan/phpstan/bootstrap.php
@@ -0,0 +1,135 @@
+loadClass($class);
+
+ return;
+ }
+ if (strpos($class, 'PHPStan\\') !== 0 || strpos($class, 'PHPStan\\PhpDocParser\\') === 0) {
+ return;
+ }
+
+ if (!in_array('phar', stream_get_wrappers(), true)) {
+ throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.');
+ }
+
+ if (!self::$polyfillsLoaded) {
+ self::$polyfillsLoaded = true;
+
+ if (
+ PHP_VERSION_ID < 80000
+ && empty($GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'])
+ && !class_exists(\Symfony\Polyfill\Php80\Php80::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/Php80.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/bootstrap.php';
+ }
+
+ if (
+ empty($GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'])
+ && !class_exists(\Symfony\Polyfill\Mbstring\Mbstring::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/Mbstring.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/bootstrap.php';
+ }
+
+ if (
+ empty($GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'])
+ && !class_exists(\Symfony\Polyfill\Intl\Normalizer\Normalizer::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/Normalizer.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/bootstrap.php';
+ }
+
+ if (
+ PHP_VERSION_ID < 70300
+ && empty($GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d'])
+ && !class_exists(\Symfony\Polyfill\Php73\Php73::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['0d59ee240a4cd96ddbb4ff164fccea4d'] = true;
+ // already loaded by bootstrap inside the hrtime condition
+ // require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/Php73.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php73/bootstrap.php';
+ }
+
+ if (
+ PHP_VERSION_ID < 70400
+ && empty($GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634'])
+ && !class_exists(\Symfony\Polyfill\Php74\Php74::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['b686b8e46447868025a15ce5d0cb2634'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/Php74.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php74/bootstrap.php';
+ }
+
+ if (
+ !extension_loaded('intl')
+ && empty($GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'])
+ && !class_exists(\Symfony\Polyfill\Intl\Grapheme\Grapheme::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/Grapheme.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/bootstrap.php';
+ }
+
+ if (
+ PHP_VERSION_ID < 80100
+ && empty ($GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'])
+ && !class_exists(\Symfony\Polyfill\Php81\Php81::class, false)
+ ) {
+ $GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'] = true;
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/Php81.php';
+ require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/bootstrap.php';
+ }
+ }
+
+ $filename = str_replace('\\', DIRECTORY_SEPARATOR, $class);
+ if (strpos($class, 'PHPStan\\BetterReflection\\') === 0) {
+ $filename = substr($filename, strlen('PHPStan\\BetterReflection\\'));
+ $filepath = 'phar://' . __DIR__ . '/phpstan.phar/vendor/ondrejmirtes/better-reflection/src/' . $filename . '.php';
+ } else {
+ $filename = substr($filename, strlen('PHPStan\\'));
+ $filepath = 'phar://' . __DIR__ . '/phpstan.phar/src/' . $filename . '.php';
+ }
+
+ if (!file_exists($filepath)) {
+ return;
+ }
+
+ require $filepath;
+ }
+}
+
+spl_autoload_register([PharAutoloader::class, 'loadClass']);
diff --git a/vendor/phpstan/phpstan/composer.json b/vendor/phpstan/phpstan/composer.json
new file mode 100644
index 00000000..07faa85b
--- /dev/null
+++ b/vendor/phpstan/phpstan/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "phpstan/phpstan",
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "license": ["MIT"],
+ "keywords": ["dev", "static analysis"],
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "autoload": {
+ "files": ["bootstrap.php"]
+ },
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "source": "https://github.com/phpstan/phpstan-src",
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "security": "https://github.com/phpstan/phpstan/security/policy"
+ }
+}
diff --git a/vendor/phpstan/phpstan/conf/bleedingEdge.neon b/vendor/phpstan/phpstan/conf/bleedingEdge.neon
new file mode 100644
index 00000000..01fee972
--- /dev/null
+++ b/vendor/phpstan/phpstan/conf/bleedingEdge.neon
@@ -0,0 +1,2 @@
+includes:
+ - phar://phpstan.phar/conf/bleedingEdge.neon
diff --git a/vendor/phpstan/phpstan/phpstan b/vendor/phpstan/phpstan/phpstan
new file mode 100755
index 00000000..7a08ef48
--- /dev/null
+++ b/vendor/phpstan/phpstan/phpstan
@@ -0,0 +1,8 @@
+#!/usr/bin/env php
+isInterface()) {
+ return null;
+ }
+
if (null !== $indexAttribute) {
$service = $class !== $serviceId ? sprintf('service "%s"', $serviceId) : 'on the corresponding service';
$message = [sprintf('Either method "%s::%s()" should ', $class, $defaultMethod), sprintf(' or tag "%s" on %s is missing attribute "%s".', $tagName, $service, $indexAttribute)];
diff --git a/vendor/symfony/error-handler/ErrorHandler.php b/vendor/symfony/error-handler/ErrorHandler.php
index d82ce6c7..777833b9 100644
--- a/vendor/symfony/error-handler/ErrorHandler.php
+++ b/vendor/symfony/error-handler/ErrorHandler.php
@@ -55,7 +55,6 @@ class ErrorHandler
\E_USER_DEPRECATED => 'User Deprecated',
\E_NOTICE => 'Notice',
\E_USER_NOTICE => 'User Notice',
- \E_STRICT => 'Runtime Notice',
\E_WARNING => 'Warning',
\E_USER_WARNING => 'User Warning',
\E_COMPILE_WARNING => 'Compile Warning',
@@ -73,7 +72,6 @@ class ErrorHandler
\E_USER_DEPRECATED => [null, LogLevel::INFO],
\E_NOTICE => [null, LogLevel::WARNING],
\E_USER_NOTICE => [null, LogLevel::WARNING],
- \E_STRICT => [null, LogLevel::WARNING],
\E_WARNING => [null, LogLevel::WARNING],
\E_USER_WARNING => [null, LogLevel::WARNING],
\E_COMPILE_WARNING => [null, LogLevel::WARNING],
@@ -181,6 +179,11 @@ public static function call(callable $function, mixed ...$arguments): mixed
public function __construct(?BufferingLogger $bootstrappingLogger = null, bool $debug = false)
{
+ if (\PHP_VERSION_ID < 80400) {
+ $this->levels[\E_STRICT] = 'Runtime Notice';
+ $this->loggers[\E_STRICT] = [null, LogLevel::WARNING];
+ }
+
if ($bootstrappingLogger) {
$this->bootstrappingLogger = $bootstrappingLogger;
$this->setDefaultLogger($bootstrappingLogger);
diff --git a/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php b/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php
index 17745c81..032f194d 100644
--- a/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php
+++ b/vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php
@@ -61,7 +61,7 @@ public function render(\Throwable $exception): FlattenException
{
$headers = ['Content-Type' => 'text/html; charset='.$this->charset];
if (\is_bool($this->debug) ? $this->debug : ($this->debug)($exception)) {
- $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage());
+ $headers['X-Debug-Exception'] = rawurlencode(substr($exception->getMessage(), 0, 2000));
$headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
}
diff --git a/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php b/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php
index a42ce3f2..b09a6e00 100644
--- a/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php
+++ b/vendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php
@@ -47,7 +47,7 @@ public function render(\Throwable $exception): FlattenException
$headers = ['Vary' => 'Accept'];
$debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception);
if ($debug) {
- $headers['X-Debug-Exception'] = rawurlencode($exception->getMessage());
+ $headers['X-Debug-Exception'] = rawurlencode(substr($exception->getMessage(), 0, 2000));
$headers['X-Debug-Exception-File'] = rawurlencode($exception->getFile()).':'.$exception->getLine();
}
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
index 5d180256..f02793d3 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
@@ -216,7 +216,7 @@ public function getMetadataBag(): MetadataBag
*/
protected function generateId(): string
{
- return hash('sha256', uniqid('ss_mock_', true));
+ return bin2hex(random_bytes(16));
}
/**
diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php
index d20596d9..22c3bc2b 100644
--- a/vendor/symfony/http-kernel/Kernel.php
+++ b/vendor/symfony/http-kernel/Kernel.php
@@ -76,11 +76,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl
*/
private static array $freshCache = [];
- public const VERSION = '6.4.9';
- public const VERSION_ID = 60409;
+ public const VERSION = '6.4.10';
+ public const VERSION_ID = 60410;
public const MAJOR_VERSION = 6;
public const MINOR_VERSION = 4;
- public const RELEASE_VERSION = 9;
+ public const RELEASE_VERSION = 10;
public const EXTRA_VERSION = '';
public const END_OF_MAINTENANCE = '11/2026';
@@ -539,6 +539,7 @@ protected function initializeContainer()
touch($oldContainerDir.'.legacy');
}
+ $buildDir = $this->container->getParameter('kernel.build_dir');
$cacheDir = $this->container->getParameter('kernel.cache_dir');
$preload = $this instanceof WarmableInterface ? (array) $this->warmUp($cacheDir, $buildDir) : [];
diff --git a/vendor/symfony/routing/Router.php b/vendor/symfony/routing/Router.php
index f81d7b7f..b769caee 100644
--- a/vendor/symfony/routing/Router.php
+++ b/vendor/symfony/routing/Router.php
@@ -272,6 +272,7 @@ function (ConfigCacheInterface $cache) {
}
$cache->write($dumper->dump(), $this->getRouteCollection()->getResources());
+ unset(self::$cache[$cache->getPath()]);
}
);
@@ -301,6 +302,7 @@ function (ConfigCacheInterface $cache) {
$dumper = $this->getGeneratorDumperInstance();
$cache->write($dumper->dump(), $this->getRouteCollection()->getResources());
+ unset(self::$cache[$cache->getPath()]);
}
);
diff --git a/vendor/symfony/serializer/Debug/TraceableSerializer.php b/vendor/symfony/serializer/Debug/TraceableSerializer.php
index 2e375e08..789ae65c 100644
--- a/vendor/symfony/serializer/Debug/TraceableSerializer.php
+++ b/vendor/symfony/serializer/Debug/TraceableSerializer.php
@@ -41,7 +41,7 @@ public function __construct(
public function serialize(mixed $data, string $format, array $context = []): string
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->serialize($data, $format, $context);
@@ -56,7 +56,7 @@ public function serialize(mixed $data, string $format, array $context = []): str
public function deserialize(mixed $data, string $type, string $format, array $context = []): mixed
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->deserialize($data, $type, $format, $context);
@@ -71,7 +71,7 @@ public function deserialize(mixed $data, string $type, string $format, array $co
public function normalize(mixed $object, ?string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->normalize($object, $format, $context);
@@ -86,7 +86,7 @@ public function normalize(mixed $object, ?string $format = null, array $context
public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): mixed
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->denormalize($data, $type, $format, $context);
@@ -101,7 +101,7 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a
public function encode(mixed $data, string $format, array $context = []): string
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->encode($data, $format, $context);
@@ -116,7 +116,7 @@ public function encode(mixed $data, string $format, array $context = []): string
public function decode(string $data, string $format, array $context = []): mixed
{
- $context[self::DEBUG_TRACE_ID] = $traceId = uniqid();
+ $context[self::DEBUG_TRACE_ID] = $traceId = uniqid('', true);
$startTime = microtime(true);
$result = $this->serializer->decode($data, $format, $context);
diff --git a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
index ccada2ed..aeae375f 100644
--- a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
@@ -267,6 +267,8 @@ protected function getGroups(array $context): array
/**
* Is this attribute allowed?
+ *
+ * @return bool
*/
protected function isAllowedAttribute(object|string $classOrObject, string $attribute, ?string $format = null, array $context = [])
{
diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php
index 4e085010..70598e40 100644
--- a/vendor/symfony/string/AbstractUnicodeString.php
+++ b/vendor/symfony/string/AbstractUnicodeString.php
@@ -155,7 +155,7 @@ public function ascii(array $rules = []): self
public function camel(): static
{
$str = clone $this;
- $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) {
+ $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?!\p{Lu})/u', static function ($m) {
static $i = 0;
return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8');
@@ -346,8 +346,8 @@ public function reverse(): static
public function snake(): static
{
- $str = clone $this;
- $str->string = str_replace(' ', '_', mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1 \2', $str->string), 'UTF-8'));
+ $str = $this->camel();
+ $str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8');
return $str;
}
diff --git a/vendor/symfony/string/ByteString.php b/vendor/symfony/string/ByteString.php
index 6389dbd1..3ebe43c1 100644
--- a/vendor/symfony/string/ByteString.php
+++ b/vendor/symfony/string/ByteString.php
@@ -342,8 +342,8 @@ public function slice(int $start = 0, ?int $length = null): static
public function snake(): static
{
- $str = clone $this;
- $str->string = str_replace(' ', '_', strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1 \2', $str->string)));
+ $str = $this->camel();
+ $str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string));
return $str;
}
diff --git a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
index 4e2c2719..1424d325 100644
--- a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
+++ b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Validator\Constraints;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
+use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Constraint;
@@ -56,6 +57,8 @@ public function validate(mixed $value, Constraint $constraint)
$comparedValue = $this->getPropertyAccessor()->getValue($object, $path);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(sprintf('Invalid property path "%s" provided to "%s" constraint: ', $path, get_debug_type($constraint)).$e->getMessage(), 0, $e);
+ } catch (UninitializedPropertyException) {
+ $comparedValue = null;
}
} else {
$comparedValue = $constraint->value;
diff --git a/vendor/symfony/validator/Constraints/BicValidator.php b/vendor/symfony/validator/Constraints/BicValidator.php
index 6236da86..7be4dc40 100644
--- a/vendor/symfony/validator/Constraints/BicValidator.php
+++ b/vendor/symfony/validator/Constraints/BicValidator.php
@@ -13,6 +13,7 @@
use Symfony\Component\Intl\Countries;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
+use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessor;
use Symfony\Component\Validator\Constraint;
@@ -130,6 +131,8 @@ public function validate(mixed $value, Constraint $constraint)
$iban = $this->getPropertyAccessor()->getValue($object, $path);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(sprintf('Invalid property path "%s" provided to "%s" constraint: ', $path, get_debug_type($constraint)).$e->getMessage(), 0, $e);
+ } catch (UninitializedPropertyException) {
+ $iban = null;
}
}
if (!$iban) {
diff --git a/vendor/symfony/validator/Constraints/RangeValidator.php b/vendor/symfony/validator/Constraints/RangeValidator.php
index 3aae44dc..449ddb38 100644
--- a/vendor/symfony/validator/Constraints/RangeValidator.php
+++ b/vendor/symfony/validator/Constraints/RangeValidator.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Validator\Constraints;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
+use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Constraint;
@@ -162,6 +163,8 @@ private function getLimit(?string $propertyPath, mixed $default, Constraint $con
return $this->getPropertyAccessor()->getValue($object, $propertyPath);
} catch (NoSuchPropertyException $e) {
throw new ConstraintDefinitionException(sprintf('Invalid property path "%s" provided to "%s" constraint: ', $propertyPath, get_debug_type($constraint)).$e->getMessage(), 0, $e);
+ } catch (UninitializedPropertyException) {
+ return null;
}
}
diff --git a/vendor/symfony/validator/Resources/translations/validators.af.xlf b/vendor/symfony/validator/Resources/translations/validators.af.xlf
index f975fc51..e09d3fc0 100644
--- a/vendor/symfony/validator/Resources/translations/validators.af.xlf
+++ b/vendor/symfony/validator/Resources/translations/validators.af.xlf
@@ -442,6 +442,14 @@
This URL is missing a top-level domain.
Die URL mis 'n topvlakdomein.
+
+ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.
+ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words.
+
+
+ This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.
+ This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less.
+