From 66496c6fe1b7dec00435102808e13ea5c8d05400 Mon Sep 17 00:00:00 2001 From: Jake Bapple <166155028+JakeBapple@users.noreply.github.com> Date: Tue, 3 Sep 2024 10:32:17 -0500 Subject: [PATCH] VACMS-18703: Updating core to 10.3.2. (#18956) * 18703-update-drupal-core-to-v1031: Updating core and rerolling patches for v1032. * 18703-update-drupal-core-to-v1031: Updating ECA contrib module to apply to 1032. * 18703-update-drupal-core-to-v1031: Pushing twig_tweak, animated_gif, and monolog module updates. * VACMS-18703: Resolves ECA action error after upgrading to ECA 2.x. * 18703-update-drupal-core-to-v1031: Fixing hash conflict. * VACMS-18703: fix for datadogprocessor error * 180703-update-drupal-core-to-v1031: Resolving lock file conflicts. * VACMS-18703: fix for phpunit tests * VACMS-18703: fix for change to /user/logout route for cypress test * VACMS-18703: Fix for ViewsResultCondition ECA Condition plugin. * 18703-update-core-to-v1031: Fixing lockfile conflict. * 18703-update-drupal-core-to-v1031: Fixing composer conflict. --------- Co-authored-by: Daniel Sasser Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> --- composer.json | 17 +- composer.lock | 532 +++++++++--------- .../Logger/Processor/DatadogApmProcessor.php | 3 +- .../Plugin/Action/CreateAdvancedQueueJob.php | 78 +-- .../ECA/Condition/ViewsResultCondition.php | 56 +- docroot/sites/default/default.services.yml | 9 + docroot/sites/default/default.settings.php | 33 +- docroot/sites/default/settings.php | 3 + docroot/sites/development.services.yml | 10 + docroot/sites/example.sites.php | 2 +- .../2893933-queue_lease_time-11.x-75.patch | 359 ++++++++++++ patches/2942404-65-11.x.patch | 218 +++++++ ...onfigurable-pager-heading-default-h2.patch | 76 ++- patches/text_module-3229493-12.patch | 51 ++ tests/cypress/support/commands.js | 1 + .../FrontendBuild/BuildMetricsTest.php | 15 +- .../FrontendBuild/BuildRequesterTest.php | 13 + .../FrontendBuild/BuildSchedulerTest.php | 15 +- .../BuildStateEventSubscriberTest.php | 15 +- .../FrontendBuild/ReleaseStateManagerTest.php | 14 +- tests/phpunit/Support/Mock/SpecifiedTime.php | 2 +- .../FrontendVersion/FrontendVersionTest.php | 32 +- 22 files changed, 1076 insertions(+), 478 deletions(-) create mode 100644 patches/2893933-queue_lease_time-11.x-75.patch create mode 100644 patches/2942404-65-11.x.patch create mode 100644 patches/text_module-3229493-12.patch diff --git a/composer.json b/composer.json index 31441e1059..4e1965da5d 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ "drupal/advancedqueue": "^1.0@RC", "drupal/allow_only_one": "1.0.2", "drupal/allowed_formats": "^3.0", - "drupal/animated_gif": "^2.0", + "drupal/animated_gif": "^2.1", "drupal/auto_entitylabel": "^3.2", "drupal/better_exposed_filters": "^6.0", "drupal/cer": "^5.0@beta", @@ -60,7 +60,7 @@ "drupal/dropzonejs": "^2.0", "drupal/dynamic_entity_reference": "^3.0", "drupal/easy_breadcrumb": "^2.0", - "drupal/eca": "^1.1", + "drupal/eca": "^2.0", "drupal/eca_cm": "^1.0", "drupal/embed": "^1.3", "drupal/entity_block": "^1.0@beta", @@ -136,7 +136,7 @@ "drupal/migrate_tools": "^6.0", "drupal/migration_tools": "^2.8", "drupal/mimemail": "^1.0@alpha", - "drupal/monolog": "^2.0", + "drupal/monolog": "^3.0", "drupal/next": "^1.1", "drupal/no_table_drag": "^2.0@alpha", "drupal/node_link_report": "^1.14", @@ -183,7 +183,7 @@ "drupal/textfield_counter": "^2.3", "drupal/tmgmt": "^1.14", "drupal/toolbar_menu": "^3.0", - "drupal/twig_tweak": "3.3", + "drupal/twig_tweak": "^3.4", "drupal/tzfield": "^1.7", "drupal/upgrade_status": "^4.0", "drupal/user_history": "^1.0@alpha", @@ -381,9 +381,9 @@ }, "drupal/core": { "3057267 - User logout during maintenance mode": "https://www.drupal.org/files/issues/2023-01-31/3057267-maintenance-forced-logout-experimental.patch", - "2893933 - claimItem in the database and memory queues does not use expire correctly": "https://www.drupal.org/files/issues/2023-06-26/2893933-queue_lease_time-11.x-67.patch", + "2893933 - claimItem in the database and memory queues does not use expire correctly": "https://www.drupal.org/files/issues/2024-08-12/2893933-queue_lease_time-11.x-75.patch", "3025164 - Make moderation_state available to field queries": "https://www.drupal.org/files/issues/2020-09-25/3025164-28.patch", - "3229493 - TextareaWidget::errorElement() does not consult violation property path.": "https://www.drupal.org/files/issues/2023-01-18/text_module-3229493-6.patch", + "3229493 - TextareaWidget::errorElement() does not consult violation property path.": "https://www.drupal.org/files/issues/2024-08-13/text_module-3229493-12.patch", "3027240 - Undefined index: #parents FormState.php": "https://www.drupal.org/files/issues/2019-01-21/form_system-undefined_index-3027240-2.patch", "2915792 - MenuLinkContentAccessControlHandler does not allow \"view\" access without admin permission": "patches/drupal-core-menu-link-perm-mr-339.patch", "2421145 - Text format wrapper does not take description_display into account": "https://www.drupal.org/files/issues/2021-12-03/2421445-18_0.patch", @@ -392,8 +392,7 @@ "2775665 - MenuLinkContent updateLink function generates a PHP Warning for override-able keys that are not present in the loaded entity": "https://www.drupal.org/files/issues/2021-09-17/updateLink-2775665-14.patch", "Claro claro_preprocess_input()": "patches/drupal-core-claro_preprocess_input.patch", "1156338 - Fixed maximum number of field values, but use «add more» similar to when cardinality «unlimited» is used": "https://www.drupal.org/files/issues/2024-02-09/1156338-33.patch", - "2942404 - Contentinfo landmark" : "https://www.drupal.org/files/issues/2023-06-30/2942404-messages-should-have-role-status.patch", - "3047110 - Add workflow to taxonomy" : "https://www.drupal.org/files/issues/2023-04-14/3047110-45.patch", + "2942404 - Contentinfo landmark": "https://www.drupal.org/files/issues/2024-08-13/2942404-65-11.x.patch", "3106205 - Length of menu_tree.url and menu_tree.route_param_key are too short (255 characters)": "https://www.drupal.org/files/issues/2024-01-02/3106205-length-menu-tree-too-short-48.patch", "3333401 - Pager h4 cause accessibility flag on many pages": "patches/3333401-configurable-pager-heading-default-h2.patch", "3382759 - Add multiple workflow content moderation filter to Views.": "https://www.drupal.org/files/issues/2023-08-24/3382759-8.patch", @@ -468,7 +467,7 @@ "3210468 - The 'bundle' field is not always populated with the menu name": "https://www.drupal.org/files/issues/2021-04-23/3210468.patch" }, "drupal/migration_tools": { - "3366789 - Create convert to boolean process plugin": "https://www.drupal.org/files/issues/2023-06-20/add-convert-boolean-process_0.patch" + "3366789 - Create convert to boolean process plugin": "https://www.drupal.org/files/issues/2023-06-20/add-convert-boolean-process_0.patch" }, "drupal/openapi_jsonapi": { "3110109 - Support renamed resource types Part 1": "https://git.drupalcode.org/project/openapi_jsonapi/-/commit/17070f1ef70ff89f732619a11c29730107a2083e.patch", diff --git a/composer.lock b/composer.lock index 7feae1f53b..88af3f0846 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": "44c646fd5da64f0e8e4d0422a016e4ff", + "content-hash": "aed087c0f9602e0d0e1dc13058bc6e8d", "packages": [ { "name": "asm89/stack-cors", @@ -2852,26 +2852,26 @@ }, { "name": "drupal/animated_gif", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/animated_gif.git", - "reference": "2.0.6" + "reference": "2.1.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/animated_gif-2.0.6.zip", - "reference": "2.0.6", - "shasum": "4c75ef76f2e4a58a746296037b2aebf716e623a4" + "url": "https://ftp.drupal.org/files/projects/animated_gif-2.1.0.zip", + "reference": "2.1.0", + "shasum": "71b2fe28eba51a13230fcd504cc8528be847c6a6" }, "require": { - "drupal/core": "^10 || ^11" + "drupal/core": "^10.3 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.6", - "datestamp": "1718421937", + "version": "2.1.0", + "datestamp": "1719242202", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -4058,16 +4058,16 @@ }, { "name": "drupal/core", - "version": "10.2.6", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "cec9bc9e829e53e667da844edd5f4897be88d860" + "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/cec9bc9e829e53e667da844edd5f4897be88d860", - "reference": "cec9bc9e829e53e667da844edd5f4897be88d860", + "url": "https://api.github.com/repos/drupal/core/zipball/10e79c67a903844bef02a5cf10475d9a8b623e7a", + "reference": "10e79c67a903844bef02a5cf10475d9a8b623e7a", "shasum": "" }, "require": { @@ -4113,7 +4113,7 @@ "symfony/serializer": "^6.4", "symfony/validator": "^6.4", "symfony/yaml": "^6.4", - "twig/twig": "^3.5.0" + "twig/twig": "^3.9.3" }, "conflict": { "drush/drush": "<12.4.3" @@ -4206,7 +4206,8 @@ "lib/Drupal/Core/DrupalKernel.php", "lib/Drupal/Core/DrupalKernelInterface.php", "lib/Drupal/Core/Installer/InstallerRedirectTrait.php", - "lib/Drupal/Core/Site/Settings.php" + "lib/Drupal/Core/Site/Settings.php", + "lib/Drupal/Component/Datetime/Time.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4215,22 +4216,22 @@ ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { - "source": "https://github.com/drupal/core/tree/10.2.6" + "source": "https://github.com/drupal/core/tree/10.3.2" }, - "time": "2024-05-01T21:00:24+00:00" + "time": "2024-08-08T09:23:57+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "10.2.6", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "adc702b6ef38a0446abe90267acb96aa806995cf" + "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/adc702b6ef38a0446abe90267acb96aa806995cf", - "reference": "adc702b6ef38a0446abe90267acb96aa806995cf", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/a1a186caeb89899143e0c6912ccee9d3d7181dbe", + "reference": "a1a186caeb89899143e0c6912ccee9d3d7181dbe", "shasum": "" }, "require": { @@ -4265,80 +4266,80 @@ "drupal" ], "support": { - "source": "https://github.com/drupal/core-composer-scaffold/tree/10.2.6" + "source": "https://github.com/drupal/core-composer-scaffold/tree/10.3.2" }, - "time": "2024-04-09T07:27:23+00:00" + "time": "2024-05-11T08:21:39+00:00" }, { "name": "drupal/core-recommended", - "version": "10.2.6", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/drupal/core-recommended.git", - "reference": "6fbff9a26e06c047ec4a2313fc423a7a1c51c850" + "reference": "18b7288d2e661afadfff4a714c5a166bf2554124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-recommended/zipball/6fbff9a26e06c047ec4a2313fc423a7a1c51c850", - "reference": "6fbff9a26e06c047ec4a2313fc423a7a1c51c850", + "url": "https://api.github.com/repos/drupal/core-recommended/zipball/18b7288d2e661afadfff4a714c5a166bf2554124", + "reference": "18b7288d2e661afadfff4a714c5a166bf2554124", "shasum": "" }, "require": { "asm89/stack-cors": "~v2.2.0", "composer/semver": "~3.4.0", "doctrine/annotations": "~1.14.3", - "doctrine/deprecations": "~1.1.2", - "doctrine/lexer": "~2.1.0", - "drupal/core": "10.2.6", + "doctrine/deprecations": "~1.1.3", + "doctrine/lexer": "~2.1.1", + "drupal/core": "10.3.2", "egulias/email-validator": "~4.0.2", "guzzlehttp/guzzle": "~7.8.1", "guzzlehttp/promises": "~2.0.2", "guzzlehttp/psr7": "~2.6.2", - "masterminds/html5": "~2.8.1", - "mck89/peast": "~v1.15.4", - "pear/archive_tar": "~1.4.14", + "masterminds/html5": "~2.9.0", + "mck89/peast": "~v1.16.2", + "pear/archive_tar": "~1.5.0", "pear/console_getopt": "~v1.4.3", - "pear/pear-core-minimal": "~v1.10.14", + "pear/pear-core-minimal": "~v1.10.15", "pear/pear_exception": "~v1.0.2", "psr/cache": "~3.0.0", "psr/container": "~2.0.2", "psr/event-dispatcher": "~1.0.0", "psr/http-client": "~1.0.3", - "psr/http-factory": "~1.0.2", + "psr/http-factory": "~1.1.0", "psr/log": "~3.0.0", "ralouphie/getallheaders": "~3.0.3", - "sebastian/diff": "~4.0.5", - "symfony/console": "~v6.4.1", - "symfony/dependency-injection": "~v6.4.1", - "symfony/deprecation-contracts": "~v3.4.0", - "symfony/error-handler": "~v6.4.0", - "symfony/event-dispatcher": "~v6.4.0", - "symfony/event-dispatcher-contracts": "~v3.4.0", - "symfony/filesystem": "~v6.4.0", - "symfony/finder": "~v6.4.0", - "symfony/http-foundation": "~v6.4.0", - "symfony/http-kernel": "~v6.4.1", - "symfony/mailer": "~v6.4.0", - "symfony/mime": "~v6.4.0", - "symfony/polyfill-ctype": "~v1.28.0", - "symfony/polyfill-iconv": "~v1.28.0", - "symfony/polyfill-intl-grapheme": "~v1.28.0", - "symfony/polyfill-intl-idn": "~v1.28.0", - "symfony/polyfill-intl-normalizer": "~v1.28.0", - "symfony/polyfill-mbstring": "~v1.28.0", - "symfony/polyfill-php83": "~v1.28.0", - "symfony/process": "~v6.4.0", - "symfony/psr-http-message-bridge": "~v6.4.0", - "symfony/routing": "~v6.4.1", - "symfony/serializer": "~v6.4.1", - "symfony/service-contracts": "~v3.4.0", - "symfony/string": "~v6.4.0", - "symfony/translation-contracts": "~v3.4.0", - "symfony/validator": "~v6.4.0", - "symfony/var-dumper": "~v6.4.0", - "symfony/var-exporter": "~v6.4.1", - "symfony/yaml": "~v6.4.0", - "twig/twig": "~v3.8.0" + "sebastian/diff": "~4.0.6", + "symfony/console": "~v6.4.8", + "symfony/dependency-injection": "~v6.4.7", + "symfony/deprecation-contracts": "~v3.5.0", + "symfony/error-handler": "~v6.4.7", + "symfony/event-dispatcher": "~v6.4.7", + "symfony/event-dispatcher-contracts": "~v3.5.0", + "symfony/filesystem": "~v6.4.8", + "symfony/finder": "~v6.4.8", + "symfony/http-foundation": "~v6.4.7", + "symfony/http-kernel": "~v6.4.7", + "symfony/mailer": "~v6.4.7", + "symfony/mime": "~v6.4.7", + "symfony/polyfill-ctype": "~v1.29.0", + "symfony/polyfill-iconv": "~v1.29.0", + "symfony/polyfill-intl-grapheme": "~v1.29.0", + "symfony/polyfill-intl-idn": "~v1.29.0", + "symfony/polyfill-intl-normalizer": "~v1.29.0", + "symfony/polyfill-mbstring": "~v1.29.0", + "symfony/polyfill-php83": "~v1.29.0", + "symfony/process": "~v6.4.8", + "symfony/psr-http-message-bridge": "~v6.4.7", + "symfony/routing": "~v6.4.7", + "symfony/serializer": "~v6.4.7", + "symfony/service-contracts": "~v3.5.0", + "symfony/string": "~v6.4.8", + "symfony/translation-contracts": "~v3.5.0", + "symfony/validator": "~v6.4.7", + "symfony/var-dumper": "~v6.4.7", + "symfony/var-exporter": "~v6.4.7", + "symfony/yaml": "~v6.4.7", + "twig/twig": "~v3.10.2" }, "conflict": { "webflo/drupal-core-strict": "*" @@ -4350,9 +4351,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.2.6" + "source": "https://github.com/drupal/core-recommended/tree/10.3.2" }, - "time": "2024-05-01T21:00:24+00:00" + "time": "2024-08-08T09:23:57+00:00" }, { "name": "drupal/core_event_dispatcher", @@ -5334,52 +5335,43 @@ }, { "name": "drupal/eca", - "version": "1.1.8", + "version": "2.0.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/eca.git", - "reference": "1.1.8" + "reference": "2.0.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/eca-1.1.8.zip", - "reference": "1.1.8", - "shasum": "38cbed48899867f32893e4d7517dad09b109c90f" + "url": "https://ftp.drupal.org/files/projects/eca-2.0.1.zip", + "reference": "2.0.1", + "shasum": "0b283199a9a080a57f20f98d750126af453bc5fb" }, "require": { "dragonmantank/cron-expression": "^3.1", - "drupal/core": "^9.5 || ^10", + "drupal/core": "^10.3||^11", "ext-dom": "*", "ext-json": "*", "mtownsend/xml-to-array": "^2.0", - "php": ">=7.4" + "php": ">=8.1" }, "require-dev": { "drupal/eca_ui": "*", - "drupal/token": "^1.10" - }, - "suggest": { - "drupal/context_stack": "Integrates ECA with Context Stacks for more fine-grained control", - "drupal/eca_state_machine": "Integrates ECA with State Machine functionality", - "drupal/eca_tamper": "Integrates ECA with the Tamper API", - "drupal/entity_share": "Integrates ECA with Entity Share functionality", - "drupal/group_action": "Integrates ECA with Group Actions if you're using groups", - "drupal/token": "Provides the token browser in the UI and offers more token values" + "drupal/entity_reference_revisions": "1.x-dev", + "drupal/inline_entity_form": "dev-project-update-bot-only", + "drupal/paragraphs": "dev-3433816-manual-drupal-11", + "drupal/token": "1.x-dev", + "roave/security-advisories": "dev-latest" }, "type": "drupal-module", "extra": { "drupal": { - "version": "1.1.8", - "datestamp": "1721913734", + "version": "2.0.1", + "datestamp": "1722254503", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" } - }, - "drush": { - "services": { - "drush.services.yml": "^9 || ^10 || ^11" - } } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -7535,7 +7527,7 @@ "homepage": "https://www.drupal.org/user/612814" }, { - "name": "Kingdutch", + "name": "kingdutch", "homepage": "https://www.drupal.org/user/1868952" }, { @@ -10524,53 +10516,56 @@ }, { "name": "drupal/monolog", - "version": "2.2.0", + "version": "3.0.4", "source": { "type": "git", "url": "https://git.drupalcode.org/project/monolog.git", - "reference": "2.2.0" + "reference": "3.0.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/monolog-2.2.0.zip", - "reference": "2.2.0", - "shasum": "3f243ccfb19cb30c75637882e24b1d8acfdb2f9a" + "url": "https://ftp.drupal.org/files/projects/monolog-3.0.4.zip", + "reference": "3.0.4", + "shasum": "5e86b3598b826dca767c52bc7e63cb2c049212d3" }, "require": { - "drupal/core": "^8.8 || ^9 || ^10", - "monolog/monolog": "^2.8.0", - "php": "^7.4|^8" + "drupal/core": "^10 || ^11", + "monolog/monolog": "^3.2.0", + "php": "^8.1.0" + }, + "require-dev": { + "mglaman/phpstan-drupal": "^1.1", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-deprecation-rules": "*", + "phpstan/phpstan-strict-rules": "^1.5", + "previousnext/coding-standard": "^1.0" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.2.0", - "datestamp": "1662121628", + "version": "3.0.4", + "datestamp": "1723450250", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" } } }, - "autoload": { - "psr-0": { - "Drupal\\Monolog": "src/" - } - }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ "GPL-2.0" ], "authors": [ { - "name": "Chris Pliakas", + "name": "Luca Lusso", "homepage": "https://www.drupal.org/user/266779", - "email": "opensource@chrispliakas.com", + "email": "lussoluca@gmail.com", "role": "Project Lead" }, { "name": "See contributors", - "homepage": "http://drupal.org/node/1937716/committers", + "homepage": "https://drupal.org/node/1937716/committers", "role": "Developer" }, { @@ -10579,10 +10574,10 @@ } ], "description": "A Framework for integrating with the Monolog library.", - "homepage": "http://drupal.org/project/monolog", + "homepage": "https://drupal.org/project/monolog", "support": { "source": "https://git.drupalcode.org/project/monolog", - "issues": "http://drupal.org/project/issues/monolog" + "issues": "https://drupal.org/project/issues/monolog" } }, { @@ -13799,24 +13794,23 @@ }, { "name": "drupal/twig_tweak", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/twig_tweak.git", - "reference": "3.3.0" + "reference": "3.4.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/twig_tweak-3.3.0.zip", - "reference": "3.3.0", - "shasum": "a029ab1775b62f08e573e5ad1ab27bc833e7f5b9" + "url": "https://ftp.drupal.org/files/projects/twig_tweak-3.4.0.zip", + "reference": "3.4.0", + "shasum": "1f47f71b4cfbad97fff11db1adc72c311bb1645e" }, "require": { - "drupal/core": "^9.3 || ^10.0", + "drupal/core": "^10.3 || ^11.0", "ext-json": "*", - "php": ">=7.3", - "symfony/polyfill-php80": "^1.17", - "twig/twig": "^2.15.3 || ^3.4.3" + "php": ">=8.1", + "twig/twig": "^3.10.3" }, "suggest": { "symfony/var-dumper": "Better dump() function for debugging Twig variables" @@ -13824,8 +13818,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.3.0", - "datestamp": "1708670116", + "version": "3.4.0", + "datestamp": "1721562308", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -13833,7 +13827,7 @@ }, "drush": { "services": { - "drush.services.yml": "^9 || ^10 || ^11" + "drush.services.yml": "^10 || ^11" } } }, @@ -16884,16 +16878,16 @@ }, { "name": "masterminds/html5", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", "shasum": "" }, "require": { @@ -16901,7 +16895,7 @@ "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" }, "type": "library", "extra": { @@ -16945,22 +16939,22 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2024-03-31T07:05:07+00:00" }, { "name": "mck89/peast", - "version": "v1.15.4", + "version": "v1.16.3", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "1df4dc28a6b5bb7ab117ab073c1712256e954e18" + "reference": "645ec21b650bc2aced18285c85f220d22afc1430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/1df4dc28a6b5bb7ab117ab073c1712256e954e18", - "reference": "1df4dc28a6b5bb7ab117ab073c1712256e954e18", + "url": "https://api.github.com/repos/mck89/peast/zipball/645ec21b650bc2aced18285c85f220d22afc1430", + "reference": "645ec21b650bc2aced18285c85f220d22afc1430", "shasum": "" }, "require": { @@ -16973,7 +16967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15.4-dev" + "dev-master": "1.16.3-dev" } }, "autoload": { @@ -16994,9 +16988,9 @@ "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.15.4" + "source": "https://github.com/mck89/peast/tree/v1.16.3" }, - "time": "2023-08-12T08:29:29+00:00" + "time": "2024-07-23T14:00:32+00:00" }, { "name": "mglaman/phpstan-drupal", @@ -17308,42 +17302,41 @@ }, { "name": "monolog/monolog", - "version": "2.9.2", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2@dev", - "guzzlehttp/guzzle": "^7.4", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.5.17", + "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -17366,7 +17359,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -17394,7 +17387,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -17406,7 +17399,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:25:26+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", @@ -17833,16 +17826,16 @@ }, { "name": "pear/archive_tar", - "version": "1.4.14", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/pear/Archive_Tar.git", - "reference": "4d761c5334c790e45ef3245f0864b8955c562caa" + "reference": "b439c859564f5cbb0f64ad6002d0afe84a889602" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/4d761c5334c790e45ef3245f0864b8955c562caa", - "reference": "4d761c5334c790e45ef3245f0864b8955c562caa", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/b439c859564f5cbb0f64ad6002d0afe84a889602", + "reference": "b439c859564f5cbb0f64ad6002d0afe84a889602", "shasum": "" }, "require": { @@ -17873,7 +17866,7 @@ "./" ], "license": [ - "BSD-3-Clause" + "BSD-2-Clause" ], "authors": [ { @@ -17899,17 +17892,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", "source": "https://github.com/pear/Archive_Tar" }, - "funding": [ - { - "url": "https://github.com/mrook", - "type": "github" - }, - { - "url": "https://www.patreon.com/michielrook", - "type": "patreon" - } - ], - "time": "2021-07-20T13:53:39+00:00" + "time": "2024-03-16T16:21:40+00:00" }, { "name": "pear/console_getopt", @@ -20208,20 +20191,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -20245,7 +20228,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -20257,9 +20240,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -22810,16 +22793,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -22828,7 +22811,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -22857,7 +22840,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -22873,7 +22856,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/dom-crawler", @@ -23099,16 +23082,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "4e64b49bf370ade88e567de29465762e316e4224" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", - "reference": "4e64b49bf370ade88e567de29465762e316e4224", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -23118,7 +23101,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -23155,7 +23138,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -23171,7 +23154,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", @@ -24042,16 +24025,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -24065,9 +24048,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24104,7 +24084,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -24120,20 +24100,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1" + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6de50471469b8c9afc38164452ab2b6170ee71c1", - "reference": "6de50471469b8c9afc38164452ab2b6170ee71c1", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", + "reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "shasum": "" }, "require": { @@ -24147,9 +24127,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24187,7 +24164,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0" }, "funding": [ { @@ -24203,20 +24180,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -24227,9 +24204,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24268,7 +24242,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -24284,7 +24258,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-icu", @@ -24372,16 +24346,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", - "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "shasum": "" }, "require": { @@ -24394,9 +24368,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24439,7 +24410,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" }, "funding": [ { @@ -24455,20 +24426,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:30:37+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -24479,9 +24450,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24523,7 +24491,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -24539,20 +24507,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -24566,9 +24534,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24606,7 +24571,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -24622,7 +24587,7 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php72", @@ -24855,16 +24820,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { @@ -24873,9 +24838,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -24915,7 +24877,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" }, "funding": [ { @@ -24931,7 +24893,7 @@ "type": "tidelift" } ], - "time": "2023-08-16T06:22:46+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/process", @@ -25420,21 +25382,22 @@ }, { "name": "symfony/service-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", - "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -25442,7 +25405,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -25482,7 +25445,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -25498,7 +25461,7 @@ "type": "tidelift" } ], - "time": "2023-12-19T21:51:00+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", @@ -25588,16 +25551,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.4.2", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", - "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -25606,7 +25569,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -25646,7 +25609,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -25662,7 +25625,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", @@ -26220,30 +26183,37 @@ }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.10.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", + "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -26276,7 +26246,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.10.3" }, "funding": [ { @@ -26288,7 +26258,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-05-16T10:04:27+00:00" }, { "name": "va-gov/content-build", diff --git a/docroot/modules/custom/va_gov_backend/src/Logger/Processor/DatadogApmProcessor.php b/docroot/modules/custom/va_gov_backend/src/Logger/Processor/DatadogApmProcessor.php index 6aa119fc7b..8fabb3935d 100644 --- a/docroot/modules/custom/va_gov_backend/src/Logger/Processor/DatadogApmProcessor.php +++ b/docroot/modules/custom/va_gov_backend/src/Logger/Processor/DatadogApmProcessor.php @@ -3,6 +3,7 @@ namespace Drupal\va_gov_backend\Logger\Processor; use Drupal\va_gov_backend\Service\DatadogContextProviderInterface; +use Monolog\LogRecord; use Monolog\Processor\ProcessorInterface; /** @@ -100,7 +101,7 @@ public function shouldAlterRecord(array $record): bool { /** * {@inheritdoc} */ - public function __invoke(array $record): array { + public function __invoke(array|LogRecord $record): array { if (!$this->shouldAlterRecord($record)) { return $record; } diff --git a/docroot/modules/custom/va_gov_eca/src/Plugin/Action/CreateAdvancedQueueJob.php b/docroot/modules/custom/va_gov_eca/src/Plugin/Action/CreateAdvancedQueueJob.php index f9ef47a8b8..63a743943d 100644 --- a/docroot/modules/custom/va_gov_eca/src/Plugin/Action/CreateAdvancedQueueJob.php +++ b/docroot/modules/custom/va_gov_eca/src/Plugin/Action/CreateAdvancedQueueJob.php @@ -5,21 +5,15 @@ use Drupal\advancedqueue\Entity\Queue; use Drupal\advancedqueue\Job; use Drupal\advancedqueue\JobTypeManager; -use Drupal\Component\Datetime\TimeInterface; use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException; use Drupal\Component\Plugin\Exception\PluginNotFoundException; use Drupal\Core\Action\Attribute\Action; -use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Logger\LoggerChannelFactoryInterface; -use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; -use Drupal\eca\EcaState; -use Drupal\eca\Plugin\Action\ActionBase; use Drupal\eca\Plugin\Action\ConfigurableActionBase; use Drupal\eca\Plugin\DataType\DataTransferObject; use Drupal\eca\Service\YamlParser; -use Drupal\eca\Token\TokenInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Yaml\Exception\ParseException; @@ -53,73 +47,15 @@ class CreateAdvancedQueueJob extends ConfigurableActionBase { */ protected LoggerChannelFactoryInterface $loggerFactory; - /** - * Constructs a CreateAdvancedQueueJob object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin_id for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager - * The Entity Type Manager service. - * @param \Drupal\eca\Token\TokenInterface $token_services - * The ECA Token Services service. - * @param \Drupal\Core\Session\AccountProxyInterface $current_user - * The current user. - * @param \Drupal\Component\Datetime\TimeInterface $time - * The Time service. - * @param \Drupal\eca\EcaState $state - * The ECA state service. - * @param \Drupal\advancedqueue\JobTypeManager $job_type_manager - * The AdvancedQueue Job Type plugin manager. - * @param \Drupal\eca\Service\YamlParser $yaml_parser - * The ECA Yaml parser service. - * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory - * The Logger Channel Factory service. - */ - public function __construct( - array $configuration, - $plugin_id, - $plugin_definition, - EntityTypeManagerInterface $entity_type_manager, - TokenInterface $token_services, - AccountProxyInterface $current_user, - TimeInterface $time, - EcaState $state, - JobTypeManager $job_type_manager, - YamlParser $yaml_parser, - LoggerChannelFactoryInterface $logger_factory - ) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $token_services, $current_user, $time, $state); - $this->entityTypeManager = $entity_type_manager; - $this->tokenServices = $token_services; - $this->currentUser = $current_user; - $this->time = $time; - $this->state = $state; - $this->jobTypeManager = $job_type_manager; - $this->yamlParser = $yaml_parser; - $this->loggerFactory = $logger_factory; - } - /** * {@inheritdoc} */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): ActionBase { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('entity_type.manager'), - $container->get('eca.token_services'), - $container->get('current_user'), - $container->get('datetime.time'), - $container->get('eca.state'), - $container->get('plugin.manager.advancedqueue_job_type'), - $container->get('eca.service.yaml_parser'), - $container->get('logger.factory') - ); + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static { + $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition); + $instance->jobTypeManager = $container->get('plugin.manager.advancedqueue_job_type'); + $instance->yamlParser = $container->get('eca.service.yaml_parser'); + $instance->loggerFactory = $container->get('logger.factory'); + return $instance; } /** @@ -142,7 +78,7 @@ public function execute() { if ($this->configuration['queue']) { Queue::load($this->configuration['queue'])?->enqueueJob($job); } - $this->tokenServices->addTokenData($this->configuration['token_name'], DataTransferObject::create([$job])); + $this->tokenService->addTokenData($this->configuration['token_name'], DataTransferObject::create([$job])); } /** diff --git a/docroot/modules/custom/va_gov_eca/src/Plugin/ECA/Condition/ViewsResultCondition.php b/docroot/modules/custom/va_gov_eca/src/Plugin/ECA/Condition/ViewsResultCondition.php index fe5c5fc21a..df096ffb3a 100644 --- a/docroot/modules/custom/va_gov_eca/src/Plugin/ECA/Condition/ViewsResultCondition.php +++ b/docroot/modules/custom/va_gov_eca/src/Plugin/ECA/Condition/ViewsResultCondition.php @@ -2,20 +2,13 @@ namespace Drupal\va_gov_eca\Plugin\ECA\Condition; -use Drupal\Component\Datetime\TimeInterface; -use Drupal\Core\Entity\EntityTypeBundleInfoInterface; -use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Form\FormStateInterface; -use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Url; -use Drupal\eca\EcaState; use Drupal\eca\Plugin\ECA\Condition\ConditionBase; -use Drupal\eca\Token\TokenInterface; use Drupal\views\Views; use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\HttpFoundation\RequestStack; /** * Provides a Views result Condition plugin for ECA. @@ -35,54 +28,13 @@ class ViewsResultCondition extends ConditionBase { */ protected ModuleHandlerInterface $moduleHandler; - /** - * Constructs a new ViewsResultCondition. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin_id for the plugin instance. - * @param mixed $plugin_definition - * The plugin implementation definition. - * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager - * The Entity Type Manager service. - * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info - * The Entity Type Bundle Info service. - * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack - * The Request Stack service. - * @param \Drupal\eca\Token\TokenInterface $token_services - * The ECA Token service. - * @param \Drupal\Core\Session\AccountProxyInterface $current_user - * The Account Proxy service. - * @param \Drupal\Component\Datetime\TimeInterface $time - * The Time service. - * @param \Drupal\eca\EcaState $state - * The ECS State service. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The Drupal Module Handler service. - */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, RequestStack $request_stack, TokenInterface $token_services, AccountProxyInterface $current_user, TimeInterface $time, EcaState $state, ModuleHandlerInterface $module_handler) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $entity_type_bundle_info, $request_stack, $token_services, $current_user, $time, $state); - $this->moduleHandler = $module_handler; - } - /** * {@inheritdoc} */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): ConditionBase { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('entity_type.manager'), - $container->get('entity_type.bundle.info'), - $container->get('request_stack'), - $container->get('eca.token_services'), - $container->get('current_user'), - $container->get('datetime.time'), - $container->get('eca.state'), - $container->get('module_handler') - ); + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static { + $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition); + $instance->module_handler = $container->get('module_handler'); + return $instance; } /** diff --git a/docroot/sites/default/default.services.yml b/docroot/sites/default/default.services.yml index c4b964fc29..dacb3f7e9e 100644 --- a/docroot/sites/default/default.services.yml +++ b/docroot/sites/default/default.services.yml @@ -1,4 +1,8 @@ parameters: + # Toggles the super user access policy. If your website has at least one user + # with the Administrator role, it is advised to set this to false. This allows + # you to make user 1 a regular user, strengthening the security of your site. + security.enable_super_user: true session.storage.options: # Default ini options for sessions. # @@ -60,6 +64,11 @@ parameters: # \Drupal\Core\Session\SessionConfiguration::__construct() # @default 6 sid_bits_per_character: 6 + # By default, Drupal generates a session cookie name based on the full + # domain name. Set the name_suffix to a short random string to ensure this + # session cookie name is unique on different installations on the same + # domain and path (for example, when migrating from Drupal 7). + name_suffix: '' twig.config: # Twig debugging: # diff --git a/docroot/sites/default/default.settings.php b/docroot/sites/default/default.settings.php index 8819d64317..264597b163 100644 --- a/docroot/sites/default/default.settings.php +++ b/docroot/sites/default/default.settings.php @@ -77,7 +77,7 @@ * * @code * $databases['default']['default'] = [ - * 'database' => 'databasename', + * 'database' => 'database_name', * 'username' => 'sql_username', * 'password' => 'sql_password', * 'host' => 'localhost', @@ -193,7 +193,7 @@ * @code * $databases['default']['default'] = [ * 'driver' => 'pgsql', - * 'database' => 'databasename', + * 'database' => 'database_name', * 'username' => 'sql_username', * 'password' => 'sql_password', * 'host' => 'localhost', @@ -215,7 +215,7 @@ * 'driver' => 'my_driver', * 'namespace' => 'Drupal\my_module\Driver\Database\my_driver', * 'autoload' => 'modules/my_module/src/Driver/Database/my_driver/', - * 'database' => 'databasename', + * 'database' => 'database_name', * 'username' => 'sql_username', * 'password' => 'sql_password', * 'host' => 'localhost', @@ -230,7 +230,7 @@ * 'driver' => 'my_driver', * 'namespace' => 'Drupal\my_module\Driver\Database\my_driver', * 'autoload' => 'modules/my_module/src/Driver/Database/my_driver/', - * 'database' => 'databasename', + * 'database' => 'database_name', * 'username' => 'sql_username', * 'password' => 'sql_password', * 'host' => 'localhost', @@ -355,14 +355,13 @@ * security, or encryption benefits. In an environment where Drupal * is behind a reverse proxy, the real IP address of the client should * be determined such that the correct client IP address is available - * to Drupal's logging, statistics, and access management systems. In - * the most simple scenario, the proxy server will add an - * X-Forwarded-For header to the request that contains the client IP - * address. However, HTTP headers are vulnerable to spoofing, where a - * malicious client could bypass restrictions by setting the - * X-Forwarded-For header directly. Therefore, Drupal's proxy - * configuration requires the IP addresses of all remote proxies to be - * specified in $settings['reverse_proxy_addresses'] to work correctly. + * to Drupal's logging and access management systems. In the most simple + * scenario, the proxy server will add an X-Forwarded-For header to the request + * that contains the client IP address. However, HTTP headers are vulnerable to + * spoofing, where a malicious client could bypass restrictions by setting the + * X-Forwarded-For header directly. Therefore, Drupal's proxy configuration + * requires the IP addresses of all remote proxies to be specified in + * $settings['reverse_proxy_addresses'] to work correctly. * * Enable this setting to get Drupal to determine the client IP from the * X-Forwarded-For header. If you are unsure about this setting, do not have a @@ -808,6 +807,16 @@ */ $settings['entity_update_backup'] = TRUE; +/** + * State caching. + * + * State caching uses the cache collector pattern to cache all requested keys + * from the state API in a single cache entry, which can greatly reduce the + * amount of database queries. However, some sites may use state with a + * lot of dynamic keys which could result in a very large cache. + */ +$settings['state_cache'] = TRUE; + /** * Node migration type. * diff --git a/docroot/sites/default/settings.php b/docroot/sites/default/settings.php index 3d6b461e09..e8e6738b5b 100755 --- a/docroot/sites/default/settings.php +++ b/docroot/sites/default/settings.php @@ -297,3 +297,6 @@ // This is intended to prevent deadlocks in the course of normal operation. // @see https://www.drupal.org/project/drupal/issues/2733675 $databases['default']['default']['init_commands']['isolation_level'] = 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED'; + + +$settings['state_cache'] = TRUE; diff --git a/docroot/sites/development.services.yml b/docroot/sites/development.services.yml index d2857c66f8..c02d3ff941 100644 --- a/docroot/sites/development.services.yml +++ b/docroot/sites/development.services.yml @@ -1,7 +1,17 @@ # Local development services. # +# The development.services.yml file allows the developer to override +# container parameters for debugging. +# # To activate this feature, follow the instructions at the top of the # 'example.settings.local.php' file, which sits next to this file. +# +# Be aware that in Drupal's configuration system, all the files that +# provide container definitions are merged using a shallow merge approach +# within \Drupal\Core\DependencyInjection\YamlFileLoader. +# This means that if you want to override any value of a parameter, the +# whole parameter array needs to be copied from +# sites/default/default.services.yml or from core/core.services.yml file. parameters: http.response.debug_cacheability_headers: true services: diff --git a/docroot/sites/example.sites.php b/docroot/sites/example.sites.php index f84da04588..a1955a9db8 100644 --- a/docroot/sites/example.sites.php +++ b/docroot/sites/example.sites.php @@ -7,7 +7,7 @@ * Configuration file for multi-site support and directory aliasing feature. * * This file is required for multi-site support and also allows you to define a - * set of aliases that map hostnames, ports, and pathnames to configuration + * set of aliases that map host names, ports, and path names to configuration * directories in the sites directory. These aliases are loaded prior to * scanning for directories, and they are exempt from the normal discovery * rules. See default.settings.php to view how Drupal discovers the diff --git a/patches/2893933-queue_lease_time-11.x-75.patch b/patches/2893933-queue_lease_time-11.x-75.patch new file mode 100644 index 0000000000..285cdccf99 --- /dev/null +++ b/patches/2893933-queue_lease_time-11.x-75.patch @@ -0,0 +1,359 @@ +diff --git a/core/lib/Drupal/Core/Annotation/QueueWorker.php b/core/lib/Drupal/Core/Annotation/QueueWorker.php +index 4797d5f9bb..4103f096e3 100644 +--- a/core/lib/Drupal/Core/Annotation/QueueWorker.php ++++ b/core/lib/Drupal/Core/Annotation/QueueWorker.php +@@ -57,11 +57,15 @@ class QueueWorker extends Plugin { + * An optional associative array of settings for cron. + * + * @var array +- * The array has one key, time, which is set to the time Drupal cron should +- * spend on calling this worker in seconds. The default is set in ++ * The array has two keys: ++ * - time: how long Drupal cron should spend calling this worker in seconds ++ * - lease_time: length of the lease for a queue item in seconds ++ * ++ * The defaults are set in + * \Drupal\Core\Queue\QueueWorkerManager::processDefinition(). + * + * @see \Drupal\Core\Queue\QueueWorkerManager::processDefinition() ++ * @see \Drupal\Core\Queue\QueueInterface::claimItem() + */ + public $cron; + +diff --git a/core/lib/Drupal/Core/Cron.php b/core/lib/Drupal/Core/Cron.php +index 1463943415..75bf70a02e 100644 +--- a/core/lib/Drupal/Core/Cron.php ++++ b/core/lib/Drupal/Core/Cron.php +@@ -261,7 +261,7 @@ protected function processQueues() { + * If the queue was suspended. + */ + protected function processQueue(QueueInterface $queue, QueueWorkerInterface $worker) { +- $lease_time = $worker->getPluginDefinition()['cron']['time']; ++ $lease_time = $worker->getPluginDefinition()['cron']['lease_time']; + $end = $this->time->getCurrentTime() + $lease_time; + while ($this->time->getCurrentTime() < $end && ($item = $queue->claimItem($lease_time))) { + try { +diff --git a/core/lib/Drupal/Core/Queue/DatabaseQueue.php b/core/lib/Drupal/Core/Queue/DatabaseQueue.php +index 3e2ed4272e..a98607f78b 100644 +--- a/core/lib/Drupal/Core/Queue/DatabaseQueue.php ++++ b/core/lib/Drupal/Core/Queue/DatabaseQueue.php +@@ -114,13 +114,19 @@ public function numberOfItems() { + * {@inheritdoc} + */ + public function claimItem($lease_time = 30) { ++ if ($lease_time <= 0) { ++ throw new \InvalidArgumentException('The lease time should be a positive integer.'); ++ } + // Claim an item by updating its expire fields. If claim is not successful + // another thread may have claimed the item in the meantime. Therefore loop + // until an item is successfully claimed or we are reasonably sure there + // are no unclaimed items left. + while (TRUE) { + try { +- $item = $this->connection->queryRange('SELECT [data], [created], [item_id] FROM {' . static::TABLE_NAME . '} q WHERE [expire] = 0 AND [name] = :name ORDER BY [created], [item_id] ASC', 0, 1, [':name' => $this->name])->fetchObject(); ++ $item = $this->connection->queryRange('SELECT [data], [created], [item_id] FROM {' . static::TABLE_NAME . '} q WHERE (([expire] = 0) OR (:now > [expire])) AND [name] = :name ORDER BY [created], [item_id] ASC', 0, 1, [ ++ ':name' => $this->name, ++ ':now' => \Drupal::time()->getCurrentTime(), ++ ])->fetchObject(); + } + catch (\Exception $e) { + $this->catchException($e); +@@ -142,8 +148,7 @@ public function claimItem($lease_time = 30) { + ->fields([ + 'expire' => \Drupal::time()->getCurrentTime() + $lease_time, + ]) +- ->condition('item_id', $item->item_id) +- ->condition('expire', 0); ++ ->condition('item_id', $item->item_id); + // If there are affected rows, this update succeeded. + if ($update->execute()) { + $item->data = unserialize($item->data); +@@ -244,16 +249,6 @@ public function garbageCollection() { + ->condition('created', \Drupal::time()->getRequestTime() - 864000, '<') + ->condition('name', 'drupal_batch:%', 'LIKE') + ->execute(); +- +- // Reset expired items in the default queue implementation table. If that's +- // not used, this will simply be a no-op. +- $this->connection->update(static::TABLE_NAME) +- ->fields([ +- 'expire' => 0, +- ]) +- ->condition('expire', 0, '<>') +- ->condition('expire', \Drupal::time()->getRequestTime(), '<') +- ->execute(); + } + catch (\Exception $e) { + $this->catchException($e); +diff --git a/core/lib/Drupal/Core/Queue/Memory.php b/core/lib/Drupal/Core/Queue/Memory.php +index ba9d2494db..f666c2a3ac 100644 +--- a/core/lib/Drupal/Core/Queue/Memory.php ++++ b/core/lib/Drupal/Core/Queue/Memory.php +@@ -62,9 +62,13 @@ public function numberOfItems() { + * {@inheritdoc} + */ + public function claimItem($lease_time = 30) { ++ if ($lease_time <= 0) { ++ throw new \InvalidArgumentException('The lease time should be a positive integer.'); ++ } + foreach ($this->queue as $key => $item) { +- if ($item->expire == 0) { +- $item->expire = \Drupal::time()->getCurrentTime() + $lease_time; ++ $now = \Drupal::time()->getCurrentTime(); ++ if ($item->expire == 0 || $now > $item->expire) { ++ $item->expire = $now + $lease_time; + $this->queue[$key] = $item; + return $item; + } +diff --git a/core/lib/Drupal/Core/Queue/QueueWorkerManager.php b/core/lib/Drupal/Core/Queue/QueueWorkerManager.php +index 818231d3bf..cbd902e298 100644 +--- a/core/lib/Drupal/Core/Queue/QueueWorkerManager.php ++++ b/core/lib/Drupal/Core/Queue/QueueWorkerManager.php +@@ -50,6 +50,10 @@ public function processDefinition(&$definition, $plugin_id) { + if ($time <= 0) { + $definition['cron']['time'] = self::DEFAULT_QUEUE_CRON_TIME; + } ++ $lease_time = $definition['cron']['lease_time'] ?? 0; ++ if ($lease_time <= 0) { ++ $definition['cron']['lease_time'] = self::DEFAULT_QUEUE_CRON_LEASE_TIME; ++ } + } + } + +diff --git a/core/lib/Drupal/Core/Queue/QueueWorkerManagerInterface.php b/core/lib/Drupal/Core/Queue/QueueWorkerManagerInterface.php +index 7acf472186..bf59a564f9 100644 +--- a/core/lib/Drupal/Core/Queue/QueueWorkerManagerInterface.php ++++ b/core/lib/Drupal/Core/Queue/QueueWorkerManagerInterface.php +@@ -16,4 +16,13 @@ interface QueueWorkerManagerInterface extends PluginManagerInterface { + */ + public const DEFAULT_QUEUE_CRON_TIME = 15; + ++ /** ++ * The default lease time duration in seconds a queue item should get. ++ * ++ * @var int ++ * ++ * @see \Drupal\Core\Queue\QueueInterface::claimItem() ++ */ ++ public const DEFAULT_QUEUE_CRON_LEASE_TIME = 30; ++ + } +diff --git a/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestDatabaseDelayException.php b/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestDatabaseDelayException.php +index 93e4a1e2cb..52c9b0080d 100644 +--- a/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestDatabaseDelayException.php ++++ b/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestDatabaseDelayException.php +@@ -16,7 +16,10 @@ + #[QueueWorker( + id: 'cron_queue_test_database_delay_exception', + title: new TranslatableMarkup('Database delay exception test'), +- cron: ['time' => 1] ++ cron: [ ++ 'time' => 1, ++ 'lease_time' => 2, ++ ] + )] + class CronQueueTestDatabaseDelayException extends QueueWorkerBase { + +diff --git a/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestLeaseTime.php b/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestLeaseTime.php +index 2027bd69a4..38a7d86e99 100644 +--- a/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestLeaseTime.php ++++ b/core/modules/system/tests/modules/cron_queue_test/src/Plugin/QueueWorker/CronQueueTestLeaseTime.php +@@ -15,7 +15,10 @@ + #[QueueWorker( + id: 'cron_queue_test_lease_time', + title: new TranslatableMarkup('Lease time test'), +- cron: ['time' => 100] ++ cron: [ ++ 'time' => 100, ++ 'lease_time' => 2, ++ ] + )] + class CronQueueTestLeaseTime extends QueueWorkerBase { + +diff --git a/core/modules/system/tests/src/Kernel/System/CronQueueTest.php b/core/modules/system/tests/src/Kernel/System/CronQueueTest.php +index 4e2f1e7858..adb9b50693 100644 +--- a/core/modules/system/tests/src/Kernel/System/CronQueueTest.php ++++ b/core/modules/system/tests/src/Kernel/System/CronQueueTest.php +@@ -107,8 +107,8 @@ public function testDelayException() { + // Get the queue worker plugin manager. + $manager = $this->container->get('plugin.manager.queue_worker'); + $definitions = $manager->getDefinitions(); +- $this->assertNotEmpty($database_lease_time = $definitions['cron_queue_test_database_delay_exception']['cron']['time']); +- $this->assertNotEmpty($memory_lease_time = $definitions['cron_queue_test_memory_delay_exception']['cron']['time']); ++ $this->assertNotEmpty($database_lease_time = $definitions['cron_queue_test_database_delay_exception']['cron']['lease_time']); ++ $this->assertNotEmpty($memory_lease_time = $definitions['cron_queue_test_memory_delay_exception']['cron']['lease_time']); + + // Create the necessary test data and run cron. + $database->createItem('test'); +@@ -320,6 +320,8 @@ public function testQueueWorkerManagerSafeguard(): void { + $queue_worker_manager->processDefinition($definition, $plugin_id); + $this->assertArrayHasKey('time', $definition['cron']); + $this->assertEquals(QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_TIME, $definition['cron']['time']); ++ $this->assertArrayHasKey('lease_time', $definition['cron']); ++ $this->assertEquals(QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_LEASE_TIME, $definition['cron']['lease_time']); + + // Ensure if an invalid lease time (less-than 1 second) is provided, it is + // overridden with the default lease time. +@@ -329,6 +331,12 @@ public function testQueueWorkerManagerSafeguard(): void { + $definition = ['cron' => ['time' => -1]]; + $queue_worker_manager->processDefinition($definition, $plugin_id); + $this->assertEquals(QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_TIME, $definition['cron']['time']); ++ $definition = ['cron' => ['lease_time' => 0]]; ++ $queue_worker_manager->processDefinition($definition, $plugin_id); ++ $this->assertEquals(QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_LEASE_TIME, $definition['cron']['lease_time']); ++ $definition = ['cron' => ['lease_time' => -1]]; ++ $queue_worker_manager->processDefinition($definition, $plugin_id); ++ $this->assertEquals(QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_LEASE_TIME, $definition['cron']['lease_time']); + } + + /** +diff --git a/core/tests/Drupal/KernelTests/Core/Queue/QueueTest.php b/core/tests/Drupal/KernelTests/Core/Queue/QueueTest.php +index 89ccc4bc3d..3a70a346e1 100644 +--- a/core/tests/Drupal/KernelTests/Core/Queue/QueueTest.php ++++ b/core/tests/Drupal/KernelTests/Core/Queue/QueueTest.php +@@ -5,6 +5,7 @@ + use Drupal\Core\Database\Database; + use Drupal\Core\Queue\DatabaseQueue; + use Drupal\Core\Queue\Memory; ++use Drupal\Core\Queue\QueueWorkerManagerInterface; + use Drupal\KernelTests\KernelTestBase; + + /** +@@ -100,6 +101,49 @@ protected function runQueueTest($queue1, $queue2) { + // Check that both queues are empty. + $this->assertSame(0, $queue1->numberOfItems(), 'Queue 1 is empty'); + $this->assertSame(0, $queue2->numberOfItems(), 'Queue 2 is empty'); ++ ++ // Test that we can claim an item that is expired, and we cannot claim an ++ // item that has not expired yet. ++ $queue1->createItem($data[0]); ++ $item = $queue1->claimItem(); ++ $this->assertNotFalse($item, 'The item can be claimed.'); ++ $item = $queue1->claimItem(); ++ $this->assertFalse($item, 'The item cannot be claimed again.'); ++ // Set the expiration date to the current time minus the lease time plus 1 ++ // second. It should be possible to reclaim the item. ++ $this->setExpiration($queue1, \Drupal::time()->getCurrentTime() - (QueueWorkerManagerInterface::DEFAULT_QUEUE_CRON_LEASE_TIME + 1)); ++ $item = $queue1->claimItem(); ++ $this->assertNotFalse($item, 'Item can be claimed after expiration.'); ++ } ++ ++ /** ++ * Set the expiration for different queues. ++ * ++ * @param \Drupal\Core\Queue\QueueInterface $queue ++ * The queue for which to alter the expiration. ++ * @param int $expire ++ * The new expiration time. ++ * ++ * @throws \ReflectionException ++ */ ++ protected function setExpiration($queue, $expire) { ++ $class = get_class($queue); ++ switch ($class) { ++ case Memory::class: ++ $reflection = new \ReflectionClass($queue); ++ $property = $reflection->getProperty('queue'); ++ $property->setAccessible(TRUE); ++ $items = $property->getValue($queue); ++ end($items)->expire = $expire; ++ break; ++ ++ case DatabaseQueue::class: ++ \Drupal::database() ++ ->update(DatabaseQueue::TABLE_NAME) ++ ->fields(['expire' => $expire]) ++ ->execute(); ++ break; ++ } + } + + /** +diff --git a/core/tests/Drupal/Tests/Core/Cron/CronSuspendQueueDelayTest.php b/core/tests/Drupal/Tests/Core/Cron/CronSuspendQueueDelayTest.php +index 6ac8367a99..adc29e0f4d 100644 +--- a/core/tests/Drupal/Tests/Core/Cron/CronSuspendQueueDelayTest.php ++++ b/core/tests/Drupal/Tests/Core/Cron/CronSuspendQueueDelayTest.php +@@ -91,6 +91,7 @@ protected function setUp(): void { + ->willReturn([ + 'cron' => [ + 'time' => 300, ++ 'lease_time' => 300, + ], + ]); + +@@ -100,6 +101,7 @@ protected function setUp(): void { + ->willReturn([ + 'cron' => [ + 'time' => 300, ++ 'lease_time' => 300, + ], + ]); + } +@@ -145,11 +147,17 @@ public function testSuspendQueue(): void { + ->willReturn([ + 'test_worker_a' => [ + 'id' => 'test_worker_a', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + 'test_worker_b' => [ + 'id' => 'test_worker_b', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + ]); + +@@ -323,19 +331,31 @@ public function testSuspendQueueOrder(): void { + ->willReturn([ + 'test_worker_a' => [ + 'id' => 'test_worker_a', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + 'test_worker_b' => [ + 'id' => 'test_worker_b', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + 'test_worker_c' => [ + 'id' => 'test_worker_c', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + 'test_worker_d' => [ + 'id' => 'test_worker_d', +- 'cron' => ['time' => 300], ++ 'cron' => [ ++ 'time' => 300, ++ 'lease_time' => 300, ++ ], + ], + ]); + +diff --git a/core/tests/Drupal/Tests/Core/CronTest.php b/core/tests/Drupal/Tests/Core/CronTest.php +index bc968777a5..edf9790685 100644 +--- a/core/tests/Drupal/Tests/Core/CronTest.php ++++ b/core/tests/Drupal/Tests/Core/CronTest.php +@@ -118,6 +118,7 @@ protected function setUp(): void { + 'id' => $queue_worker, + 'cron' => [ + 'time' => &$this->claimTime, ++ 'lease_time' => $this->claimTime, + ], + ]; + \ No newline at end of file diff --git a/patches/2942404-65-11.x.patch b/patches/2942404-65-11.x.patch new file mode 100644 index 0000000000..3fc70ce9ed --- /dev/null +++ b/patches/2942404-65-11.x.patch @@ -0,0 +1,218 @@ +diff --git a/core/modules/big_pipe/tests/modules/big_pipe_test/src/BigPipePlaceholderTestCases.php b/core/modules/big_pipe/tests/modules/big_pipe_test/src/BigPipePlaceholderTestCases.php +index fc33e67c0e..82f28da02d 100644 +--- a/core/modules/big_pipe/tests/modules/big_pipe_test/src/BigPipePlaceholderTestCases.php ++++ b/core/modules/big_pipe/tests/modules/big_pipe_test/src/BigPipePlaceholderTestCases.php +@@ -106,11 +106,11 @@ public static function cases(ContainerInterface $container = NULL, AccountInterf + 'method' => 'replaceWith', + // cspell:disable-next-line + 'selector' => '[data-big-pipe-placeholder-id="callback=Drupal%5CCore%5CRender%5CElement%5CStatusMessages%3A%3ArenderMessages&args%5B0%5D&token=_HAdUpwWmet0TOTe2PSiJuMntExoshbm1kh2wQzzzAA"]', +- 'data' => '
' . "\n" . '
' . "\n" . '

Status message

' . "\n" . ' Hello from BigPipe!' . "\n" . '
' . "\n" . '
' . "\n", ++ 'data' => '
' . "\n" . '
' . "\n" . '

Status message

' . "\n" . ' Hello from BigPipe!' . "\n" . '
' . "\n" . '
' . "\n", + 'settings' => NULL, + ], + ]; +- $status_messages->embeddedHtmlResponse = '
' . "\n" . '
' . "\n" . '

Status message

' . "\n" . ' Hello from BigPipe!' . "\n" . '
' . "\n" . '
' . "\n"; ++ $status_messages->embeddedHtmlResponse = '
' . "\n" . '
' . "\n" . '

Status message

' . "\n" . ' Hello from BigPipe!' . "\n" . '
' . "\n" . '
' . "\n"; + } + + // 2. Real-world example of HTML attribute value placeholder: form action. +diff --git a/core/modules/big_pipe/tests/src/FunctionalJavascript/BigPipeRegressionTest.php b/core/modules/big_pipe/tests/src/FunctionalJavascript/BigPipeRegressionTest.php +index a20fe48253..74d4f35e4c 100644 +--- a/core/modules/big_pipe/tests/src/FunctionalJavascript/BigPipeRegressionTest.php ++++ b/core/modules/big_pipe/tests/src/FunctionalJavascript/BigPipeRegressionTest.php +@@ -83,7 +83,7 @@ public function testMessages_2712935() { + $this->assertTrue($this->container->get('module_installer')->install(['render_placeholder_message_test'], TRUE), 'Installed modules.'); + + $this->drupalLogin($this->drupalCreateUser()); +- $messages_markup = '
+ {% for type, messages in message_list %} +-
++
+ {% if type == 'error' %} +
++ {% elseif type == 'status' or type == 'warning' %} ++
+ {% endif %} + {% if status_headings[type] %} +

{{ status_headings[type] }}

+@@ -39,7 +41,7 @@ + {% else %} + {{ messages|first }} + {% endif %} +- {% if type == 'error' %} ++ {% if type in ['error', 'status', 'warning'] %} +
+ {% endif %} +
+diff --git a/core/modules/system/tests/src/Functional/Render/PlaceholderMessageTest.php b/core/modules/system/tests/src/Functional/Render/PlaceholderMessageTest.php +index 68fd9543b0..a0e50af73c 100644 +--- a/core/modules/system/tests/src/Functional/Render/PlaceholderMessageTest.php ++++ b/core/modules/system/tests/src/Functional/Render/PlaceholderMessageTest.php +@@ -30,7 +30,7 @@ class PlaceholderMessageTest extends BrowserTestBase { + * Tests rendering of message placeholder. + */ + public function testMessagePlaceholder(): void { +- $messages_markup = '
++
+ {% if type == 'error' %} +
++ {% elseif type == 'status' or type == 'warning' %} ++
+ {% endif %} + {% if status_headings[type] %} +

{{ status_headings[type] }}

+@@ -29,7 +31,7 @@ + {% else %} + {{ messages|first }} + {% endif %} +- {% if type == 'error' %} ++ {% if type in ['error', 'status', 'warning'] %} +
+ {% endif %} +
+diff --git a/core/profiles/demo_umami/themes/umami/templates/components/messages/status-messages.html.twig b/core/profiles/demo_umami/themes/umami/templates/components/messages/status-messages.html.twig +index 1a65511a3d..75b2da4533 100644 +--- a/core/profiles/demo_umami/themes/umami/templates/components/messages/status-messages.html.twig ++++ b/core/profiles/demo_umami/themes/umami/templates/components/messages/status-messages.html.twig +@@ -28,10 +28,12 @@ + 'messages--' ~ type, + ] + %} +-
++
+
+ {% if type == 'error' %} +
++ {% elseif type == 'status' or type == 'warning' %} ++
+ {% endif %} + {% if status_headings[type] %} +

{{ status_headings[type] }}

+@@ -45,7 +47,7 @@ + {% else %} + {{ messages|first }} + {% endif %} +- {% if type == 'error' %} ++ {% if type in ['error', 'status', 'warning'] %} +
+ {% endif %} +
+diff --git a/core/themes/claro/templates/misc/status-messages.html.twig b/core/themes/claro/templates/misc/status-messages.html.twig +index 7708a745b2..4195e08459 100644 +--- a/core/themes/claro/templates/misc/status-messages.html.twig ++++ b/core/themes/claro/templates/misc/status-messages.html.twig +@@ -39,9 +39,11 @@ + set is_message_with_icon = type in ['error', 'status', 'warning'] + %} + +-
++
+ {% if type == 'error' %} +
++ {% elseif type == 'status' or type == 'warning' %} ++
+ {% endif %} + {% if is_message_with_title or is_message_with_icon %} +
+@@ -63,7 +65,7 @@ + {{ messages|first }} + {% endif %} +
+- {% if type == 'error' %} ++ {% if type in ['error', 'status', 'warning'] %} +
+ {% endif %} +
+diff --git a/core/themes/olivero/templates/misc/status-messages.html.twig b/core/themes/olivero/templates/misc/status-messages.html.twig +index 2dfe964a77..412f91cb48 100644 +--- a/core/themes/olivero/templates/misc/status-messages.html.twig ++++ b/core/themes/olivero/templates/misc/status-messages.html.twig +@@ -35,10 +35,10 @@ + +-