diff --git a/.ddev/config.yaml b/.ddev/config.yaml index a9e314eda..b8d37c784 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -1,7 +1,7 @@ name: drupal-starter type: drupal10 docroot: web -php_version: "8.3" +php_version: "8.4" webserver_type: nginx-fpm router_http_port: "8880" router_https_port: "4443" @@ -30,7 +30,7 @@ corepack_enable: false # docroot: # Relative path to the directory containing index.php. -# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3" +# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4" # You can explicitly specify the webimage but this # is not recommended, as the images are often closely tied to DDEV's' behavior, diff --git a/.travis.template.yml b/.travis.template.yml index 46a2427bd..be778accf 100644 --- a/.travis.template.yml +++ b/.travis.template.yml @@ -2,7 +2,7 @@ version: "~> 1.0" language: php dist: jammy php: - - 8.3 + - 8.4 services: - docker stages: diff --git a/.travis.yml b/.travis.yml index e664802f9..b0be5b45d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ version: "~> 1.0" language: php dist: noble php: -- 8.3 +- 8.4 services: - docker stages: diff --git a/composer.json b/composer.json index 266d893a4..e667ec24b 100644 --- a/composer.json +++ b/composer.json @@ -19,14 +19,14 @@ } ], "require": { - "php": "^8.3", + "php": "^8.4", "ext-curl": "*", "ext-dom": "*", "ext-intl": "*", "ext-json": "*", "ext-mbstring": "*", "bower-asset/font-awesome": "^6", - "composer/installers": "^1.9", + "composer/installers": "^1.9 || ^2.0", "cweagans/composer-patches": "^1.7", "drupal/admin_toolbar": "^3.4", "drupal/ai": "^1.0", @@ -89,7 +89,6 @@ "drupal/webform": "^6.2", "drupal/wpf": "^1.2", "drush/drush": "^12.4", - "longwave/laminas-diactoros": "^2.14", "mglaman/phpstan-drupal": "^2.0", "npm-asset/anchor-js": "^5.0", "npm-asset/select2": "^4.0", @@ -101,7 +100,7 @@ "behat/mink": "^1.10", "behat/mink-browserkit-driver": "^2.1", "behat/mink-selenium2-driver": "^1.6", - "consolidation/robo": "^4", + "consolidation/robo": "^4 || ^5", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "drupal/cache_review": "1.1.x-dev@dev", "drupal/coder": "^8.3.1", diff --git a/composer.lock b/composer.lock index 9d97ca454..3e1ba2619 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": "6cf91aab6c5d5f8105d204188c3f9d3d", + "content-hash": "add36cb9e448154164582c06a222aa42", "packages": [ { "name": "asm89/stack-cors", @@ -420,39 +420,37 @@ }, { "name": "composer/installers", - "version": "v1.12.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", + "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "replace": { - "roundcube/plugin-installer": "*", - "shama/baton": "*" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "1.6.* || ^2.0", - "composer/semver": "^1 || ^3", - "phpstan/phpstan": "^0.12.55", - "phpstan/phpstan-phpunit": "^0.12.16", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.3" + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-phpunit": "^1", + "symfony/phpunit-bridge": "^7.1.1", + "symfony/process": "^5 || ^6 || ^7" }, "type": "composer-plugin", "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-main": "1.x-dev" - } + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true }, "autoload": { "psr-4": { @@ -473,7 +471,6 @@ "description": "A multi-framework Composer library installer", "homepage": "https://composer.github.io/installers/", "keywords": [ - "Craft", "Dolibarr", "Eliasis", "Hurad", @@ -494,7 +491,6 @@ "Whmcs", "WolfCMS", "agl", - "aimeos", "annotatecms", "attogram", "bitrix", @@ -503,6 +499,7 @@ "cockpit", "codeigniter", "concrete5", + "concreteCMS", "croogo", "dokuwiki", "drupal", @@ -513,7 +510,6 @@ "grav", "installer", "itop", - "joomla", "known", "kohana", "laravel", @@ -522,6 +518,7 @@ "magento", "majima", "mako", + "matomo", "mediawiki", "miaoxing", "modulework", @@ -541,9 +538,7 @@ "silverstripe", "sydes", "sylius", - "symfony", "tastyigniter", - "typo3", "wordpress", "yawik", "zend", @@ -551,7 +546,7 @@ ], "support": { "issues": "https://github.com/composer/installers/issues", - "source": "https://github.com/composer/installers/tree/v1.12.0" + "source": "https://github.com/composer/installers/tree/v2.3.0" }, "funding": [ { @@ -567,20 +562,20 @@ "type": "tidelift" } ], - "time": "2021-09-13T08:19:44+00:00" + "time": "2024-06-24T20:46:46+00:00" }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -632,7 +627,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -642,26 +637,22 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "consolidation/annotated-command", - "version": "4.10.1", + "version": "4.10.2", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "362310b13ececa9f6f0a4a880811fa08fecc348b" + "reference": "e550ea4f177f199e0e9451168342bf3f321d92b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/362310b13ececa9f6f0a4a880811fa08fecc348b", - "reference": "362310b13ececa9f6f0a4a880811fa08fecc348b", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/e550ea4f177f199e0e9451168342bf3f321d92b0", + "reference": "e550ea4f177f199e0e9451168342bf3f321d92b0", "shasum": "" }, "require": { @@ -702,9 +693,9 @@ "description": "Initialize Symfony Console commands from annotated command class methods.", "support": { "issues": "https://github.com/consolidation/annotated-command/issues", - "source": "https://github.com/consolidation/annotated-command/tree/4.10.1" + "source": "https://github.com/consolidation/annotated-command/tree/4.10.2" }, - "time": "2024-12-13T19:55:40+00:00" + "time": "2025-07-16T20:54:09+00:00" }, { "name": "consolidation/config", @@ -870,16 +861,16 @@ }, { "name": "consolidation/output-formatters", - "version": "4.6.0", + "version": "4.6.1", "source": { "type": "git", "url": "https://github.com/consolidation/output-formatters.git", - "reference": "5fd5656718d7068a02d046f418a7ba873d5abbfe" + "reference": "b6bcaf13bec9f4597e75ae853f3b3ac0d53b798d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/5fd5656718d7068a02d046f418a7ba873d5abbfe", - "reference": "5fd5656718d7068a02d046f418a7ba873d5abbfe", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/b6bcaf13bec9f4597e75ae853f3b3ac0d53b798d", + "reference": "b6bcaf13bec9f4597e75ae853f3b3ac0d53b798d", "shasum": "" }, "require": { @@ -918,9 +909,9 @@ "description": "Format text by applying transformations provided by plug-in formatters.", "support": { "issues": "https://github.com/consolidation/output-formatters/issues", - "source": "https://github.com/consolidation/output-formatters/tree/4.6.0" + "source": "https://github.com/consolidation/output-formatters/tree/4.6.1" }, - "time": "2024-10-18T14:02:48+00:00" + "time": "2024-12-13T18:38:45+00:00" }, { "name": "consolidation/robo", @@ -2421,17 +2412,17 @@ }, { "name": "drupal/config_pages", - "version": "2.17.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/config_pages.git", - "reference": "8.x-2.17" + "reference": "8.x-2.18" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/config_pages-8.x-2.17.zip", - "reference": "8.x-2.17", - "shasum": "717b1eb911e30e766a891d45eeefa34825794ac4" + "url": "https://ftp.drupal.org/files/projects/config_pages-8.x-2.18.zip", + "reference": "8.x-2.18", + "shasum": "16f567054896f572ffbb0c4c165e68e165413864" }, "require": { "drupal/core": "^8.5 | ^9 || ^10 || ^11" @@ -2439,8 +2430,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-2.17", - "datestamp": "1736029180", + "version": "8.x-2.18", + "datestamp": "1753893029", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -2482,16 +2473,16 @@ }, { "name": "drupal/core", - "version": "10.4.7", + "version": "10.4.8", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "547fa74348dda2ecb4a3e752f88a5c40be675d64" + "reference": "18b5bd895531f95c8c537e2445a27d64415c3846" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/547fa74348dda2ecb4a3e752f88a5c40be675d64", - "reference": "547fa74348dda2ecb4a3e752f88a5c40be675d64", + "url": "https://api.github.com/repos/drupal/core/zipball/18b5bd895531f95c8c537e2445a27d64415c3846", + "reference": "18b5bd895531f95c8c537e2445a27d64415c3846", "shasum": "" }, "require": { @@ -2640,13 +2631,13 @@ ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { - "source": "https://github.com/drupal/core/tree/10.4.7" + "source": "https://github.com/drupal/core/tree/10.4.8" }, - "time": "2025-05-08T04:06:41+00:00" + "time": "2025-06-05T23:40:40+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "10.4.7", + "version": "10.5.2", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", @@ -2690,13 +2681,13 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-composer-scaffold/tree/10.4.7" + "source": "https://github.com/drupal/core-composer-scaffold/tree/10.5.2" }, "time": "2024-08-22T14:31:30+00:00" }, { "name": "drupal/core-project-message", - "version": "10.4.7", + "version": "10.5.2", "source": { "type": "git", "url": "https://github.com/drupal/core-project-message.git", @@ -2731,22 +2722,22 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-project-message/tree/11.1.7" + "source": "https://github.com/drupal/core-project-message/tree/11.1.8" }, "time": "2023-07-24T07:55:25+00:00" }, { "name": "drupal/core-recommended", - "version": "10.4.7", + "version": "10.4.8", "source": { "type": "git", "url": "https://github.com/drupal/core-recommended.git", - "reference": "308b63fa05111c15f4a36919718b7c2d016af892" + "reference": "d5e2b8461b93e5b0bf4495b41feadb8fb2c9d40b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-recommended/zipball/308b63fa05111c15f4a36919718b7c2d016af892", - "reference": "308b63fa05111c15f4a36919718b7c2d016af892", + "url": "https://api.github.com/repos/drupal/core-recommended/zipball/d5e2b8461b93e5b0bf4495b41feadb8fb2c9d40b", + "reference": "d5e2b8461b93e5b0bf4495b41feadb8fb2c9d40b", "shasum": "" }, "require": { @@ -2755,7 +2746,7 @@ "doctrine/annotations": "~1.14.4", "doctrine/deprecations": "~1.1.3", "doctrine/lexer": "~2.1.1", - "drupal/core": "10.4.7", + "drupal/core": "10.4.8", "egulias/email-validator": "~4.0.2", "guzzlehttp/guzzle": "~7.9.2", "guzzlehttp/promises": "~2.0.4", @@ -2816,9 +2807,9 @@ ], "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.4.7" + "source": "https://github.com/drupal/core-recommended/tree/10.4.8" }, - "time": "2025-05-08T04:06:41+00:00" + "time": "2025-06-05T23:40:40+00:00" }, { "name": "drupal/crop", @@ -4126,17 +4117,17 @@ }, { "name": "drupal/metatag", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/metatag.git", - "reference": "2.1.0" + "reference": "2.1.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/metatag-2.1.0.zip", - "reference": "2.1.0", - "shasum": "c28fe2fdac68a9370a6af6cbafff4425dd5148f3" + "url": "https://ftp.drupal.org/files/projects/metatag-2.1.1.zip", + "reference": "2.1.1", + "shasum": "94f272db388cbf1e4df775a2677f8c35818c9382" }, "require": { "drupal/core": "^9.4 || ^10 || ^11", @@ -4144,7 +4135,7 @@ "php": ">=8.0" }, "require-dev": { - "drupal/forum": "*", + "drupal/forum": "1.x-dev", "drupal/hal": "^1 || ^2 || ^9", "drupal/metatag_dc": "*", "drupal/metatag_open_graph": "*", @@ -4156,8 +4147,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.0", - "datestamp": "1731004042", + "version": "2.1.1", + "datestamp": "1752433708", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7437,16 +7428,16 @@ }, { "name": "league/container", - "version": "4.2.4", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/thephpleague/container.git", - "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec" + "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/7ea728b013b9a156c409c6f0fc3624071b742dec", - "reference": "7ea728b013b9a156c409c6f0fc3624071b742dec", + "url": "https://api.github.com/repos/thephpleague/container/zipball/d3cebb0ff4685ff61c749e54b27db49319e2ec00", + "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00", "shasum": "" }, "require": { @@ -7507,7 +7498,7 @@ ], "support": { "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/4.2.4" + "source": "https://github.com/thephpleague/container/tree/4.2.5" }, "funding": [ { @@ -7515,7 +7506,7 @@ "type": "github" } ], - "time": "2024-11-10T12:42:13+00:00" + "time": "2025-05-20T12:55:37+00:00" }, { "name": "league/csv", @@ -7697,102 +7688,6 @@ ], "time": "2023-07-12T21:21:09+00:00" }, - { - "name": "longwave/laminas-diactoros", - "version": "2.14.3", - "source": { - "type": "git", - "url": "https://github.com/longwave/laminas-diactoros.git", - "reference": "2bd6b47a090ae924ecc298657d01f8a462f7507b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/longwave/laminas-diactoros/zipball/2bd6b47a090ae924ecc298657d01f8a462f7507b", - "reference": "2bd6b47a090ae924ecc298657d01f8a462f7507b", - "shasum": "" - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "replace": { - "laminas/laminas-diactoros": "2.18.1" - }, - "require-dev": { - "ext-curl": "*", - "ext-dom": "*", - "ext-gd": "*", - "ext-libxml": "*", - "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "~2.3.0", - "php-http/psr7-integration-tests": "^1.1.1", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.17.0", - "vimeo/psalm": "^4.24.0" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\Diactoros", - "config-provider": "Laminas\\Diactoros\\ConfigProvider" - } - }, - "autoload": { - "files": [ - "src/functions/create_uploaded_file.php", - "src/functions/marshal_headers_from_sapi.php", - "src/functions/marshal_method_from_sapi.php", - "src/functions/marshal_protocol_version_from_sapi.php", - "src/functions/marshal_uri_from_sapi.php", - "src/functions/normalize_server.php", - "src/functions/normalize_uploaded_files.php", - "src/functions/parse_cookie_header.php", - "src/functions/create_uploaded_file.legacy.php", - "src/functions/marshal_headers_from_sapi.legacy.php", - "src/functions/marshal_method_from_sapi.legacy.php", - "src/functions/marshal_protocol_version_from_sapi.legacy.php", - "src/functions/marshal_uri_from_sapi.legacy.php", - "src/functions/normalize_server.legacy.php", - "src/functions/normalize_uploaded_files.legacy.php", - "src/functions/parse_cookie_header.legacy.php" - ], - "psr-4": { - "Laminas\\Diactoros\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "PSR HTTP Message implementations", - "homepage": "https://laminas.dev", - "keywords": [ - "http", - "laminas", - "psr", - "psr-17", - "psr-7" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-diactoros/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-diactoros/issues", - "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", - "source": "https://github.com/laminas/laminas-diactoros" - }, - "time": "2024-09-11T14:26:18+00:00" - }, { "name": "maennchen/zipstream-php", "version": "3.1.2", @@ -12009,7 +11904,7 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.32.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -12065,7 +11960,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -12076,6 +11971,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -14149,17 +14048,17 @@ }, { "name": "drupal/devel", - "version": "5.3.1", + "version": "5.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/devel.git", - "reference": "5.3.1" + "reference": "5.4.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/devel-5.3.1.zip", - "reference": "5.3.1", - "shasum": "6a5f13bdf93dc5f7f194b6af847589ae15e37b63" + "url": "https://ftp.drupal.org/files/projects/devel-5.4.0.zip", + "reference": "5.4.0", + "shasum": "fc14fe1c396dbff661f9d13e6e3171d9ab781a46" }, "require": { "doctrine/common": "^2.7 || ^3.4", @@ -14169,22 +14068,21 @@ }, "conflict": { "drupal/core": "<10.3", - "drush/drush": "<12.5.1", - "kint-php/kint": "<3" + "drush/drush": "<12.5.1" }, "require-dev": { + "drupal/navigation_extra_tools": "1.0.x-dev", "drush/drush": "^13", - "firephp/firephp-core": "^0.5.3", - "kint-php/kint": "^5.1" + "firephp/firephp-core": "^0.5.3" }, "suggest": { - "kint-php/kint": "Kint provides an informative display of arrays/objects. Useful for debugging and developing." + "drupal/kint": "Kint provides an informative display of arrays/objects. Useful for debugging and developing." }, "type": "drupal-module", "extra": { "drupal": { - "version": "5.3.1", - "datestamp": "1723258446", + "version": "5.4.0", + "datestamp": "1752755621", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -17269,16 +17167,16 @@ }, { "name": "weitzman/drupal-test-traits", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/dtt.git", - "reference": "664201b00140f9b935fcb9f3eef012c6638ec0c5" + "reference": "4f77e7cc79eb0a067a224fd167e43736a5a071df" }, "dist": { "type": "zip", - "url": "https://git.drupalcode.org/api/v4/projects/project%2Fdtt/repository/archive.zip?sha=664201b00140f9b935fcb9f3eef012c6638ec0c5", - "reference": "664201b00140f9b935fcb9f3eef012c6638ec0c5", + "url": "https://git.drupalcode.org/api/v4/projects/project%2Fdtt/repository/archive.zip?sha=4f77e7cc79eb0a067a224fd167e43736a5a071df", + "reference": "4f77e7cc79eb0a067a224fd167e43736a5a071df", "shasum": "" }, "require": { @@ -17328,9 +17226,9 @@ ], "description": "Traits for testing Drupal sites that have user content (versus unpopulated sites).", "support": { - "source": "https://git.drupalcode.org/project/dtt/-/tree/2.5.0" + "source": "https://git.drupalcode.org/project/dtt/-/tree/2.6.0" }, - "time": "2024-10-30T23:28:39+00:00" + "time": "2025-07-07T02:18:46+00:00" } ], "aliases": [], @@ -17346,7 +17244,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.3", + "php": "^8.4", "ext-curl": "*", "ext-dom": "*", "ext-intl": "*", diff --git a/composer.patches.json b/composer.patches.json index fa4a41297..dbb2c72b0 100644 --- a/composer.patches.json +++ b/composer.patches.json @@ -34,6 +34,21 @@ }, "drupal/rollbar": { "d.o. #3432364": "patches/3432364-rollbar-vars.patch" + }, + "drupal/google_tag": { + "PHP 8.4 nullable parameter compatibility": "patches/google_tag-php84-nullable-params.patch" + }, + "consolidation/config": { + "PHP 8.4 nullable parameter compatibility": "patches/consolidation_config-php84-nullable-params.patch" + }, + "consolidation/robo": { + "PHP 8.4 nullable parameter compatibility": "patches/consolidation_robo-php84-nullable-params.patch" + }, + "drupal/drupal_test_assertions": { + "PHP 8.4 nullable parameter compatibility": "patches/drupal_test_assertions-php84-nullable-params.patch" + }, + "drupal/pathauto": { + "PHP 8.4 nullable parameter compatibility": "patches/pathauto-php84-nullable-params.patch" } } } diff --git a/pantheon.yml b/pantheon.yml index 5fc595c10..c812f6402 100644 --- a/pantheon.yml +++ b/pantheon.yml @@ -1,5 +1,5 @@ api_version: 1 web_docroot: true build_step: false -php_version: 8.3 +php_version: 8.4 drush_version: 10 diff --git a/pantheon_template/pantheon.yml b/pantheon_template/pantheon.yml index f780cfe58..c8f5b1c1d 100644 --- a/pantheon_template/pantheon.yml +++ b/pantheon_template/pantheon.yml @@ -1,7 +1,7 @@ api_version: 1 web_docroot: true build_step: false -php_version: 8.3 +php_version: 8.4 enforce_https: transitional search: version: 8 diff --git a/patches/consolidation_config-php84-nullable-params.patch b/patches/consolidation_config-php84-nullable-params.patch new file mode 100644 index 000000000..48c5798da --- /dev/null +++ b/patches/consolidation_config-php84-nullable-params.patch @@ -0,0 +1,13 @@ +diff --git a/src/Config.php b/src/Config.php +index 1234567..abcdefg 100644 +--- a/src/Config.php ++++ b/src/Config.php +@@ -30,7 +30,7 @@ class Config implements ConfigInterface + * @param array $data + * Config data to store. + */ +- public function __construct(array $data = null) ++ public function __construct(?array $data = null) + { + $this->config = new Data($data ?: []); + $this->setDefaults(new Data()); \ No newline at end of file diff --git a/patches/consolidation_robo-php84-nullable-params.patch b/patches/consolidation_robo-php84-nullable-params.patch new file mode 100644 index 000000000..ed1af6504 --- /dev/null +++ b/patches/consolidation_robo-php84-nullable-params.patch @@ -0,0 +1,27 @@ +diff --git a/src/Common/IO.php b/src/Common/IO.php +index 1234567..abcdefg 100644 +--- a/src/Common/IO.php ++++ b/src/Common/IO.php +@@ -45,7 +45,7 @@ trait IO + } + + // This should typically only be called by State::restore() +- public function restoreState(InputInterface $input = null, OutputInterface $output = null, SymfonyStyle $io = null) ++ public function restoreState(?InputInterface $input = null, ?OutputInterface $output = null, ?SymfonyStyle $io = null) + { + $this->setInput($input); + $this->setOutput($output); + +diff --git a/src/Collection/CompletionWrapper.php b/src/Collection/CompletionWrapper.php +index 2345678..bcdefgh 100644 +--- a/src/Collection/CompletionWrapper.php ++++ b/src/Collection/CompletionWrapper.php +@@ -54,7 +54,7 @@ class CompletionWrapper implements TaskInterface + * + * @param \Robo\Contract\TaskInterface|null $rollbackTask + */ +- public function __construct(Collection $collection, TaskInterface $task, TaskInterface $rollbackTask = null) ++ public function __construct(Collection $collection, TaskInterface $task, ?TaskInterface $rollbackTask = null) + { + $this->collection = $collection; + $this->task = ($task instanceof WrappedTaskInterface) ? $task->original() : $task; \ No newline at end of file diff --git a/patches/drupal_test_assertions-php84-nullable-params.patch b/patches/drupal_test_assertions-php84-nullable-params.patch new file mode 100644 index 000000000..af876083a --- /dev/null +++ b/patches/drupal_test_assertions-php84-nullable-params.patch @@ -0,0 +1,13 @@ +diff --git a/tests/src/Assertions/EntityTrait.php b/tests/src/Assertions/EntityTrait.php +index 1234567..abcdefg 100644 +--- a/tests/src/Assertions/EntityTrait.php ++++ b/tests/src/Assertions/EntityTrait.php +@@ -10,7 +10,7 @@ trait EntityTrait { + /** + * Asserts an entity with a specific bundle exists. + */ +- public function assertEntityExists(string $entity_type, string $bundle = NULL) { ++ public function assertEntityExists(string $entity_type, ?string $bundle = NULL) { + $bundles = \Drupal::service('entity_type.bundle.info')->getBundleInfo($entity_type); + + $bundle = $bundle ?? $entity_type; \ No newline at end of file diff --git a/patches/google_tag-php84-nullable-params.patch b/patches/google_tag-php84-nullable-params.patch new file mode 100644 index 000000000..58b41845f --- /dev/null +++ b/patches/google_tag-php84-nullable-params.patch @@ -0,0 +1,13 @@ +diff --git a/src/Entity/TagContainer.php b/src/Entity/TagContainer.php +index 1234567..abcdefg 100644 +--- a/src/Entity/TagContainer.php ++++ b/src/Entity/TagContainer.php +@@ -185,7 +185,7 @@ class TagContainer extends ConfigEntityBase implements TagContainerInterface { + * @return array + * Gtm settings. + */ +- public function getGtmSettings(string $gtmid = NULL): array { ++ public function getGtmSettings(?string $gtmid = NULL): array { + // Choose first gtmID if none was supplied. + $gtmid = $gtmid ?? $this->getGtmId(); + \ No newline at end of file diff --git a/patches/pathauto-php84-nullable-params.patch b/patches/pathauto-php84-nullable-params.patch new file mode 100644 index 000000000..1c81696b0 --- /dev/null +++ b/patches/pathauto-php84-nullable-params.patch @@ -0,0 +1,26 @@ +diff --git a/src/AliasStorageHelper.php b/src/AliasStorageHelper.php +index 1234567..abcdefg 100644 +--- a/src/AliasStorageHelper.php ++++ b/src/AliasStorageHelper.php +@@ -76,7 +76,7 @@ class AliasStorageHelper implements AliasStorageHelperInterface { + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manger. + */ +- public function __construct(ConfigFactoryInterface $config_factory, AliasRepositoryInterface $alias_repository, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation, EntityTypeManagerInterface $entity_type_manager = NULL) { ++ public function __construct(ConfigFactoryInterface $config_factory, AliasRepositoryInterface $alias_repository, Connection $database, MessengerInterface $messenger, TranslationInterface $string_translation, ?EntityTypeManagerInterface $entity_type_manager = NULL) { + $this->configFactory = $config_factory; + $this->aliasRepository = $alias_repository; + $this->database = $database; +diff --git a/src/PathautoGenerator.php b/src/PathautoGenerator.php +index 2345678..bcdefgh 100644 +--- a/src/PathautoGenerator.php ++++ b/src/PathautoGenerator.php +@@ -136,7 +136,7 @@ class PathautoGenerator implements PathautoGeneratorInterface { + * @param \Drupal\pathauto\AliasTypeManager $alias_type_manager + * Manages pathauto alias type plugins. + */ +- public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, Token $token, AliasCleanerInterface $alias_cleaner, AliasStorageHelperInterface $alias_storage_helper, AliasUniquifierInterface $alias_uniquifier, MessengerInterface $pathauto_messenger, TranslationInterface $string_translation, TokenEntityMapperInterface $token_entity_mapper, EntityTypeManagerInterface $entity_type_manager, AliasTypeManager $alias_type_manager = NULL) { ++ public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, Token $token, AliasCleanerInterface $alias_cleaner, AliasStorageHelperInterface $alias_storage_helper, AliasUniquifierInterface $alias_uniquifier, MessengerInterface $pathauto_messenger, TranslationInterface $string_translation, TokenEntityMapperInterface $token_entity_mapper, EntityTypeManagerInterface $entity_type_manager, ?AliasTypeManager $alias_type_manager = NULL) { + $this->configFactory = $config_factory; + $this->moduleHandler = $module_handler; + $this->token = $token; \ No newline at end of file diff --git a/patches/webform-php84-nullable-params.patch b/patches/webform-php84-nullable-params.patch new file mode 100644 index 000000000..750e7ec8e --- /dev/null +++ b/patches/webform-php84-nullable-params.patch @@ -0,0 +1,284 @@ +diff --git a/includes/webform.date.inc b/includes/webform.date.inc +index 1234567..abcdefg 100644 +--- a/includes/webform.date.inc ++++ b/includes/webform.date.inc +@@ -38,7 +38,7 @@ use Drupal\webform\Plugin\WebformElement\DateTime; + * + * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare + */ +-function _webform_datetime_date(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) { ++function _webform_datetime_date(array &$element, FormStateInterface $form_state, ?DrupalDateTime $date = NULL) { + DateTime::dateCallback($element, $form_state, $date); + } + +@@ -54,7 +54,7 @@ function _webform_datetime_date(array &$element, FormStateInterface $form_state + * + * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare + */ +-function _webform_datetime_time(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) { ++function _webform_datetime_time(array &$element, FormStateInterface $form_state, ?DrupalDateTime $date = NULL) { + DateTime::timeCallback($element, $form_state, $date); + } + +diff --git a/src/WebformEntityReferenceManager.php b/src/WebformEntityReferenceManager.php +index 2345678..bcdefgh 100644 +--- a/src/WebformEntityReferenceManager.php ++++ b/src/WebformEntityReferenceManager.php +@@ -87,7 +87,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + */ +- public function __construct(RouteMatchInterface $route_match, AccountInterface $current_user, UserDataInterface $user_data, ModuleHandlerInterface $module_handler = NULL, EntityTypeManagerInterface $entity_type_manager = NULL) { ++ public function __construct(RouteMatchInterface $route_match, AccountInterface $current_user, UserDataInterface $user_data, ?ModuleHandlerInterface $module_handler = NULL, ?EntityTypeManagerInterface $entity_type_manager = NULL) { + $this->routeMatch = $route_match; + $this->currentUser = $current_user; + $this->userData = $user_data; +@@ -166,7 +166,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + /** + * {@inheritdoc} + */ +- public function hasField(EntityInterface $entity = NULL) { ++ public function hasField(?EntityInterface $entity = NULL) { + return $this->getFieldName($entity) ? TRUE : FALSE; + } + +@@ -173,7 +173,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + /** + * {@inheritdoc} + */ +- public function getFieldName(EntityInterface $entity = NULL) { ++ public function getFieldName(?EntityInterface $entity = NULL) { + $field_names = $this->getFieldNames($entity); + return $field_names ? reset($field_names) : FALSE; + } +@@ -181,7 +181,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + /** + * {@inheritdoc} + */ +- public function getFieldNames(EntityInterface $entity = NULL) { ++ public function getFieldNames(?EntityInterface $entity = NULL) { + if (!$entity) { + $route_name = $this->routeMatch->getRouteName(); + if (strpos($route_name, 'entity.') !== 0) { +@@ -212,7 +212,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + /** + * {@inheritdoc} + */ +- public function getWebform(EntityInterface $entity = NULL) { ++ public function getWebform(?EntityInterface $entity = NULL) { + $field_name = $this->getFieldName($entity); + if (!$field_name) { + return NULL; +@@ -227,7 +227,7 @@ class WebformEntityReferenceManager implements WebformEntityReferenceManagerInt + /** + * {@inheritdoc} + */ +- public function getWebforms(EntityInterface $entity = NULL) { ++ public function getWebforms(?EntityInterface $entity = NULL) { + $field_names = $this->getFieldNames($entity); + if (!$field_names) { + return []; + +diff --git a/src/WebformEntityReferenceManagerInterface.php b/src/WebformEntityReferenceManagerInterface.php +index 3456789..cdefghi 100644 +--- a/src/WebformEntityReferenceManagerInterface.php ++++ b/src/WebformEntityReferenceManagerInterface.php +@@ -67,7 +67,7 @@ interface WebformEntityReferenceManagerInterface { + * @return bool + * TRUE if the entity has a webform entity reference field. + */ +- public function hasField(EntityInterface $entity = NULL); ++ public function hasField(?EntityInterface $entity = NULL); + + /** + * Get an entity's webform field name. +@@ -78,7 +78,7 @@ interface WebformEntityReferenceManagerInterface { + * @return string + * The name of the webform field or an empty string. + */ +- public function getFieldName(EntityInterface $entity = NULL); ++ public function getFieldName(?EntityInterface $entity = NULL); + + /** + * Get an entity's webform field names. +@@ -89,7 +89,7 @@ interface WebformEntityReferenceManagerInterface { + * @return array + * An array of webform field names. + */ +- public function getFieldNames(EntityInterface $entity = NULL); ++ public function getFieldNames(?EntityInterface $entity = NULL); + + /** + * Get an entity's webform. +@@ -100,7 +100,7 @@ interface WebformEntityReferenceManagerInterface { + * @return \Drupal\webform\WebformInterface|null + * A webform or NULL if the entity does not have a webform field. + */ +- public function getWebform(EntityInterface $entity = NULL); ++ public function getWebform(?EntityInterface $entity = NULL); + + /** + * Get an entity's webforms. +@@ -111,7 +111,7 @@ interface WebformEntityReferenceManagerInterface { + * @return \Drupal\webform\WebformInterface[] + * An array of webforms. + */ +- public function getWebforms(EntityInterface $entity = NULL); ++ public function getWebforms(?EntityInterface $entity = NULL); + +diff --git a/src/WebformRequest.php b/src/WebformRequest.php +index 4567890..defghij 100644 +--- a/src/WebformRequest.php ++++ b/src/WebformRequest.php +@@ -226,7 +226,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function getUrl(EntityInterface $webform_entity, EntityInterface $source_entity = NULL, $route_name, array $route_options = []) { ++ public function getUrl(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL, $route_name, array $route_options = []) { + $route_name = $this->getRouteName($webform_entity, $source_entity, $route_name); + $route_parameters = $this->getRouteParameters($webform_entity, $source_entity); + return Url::fromRoute($route_name, $route_parameters, $route_options); +@@ -235,7 +235,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function getRouteName(EntityInterface $webform_entity, EntityInterface $source_entity = NULL, $route_name) { ++ public function getRouteName(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL, $route_name) { + if (!$this->hasSourceEntityWebformRoutes($source_entity)) { + return $route_name; + } +@@ -246,7 +246,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function getRouteParameters(EntityInterface $webform_entity, EntityInterface $source_entity = NULL) { ++ public function getRouteParameters(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL) { + $route_parameters = ['webform' => $webform_entity->id()]; + if ($source_entity && $this->hasSourceEntityWebformRoutes($source_entity)) { + $route_parameters[$source_entity->getEntityTypeId()] = $source_entity->id(); +@@ -276,7 +276,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function getBaseRouteName(EntityInterface $webform_entity, EntityInterface $source_entity = NULL) { ++ public function getBaseRouteName(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL) { + if ($this->hasSourceEntityWebformRoutes($source_entity)) { + return 'entity.' . $source_entity->getEntityTypeId() . '.webform'; + } +@@ -298,7 +298,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function hasSourceEntityWebformRoutes(EntityInterface $source_entity = NULL) { ++ public function hasSourceEntityWebformRoutes(?EntityInterface $source_entity = NULL) { + return ($this->isValidSourceEntity($source_entity) + && $this->webformEntityReferenceManager->hasField($source_entity)); + } +@@ -310,7 +310,7 @@ class WebformRequest implements WebformRequestInterface { + /** + * {@inheritdoc} + */ +- public function isValidSourceEntity(EntityInterface $source_entity = NULL) { ++ public function isValidSourceEntity(?EntityInterface $source_entity = NULL) { + return ($source_entity && method_exists($source_entity, 'hasField')); + } + +diff --git a/src/WebformRequestInterface.php b/src/WebformRequestInterface.php +index 5678901..efghijk 100644 +--- a/src/WebformRequestInterface.php ++++ b/src/WebformRequestInterface.php +@@ -111,7 +111,7 @@ interface WebformRequestInterface { + * @return \Drupal\Core\Url + * A URL object. + */ +- public function getUrl(EntityInterface $webform_entity, EntityInterface $source_entity = NULL, $route_name, array $route_options = []); ++ public function getUrl(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL, $route_name, array $route_options = []); + + /** + * Get a webform's route name. +@@ -127,7 +127,7 @@ interface WebformRequestInterface { + * @return string + * The webform's route name. + */ +- public function getRouteName(EntityInterface $webform_entity, EntityInterface $source_entity = NULL, $route_name); ++ public function getRouteName(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL, $route_name); + + /** + * Get a webform's route parameters. +@@ -140,7 +140,7 @@ interface WebformRequestInterface { + * @return array + * An associative array of route parameters. + */ +- public function getRouteParameters(EntityInterface $webform_entity, EntityInterface $source_entity = NULL); ++ public function getRouteParameters(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL); + + /** + * Get a webform's base route name. +@@ -154,7 +154,7 @@ interface WebformRequestInterface { + * @return string + * The webform's base route name. + */ +- public function getBaseRouteName(EntityInterface $webform_entity, EntityInterface $source_entity = NULL); ++ public function getBaseRouteName(EntityInterface $webform_entity, ?EntityInterface $source_entity = NULL); + + /** + * Check if source entity has webform routes. +@@ -165,7 +165,7 @@ interface WebformRequestInterface { + * @return bool + * TRUE if the source entity has webform routes. + */ +- public function hasSourceEntityWebformRoutes(EntityInterface $source_entity = NULL); ++ public function hasSourceEntityWebformRoutes(?EntityInterface $source_entity = NULL); + + /** + * Check that source entity is valid. +@@ -178,7 +178,7 @@ interface WebformRequestInterface { + * @return bool + * TRUE if the source entity is valid. + */ +- public function isValidSourceEntity(EntityInterface $source_entity = NULL); ++ public function isValidSourceEntity(?EntityInterface $source_entity = NULL); + +diff --git a/webform.tokens.inc b/webform.tokens.inc +index 6789012..fghijkl 100644 +--- a/webform.tokens.inc ++++ b/webform.tokens.inc +@@ -1186,7 +1186,7 @@ function _webform_token_format_date($date) { + * @return string + * Formatted interval wait time. + */ +-function _webform_token_get_interval_wait($interval_setting, BubbleableMetadata $bubbleable_metadata, WebformInterface $webform = NULL, EntityInterface $source_entity = NULL, AccountInterface $account = NULL) { ++function _webform_token_get_interval_wait($interval_setting, BubbleableMetadata $bubbleable_metadata, ?WebformInterface $webform = NULL, ?EntityInterface $source_entity = NULL, ?AccountInterface $account = NULL) { + // Get last submission completed time. + /** @var \Drupal\webform\WebformSubmissionStorageInterface $submission_storage */ + $submission_storage = \Drupal::entityTypeManager()->getStorage('webform_submission'); + +diff --git a/modules/webform_ui/src/PathProcessor/WebformUiPathProcessor.php b/modules/webform_ui/src/PathProcessor/WebformUiPathProcessor.php +index 7890123..ghijklm 100644 +--- a/modules/webform_ui/src/PathProcessor/WebformUiPathProcessor.php ++++ b/modules/webform_ui/src/PathProcessor/WebformUiPathProcessor.php +@@ -14,7 +14,7 @@ class WebformUiPathProcessor implements OutboundPathProcessorInterface { + /** + * {@inheritdoc} + */ +- public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { ++ public function processOutbound($path, &$options = [], ?Request $request = NULL, ?BubbleableMetadata $bubbleable_metadata = NULL) { + + $is_webform_path = (!empty($path) && str_contains($path, '/webform/')); + $has_query_string = (!empty($request) && !empty($request->getQueryString())); + +diff --git a/src/Twig/WebformTwigExtension.php b/src/Twig/WebformTwigExtension.php +index 8901234..hijklmn 100644 +--- a/src/Twig/WebformTwigExtension.php ++++ b/src/Twig/WebformTwigExtension.php +@@ -106,7 +106,7 @@ class WebformTwigExtension extends AbstractExtension { + * + * @see \Drupal\Core\Utility\Token::replace + */ +- public function webformToken($token, EntityInterface $entity = NULL, array $data = [], array $options = NULL) { ++ public function webformToken($token, ?EntityInterface $entity = NULL, array $data = [], ?array $options = NULL) { + $options = $options ?: []; + + // Allow the webform_token function to be tested during validation without + \ No newline at end of file