diff --git a/composer.json b/composer.json index 8ec23126865562da97d7251bfca999c98b6c67f1..943aef6ef170b53a8de287f060e8fa11b84dac34 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "drupal/anchor_link": "^3.0@beta", "drupal/better_exposed_filters": "6.0.6", "drupal/block_field": "1.0.0-rc5", - "drupal/block_permissions": "1.3", + "drupal/block_permissions": "1.4", "drupal/block_region_permissions": "1.5", "drupal/bootstrap": "3.34", "drupal/cache_control_override": "2.0.1", @@ -57,7 +57,7 @@ "drupal/media_entity_file_replace": "1.3.0", "drupal/media_library_edit": "3.0.4", "drupal/menu_block": "1.13", - "drupal/menu_breadcrumb": "^2.0@alpha", + "drupal/menu_breadcrumb": "^2.0", "drupal/metatag": "^2.1", "drupal/mobile_detect": "^3.0", "drupal/module_filter": "5.0.3", @@ -72,14 +72,14 @@ "drupal/recaptcha": "3.4", "drupal/recaptcha_v3": "2.0.3", "drupal/redirect": "1.10", - "drupal/roleassign": "2.0.2", - "drupal/scheduler": "2.1.0", + "drupal/roleassign": "2.0.3", + "drupal/scheduler": "2.2.0", "drupal/simple_gmap": "3.1.0", "drupal/simple_sitemap": "4.2.2", "drupal/smtp": "1.4", "drupal/social_media": "2.0.0", "drupal/social_media_links": "^2.8", - "drupal/svg_image": "3.2.0", + "drupal/svg_image": "3.2.1", "drupal/token": "1.15", "drupal/twig_field_value": "2.0.5", "drupal/twig_tweak": "3.4.0", @@ -203,9 +203,6 @@ "drupal/honeypot": { "2811189": "https://www.drupal.org/files/issues/2022-05-25/honeypot-field_weight-2811189-27_0.patch" }, - "drupal/menu_breadcrumb": { - "duplicate_current_page_of_views": "https://www.drupal.org/files/issues/2023-05-26/duplicate_current_page_of_views.patch" - }, "drupal/social_media": { "Twitter X Logo": "patches/3381823-xlogo.patch" }, diff --git a/composer.lock b/composer.lock index 19e3513a898f687c39bf9af463e85a04df8f2dab..6a1e4d26ab056520bda015876d24079b41ec4550 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": "a2ee55c762dc5fc124969e85c6622daf", + "content-hash": "391f93f3ffc41e89d3f3069e92332b46", "packages": [ { "name": "algolia/places", @@ -17,7 +17,9 @@ "extra": { "installer-name": "algolia.places" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "asm89/stack-cors", @@ -54,7 +56,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Alexander", @@ -63,7 +67,10 @@ ], "description": "Cross-origin resource sharing library and stack middleware", "homepage": "https://github.com/asm89/stack-cors", - "keywords": ["cors", "stack"], + "keywords": [ + "cors", + "stack" + ], "support": { "issues": "https://github.com/asm89/stack-cors/issues", "source": "https://github.com/asm89/stack-cors/tree/v2.2.0" @@ -110,7 +117,9 @@ "symfony/yaml": "^6.3", "vimeo/psalm": "^5.14.0" }, - "bin": ["bin/dcg"], + "bin": [ + "bin/dcg" + ], "type": "library", "autoload": { "psr-4": { @@ -118,7 +127,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "description": "Drupal code generator", "support": { "issues": "https://github.com/Chi-teck/drupal-code-generator/issues", @@ -137,7 +148,9 @@ "extra": { "installer-name": "choices" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "codemirror/codemirror", @@ -150,7 +163,9 @@ "extra": { "installer-name": "codemirror" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "composer/installers", @@ -192,7 +207,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Kyle Robinson Young", @@ -329,7 +346,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nils Adermann", @@ -348,7 +367,12 @@ } ], "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": ["semantic", "semver", "validation", "versioning"], + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", @@ -410,7 +434,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -468,7 +494,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -517,7 +545,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -566,7 +596,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -618,7 +650,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -679,7 +713,9 @@ "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.", "totten/lurkerlite": "For monitoring filesystem changes in taskWatch" }, - "bin": ["robo"], + "bin": [ + "robo" + ], "type": "library", "autoload": { "psr-4": { @@ -687,7 +723,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Davert", @@ -721,7 +759,9 @@ "symfony/console": "^2.8 || ^3 || ^4 || ^5 || ^6", "symfony/filesystem": "^2.5 || ^3 || ^4 || ^5 || ^6" }, - "bin": ["scripts/release"], + "bin": [ + "scripts/release" + ], "type": "library", "extra": { "branch-alias": { @@ -734,7 +774,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Alexander Menk", @@ -791,7 +833,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -846,7 +890,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Greg Anderson", @@ -896,7 +942,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Cameron Eagans", @@ -946,7 +994,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Dragonfly Development Inc.", @@ -971,7 +1021,12 @@ ], "description": "Given a deep data structure, access data by dot notation.", "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": ["access", "data", "dot", "notation"], + "keywords": [ + "access", + "data", + "dot", + "notation" + ], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" @@ -1016,7 +1071,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Guilherme Blanco", @@ -1041,7 +1098,11 @@ ], "description": "Docblock Annotations Parser", "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": ["annotations", "docblock", "parser"], + "keywords": [ + "annotations", + "docblock", + "parser" + ], "support": { "issues": "https://github.com/doctrine/annotations/issues", "source": "https://github.com/doctrine/annotations/tree/1.14.4" @@ -1082,7 +1143,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", "homepage": "https://www.doctrine-project.org/", "support": { @@ -1123,7 +1186,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Guilherme Blanco", @@ -1140,7 +1205,13 @@ ], "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": ["annotations", "docblock", "lexer", "parser", "php"], + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], "support": { "issues": "https://github.com/doctrine/lexer/issues", "source": "https://github.com/doctrine/lexer/tree/2.1.1" @@ -1189,7 +1260,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "The FontLib Community", @@ -1233,7 +1306,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "anand.toshniwal93", @@ -1302,7 +1377,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Wilfrid Roze (eme)", @@ -1344,7 +1421,10 @@ ], "description": "Provides a drop-down menu interface to the core Drupal Toolbar.", "homepage": "http://drupal.org/project/admin_toolbar", - "keywords": ["Drupal", "Toolbar"], + "keywords": [ + "Drupal", + "Toolbar" + ], "support": { "source": "https://git.drupalcode.org/project/admin_toolbar", "issues": "https://www.drupal.org/project/issues/admin_toolbar" @@ -1380,7 +1460,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "ANDiTKO", @@ -1435,7 +1517,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "adamps", @@ -1492,7 +1576,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Vardot", @@ -1549,7 +1635,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Mike Keran", @@ -1620,7 +1708,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "acbramley", @@ -1655,26 +1745,26 @@ }, { "name": "drupal/block_permissions", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/block_permissions.git", - "reference": "8.x-1.3" + "reference": "8.x-1.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/block_permissions-8.x-1.3.zip", - "reference": "8.x-1.3", - "shasum": "f12967eba6498a77249836849b4245c98af60867" + "url": "https://ftp.drupal.org/files/projects/block_permissions-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "f5fb4fbf026517eb0ce9063213c33b00e49bb74c" }, "require": { - "drupal/core": "^9.3 || ^10" + "drupal/core": "^9.3 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.3", - "datestamp": "1680965820", + "version": "8.x-1.4", + "datestamp": "1736247569", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -1682,7 +1772,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "jefuri", @@ -1697,7 +1789,7 @@ "homepage": "https://www.drupal.org/user/682600" }, { - "name": "Steven Buteneers", + "name": "steven buteneers", "homepage": "https://www.drupal.org/user/3301055" } ], @@ -1740,7 +1832,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Joshua Roberson", @@ -1792,7 +1886,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Fabiano Sant'Ana (wundo)", @@ -1853,7 +1949,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "asgorobets", @@ -1902,7 +2000,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "anybody", @@ -1977,7 +2077,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "Christian Meilinger (meichr)", @@ -1991,7 +2093,9 @@ ], "description": "Provides integration of the CKEditor IndentBlock plugin with CKEditor.", "homepage": "https://www.drupal.org/project/ckeditor_indentblock", - "keywords": ["Drupal"], + "keywords": [ + "Drupal" + ], "support": { "source": "http://cgit.drupalcode.org/ckeditor_indentblock/", "issues": "https://www.drupal.org/project/issues/ckeditor_indentblock" @@ -2030,7 +2134,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Tommy Lynge Jørgensen", @@ -2177,7 +2283,9 @@ } }, "autoload": { - "files": ["includes/bootstrap.inc"], + "files": [ + "includes/bootstrap.inc" + ], "psr-4": { "Drupal\\Core\\": "lib/Drupal/Core", "Drupal\\Component\\": "lib/Drupal/Component" @@ -2208,7 +2316,9 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { "source": "https://github.com/drupal/core/tree/10.4.1" @@ -2252,10 +2362,14 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "description": "A flexible Composer project scaffold builder.", "homepage": "https://www.drupal.org/project/drupal", - "keywords": ["drupal"], + "keywords": [ + "drupal" + ], "support": { "source": "https://github.com/drupal/core-composer-scaffold/tree/10.4.1" }, @@ -2337,7 +2451,9 @@ }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "description": "Core and its dependencies with known-compatible minor versions. Require this project INSTEAD OF drupal/core.", "support": { "source": "https://github.com/drupal/core-recommended/tree/10.4.1" @@ -2373,7 +2489,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Drupal Media Team", @@ -2431,7 +2549,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Kris Vanderwater (EclipseGc)", @@ -2519,7 +2639,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bkosborne", @@ -2566,7 +2688,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Alex Sharkov", @@ -2576,7 +2700,11 @@ ], "description": "The module provide ability to edit Media entity embedded via CKEditor in a modal window.", "homepage": "https://www.drupal.org/project/edit_media_modal", - "keywords": ["CKEditor", "Drupal", "Media"], + "keywords": [ + "CKEditor", + "Drupal", + "Media" + ], "support": { "source": "http://cgit.drupalcode.org/edit_media_modal", "issues": "https://www.drupal.org/project/issues/edit_media_modal" @@ -2615,7 +2743,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "DuaelFr", @@ -2664,7 +2794,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "John Jameson", @@ -2737,7 +2869,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "Janez Urevc", @@ -2822,7 +2956,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "colan", @@ -2892,7 +3028,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Berdir", @@ -2946,7 +3084,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "heddn", @@ -2996,7 +3136,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Sven Decabooter", @@ -3051,7 +3193,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Anybody", @@ -3117,7 +3261,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "japerry", @@ -3192,7 +3338,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "NickDickinsonWilde", @@ -3244,7 +3392,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "mondrake", @@ -3276,7 +3426,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "mondrake", @@ -3308,7 +3460,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "mondrake", @@ -3354,7 +3508,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Alexander Ross (bleen)", @@ -3409,7 +3565,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "See contributors", @@ -3472,7 +3630,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "acquia", @@ -3533,7 +3693,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Jeff Geerling", @@ -3617,7 +3779,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "mondrake", @@ -3663,7 +3827,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -3759,7 +3925,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -3822,7 +3990,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -3885,7 +4055,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -3936,7 +4108,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -3999,7 +4173,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -4058,7 +4234,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -4110,7 +4288,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Naveen Valecha", @@ -4124,7 +4304,10 @@ ], "description": "Provides jQuery UI Touch Punch library.", "homepage": "https://www.drupal.org/project/jquery_ui_touch_punch", - "keywords": ["Drupal", "jquery_ui_touch_punch"], + "keywords": [ + "Drupal", + "jquery_ui_touch_punch" + ], "support": { "source": "https://www.drupal.org/project/jquery_ui_touch_punch", "issues": "https://www.drupal.org/project/issues/jquery_ui_touch_punch" @@ -4159,7 +4342,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "joseph.olstad", @@ -4227,7 +4412,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Emil Stjerneman", @@ -4280,7 +4467,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "cilefen", @@ -4330,7 +4519,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bkosborne", @@ -4376,7 +4567,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "ahebrank", @@ -4385,7 +4578,9 @@ ], "description": "Add an edit button to the Media Library widget when an item is selected.", "homepage": "https://www.drupal.org/project/media_library_edit", - "keywords": ["Drupal"], + "keywords": [ + "Drupal" + ], "support": { "source": "http://cgit.drupalcode.org/media_library_edit", "issues": "https://www.drupal.org/project/issues/media_library_edit" @@ -4420,7 +4615,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Dave Reid", @@ -4455,34 +4652,36 @@ }, { "name": "drupal/menu_breadcrumb", - "version": "2.0.0-alpha0", + "version": "2.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/menu_breadcrumb.git", - "reference": "2.0.0-alpha0" + "reference": "2.0.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/menu_breadcrumb-2.0.0-alpha0.zip", - "reference": "2.0.0-alpha0", - "shasum": "d031d6a859b3f20a290fd9f812fdc4dace0810ef" + "url": "https://ftp.drupal.org/files/projects/menu_breadcrumb-2.0.0.zip", + "reference": "2.0.0", + "shasum": "016f2eead9cf9d4bfdf4b36fca5e3c8a8e8d0f1e" }, "require": { - "drupal/core": "^8.8 || ^9 || ^10" + "drupal/core": "^9 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.0-alpha0", - "datestamp": "1675717886", + "version": "2.0.0", + "datestamp": "1736662457", "security-coverage": { - "status": "not-covered", - "message": "Alpha releases are not covered by Drupal security advisories." + "status": "covered", + "message": "Covered by Drupal's security advisory policy" } } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "aaron", @@ -4509,10 +4708,11 @@ "homepage": "https://www.drupal.org/user/76026" } ], - "description": "Create breadcrumbs from nested menu titles and/or taxonomy membership.", + "description": "Create breadcrumbs from nested menu titles and/or taxonomy membership..", "homepage": "https://www.drupal.org/project/menu_breadcrumb", "support": { - "source": "https://git.drupalcode.org/project/menu_breadcrumb" + "source": "https://git.drupalcode.org/project/menu_breadcrumb", + "issues": "https://www.drupal.org/project/issues/menu_breadcrumb" } }, { @@ -4560,7 +4760,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "See contributors", @@ -4574,7 +4776,10 @@ ], "description": "Manage meta tags for all entities.", "homepage": "https://www.drupal.org/project/metatag", - "keywords": ["Drupal", "seo"], + "keywords": [ + "Drupal", + "seo" + ], "support": { "source": "https://git.drupalcode.org/project/metatag", "issues": "https://www.drupal.org/project/issues/metatag", @@ -4611,7 +4816,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "Matthew Donadio (mpdonadio)", @@ -4669,7 +4876,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "andrey.troeglazov", @@ -4721,7 +4930,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "randalv", @@ -4763,7 +4974,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "asghar", @@ -4830,9 +5043,13 @@ "phpcbf --report=full --extensions=php,module,inc,theme,info,install --standard=vendor/drupal/coder/coder_sniffer/Drupal tests/modules", "phpcbf tests/behat --standard=PSR2" ], - "phpunit": ["phpunit tests --colors=always"] + "phpunit": [ + "phpunit tests --colors=always" + ] }, - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "david strauss", @@ -4911,7 +5128,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Berdir", @@ -4986,7 +5205,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Berdir", @@ -5042,7 +5263,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Evgenii Nikitin (sinn)", @@ -5101,7 +5324,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "hass", @@ -5180,7 +5405,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "leymannx", @@ -5224,7 +5451,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "hass", @@ -5309,7 +5538,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "B-Prod", @@ -5359,7 +5590,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Berdir", @@ -5386,26 +5619,26 @@ }, { "name": "drupal/roleassign", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/roleassign.git", - "reference": "2.0.2" + "reference": "2.0.3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/roleassign-2.0.2.zip", - "reference": "2.0.2", - "shasum": "186a31d7ed2cc846c148e4d49cdc0b35e86e21ce" + "url": "https://ftp.drupal.org/files/projects/roleassign-2.0.3.zip", + "reference": "2.0.3", + "shasum": "99f50d92634abc60e1de89e6559334f5f05deacf" }, "require": { - "drupal/core": "^9.1 || ^10" + "drupal/core": "^10.1 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.2", - "datestamp": "1713184816", + "version": "2.0.3", + "datestamp": "1736794235", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5413,7 +5646,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "joseph.olstad", @@ -5441,17 +5676,17 @@ }, { "name": "drupal/scheduler", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/scheduler.git", - "reference": "2.1.0" + "reference": "2.2.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/scheduler-2.1.0.zip", - "reference": "2.1.0", - "shasum": "aea0f1dc40cfbc75f470860998d773a8749bcee2" + "url": "https://ftp.drupal.org/files/projects/scheduler-2.2.0.zip", + "reference": "2.2.0", + "shasum": "b33463ea677f5e14e4f5602a261b3d86360ddc14" }, "require": { "drupal/core": "^8 || ^9 || ^10 || ^11" @@ -5467,8 +5702,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.0", - "datestamp": "1723723795", + "version": "2.2.0", + "datestamp": "1736417382", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5481,7 +5716,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Eric Schaefer (Eric Schaefer)", @@ -5540,7 +5777,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "bnjmnm", @@ -5601,7 +5840,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "martin107", @@ -5650,7 +5891,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Pawel Ginalski (gbyte)", @@ -5701,7 +5944,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "berdir", @@ -5774,7 +6019,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "japerry", @@ -5842,7 +6089,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "Takim Islam", @@ -5895,7 +6144,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Neslee Canil Pinto", @@ -5921,17 +6172,17 @@ }, { "name": "drupal/svg_image", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/svg_image.git", - "reference": "3.2.0" + "reference": "3.2.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/svg_image-3.2.0.zip", - "reference": "3.2.0", - "shasum": "d55ef2bc3b751b8ce3f33485216c38cfbfb076b2" + "url": "https://ftp.drupal.org/files/projects/svg_image-3.2.1.zip", + "reference": "3.2.1", + "shasum": "4623b9d0de4c624857df10daaa8c68793942ad87" }, "require": { "drupal/core": "^10.3 || ^11", @@ -5940,8 +6191,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.2.0", - "datestamp": "1733298643", + "version": "3.2.1", + "datestamp": "1736865227", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5949,7 +6200,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Yaroslav Lushnikov", @@ -6017,7 +6270,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Berdir", @@ -6079,7 +6334,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "anybody", @@ -6152,7 +6409,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Chi", @@ -6161,7 +6420,10 @@ ], "description": "A Twig extension with some useful functions and filters for Drupal development.", "homepage": "https://www.drupal.org/project/twig_tweak", - "keywords": ["Drupal", "Twig"], + "keywords": [ + "Drupal", + "Twig" + ], "support": { "source": "https://git.drupalcode.org/project/twig_tweak", "issues": "https://www.drupal.org/project/issues/twig_tweak" @@ -6201,7 +6463,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "arnested", @@ -6262,7 +6526,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0+"], + "license": [ + "GPL-2.0+" + ], "authors": [ { "name": "karschsp", @@ -6275,7 +6541,10 @@ ], "description": "Allows admins to protect users from being edited or cancelled, on a per-user basis.", "homepage": "https://www.drupal.org/project/userprotect", - "keywords": ["Drupal", "User Management"], + "keywords": [ + "Drupal", + "User Management" + ], "support": { "source": "http://cgit.drupalcode.org/userprotect", "issues": "https://www.drupal.org/project/issues/userprotect" @@ -6315,7 +6584,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "abhinesh", @@ -6373,7 +6644,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Agnes Chisholm", @@ -6424,7 +6697,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "amateescu", @@ -6482,7 +6757,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "colan", @@ -6503,7 +6780,10 @@ ], "description": "Add autocomplete functionality to the views filter text fields.", "homepage": "https://www.drupal.org/project/views_autocomplete_filters", - "keywords": ["Drupal", "views_autocomplete_filters"], + "keywords": [ + "Drupal", + "views_autocomplete_filters" + ], "support": { "source": "https://git.drupalcode.org/project/views_autocomplete_filters", "issues": "https://www.drupal.org/project/issues/views_autocomplete_filters" @@ -6538,7 +6818,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Dmitry Demenchuk", @@ -6611,7 +6893,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Marcin Grabias", @@ -6663,7 +6947,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "pifagor", @@ -6718,7 +7004,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "anybody", @@ -6831,7 +7119,9 @@ } }, "notification-url": "https://packages.drupal.org/8/downloads", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Jacob Rockowitz (jrockowitz)", @@ -6917,18 +7207,36 @@ "rector/rector": "^0.12", "squizlabs/php_codesniffer": "^3.7" }, - "bin": ["drush"], + "bin": [ + "drush" + ], "type": "library", "extra": { "installer-paths": { - "sut/core": ["type:drupal-core"], - "sut/libraries/{$name}": ["type:drupal-library"], - "sut/modules/unish/{$name}": ["drupal/devel"], - "sut/themes/unish/{$name}": ["drupal/empty_theme"], - "sut/modules/contrib/{$name}": ["type:drupal-module"], - "sut/profiles/contrib/{$name}": ["type:drupal-profile"], - "sut/themes/contrib/{$name}": ["type:drupal-theme"], - "sut/drush/contrib/{$name}": ["type:drupal-drush"] + "sut/core": [ + "type:drupal-core" + ], + "sut/libraries/{$name}": [ + "type:drupal-library" + ], + "sut/modules/unish/{$name}": [ + "drupal/devel" + ], + "sut/themes/unish/{$name}": [ + "drupal/empty_theme" + ], + "sut/modules/contrib/{$name}": [ + "type:drupal-module" + ], + "sut/profiles/contrib/{$name}": [ + "type:drupal-profile" + ], + "sut/themes/contrib/{$name}": [ + "type:drupal-theme" + ], + "sut/drush/contrib/{$name}": [ + "type:drupal-drush" + ] } }, "autoload": { @@ -6937,7 +7245,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Moshe Weitzman", @@ -7027,7 +7337,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Eduardo Gulias Davis" @@ -7083,7 +7395,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Daryll Doyle", @@ -7131,7 +7445,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0"], + "license": [ + "GPL-2.0" + ], "authors": [ { "name": "Lars Olesen", @@ -7148,7 +7464,10 @@ ], "description": "PHP Exif Library. A library for reading and writing Exif headers in JPEG and TIFF images using PHP.", "homepage": "https://github.com/FileEye/pel", - "keywords": ["exif", "image"], + "keywords": [ + "exif", + "image" + ], "support": { "issues": "https://github.com/FileEye/pel/issues", "source": "https://github.com/FileEye/pel/tree/0.10.0" @@ -7187,7 +7506,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Oscar Otero", @@ -7198,7 +7519,14 @@ ], "description": "PHP gettext manager", "homepage": "https://github.com/php-gettext/Gettext", - "keywords": ["JS", "gettext", "i18n", "mo", "po", "translation"], + "keywords": [ + "JS", + "gettext", + "i18n", + "mo", + "po", + "translation" + ], "support": { "email": "oom@oscarotero.com", "issues": "https://github.com/php-gettext/Gettext/issues", @@ -7240,7 +7568,9 @@ "require-dev": { "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, - "bin": ["bin/export-plural-rules"], + "bin": [ + "bin/export-plural-rules" + ], "type": "library", "autoload": { "psr-4": { @@ -7248,7 +7578,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Michele Locati", @@ -7324,7 +7656,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Oscar Otero", @@ -7335,7 +7669,12 @@ ], "description": "Gettext translator functions", "homepage": "https://github.com/php-gettext/Translator", - "keywords": ["gettext", "i18n", "php", "translator"], + "keywords": [ + "gettext", + "i18n", + "php", + "translator" + ], "support": { "email": "oom@oscarotero.com", "issues": "https://github.com/php-gettext/Translator/issues", @@ -7391,10 +7730,17 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", "homepage": "https://www.google.com/recaptcha/", - "keywords": ["Abuse", "captcha", "recaptcha", "spam"], + "keywords": [ + "Abuse", + "captcha", + "recaptcha", + "spam" + ], "support": { "forum": "https://groups.google.com/forum/#!forum/recaptcha", "issues": "https://github.com/google/recaptcha/issues", @@ -7439,7 +7785,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Matthew Grasmick" @@ -7478,7 +7826,9 @@ "phpunit/phpunit": "^9", "squizlabs/php_codesniffer": "^3.0" }, - "bin": ["bin/yaml-cli"], + "bin": [ + "bin/yaml-cli" + ], "type": "library", "extra": { "branch-alias": { @@ -7491,7 +7841,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Matthew Grasmick" @@ -7550,13 +7902,17 @@ } }, "autoload": { - "files": ["src/functions_include.php"], + "files": [ + "src/functions_include.php" + ], "psr-4": { "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Graham Campbell", @@ -7660,7 +8016,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Graham Campbell", @@ -7684,7 +8042,9 @@ } ], "description": "Guzzle promises library", - "keywords": ["promise"], + "keywords": [ + "promise" + ], "support": { "issues": "https://github.com/guzzle/promises/issues", "source": "https://github.com/guzzle/promises/tree/2.0.4" @@ -7750,7 +8110,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Graham Campbell", @@ -7830,7 +8192,9 @@ "extra": { "installer-name": "jquery.chosen" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/geocomplete", @@ -7843,7 +8207,9 @@ "extra": { "installer-name": "jquery.geocomplete" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/hotkeys", @@ -7856,7 +8222,9 @@ "extra": { "installer-name": "jquery.hotkeys" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/icheck", @@ -7869,7 +8237,9 @@ "extra": { "installer-name": "jquery.icheck" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/image-picker", @@ -7882,7 +8252,9 @@ "extra": { "installer-name": "jquery.image-picker" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/inputmask", @@ -7895,7 +8267,9 @@ "extra": { "installer-name": "jquery.inputmask" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/intl-tel-input", @@ -7908,7 +8282,9 @@ "extra": { "installer-name": "jquery.intl-tel-input" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/rateit", @@ -7921,7 +8297,9 @@ "extra": { "installer-name": "jquery.rateit" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/select2", @@ -7934,7 +8312,9 @@ "extra": { "installer-name": "jquery.select2" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/textcounter", @@ -7947,7 +8327,9 @@ "extra": { "installer-name": "jquery.textcounter" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/timepicker", @@ -7960,7 +8342,9 @@ "extra": { "installer-name": "jquery.timepicker" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "jquery/toggles", @@ -7973,7 +8357,9 @@ "extra": { "installer-name": "jquery.toggles" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "league/container", @@ -8024,7 +8410,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Phil Bennett", @@ -8094,7 +8482,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Ignace Nyamagana Butera", @@ -8170,7 +8560,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Matt Butcher", @@ -8235,7 +8627,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Marco Marchiò", @@ -8274,10 +8668,14 @@ "psr-0": { "Detection": "namespaced/" }, - "classmap": ["Mobile_Detect.php"] + "classmap": [ + "Mobile_Detect.php" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Serban Ghita", @@ -8325,7 +8723,9 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, - "bin": ["bin/php-parse"], + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { @@ -8338,14 +8738,19 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", - "keywords": ["parser", "php"], + "keywords": [ + "parser", + "php" + ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" @@ -8395,7 +8800,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Stephen Beemsterboer", @@ -8454,8 +8861,12 @@ } }, "notification-url": "https://packagist.org/downloads/", - "include-path": ["./"], - "license": ["BSD-2-Clause"], + "include-path": [ + "./" + ], + "license": [ + "BSD-2-Clause" + ], "authors": [ { "name": "Vincent Blavet", @@ -8472,7 +8883,10 @@ ], "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", "homepage": "https://github.com/pear/Archive_Tar", - "keywords": ["archive", "tar"], + "keywords": [ + "archive", + "tar" + ], "support": { "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", "source": "https://github.com/pear/Archive_Tar" @@ -8500,8 +8914,12 @@ } }, "notification-url": "https://packagist.org/downloads/", - "include-path": ["./"], - "license": ["BSD-2-Clause"], + "include-path": [ + "./" + ], + "license": [ + "BSD-2-Clause" + ], "authors": [ { "name": "Andrei Zmievski", @@ -8550,11 +8968,17 @@ }, "type": "library", "autoload": { - "classmap": ["src/"] + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": ["src/"], - "license": ["BSD-3-Clause"], + "include-path": [ + "src/" + ], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Christian Weiske", @@ -8596,11 +9020,17 @@ } }, "autoload": { - "classmap": ["PEAR/"] + "classmap": [ + "PEAR/" + ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": ["."], - "license": ["BSD-2-Clause"], + "include-path": [ + "." + ], + "license": [ + "BSD-2-Clause" + ], "authors": [ { "name": "Helgi Thormar", @@ -8613,7 +9043,9 @@ ], "description": "The PEAR Exception base class.", "homepage": "https://github.com/pear/PEAR_Exception", - "keywords": ["exception"], + "keywords": [ + "exception" + ], "support": { "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception", "source": "https://github.com/pear/PEAR_Exception" @@ -8645,7 +9077,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Thomas Gossmann", @@ -8699,7 +9133,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Thomas Gossmann", @@ -8708,7 +9144,12 @@ ], "description": "Missing PHP language constructs", "homepage": "https://phootwork.github.io/lang/", - "keywords": ["array", "comparator", "comparison", "string"], + "keywords": [ + "array", + "comparator", + "comparison", + "string" + ], "support": { "issues": "https://github.com/phootwork/phootwork/issues", "source": "https://github.com/phootwork/lang/tree/v3.2.2" @@ -8763,7 +9204,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-only"], + "license": [ + "LGPL-2.1-only" + ], "authors": [ { "name": "Marcus Bointon", @@ -8825,7 +9268,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Thomas Gossmann", @@ -8833,7 +9278,11 @@ } ], "description": "PHP Docblock parser and generator. An API to read and write Docblocks.", - "keywords": ["docblock", "generator", "parser"], + "keywords": [ + "docblock", + "generator", + "parser" + ], "support": { "issues": "https://github.com/phpowermove/docblock/issues", "source": "https://github.com/phpowermove/docblock/tree/v4.0" @@ -8856,7 +9305,9 @@ }, "type": "drupal-library", "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Dave Furfero", @@ -8865,7 +9316,11 @@ ], "description": "Extension to jQuery UI for mobile touch event support.", "homepage": "http://touchpunch.furf.com/", - "keywords": ["gestures", "mobile", "touch"], + "keywords": [ + "gestures", + "mobile", + "touch" + ], "support": { "issues": "https://github.com/politsin/jquery-ui-touch-punch/issues", "source": "https://github.com/politsin/jquery-ui-touch-punch/tree/1.0" @@ -8883,7 +9338,9 @@ "extra": { "installer-name": "popperjs" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "progress-tracker/progress-tracker", @@ -8896,7 +9353,9 @@ "extra": { "installer-name": "progress-tracker" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "psr/cache", @@ -8927,7 +9386,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -8935,7 +9396,11 @@ } ], "description": "Common interface for caching libraries", - "keywords": ["cache", "psr", "psr-6"], + "keywords": [ + "cache", + "psr", + "psr-6" + ], "support": { "source": "https://github.com/php-fig/cache/tree/3.0.0" }, @@ -8970,7 +9435,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9021,7 +9488,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9029,7 +9498,11 @@ } ], "description": "Standard interfaces for event handling.", - "keywords": ["events", "psr", "psr-14"], + "keywords": [ + "events", + "psr", + "psr-14" + ], "support": { "issues": "https://github.com/php-fig/event-dispatcher/issues", "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" @@ -9066,7 +9539,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9075,7 +9550,12 @@ ], "description": "Common interface for HTTP clients", "homepage": "https://github.com/php-fig/http-client", - "keywords": ["http", "http-client", "psr", "psr-18"], + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], "support": { "source": "https://github.com/php-fig/http-client" }, @@ -9111,7 +9591,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9163,7 +9645,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9214,7 +9698,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "PHP-FIG", @@ -9223,7 +9709,11 @@ ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", - "keywords": ["log", "psr", "psr-3"], + "keywords": [ + "log", + "psr", + "psr-3" + ], "support": { "source": "https://github.com/php-fig/log/tree/3.0.2" }, @@ -9262,7 +9752,9 @@ "ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." }, - "bin": ["bin/psysh"], + "bin": [ + "bin/psysh" + ], "type": "library", "extra": { "branch-alias": { @@ -9274,13 +9766,17 @@ } }, "autoload": { - "files": ["src/functions.php"], + "files": [ + "src/functions.php" + ], "psr-4": { "Psy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Justin Hileman", @@ -9290,7 +9786,12 @@ ], "description": "An interactive shell for modern PHP.", "homepage": "http://psysh.org", - "keywords": ["REPL", "console", "interactive", "shell"], + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", "source": "https://github.com/bobthecow/psysh/tree/v0.12.0" @@ -9320,10 +9821,14 @@ }, "type": "library", "autoload": { - "files": ["src/getallheaders.php"] + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Ralph Khattar", @@ -9362,10 +9867,17 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "description": "A PHP library for XML Security", "homepage": "https://github.com/robrichards/xmlseclibs", - "keywords": ["security", "signature", "xml", "xmldsig"], + "keywords": [ + "security", + "signature", + "xml", + "xmldsig" + ], "support": { "issues": "https://github.com/robrichards/xmlseclibs/issues", "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" @@ -9400,10 +9912,14 @@ } }, "autoload": { - "classmap": ["src/"] + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Sebastian Bergmann", @@ -9416,7 +9932,12 @@ ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": ["diff", "udiff", "unidiff", "unified diff"], + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" @@ -9440,7 +9961,9 @@ "extra": { "installer-name": "signature_pad" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "simplesamlphp/assert", @@ -9481,7 +10004,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Tim van Dijen", @@ -9532,7 +10057,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-only"], + "license": [ + "LGPL-2.1-only" + ], "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", "support": { "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", @@ -9572,7 +10099,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-only"], + "license": [ + "LGPL-2.1-only" + ], "description": "A composer plugin that will auto-generate a classmap with all classes that implement SerializableElementInterface.", "support": { "issues": "https://github.com/simplesamlphp/composer-xmlprovider-installer/issues", @@ -9625,7 +10154,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Andreas Åkre Solberg", @@ -9722,7 +10253,9 @@ } }, "autoload": { - "files": ["src/_autoload_modules.php"], + "files": [ + "src/_autoload_modules.php" + ], "psr-4": { "SimpleSAML\\": "src/SimpleSAML", "SimpleSAML\\Module\\core\\": "modules/core/src", @@ -9734,7 +10267,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Andreas Åkre Solberg", @@ -9785,7 +10320,9 @@ }, "type": "simplesamlphp-module", "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Tim van Dijen", @@ -9829,7 +10366,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Olav Morken", @@ -9837,7 +10376,10 @@ } ], "description": "This module provides authentication against password hashes or .htpasswd files", - "keywords": ["authcrypt", "simplesamlphp"], + "keywords": [ + "authcrypt", + "simplesamlphp" + ], "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-module-authcrypt/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-module-authcrypt" @@ -9876,7 +10418,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Andreas Åkre Solberg", @@ -9884,7 +10428,10 @@ } ], "description": "The metarefresh module will download and parse metadata documents and store them locally", - "keywords": ["metarefresh", "simplesamlphp"], + "keywords": [ + "metarefresh", + "simplesamlphp" + ], "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-module-metarefresh" @@ -9926,7 +10473,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Jaime Perez", @@ -9939,7 +10488,10 @@ ], "description": "A library with classes and utilities for handling XML structures.", "homepage": "http://simplesamlphp.org", - "keywords": ["saml", "xml"], + "keywords": [ + "saml", + "xml" + ], "support": { "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" @@ -9981,7 +10533,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["LGPL-2.1-or-later"], + "license": [ + "LGPL-2.1-or-later" + ], "authors": [ { "name": "Jaime Perez Crespo", @@ -9996,7 +10550,12 @@ ], "description": "SimpleSAMLphp library for XML Security", "homepage": "https://github.com/simplesamlphp/xml-security", - "keywords": ["security", "signature", "xml", "xmldsig"], + "keywords": [ + "security", + "signature", + "xml", + "xmldsig" + ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", "source": "https://github.com/simplesamlphp/xml-security/tree/v1.12.0" @@ -10014,7 +10573,9 @@ "extra": { "installer-name": "svg-pan-zoom" }, - "license": ["BSD-2-Clause"] + "license": [ + "BSD-2-Clause" + ] }, { "name": "symfony/cache", @@ -10066,11 +10627,17 @@ "psr-4": { "Symfony\\Component\\Cache\\": "" }, - "classmap": ["Traits/ValueWrapper.php"], - "exclude-from-classmap": ["/Tests/"] + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -10083,7 +10650,10 @@ ], "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", "homepage": "https://symfony.com", - "keywords": ["caching", "psr6"], + "keywords": [ + "caching", + "psr6" + ], "support": { "source": "https://github.com/symfony/cache/tree/v6.4.16" }, @@ -10137,7 +10707,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -10213,10 +10785,14 @@ "psr-4": { "Symfony\\Component\\Config\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10297,10 +10873,14 @@ "psr-4": { "Symfony\\Component\\Console\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10313,7 +10893,12 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "keywords": ["cli", "command-line", "console", "terminal"], + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], "support": { "source": "https://github.com/symfony/console/tree/v6.4.17" }, @@ -10375,10 +10960,14 @@ "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10438,10 +11027,14 @@ } }, "autoload": { - "files": ["function.php"] + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -10501,16 +11094,22 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/serializer": "^5.4|^6.0|^7.0" }, - "bin": ["Resources/bin/patch-type-declarations"], + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10583,10 +11182,14 @@ "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10652,7 +11255,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -10719,10 +11324,14 @@ "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10779,10 +11388,14 @@ "psr-4": { "Symfony\\Component\\Finder\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10924,10 +11537,14 @@ "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -10997,10 +11614,14 @@ "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -11107,10 +11728,14 @@ "psr-4": { "Symfony\\Component\\HttpKernel\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -11169,10 +11794,15 @@ "psr-4": { "Symfony\\Component\\Intl\\": "" }, - "exclude-from-classmap": ["/Tests/", "/Resources/data/"] + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Bernhard Schussek", @@ -11261,10 +11891,14 @@ "psr-4": { "Symfony\\Component\\Mailer\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -11338,10 +11972,14 @@ "psr-4": { "Symfony\\Component\\Mime\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -11354,7 +11992,10 @@ ], "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", - "keywords": ["mime", "mime-type"], + "keywords": [ + "mime", + "mime-type" + ], "support": { "source": "https://github.com/symfony/mime/tree/v6.4.17" }, @@ -11403,10 +12044,14 @@ "psr-4": { "Symfony\\Component\\PasswordHasher\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Robin Chalas", @@ -11419,7 +12064,10 @@ ], "description": "Provides password hashing utilities", "homepage": "https://symfony.com", - "keywords": ["hashing", "password"], + "keywords": [ + "hashing", + "password" + ], "support": { "source": "https://github.com/symfony/password-hasher/tree/v6.4.13" }, @@ -11470,13 +12118,17 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Gert de Pagter", @@ -11489,7 +12141,12 @@ ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", - "keywords": ["compatibility", "ctype", "polyfill", "portable"], + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, @@ -11540,13 +12197,17 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Iconv\\": "" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -11613,13 +12274,17 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -11687,15 +12352,23 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Intl\\Icu\\": "" }, - "classmap": ["Resources/stubs"], - "exclude-from-classmap": ["/Tests/"] + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -11764,13 +12437,17 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Laurent Bassin", @@ -11842,14 +12519,20 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, - "classmap": ["Resources/stubs"] + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -11920,13 +12603,17 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -11990,14 +12677,20 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Php81\\": "" }, - "classmap": ["Resources/stubs"] + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12010,7 +12703,12 @@ ], "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", - "keywords": ["compatibility", "polyfill", "portable", "shim"], + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, @@ -12055,14 +12753,20 @@ } }, "autoload": { - "files": ["bootstrap.php"], + "files": [ + "bootstrap.php" + ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" }, - "classmap": ["Resources/stubs"] + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12075,7 +12779,12 @@ ], "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", - "keywords": ["compatibility", "polyfill", "portable", "shim"], + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], "support": { "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, @@ -12117,10 +12826,14 @@ "psr-4": { "Symfony\\Component\\Process\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12190,10 +12903,14 @@ "psr-4": { "Symfony\\Bridge\\PsrHttpMessage\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12206,7 +12923,12 @@ ], "description": "PSR HTTP message bridge", "homepage": "https://symfony.com", - "keywords": ["http", "http-message", "psr-17", "psr-7"], + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], "support": { "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.13" }, @@ -12264,10 +12986,14 @@ "psr-4": { "Symfony\\Component\\Routing\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12280,7 +13006,12 @@ ], "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", - "keywords": ["router", "routing", "uri", "url"], + "keywords": [ + "router", + "routing", + "uri", + "url" + ], "support": { "source": "https://github.com/symfony/routing/tree/v6.4.16" }, @@ -12359,10 +13090,14 @@ "psr-4": { "Symfony\\Component\\Serializer\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12430,10 +13165,14 @@ "psr-4": { "Symfony\\Contracts\\Service\\": "" }, - "exclude-from-classmap": ["/Test/"] + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12506,14 +13245,20 @@ }, "type": "library", "autoload": { - "files": ["Resources/functions.php"], + "files": [ + "Resources/functions.php" + ], "psr-4": { "Symfony\\Component\\String\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12584,10 +13329,14 @@ "psr-4": { "Symfony\\Contracts\\Translation\\": "" }, - "exclude-from-classmap": ["/Test/"] + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12697,10 +13446,14 @@ "psr-4": { "Symfony\\Bridge\\Twig\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12789,10 +13542,15 @@ "psr-4": { "Symfony\\Component\\Validator\\": "" }, - "exclude-from-classmap": ["/Tests/", "/Resources/bin/"] + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -12855,17 +13613,25 @@ "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "bin": ["Resources/bin/var-dump-server"], + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "autoload": { - "files": ["Resources/functions/dump.php"], + "files": [ + "Resources/functions/dump.php" + ], "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12878,7 +13644,10 @@ ], "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", - "keywords": ["debug", "dump"], + "keywords": [ + "debug", + "dump" + ], "support": { "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" }, @@ -12926,10 +13695,14 @@ "psr-4": { "Symfony\\Component\\VarExporter\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Nicolas Grekas", @@ -12996,16 +13769,22 @@ "require-dev": { "symfony/console": "^5.4|^6.0|^7.0" }, - "bin": ["Resources/bin/yaml-lint"], + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -13048,7 +13827,9 @@ "extra": { "installer-name": "tabby" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "tippyjs/tippyjs", @@ -13061,7 +13842,9 @@ "extra": { "installer-name": "tippyjs" }, - "license": ["MIT"] + "license": [ + "MIT" + ] }, { "name": "twig/intl-extra", @@ -13090,10 +13873,14 @@ "psr-4": { "Twig\\Extra\\Intl\\": "" }, - "exclude-from-classmap": ["/Tests/"] + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Fabien Potencier", @@ -13104,7 +13891,10 @@ ], "description": "A Twig extension for Intl", "homepage": "https://twig.symfony.com", - "keywords": ["intl", "twig"], + "keywords": [ + "intl", + "twig" + ], "support": { "source": "https://github.com/twigphp/intl-extra/tree/v3.18.0" }, @@ -13159,7 +13949,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], + "license": [ + "BSD-3-Clause" + ], "authors": [ { "name": "Fabien Potencier", @@ -13179,7 +13971,9 @@ ], "description": "Twig, the flexible, fast, and secure template language for PHP", "homepage": "https://twig.symfony.com", - "keywords": ["templating"], + "keywords": [ + "templating" + ], "support": { "issues": "https://github.com/twigphp/Twig/issues", "source": "https://github.com/twigphp/Twig/tree/v3.16.0" @@ -13283,7 +14077,9 @@ } } }, - "license": ["None"], + "license": [ + "None" + ], "description": "Simplesamlphp configuration and utilities for wcm sites." }, { @@ -13309,10 +14105,14 @@ }, "type": "library", "autoload": { - "classmap": ["src/DrupalFinder.php"] + "classmap": [ + "src/DrupalFinder.php" + ] }, "notification-url": "https://packagist.org/downloads/", - "license": ["GPL-2.0-or-later"], + "license": [ + "GPL-2.0-or-later" + ], "authors": [ { "name": "Florian Weber", @@ -13363,7 +14163,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Bernhard Schussek", @@ -13371,7 +14173,11 @@ } ], "description": "Assertions to validate method input/output with nice error messages.", - "keywords": ["assert", "check", "validate"], + "keywords": [ + "assert", + "check", + "validate" + ], "support": { "issues": "https://github.com/webmozarts/assert/issues", "source": "https://github.com/webmozarts/assert/tree/1.11.0" @@ -13405,7 +14211,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Jeremy Ebler", @@ -13414,7 +14222,10 @@ ], "description": "Apache's APR1-MD5 algorithm in pure PHP", "homepage": "https://github.com/whitehat101/apr1-md5", - "keywords": ["MD5", "apr1"], + "keywords": [ + "MD5", + "apr1" + ], "support": { "issues": "https://github.com/whitehat101/apr1-md5/issues", "source": "https://github.com/whitehat101/apr1-md5/tree/master" @@ -13461,7 +14272,9 @@ } }, "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], + "license": [ + "MIT" + ], "authors": [ { "name": "Bryan Davis", @@ -13481,7 +14294,6 @@ "minimum-stability": "dev", "stability-flags": { "drupal/anchor_link": 10, - "drupal/menu_breadcrumb": 15, "drupal/ultimate_cron": 10 }, "prefer-stable": true, diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 257e2b616b7bf84403da020c92541e2e4a5883fc..999529e623a3fad8b3e1688c9bb22c64880e0359 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -6,7 +6,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 { - public static $files = array( + public static $files = array ( '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', @@ -30,38 +30,38 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php', ); - public static $prefixLengthsPsr4 = array( - 'p' => - array( + public static $prefixLengthsPsr4 = array ( + 'p' => + array ( 'phpowermove\\docblock\\' => 21, 'phootwork\\lang\\' => 15, 'phootwork\\collection\\' => 21, ), - 'l' => - array( + 'l' => + array ( 'lsolesen\\pel\\' => 13, ), - 'e' => - array( + 'e' => + array ( 'enshrined\\svgSanitize\\' => 22, ), - 'c' => - array( + 'c' => + array ( 'cweagans\\Composer\\' => 18, ), - 'W' => - array( + 'W' => + array ( 'Wikimedia\\Composer\\Merge\\V2\\' => 28, 'WhiteHat101\\Crypt\\' => 18, 'Webmozart\\Assert\\' => 17, ), - 'T' => - array( + 'T' => + array ( 'Twig\\Extra\\Intl\\' => 16, 'Twig\\' => 5, ), - 'S' => - array( + 'S' => + array ( 'Symfony\\Polyfill\\Php83\\' => 23, 'Symfony\\Polyfill\\Php81\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, @@ -117,14 +117,14 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'SelfUpdate\\' => 11, 'SAML2\\' => 6, ), - 'R' => - array( + 'R' => + array ( 'Robo\\' => 5, 'RobRichards\\XMLSecLibs\\' => 23, 'ReCaptcha\\' => 10, ), - 'P' => - array( + 'P' => + array ( 'Psy\\' => 4, 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, @@ -137,21 +137,21 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'PantheonSystems\\CDNBehatHelpers\\' => 32, 'PHPMailer\\PHPMailer\\' => 20, ), - 'O' => - array( + 'O' => + array ( 'OomphInc\\ComposerInstallersExtender\\' => 36, ), - 'M' => - array( + 'M' => + array ( 'Masterminds\\' => 12, ), - 'L' => - array( + 'L' => + array ( 'League\\Uri\\' => 11, 'League\\Container\\' => 17, ), - 'G' => - array( + 'G' => + array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, @@ -160,16 +160,16 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'Gettext\\Languages\\' => 18, 'Gettext\\' => 8, ), - 'F' => - array( + 'F' => + array ( 'FontLib\\' => 8, ), - 'E' => - array( + 'E' => + array ( 'Egulias\\EmailValidator\\' => 23, ), - 'D' => - array( + 'D' => + array ( 'Drush\\' => 6, 'Drupal\\bootstrap\\' => 17, 'Drupal\\Core\\' => 12, @@ -181,8 +181,8 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'Doctrine\\Common\\Annotations\\' => 28, 'Dflydev\\DotAccessData\\' => 22, ), - 'C' => - array( + 'C' => + array ( 'Consolidation\\SiteProcess\\' => 26, 'Consolidation\\SiteAlias\\' => 24, 'Consolidation\\OutputFormatters\\' => 31, @@ -193,490 +193,490 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'Composer\\Semver\\' => 16, 'Composer\\Installers\\' => 20, ), - 'A' => - array( + 'A' => + array ( 'Asm89\\Stack\\' => 12, ), ); - public static $prefixDirsPsr4 = array( - 'phpowermove\\docblock\\' => - array( + public static $prefixDirsPsr4 = array ( + 'phpowermove\\docblock\\' => + array ( 0 => __DIR__ . '/..' . '/phpowermove/docblock/src', ), - 'phootwork\\lang\\' => - array( + 'phootwork\\lang\\' => + array ( 0 => __DIR__ . '/..' . '/phootwork/lang', ), - 'phootwork\\collection\\' => - array( + 'phootwork\\collection\\' => + array ( 0 => __DIR__ . '/..' . '/phootwork/collection', ), - 'lsolesen\\pel\\' => - array( + 'lsolesen\\pel\\' => + array ( 0 => __DIR__ . '/..' . '/fileeye/pel/src', ), - 'enshrined\\svgSanitize\\' => - array( + 'enshrined\\svgSanitize\\' => + array ( 0 => __DIR__ . '/..' . '/enshrined/svg-sanitize/src', ), - 'cweagans\\Composer\\' => - array( + 'cweagans\\Composer\\' => + array ( 0 => __DIR__ . '/..' . '/cweagans/composer-patches/src', ), - 'Wikimedia\\Composer\\Merge\\V2\\' => - array( + 'Wikimedia\\Composer\\Merge\\V2\\' => + array ( 0 => __DIR__ . '/..' . '/wikimedia/composer-merge-plugin/src', ), - 'WhiteHat101\\Crypt\\' => - array( + 'WhiteHat101\\Crypt\\' => + array ( 0 => __DIR__ . '/..' . '/whitehat101/apr1-md5/src', ), - 'Webmozart\\Assert\\' => - array( + 'Webmozart\\Assert\\' => + array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), - 'Twig\\Extra\\Intl\\' => - array( + 'Twig\\Extra\\Intl\\' => + array ( 0 => __DIR__ . '/..' . '/twig/intl-extra', ), - 'Twig\\' => - array( + 'Twig\\' => + array ( 0 => __DIR__ . '/..' . '/twig/twig/src', ), - 'Symfony\\Polyfill\\Php83\\' => - array( + 'Symfony\\Polyfill\\Php83\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php83', ), - 'Symfony\\Polyfill\\Php81\\' => - array( + 'Symfony\\Polyfill\\Php81\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', ), - 'Symfony\\Polyfill\\Mbstring\\' => - array( + 'Symfony\\Polyfill\\Mbstring\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => - array( + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), - 'Symfony\\Polyfill\\Intl\\Idn\\' => - array( + 'Symfony\\Polyfill\\Intl\\Idn\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', ), - 'Symfony\\Polyfill\\Intl\\Icu\\' => - array( + 'Symfony\\Polyfill\\Intl\\Icu\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-icu', ), - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => - array( + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), - 'Symfony\\Polyfill\\Iconv\\' => - array( + 'Symfony\\Polyfill\\Iconv\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-iconv', ), - 'Symfony\\Polyfill\\Ctype\\' => - array( + 'Symfony\\Polyfill\\Ctype\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), - 'Symfony\\Contracts\\Translation\\' => - array( + 'Symfony\\Contracts\\Translation\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/translation-contracts', ), - 'Symfony\\Contracts\\Service\\' => - array( + 'Symfony\\Contracts\\Service\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'Symfony\\Contracts\\EventDispatcher\\' => - array( + 'Symfony\\Contracts\\EventDispatcher\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', ), - 'Symfony\\Contracts\\Cache\\' => - array( + 'Symfony\\Contracts\\Cache\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), - 'Symfony\\Component\\Yaml\\' => - array( + 'Symfony\\Component\\Yaml\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'Symfony\\Component\\VarExporter\\' => - array( + 'Symfony\\Component\\VarExporter\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), - 'Symfony\\Component\\VarDumper\\' => - array( + 'Symfony\\Component\\VarDumper\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', ), - 'Symfony\\Component\\Validator\\' => - array( + 'Symfony\\Component\\Validator\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/validator', ), - 'Symfony\\Component\\String\\' => - array( + 'Symfony\\Component\\String\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/string', ), - 'Symfony\\Component\\Serializer\\' => - array( + 'Symfony\\Component\\Serializer\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/serializer', ), - 'Symfony\\Component\\Routing\\' => - array( + 'Symfony\\Component\\Routing\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/routing', ), - 'Symfony\\Component\\Process\\' => - array( + 'Symfony\\Component\\Process\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/process', ), - 'Symfony\\Component\\PasswordHasher\\' => - array( + 'Symfony\\Component\\PasswordHasher\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/password-hasher', ), - 'Symfony\\Component\\Mime\\' => - array( + 'Symfony\\Component\\Mime\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/mime', ), - 'Symfony\\Component\\Mailer\\' => - array( + 'Symfony\\Component\\Mailer\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/mailer', ), - 'Symfony\\Component\\Intl\\' => - array( + 'Symfony\\Component\\Intl\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/intl', ), - 'Symfony\\Component\\HttpKernel\\' => - array( + 'Symfony\\Component\\HttpKernel\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/http-kernel', ), - 'Symfony\\Component\\HttpFoundation\\' => - array( + 'Symfony\\Component\\HttpFoundation\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), - 'Symfony\\Component\\Finder\\' => - array( + 'Symfony\\Component\\Finder\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'Symfony\\Component\\Filesystem\\' => - array( + 'Symfony\\Component\\Filesystem\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), - 'Symfony\\Component\\EventDispatcher\\' => - array( + 'Symfony\\Component\\EventDispatcher\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), - 'Symfony\\Component\\ErrorHandler\\' => - array( + 'Symfony\\Component\\ErrorHandler\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/error-handler', ), - 'Symfony\\Component\\DependencyInjection\\' => - array( + 'Symfony\\Component\\DependencyInjection\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/dependency-injection', ), - 'Symfony\\Component\\Console\\' => - array( + 'Symfony\\Component\\Console\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'Symfony\\Component\\Config\\' => - array( + 'Symfony\\Component\\Config\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/config', ), - 'Symfony\\Component\\Cache\\' => - array( + 'Symfony\\Component\\Cache\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/cache', ), - 'Symfony\\Bundle\\FrameworkBundle\\' => - array( + 'Symfony\\Bundle\\FrameworkBundle\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/framework-bundle', ), - 'Symfony\\Bridge\\Twig\\' => - array( + 'Symfony\\Bridge\\Twig\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/twig-bridge', ), - 'Symfony\\Bridge\\PsrHttpMessage\\' => - array( + 'Symfony\\Bridge\\PsrHttpMessage\\' => + array ( 0 => __DIR__ . '/..' . '/symfony/psr-http-message-bridge', ), - 'SimpleSAML\\XML\\' => - array( + 'SimpleSAML\\XML\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/xml-common/src', ), - 'SimpleSAML\\XMLSecurity\\' => - array( + 'SimpleSAML\\XMLSecurity\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/xml-security/src', ), - 'SimpleSAML\\Module\\saml\\' => - array( + 'SimpleSAML\\Module\\saml\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/saml/src', ), - 'SimpleSAML\\Module\\multiauth\\' => - array( + 'SimpleSAML\\Module\\multiauth\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/multiauth/src', ), - 'SimpleSAML\\Module\\metarefresh\\' => - array( + 'SimpleSAML\\Module\\metarefresh\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/metarefresh/src', ), - 'SimpleSAML\\Module\\exampleauth\\' => - array( + 'SimpleSAML\\Module\\exampleauth\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/exampleauth/src', ), - 'SimpleSAML\\Module\\cron\\' => - array( + 'SimpleSAML\\Module\\cron\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/cron/src', ), - 'SimpleSAML\\Module\\core\\' => - array( + 'SimpleSAML\\Module\\core\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/core/src', ), - 'SimpleSAML\\Module\\authcrypt\\' => - array( + 'SimpleSAML\\Module\\authcrypt\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/authcrypt/src', ), - 'SimpleSAML\\Module\\admin\\' => - array( + 'SimpleSAML\\Module\\admin\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/admin/src', ), - 'SimpleSAML\\Composer\\XMLProvider\\' => - array( + 'SimpleSAML\\Composer\\XMLProvider\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/composer-xmlprovider-installer/src', ), - 'SimpleSAML\\Composer\\' => - array( + 'SimpleSAML\\Composer\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/composer-module-installer/src', ), - 'SimpleSAML\\Assert\\' => - array( + 'SimpleSAML\\Assert\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/assert/src', ), - 'SimpleSAML\\' => - array( + 'SimpleSAML\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/src/SimpleSAML', ), - 'SelfUpdate\\' => - array( + 'SelfUpdate\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/self-update/src', ), - 'SAML2\\' => - array( + 'SAML2\\' => + array ( 0 => __DIR__ . '/..' . '/simplesamlphp/saml2/src/SAML2', ), - 'Robo\\' => - array( + 'Robo\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/robo/src', ), - 'RobRichards\\XMLSecLibs\\' => - array( + 'RobRichards\\XMLSecLibs\\' => + array ( 0 => __DIR__ . '/..' . '/robrichards/xmlseclibs/src', ), - 'ReCaptcha\\' => - array( + 'ReCaptcha\\' => + array ( 0 => __DIR__ . '/..' . '/google/recaptcha/src/ReCaptcha', ), - 'Psy\\' => - array( + 'Psy\\' => + array ( 0 => __DIR__ . '/..' . '/psy/psysh/src', ), - 'Psr\\Log\\' => - array( + 'Psr\\Log\\' => + array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), - 'Psr\\Http\\Message\\' => - array( + 'Psr\\Http\\Message\\' => + array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), - 'Psr\\Http\\Client\\' => - array( + 'Psr\\Http\\Client\\' => + array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), - 'Psr\\EventDispatcher\\' => - array( + 'Psr\\EventDispatcher\\' => + array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), - 'Psr\\Container\\' => - array( + 'Psr\\Container\\' => + array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'Psr\\Cache\\' => - array( + 'Psr\\Cache\\' => + array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), - 'PhpParser\\' => - array( + 'PhpParser\\' => + array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), - 'Peast\\' => - array( + 'Peast\\' => + array ( 0 => __DIR__ . '/..' . '/mck89/peast/lib/Peast', ), - 'PantheonSystems\\CDNBehatHelpers\\' => - array( + 'PantheonSystems\\CDNBehatHelpers\\' => + array ( 0 => __DIR__ . '/../..' . '/web/modules/pantheon_advanced_page_cache/tests/behat/helper_classes', ), - 'PHPMailer\\PHPMailer\\' => - array( + 'PHPMailer\\PHPMailer\\' => + array ( 0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src', ), - 'OomphInc\\ComposerInstallersExtender\\' => - array( + 'OomphInc\\ComposerInstallersExtender\\' => + array ( 0 => __DIR__ . '/..' . '/oomphinc/composer-installers-extender/src', ), - 'Masterminds\\' => - array( + 'Masterminds\\' => + array ( 0 => __DIR__ . '/..' . '/masterminds/html5/src', ), - 'League\\Uri\\' => - array( + 'League\\Uri\\' => + array ( 0 => __DIR__ . '/..' . '/league/uri-interfaces', ), - 'League\\Container\\' => - array( + 'League\\Container\\' => + array ( 0 => __DIR__ . '/..' . '/league/container/src', ), - 'GuzzleHttp\\Psr7\\' => - array( + 'GuzzleHttp\\Psr7\\' => + array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), - 'GuzzleHttp\\Promise\\' => - array( + 'GuzzleHttp\\Promise\\' => + array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), - 'GuzzleHttp\\' => - array( + 'GuzzleHttp\\' => + array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), - 'Grasmash\\YamlCli\\' => - array( + 'Grasmash\\YamlCli\\' => + array ( 0 => __DIR__ . '/..' . '/grasmash/yaml-cli/src', ), - 'Grasmash\\Expander\\' => - array( + 'Grasmash\\Expander\\' => + array ( 0 => __DIR__ . '/..' . '/grasmash/expander/src', ), - 'Gettext\\Languages\\' => - array( + 'Gettext\\Languages\\' => + array ( 0 => __DIR__ . '/..' . '/gettext/languages/src', ), - 'Gettext\\' => - array( + 'Gettext\\' => + array ( 0 => __DIR__ . '/..' . '/gettext/gettext/src', 1 => __DIR__ . '/..' . '/gettext/translator/src', ), - 'FontLib\\' => - array( + 'FontLib\\' => + array ( 0 => __DIR__ . '/..' . '/dompdf/php-font-lib/src/FontLib', ), - 'Egulias\\EmailValidator\\' => - array( + 'Egulias\\EmailValidator\\' => + array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), - 'Drush\\' => - array( + 'Drush\\' => + array ( 0 => __DIR__ . '/..' . '/drush/drush/src', ), - 'Drupal\\bootstrap\\' => - array( + 'Drupal\\bootstrap\\' => + array ( 0 => __DIR__ . '/../..' . '/web/themes/bootstrap/src', ), - 'Drupal\\Core\\' => - array( + 'Drupal\\Core\\' => + array ( 0 => __DIR__ . '/../..' . '/web/core/lib/Drupal/Core', ), - 'Drupal\\Composer\\Plugin\\Scaffold\\' => - array( + 'Drupal\\Composer\\Plugin\\Scaffold\\' => + array ( 0 => __DIR__ . '/..' . '/drupal/core-composer-scaffold', ), - 'Drupal\\Component\\' => - array( + 'Drupal\\Component\\' => + array ( 0 => __DIR__ . '/../..' . '/web/core/lib/Drupal/Component', ), - 'DrupalCodeGenerator\\' => - array( + 'DrupalCodeGenerator\\' => + array ( 0 => __DIR__ . '/..' . '/chi-teck/drupal-code-generator/src', ), - 'Doctrine\\Deprecations\\' => - array( + 'Doctrine\\Deprecations\\' => + array ( 0 => __DIR__ . '/..' . '/doctrine/deprecations/src', ), - 'Doctrine\\Common\\Lexer\\' => - array( + 'Doctrine\\Common\\Lexer\\' => + array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/src', ), - 'Doctrine\\Common\\Annotations\\' => - array( + 'Doctrine\\Common\\Annotations\\' => + array ( 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', ), - 'Dflydev\\DotAccessData\\' => - array( + 'Dflydev\\DotAccessData\\' => + array ( 0 => __DIR__ . '/..' . '/dflydev/dot-access-data/src', ), - 'Consolidation\\SiteProcess\\' => - array( + 'Consolidation\\SiteProcess\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/site-process/src', ), - 'Consolidation\\SiteAlias\\' => - array( + 'Consolidation\\SiteAlias\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/site-alias/src', ), - 'Consolidation\\OutputFormatters\\' => - array( + 'Consolidation\\OutputFormatters\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/output-formatters/src', ), - 'Consolidation\\Log\\' => - array( + 'Consolidation\\Log\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/log/src', ), - 'Consolidation\\Filter\\' => - array( + 'Consolidation\\Filter\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/filter-via-dot-access-data/src', ), - 'Consolidation\\Config\\' => - array( + 'Consolidation\\Config\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/config/src', ), - 'Consolidation\\AnnotatedCommand\\' => - array( + 'Consolidation\\AnnotatedCommand\\' => + array ( 0 => __DIR__ . '/..' . '/consolidation/annotated-command/src', ), - 'Composer\\Semver\\' => - array( + 'Composer\\Semver\\' => + array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), - 'Composer\\Installers\\' => - array( + 'Composer\\Installers\\' => + array ( 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', ), - 'Asm89\\Stack\\' => - array( + 'Asm89\\Stack\\' => + array ( 0 => __DIR__ . '/..' . '/asm89/stack-cors/src', ), ); - public static $prefixesPsr0 = array( - 'D' => - array( - 'Detection' => - array( + public static $prefixesPsr0 = array ( + 'D' => + array ( + 'Detection' => + array ( 0 => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/namespaced', ), ), - 'C' => - array( - 'Console' => - array( + 'C' => + array ( + 'Console' => + array ( 0 => __DIR__ . '/..' . '/pear/console_getopt', ), ), - 'A' => - array( - 'Archive_Tar' => - array( + 'A' => + array ( + 'Archive_Tar' => + array ( 0 => __DIR__ . '/..' . '/pear/archive_tar', ), ), ); - public static $classMap = array( + public static $classMap = array ( 'Archive_Tar' => __DIR__ . '/..' . '/pear/archive_tar/Archive/Tar.php', 'Asm89\\Stack\\Cors' => __DIR__ . '/..' . '/asm89/stack-cors/src/Cors.php', 'Asm89\\Stack\\CorsService' => __DIR__ . '/..' . '/asm89/stack-cors/src/CorsService.php', @@ -7548,7 +7548,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'phpowermove\\docblock\\tags\\VarTag' => __DIR__ . '/..' . '/phpowermove/docblock/src/tags/VarTag.php', 'phpowermove\\docblock\\tags\\VersionTag' => __DIR__ . '/..' . '/phpowermove/docblock/src/tags/VersionTag.php', 'wcm_site_scripts\\composer\\SimplesamlphpConfigurator' => __DIR__ . '/../..' . '/scripts/wcm-osu/composer/SimplesamlphpConfigurator.php', - '�' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php', + '�' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php', ); public static function getInitializer(ClassLoader $loader) @@ -7558,6 +7558,7 @@ public static function getInitializer(ClassLoader $loader) $loader->prefixDirsPsr4 = ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530::$prefixesPsr0; $loader->classMap = ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530::$classMap; + }, null, ClassLoader::class); } } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index bba57358e502fb57de7eb93966f1d2079e8ce2ee..d0ce65fcebbbc8dd7e4b38cd568e715ee2ed50cb 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1829,27 +1829,27 @@ }, { "name": "drupal/block_permissions", - "version": "1.3.0", - "version_normalized": "1.3.0.0", + "version": "1.4.0", + "version_normalized": "1.4.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/block_permissions.git", - "reference": "8.x-1.3" + "reference": "8.x-1.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/block_permissions-8.x-1.3.zip", - "reference": "8.x-1.3", - "shasum": "f12967eba6498a77249836849b4245c98af60867" + "url": "https://ftp.drupal.org/files/projects/block_permissions-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "f5fb4fbf026517eb0ce9063213c33b00e49bb74c" }, "require": { - "drupal/core": "^9.3 || ^10" + "drupal/core": "^9.3 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-1.3", - "datestamp": "1680965820", + "version": "8.x-1.4", + "datestamp": "1736247569", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -1875,7 +1875,7 @@ "homepage": "https://www.drupal.org/user/682600" }, { - "name": "Steven Buteneers", + "name": "steven buteneers", "homepage": "https://www.drupal.org/user/3301055" } ], @@ -4882,34 +4882,31 @@ }, { "name": "drupal/menu_breadcrumb", - "version": "2.0.0-alpha0", - "version_normalized": "2.0.0.0-alpha0", + "version": "2.0.0", + "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/menu_breadcrumb.git", - "reference": "2.0.0-alpha0" + "reference": "2.0.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/menu_breadcrumb-2.0.0-alpha0.zip", - "reference": "2.0.0-alpha0", - "shasum": "d031d6a859b3f20a290fd9f812fdc4dace0810ef" + "url": "https://ftp.drupal.org/files/projects/menu_breadcrumb-2.0.0.zip", + "reference": "2.0.0", + "shasum": "016f2eead9cf9d4bfdf4b36fca5e3c8a8e8d0f1e" }, "require": { - "drupal/core": "^8.8 || ^9 || ^10" + "drupal/core": "^9 || ^10 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.0-alpha0", - "datestamp": "1675717886", + "version": "2.0.0", + "datestamp": "1736662457", "security-coverage": { - "status": "not-covered", - "message": "Alpha releases are not covered by Drupal security advisories." + "status": "covered", + "message": "Covered by Drupal's security advisory policy" } - }, - "patches_applied": { - "duplicate_current_page_of_views": "https://www.drupal.org/files/issues/2023-05-26/duplicate_current_page_of_views.patch" } }, "installation-source": "dist", @@ -4943,10 +4940,11 @@ "homepage": "https://www.drupal.org/user/76026" } ], - "description": "Create breadcrumbs from nested menu titles and/or taxonomy membership.", + "description": "Create breadcrumbs from nested menu titles and/or taxonomy membership..", "homepage": "https://www.drupal.org/project/menu_breadcrumb", "support": { - "source": "https://git.drupalcode.org/project/menu_breadcrumb" + "source": "https://git.drupalcode.org/project/menu_breadcrumb", + "issues": "https://www.drupal.org/project/issues/menu_breadcrumb" }, "install-path": "../../web/modules/menu_breadcrumb" }, @@ -5896,27 +5894,27 @@ }, { "name": "drupal/roleassign", - "version": "2.0.2", - "version_normalized": "2.0.2.0", + "version": "2.0.3", + "version_normalized": "2.0.3.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/roleassign.git", - "reference": "2.0.2" + "reference": "2.0.3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/roleassign-2.0.2.zip", - "reference": "2.0.2", - "shasum": "186a31d7ed2cc846c148e4d49cdc0b35e86e21ce" + "url": "https://ftp.drupal.org/files/projects/roleassign-2.0.3.zip", + "reference": "2.0.3", + "shasum": "99f50d92634abc60e1de89e6559334f5f05deacf" }, "require": { - "drupal/core": "^9.1 || ^10" + "drupal/core": "^10.1 || ^11" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.2", - "datestamp": "1713184816", + "version": "2.0.3", + "datestamp": "1736794235", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5956,18 +5954,18 @@ }, { "name": "drupal/scheduler", - "version": "2.1.0", - "version_normalized": "2.1.0.0", + "version": "2.2.0", + "version_normalized": "2.2.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/scheduler.git", - "reference": "2.1.0" + "reference": "2.2.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/scheduler-2.1.0.zip", - "reference": "2.1.0", - "shasum": "aea0f1dc40cfbc75f470860998d773a8749bcee2" + "url": "https://ftp.drupal.org/files/projects/scheduler-2.2.0.zip", + "reference": "2.2.0", + "shasum": "b33463ea677f5e14e4f5602a261b3d86360ddc14" }, "require": { "drupal/core": "^8 || ^9 || ^10 || ^11" @@ -5983,8 +5981,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.0", - "datestamp": "1723723795", + "version": "2.2.0", + "datestamp": "1736417382", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -6483,18 +6481,18 @@ }, { "name": "drupal/svg_image", - "version": "3.2.0", - "version_normalized": "3.2.0.0", + "version": "3.2.1", + "version_normalized": "3.2.1.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/svg_image.git", - "reference": "3.2.0" + "reference": "3.2.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/svg_image-3.2.0.zip", - "reference": "3.2.0", - "shasum": "d55ef2bc3b751b8ce3f33485216c38cfbfb076b2" + "url": "https://ftp.drupal.org/files/projects/svg_image-3.2.1.zip", + "reference": "3.2.1", + "shasum": "4623b9d0de4c624857df10daaa8c68793942ad87" }, "require": { "drupal/core": "^10.3 || ^11", @@ -6503,8 +6501,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.2.0", - "datestamp": "1733298643", + "version": "3.2.1", + "datestamp": "1736865227", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index d88ccddf6a37fee8b6903da6acb910f5a3b956cf..1a2c30ef10a2f64018837a0b9d63b99668eebf4d 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'asc-web-services/drupal-upstream', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '35a9e7493786ea29d6ef8d7345a63ee460ab777a', + 'reference' => '12014248cb728442dfbd8a7fa5743306eafe7e8d', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -22,7 +22,7 @@ 'asc-web-services/drupal-upstream' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '35a9e7493786ea29d6ef8d7345a63ee460ab777a', + 'reference' => '12014248cb728442dfbd8a7fa5743306eafe7e8d', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -281,9 +281,9 @@ 'dev_requirement' => false, ), 'drupal/block_permissions' => array( - 'pretty_version' => '1.3.0', - 'version' => '1.3.0.0', - 'reference' => '8.x-1.3', + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'reference' => '8.x-1.4', 'type' => 'drupal-module', 'install_path' => __DIR__ . '/../../web/modules/block_permissions', 'aliases' => array(), @@ -839,9 +839,9 @@ 'dev_requirement' => false, ), 'drupal/menu_breadcrumb' => array( - 'pretty_version' => '2.0.0-alpha0', - 'version' => '2.0.0.0-alpha0', - 'reference' => '2.0.0-alpha0', + 'pretty_version' => '2.0.0', + 'version' => '2.0.0.0', + 'reference' => '2.0.0', 'type' => 'drupal-module', 'install_path' => __DIR__ . '/../../web/modules/menu_breadcrumb', 'aliases' => array(), @@ -974,18 +974,18 @@ 'dev_requirement' => false, ), 'drupal/roleassign' => array( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'reference' => '2.0.2', + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'reference' => '2.0.3', 'type' => 'drupal-module', 'install_path' => __DIR__ . '/../../web/modules/roleassign', 'aliases' => array(), 'dev_requirement' => false, ), 'drupal/scheduler' => array( - 'pretty_version' => '2.1.0', - 'version' => '2.1.0.0', - 'reference' => '2.1.0', + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', + 'reference' => '2.2.0', 'type' => 'drupal-module', 'install_path' => __DIR__ . '/../../web/modules/scheduler', 'aliases' => array(), @@ -1055,9 +1055,9 @@ 'dev_requirement' => false, ), 'drupal/svg_image' => array( - 'pretty_version' => '3.2.0', - 'version' => '3.2.0.0', - 'reference' => '3.2.0', + 'pretty_version' => '3.2.1', + 'version' => '3.2.1.0', + 'reference' => '3.2.1', 'type' => 'drupal-module', 'install_path' => __DIR__ . '/../../web/modules/svg_image', 'aliases' => array(), diff --git a/web/modules/block_permissions/.gitlab-ci.yml b/web/modules/block_permissions/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..77a0d7d3276f9323341aabe3bbdf264e6679bdff --- /dev/null +++ b/web/modules/block_permissions/.gitlab-ci.yml @@ -0,0 +1,26 @@ +################ +# GitLabCI template for Drupal projects. +# +# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. +# It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained. +# As long as you include the project, ref and three files below, any future updates added by the Drupal Association will be used in your +# pipelines automatically. However, you can modify this template if you have additional needs for your project. +# The full documentation is on https://project.pages.drupalcode.org/gitlab_templates/ +################ +include: + - project: $_GITLAB_TEMPLATES_REPO + ref: $_GITLAB_TEMPLATES_REF + file: + - "/includes/include.drupalci.main.yml" + - "/includes/include.drupalci.variables.yml" + - "/includes/include.drupalci.workflows.yml" +################ +# Pipeline configuration variables are defined with default values and descriptions in the file +# https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes/include.drupalci.variables.yml +# Uncomment the lines below if you want to override any of the variables. The following is just an example. +################ +variables: + OPT_IN_TEST_PREVIOUS_MAJOR: 1 + OPT_IN_TEST_PREVIOUS_MINOR: 1 + OPT_IN_TEST_MAX_PHP: 1 + _CSPELL_WORDS: 'evgenii, nikitin, michiel, nugter, undraggable' diff --git a/web/modules/block_permissions/block_permissions.info.yml b/web/modules/block_permissions/block_permissions.info.yml index 4c5160838131348a6cb29fec90970146f778384b..65dfe9165062d3eb22b65126c57738cfac6cfad4 100644 --- a/web/modules/block_permissions/block_permissions.info.yml +++ b/web/modules/block_permissions/block_permissions.info.yml @@ -2,9 +2,9 @@ name: 'Block Permissions' type: module description: 'Adds specific permissions for administering blocks.' package: Block -core_version_requirement: ^9.3 || ^10 +core_version_requirement: ^9.3 || ^10 || ^11 -# Information added by Drupal.org packaging script on 2023-04-08 -version: '8.x-1.3' +# Information added by Drupal.org packaging script on 2025-01-07 +version: '8.x-1.4' project: 'block_permissions' -datestamp: 1680965779 +datestamp: 1736247572 diff --git a/web/modules/menu_breadcrumb/.cspell-project-words.txt b/web/modules/menu_breadcrumb/.cspell-project-words.txt new file mode 100644 index 0000000000000000000000000000000000000000..c842164918e0e076b5aa52e0c0cdd1a554447a83 --- /dev/null +++ b/web/modules/menu_breadcrumb/.cspell-project-words.txt @@ -0,0 +1,3 @@ +breadcrumbed +langhandle +taxattach diff --git a/web/modules/menu_breadcrumb/.gitignore b/web/modules/menu_breadcrumb/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5e2d7ba1188676af37361a54e55ee8ec1bdcfe36 --- /dev/null +++ b/web/modules/menu_breadcrumb/.gitignore @@ -0,0 +1 @@ +.gitlab-ci-local/ diff --git a/web/modules/menu_breadcrumb/.gitlab-ci.yml b/web/modules/menu_breadcrumb/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..c6cd69aa31ead90c957c72ffb8038a791f62dd1f --- /dev/null +++ b/web/modules/menu_breadcrumb/.gitlab-ci.yml @@ -0,0 +1,29 @@ +################ +# GitLabCI template for Drupal projects. +# +# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. +# It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained. +# As long as you include the project, ref and three files below, any future updates added by the Drupal Association will be used in your +# pipelines automatically. However, you can modify this template if you have additional needs for your project. +# The full documentation is on https://project.pages.drupalcode.org/gitlab_templates/ +################ + +# For information on alternative values for 'ref' see https://project.pages.drupalcode.org/gitlab_templates/info/templates-version/ +# To test a Drupal 7 project, change the first include filename from .main.yml to .main-d7.yml +include: + - project: $_GITLAB_TEMPLATES_REPO + ref: $_GITLAB_TEMPLATES_REF + file: + - '/includes/include.drupalci.main.yml' + - '/includes/include.drupalci.variables.yml' + - '/includes/include.drupalci.workflows.yml' +# +################ +# Pipeline configuration variables are defined with default values and descriptions in the file +# https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes/include.drupalci.variables.yml +# Uncomment the lines below if you want to override any of the variables. The following is just an example. +################ +# variables: +# SKIP_ESLINT: '1' +# OPT_IN_TEST_NEXT_MAJOR: '1' +# _CURL_TEMPLATES_REF: 'main' diff --git a/web/modules/menu_breadcrumb/PATCHES.txt b/web/modules/menu_breadcrumb/PATCHES.txt deleted file mode 100644 index 75e3bd1002a25d0e28eca33ac4b2939636539f8a..0000000000000000000000000000000000000000 --- a/web/modules/menu_breadcrumb/PATCHES.txt +++ /dev/null @@ -1,7 +0,0 @@ -This file was automatically generated by Composer Patches (https://github.com/cweagans/composer-patches) -Patches applied to this directory: - -duplicate_current_page_of_views -Source: https://www.drupal.org/files/issues/2023-05-26/duplicate_current_page_of_views.patch - - diff --git a/web/modules/menu_breadcrumb/README.md b/web/modules/menu_breadcrumb/README.md index b55e03cd790698bfebc05ec0494da9e4ff13024c..96ba52a883071bc50f156a474d2fa9a6a7ca7d25 100644 --- a/web/modules/menu_breadcrumb/README.md +++ b/web/modules/menu_breadcrumb/README.md @@ -2,7 +2,7 @@ ## Introduction -The Drupal 7 version of this module implemented the Drupal 6 behaviour of +The Drupal 7 version of this module implemented the Drupal 6 behavior of using the menu position of the current page for the breadcrumb. It also added an option to append the page title to the breadcrumb (either as a clickable url or not), saving the trouble of doing this in the theme, @@ -26,18 +26,17 @@ Follow current instructions on this Drupal documentation page to install Menu Breadcrumb as a site dependency and upgrade it along with other site dependencies (as well as Drupal Core itself): -<<<<<<< HEAD:README.md <https://www.drupal.org/docs/develop/using-composer/using-composer-to-manage-drupal-site-dependencies> -======= -* https://www.drupal.org/node/2718229 ->>>>>>> Issue #3212252: Update info.yml for 2.0.x / Drupal 9:README.txt -IF YOU SEE AN ERROR PAGE similar to the following after up- or down-grading the module: +IF YOU SEE AN ERROR PAGE similar to the following after up- or +down-grading the module: -TypeError: Argument <X> passed to Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder::__construct() ... +TypeError: Argument <X> passed to +Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder::__construct() ... -... you probably just need to rebuild the cache between two versions that use -different argument lists (i.e. system services). See here for how to rebuild cache: +... you probably just need to rebuild the cache between two versions that use +different argument lists (i.e. system services). See here for how to rebuild +cache: <https://www.drupal.org/docs/user_guide/en/prevent-cache-clear.html> @@ -58,8 +57,8 @@ then run "update.php" if present (to install any configuration changes). Since different versions of the module may use different services, if you see errors: -- Try clearing the cache, which fixes breacrumb on taxonomy pages (since this - module's breadcrumb builder needs to be acknolwedged as higher priority). +- Try clearing the cache, which fixes breadcrumb on taxonomy pages (since this + module's breadcrumb builder needs to be acknowledged as higher priority). - Clearing the cache (at least the router cache) should clear up messages about any services missing (known issue upgrading beta1 to beta2). - If all else fails, try uninstalling & reinstalling the module. diff --git a/web/modules/menu_breadcrumb/composer.json b/web/modules/menu_breadcrumb/composer.json new file mode 100644 index 0000000000000000000000000000000000000000..f995bf66d9a51372e8d1b62bbacad087bc05047d --- /dev/null +++ b/web/modules/menu_breadcrumb/composer.json @@ -0,0 +1,14 @@ +{ + "name": "drupal/menu_breadcrumb", + "type": "drupal-module", + "description": "Create breadcrumbs from nested menu titles and/or taxonomy membership..", + "homepage": "https://www.drupal.org/project/menu_breadcrumb", + "license": "GPL-2.0-or-later", + "support": { + "issues": "https://www.drupal.org/project/issues/menu_breadcrumb", + "source": "https://git.drupalcode.org/project/menu_breadcrumb" + }, + "require": { + "drupal/core": "^9 || ^10 || ^11" + } +} diff --git a/web/modules/menu_breadcrumb/logo.png b/web/modules/menu_breadcrumb/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2df2994d5769c99594ed0a47a805be8f415a2c04 --- /dev/null +++ b/web/modules/menu_breadcrumb/logo.png @@ -0,0 +1,47 @@ +�PNG + +��� IHDR����������x�����iCCPICC profile��(�}�=H�P�OSKE*v�P�,��8j�P!� +�:����4$).��k���Ū������ ��.8)�H��%�1^x����9�w 4*L��fM��t2!fs�b�D�0�efs���o}�S7�]�g���Y�j�b@@$�e�ioOo��}�(+�*�9�I$~�����ό���<q�X,v����dj�S�1U�)_�z�r��Uj�uO��H^_Y�:�!$��%H���2*��]'�B��>�A�/�K!W��B�������l��䄗I����»@��8�ǎ�<������W��'���;����붦��;���!��+i ��~Fߔ�o��5on�s�>��U�88F�������ι��Ӛ��5r�������bKGD������������� pHYs�� ��� �B(�x���tIME�01z���� �IDATx���yxSU���O��m +�PJ��"PdG�(��R7���GDf|@G���uPG�3#*#"Kk�E�qT(�� �B[ +t�6m����Ì�@oۤM���yxMO�=�ܛ�O�r��7�p���)f������� ������� ������� ������� ������� ������� ������� ����:�rV�8�lM���J��siIfK���J�J�آ�����p�iђS-u�Ԫs�AZ��JN[�����n����B��������jifK���Ժ��p���-�^����B�.[�����n����\��˖9R�7O���M���V��6��°2�,�ڳM��������� \��Gx�n��e�z�ʧ��V�V������Zs&��u�٤�F�hE� +2{��L�O��@�P��A�kvs�z9����5�S ���^��j��;�&-�n�\��������wN7S��s��f�л��B��ߛ[x�+p�����r���� 57��!�^m"�t���/r�n�����?�C�Q^$[��@�G�C����2"D��A!A�ͷZLzwl'������s�:�e�������m���M�ҥ���&���� �/�ަ ��|L'Y~qQ�K&���Lv7A��m{eܪ�h�vx����V��oX�����д��j�����~�Ԫ�r���&��}^�@V�C�Z�Vʽ��a �'v��+�ڲ����N�*��w�.=��*������`���MN��U��)�Y=�����;�k߾�:q�����T\l�-Vk���+Qd�yu옩.]���3�P{�����|��{����hg��g��Ӗ�����K^�}��n��@�a��͏������e����?k�N^T�����hw����}�F~9R7��J���W���t�\� +���� ������ys]uU���3�n}�o3��p�\f�ɉ�x�~�E��z���_6ݘMz{L��C<s�Ꜩ�zhP�������:�~v����7��Ur��k��-�]{����~�/�ȑh͛7L;wv��@����F)�����îUǨ�O�ӮQ� ����g��6�uo�!�� �?��-Z�c�ߗ���]���~���hٲ�u�pS������p�8T_����wpL��o���[��M58�����#t�Xw4;~\q�W�ZRR������v�(56U;���[���ƍ�?�PZjѻ��*7s]�0(`�pK��L�/�� -rM��_2�Z}�c�r���]�[Zs6ZO�HW =7�ى�{�}m��^9���o��䓀�y_y�ρ�\��Q��Q��M�oճ��uM�*k�o��p�Lz��ކ�.]���_P�Vg�����iRvvC}��5ں�Z�13fFF���o�.]��fPs���8�c^�џ9���{��=�6��{��^�������8QmGj��/Ia�a����x'M�8Y�v2TϹz��e�/}�{�*3����#F���~���� +/TXX�ǿ ���!S����~���v����m�VPs��mV�9�C�]���:�oE=rsum^����sQr����22�<tݱ�F�e1ɤ�;��˱.��v{}ކ}��*w�M?j��=媻g�{���~hƷ���>�W^���/ ��c2�ʰ�MZ8��_Ny�m-�� �,#C�V�Vp���;v�g-;�?`��C�E����ӛ*�� +��-�y���[�o5�5#������9�G��D�]���˻�m��w��b�(���t����>���u��Z7�KR��me2p��y�y�L.�.;?��]+���}�,��&�[.3]([�_���8-��_���ߖ����`��?{<`�ӢO�"����7�Z�M�G���vݾ]=k�ao�N�L.���+_��2��r(��e��/8��B�ׯo�+��ͷ��w��m�'�����c��&a~[�5M�46���-���p�vc5=yRw���B�v�@� ��.4P�/&��ZL�����Ǭ���]h�,*3Sw�Z����J��� S��?��U��<�_�#;G�}c�ߗݾ�M�t��x�y ~��"�n߮���<�V������c�M'J<Ϸ>ާU��a��e�, яŶ��pQYY����������i}�E�{���"��:\��z���UA��t�ʕ� +um�wXr�˾��C�@��R����Gz�������2� +���̩����V�T���m�Z�~��G���A�@�����t�y��[�>��߆v�R��KoC��4뛢�P%/2�B!`ЪUW�;��֭�m�_��>��q�e����H7� ���mo���:�S���*�Y-�eb�=�'�|8v��5.�c��23u�e�tߺU7�g�o�H�[�w|��W��b�ˢ?yPf&�@��/�[�����1���,so����V-�V-�WO��ܨ� i��kBvM@���x]�_3��u��:�����/Z�k��������̫�&�P�T�L�'�����u�U�w��m��f5���ߋ��A:�Q���j ɣFi�{�)�\�f&��nj� �v����CS<^�� M���l+���}j�՞o����]Q=��~u�Opu 2�v ��Cg/m�=�Z�$]h�@����}W�yy��ٺ������\��ر*�A��C +�U��*�D�n>t�����?��U������W7����߱�G�8bկ����� ����P(���a||���#*?J�g\����#k��O>�@U/0��3��lS�����e>�S���|��0>^��{O rs}^M?�oDNx�>�L�]����V�p� �9T��5��@�U���K�&e�\���d�b�֫���Դ�L�8"�]bUi�&>���cU�з�I���?�8��_YW�;�J�*M�����]6� ��#�U!�,�/���2<D C���Ċ R��e�����K&e9�j\!`̘����t@m����ۯx}=?,_{��Շ�?Tn���&.�K��@N�Sq{��&����-�词�0�q����9�|���%�]�A���/�ު��=��+_đ�#Q������� +��mR/pب0϶�1�����9��]h���+��w�\Z�r�ͷ���xL���E^�R����s�~�z_]�/��2'"O�`�|� ����K���`2��@ Ic��u�.��y>R&�}!gYS���^���4��������EF�C�����_�i����m�}���6�@��`��y֟O�[� +K\^�� +� ��njQa�z��p��9:��_B���~��8�@�g[B́qXn���p�X�"�3��8TTBG� ��CC�����[0��~��Q� ͎�!s7V�Q��l���Ǝe�/��;���"�Z��ڷ�/Lg|{�s��FA�5fc���V�1�n�����w ���*��I�CV�[��M��UP��v�nZ�q�]��/=l5����Q�Lt���?{��9,� ��1�Ͳ�xҧ��R�]gII����4 +B5c��K^3���^Z.s�_������j������>�œ�%�MH�,�ю59fh�����e>G���Ë���X� +��p3�\���21��� Im�_��>]��x0dz��E�!5\jl��rmO����۴1�_��t��9s���<^k��@`�.a�=}VG�V�`{�]{9��K[Q3��ֆ����>C����6��3T���6ڰ��r��mۮ���m<Ck�L6>�C�|��!v5r�L�ύ��n���t-~m�t����u�o� ������ϋ6K-�Jo���;�oZ}c��F��=}Ν��E��:y2�̲�6��ȑh��Om���juz�q:���l��?�V_|q�����;���&I���i�٨K^_����R]�W�mk{O��ۻ<5��'��$�Myh�O���H���}f�[�F}�E���.{g������^^˖gu� ����}GU�B{7�W���_8N�[�VT��Yu� N=��ǯ�z�z5�c��������Ј;���K��[ ��;����������Y��{U������.�����hj@��q%u�f�Iq{�4���~_֝w�Ո;d��%V�S�������?�Hҭ �y�%��or4���z$���Ԩ�P�7�W�� +����\��Z,*?J���[ �1L&w��d0`�<EM�����UWekڴ ���0@�T۳x�L�Cљ�SFk9�f��g�.�5:����=u^����?���CM��a�Z%�4D"�&���몛~�IA����o�Ḯ��}���Ӟ=�t�X���Sq���X���W�X��Ա�)u�rLW_ͯ~�cz�7�u�������-�����l��ݛ멾mtU��R�9r�H�?I�[�Ny��~z��D��z�"���?�V��g��r���&��_�H�nh��#ն��i�������j��9����r]�Fk�I�8[�p���� +�F�i���f��9�\%^�ɺ�nm���6��d=���u]t��4U�0������p�u�С�sv}{��cno�Mn=��/���:t�wAS���vv3/ �b���%���4���L��9���@�ij-��[�볂FJ͍��nR�gqi@������@@4�$�:��z�����,��%�WF� �n�S�y��� ��0�K�"ruGD�ҋC����~(��xI��m��c5��:�XmE�vAm��̔�@ ��L��BmC�R#�%��K�:�*��"��"�/��� +59�0ȩF���2��V����_2˭f�%j&.�����)�� ������� ������� ������� ������� ������� ����������w���r��k@���:�S�����������JA��O�>�կ~E���PKmݺU۶m�4���W�Ҵi����j���S����A����������������������������������������������������������������������������������������������������������������Բ�кukEFF���օ��^{�5EFFz�+--e�������?��ѣ:,]�T�=�{�����0jԨ�K�.�����{�����/.0���U��^�?��۲d�����|��5jT���%K�hƌ�1��@U���:��� �T��۷WyX�x1�?���!`�ȑ*((���?!!���P���F�رC�F�������e/���f͚U���t: �� �b��lٹ��e�1�L���0����p�;ɜn�[yyyj_U���? x���ՠA�Z3�k͚5JNN��ݻ���#��e�f�YQQQ�ҥ����4z�h���U�-;v,s�6�Mr8Z�d�V�X�Ç{-k�X���X���iԨQ + �P�JJJԾ}�2�5n�X�*�\~~���BBBt��)�9��x5�Y�;v���逗^z�����d���S�&MRJJ���� ���r������?�X��Խ{w}��Ur���ԋ/�x���b���,�����'�T�=���ħ�����W_�{�Q~~~��?�fϞ]���v�5o�<=���JOO�Y����z�G4s�L��n�����JMM-��2224n�8͟?�O"���o�Ν��ӟ4gΜji��/��y���m�^�`�_�͊+*~�̙��i�@��ڵK#F�0t!����ܹ���>��J���/�������^�ۭ���J�3k�,������@����!`y�6������3��?..NIII:q�222�q�F�}�݆���s��n��t�v� +%IC�ѦM�������%%%��;�4$�}�Y�����@����iĈ�na�7o��͛WmmMMM5t��$=��z��wէO����f��W�^z�w�Up��I�^��/�2k�,���[�ٳ�l6�l6���飕+Wj�ԩ��8r�6l�����R���Ν[���"�(��Cރ ������}��Ɇ�lڴ���q�=�h�ĉ����O?�~��U[���50��_��B��={4|�p�;w�����?��\��?nWۻw��r�=��O�\�_�e��� �����M�j�ƍ��k*4�6LgΜ�������f͚�|ݲ������-�̍7�h����9�N��@f�:w�\f��]���O���<�HR�&M�v�Z]u�U�~����5b��={V�gϮ�/��͛�e�.^<W#�����((���N�O/4�\�S6�k�#�@�Ԙ��[�h���D <XG�-w�ݻ�N�>]�������@9�l�RIIIj]��[���_��� �T0$&&�m۶~�����������4�V�Zi���<x�N�8Q�#s��P��$�m�V���<x�O�ȿ��<�����3�n�Zk����a����i߾}�o������U����@-IIIjڴ)�?��e�M+s1<��S�ִ���ٳ�����\Iǎ������h~��PW�$]}��JJJR�&M.y���@��!`�ڵjܸ1�?��u%�HR�N��n�:u��]���jѢ[��ղ������y��l[XX�.\�Pf���"�l�r�_\\�믿�c�����d����j�*((H���W,g��S�8�J�܅�����V���;����K��hѢ���d6�Uf9�ݮ����r�v�b�@�@Ո��5TnѢEr���?%%��nݺ՚���� �ߕ8�N�������qqq��}��G�9sf�B��C���+�x�>hР:�+W��ҥK����r�駟�����<��_�+����Ç+55UYYY��sss������4͛7O���W^^�%u�j�J��rK�鿑#G�e˖��N�>]�����?����leee)%%E�����7vF�uN]P},�fϞ�{�G.����~��>��� +/oڴi�X,���BCC��/j���ʧ��x=-"�t=Fvv6;%����j���W U��1c�Ժ�6l�&O�\�zz��������5i�$%$$�l����ܹ�����ժ_�?7}��J����xvD��T�ɓ'k�ʕ�С���Z�?~�RSSY{wb�Y Z�l�Z�n]���7�V]�Fp @��߿�������d%''kϞ=:u� + �?44T�7VǎէO�=�BbM5t�P 8P�֭ӦM�t��eff���ȣ��f�u�]�q������W~~>; �@u9~�x@wVU<��j�jذa6lX��oNN��� +��� ј1c�}�CDD�]P�p +������ ������� ������� ������� ������� ������� ������� ������� ����������@�������@�������@�������@�������@�������@�������@�������@����? +�ƴn�Z.\�Y}6�MM�6U�.]4h� :T!!!luTةS�ԩS�2�EFF�~���p�:��ѣJLLԄ ԳgO%%%����������z衇��3���r������7�Ћ/������E�i������:)�&6���x��ph߾}Z�t�>��C�<��s8p�BCC���t 6��פI���O|���z�)C��<yR�W�f/���j:�ɤ?��8p���7nd/���j�'�x�P�={����꜠ںb7�x�L&��n�˝9sFN�S���:sss�,c2�Qf���R�?�B����t����P���p��U����I�"""d2��}���|k� ����Y,����9p��vիW��:;v�X��6�M�<xP+W�Զm�t��a������n��ի����={��̙3��6�X,���Rll����4j�(�_�w�^�^�Z[�n�ѣG �����[�n����ȑ#}>�cAA�V�\��7����:}�4������\M�2E���e�0jݺu�>}�N�<Y�YYYJMMUjj��ϟ�ٳgk����n�ٳg��O*99���{�}7n�ƍs=���IDAT��K/i�ܹ0`�O��w��̙3���� +���a@����<yR���׆ |2��\.�������� +��dddhܸq�?~����o~�?��gaG��;���OK�,�T=�CO>���|�I��}u�BBBd��|^oqq�x��sTԬY��h�"����֜9s�`�� +��>�#G���}.�K3f�П��� +���SO�w��S���iӦ~���7�TZZ���KJJ�+������5k�RRR�}}/g���'z��e˖i���|�������2/����o��/�^�p�O�1c���C�ѦM�������%%%��;�4|$��g�UII��啔�x=2a�X��c�i�֭:u�Ξ=���ĉZ�~�n��v�G�y�C�����|͞=�PY�ɤ��x����ɓ'=����_�������k��� ����>��U�III:v��_�o���z��)��&�ͦ>}�h�ʕ�:u��:�9� 6n�֭[����1���/�̙3s٫����t�m��>ФI�-��+�Q�+V�̙3���^{MK�,э7�����5�ҥK�,Ӿ}{ 2���i�O�3:��s�=�8q�e����O�_�~>_o�<x�� f��ɤ�^}���i�HRjj��r�>��F�ͷ�@M�����X�j�j��� + +����F�>����{�'eʻ�fS|衇ʽ�&�I&L0T�<����h��@mPk�p�\ڻw�/^\�c~����p�B������p��:t�O����u�I�lV�Ν�,kWC����2ܾ��ޣ-��"66�P9��X������Wf���H�nݚo��@־}{�� + + +�t:�|o�N��`�����/m������~:>~�x����j��썑)jCBBͨ_����(,,���24G�/a�L&C3+V�}Fg4:�pE���*ddN�_�w�q���^ 2�J���;w�}��:�5lؐO��G�v�Էo_�y����]eWu�3�������VOt��Q���ۺ��Ծ}{=��C������+]���G�*��!����_qr�ݮ��$mڴI3f���?Y,���Ty���nC�FG�l3o�?������.7�~vv�RRR4w�\eff^v �1c���L����b�Ty���v�GV���B�Z�J���ڿ�rrr|�� �@�ԪS����z������I�&W,;{�lm߾�=�V�\�nݺ����l٢ӧO3����Z�h�����W,�t:��SO10�������G=��c�G��@��#���믵e���>}�^�u:��էU�V��%&&����U�������X�V�����?��V���fSFFF�,���H/�����#G�ԣ�>�N�:�f�]<]u�U|2���_�5h�&k֬��]��`��7�N�jf��`��UTTĞP F���0�� p�\.:��>n�w������n�[999e���l��k�0������bC��X, + �u +sݒ�9�� +�Bx��9u����"##�s�NC��\ +F��}|oy�Έ���ji�p����� L��� + + +�]f�ө}��U����t���^���m�f�YQQQ��7�|Sf�]�v���BCC^f�3g�(==�����[�h��r7�xc��Kll�O����]�w�M7~��>,�}N�S�������h��Z����ҥK���@�Dn�[�g�Vjj��� +�u���3T.11Q���/W�_���A�����y�V�^}���r�駟��/�*�l�2��曗 'S�Lс���P+�$�%iڴi�6mZ�6�u�ֆαz{`II���ۧ�^{M�|��h�B_}���d4�U�lL��p8Իw��>���M�0A]�tQpp�����ӕ����_ݣ�;t�;v�d2Z��nW�=������#��S�Nr��JKK��ŋ��_��:u�P���ϫ[�n:}����C���?���9�N�ܹS�-*W8����?��7��2o�<͛7OR ��W��}�� ���j�j֬Y���7t]Ö-[*���g�y���/�t���_���� �OII����������i�կ__ z��� I����h�T�:{�O<��Çט�0@S�N��r�aÆ��}Æ ��ɓ+��=z�e������#�l�����g&�IS�Lь3j\ۧN��iӦ���yy�t�Mz���e6Wl��>}z�C@||���o�����o[�}g�ر|k� ��4�ڵ��o���ӧWx����2m�4-_�\�ڵ�Y�����8q���� �2wٝ�lVBB��-[�֭[����ƍ�-�����X,�3g�^�u5o��8qb��k���� +S���եK���iȐ!^/��i ����+11Q7nԾ}�t��)��4��l�����W_�[o�U�G�V�-|־�C�j���Z�n�6mڤ(33�k�l6����:�7N���������F������v�Z��������ʒ�n�����h���3f�� �T*���������x���u������ ������� ������� ������� ������� ������� ������� ������� ����������@�������@�������@�������@�������@�������@�������@��������UP�7�n�kݺuJII��_���Lzohh�6l�V�Z�W�^���S��ꨰ��b5o�r�7֡C��0���X�v�f̘��'OV8<dff*33S;w�Ԓ%Kԭ[7-X�@�;wf��<�v���/���+<�_ή]�t�wjݺul}�� �̝;W�-�[����z�Ǵc����� |���z饗�����b�������f/���9u ���Գ�>kxP0`�}�Qu��I���/--��Ç��{�����\.�%?x�6oެ�'����eӦM���NHH��ɓ�,��={�O�>�0a�G� ���ꢀ:���j�ܐ!C �?w��ꮻ��x��/�d/����Ӟ={�{��*T||��k������� �Ndgg*W�{�{�衆 ^��dRii��������2˘L&EDD�Y���T�ϟ7�^_.�h}�<���ۭ��� +��[HRDD�L&S������@o�@�1:ß�f�P��7֏?�X��u����BBom����x����Z�r��mۦÇ+??��{+��_*))Q��� �oNN��f�O�83^qq�.\�U�V��ѣ^�Z,EEE�C����5b�EGG{�;|��֬Y����<yR�O��b}7�|� �#F�j�V�>]���֭����4r�H���������(77WS�LQbbb�����ph̘1��u�rN�SYYY������9s�(!!A?��L&�JJJ���/k� r8e.�b}IIIJJJ�K/���s�_�~��7n�ƍ��>.N�O<ȏN�<����kÆ �7 i���e��詧����?/�˥ &h����o>�ѣGk�����ǎ�}�ݧ%K��!������X<�@�N9�6+V����/^�/��R_}�U���r������� M�81����riƌ�X,~k�����|�M������p8���J�����f̘�m۶��N�>]�|� ;�@M���p�B:�g����s�~�ȑڼy�222t�� �_�^��~{��:t�RSSu��I?~\�֭S߾} ����e]dY]��r���3Ϩ����� �}��g��"��[�`�����Oݻw��fSXX�n��6}���4iR��9s��-[�=z(44T���S߾}�v�ZÇ�����_پX���N)))�<���nӦMt����ƍ��o&�I�?�����c���Ç_vR(�ɤ_|Q={���m���%�� ���{������~wſ�L&M�0�g���f�Gv������$����v~�Q]�k����r�����3�L�f��ڵ�����BY]��)%���m�>f��e��%I�����ch��<l�z���_���r������h}ަ� ��-((����P̝;W�>�(�H���1c�0���u 3���u��bQLL� ��%����X,t��������������������������������������������� e�+**��f+w�999���/y�d2��SPP�>1,,���Ֆ����t�9���E�1�=�>^�j����hC����*T���ە��{�?��Ѓ��~q:�ڷo_��v���^@v���������k�ܢE��v��]����=^kѢE�o���˕�\�2ˠ�8�N���>���F���8C�>��#͜9�\!��w���͛=^�իW�o$���������{����VBB��n��^�\.��~�i�G� D��:�=`��]����o�,��+�h]�8q�bcc�Q��p�СCZ�b��{�=��80�7Ґ!C4g����e��3g��o߮ &�K�.���{�j�ҥ���O�㫈��Vnn������JKK��ŋ��_���k���)�@�Y,͞=[��s�\.W��?���J j111��o~��j�j֬Y���7t�c˖-ڲe�EGG+;;�=��Ξ=����W��٬9s��u*�j��� �o߾JHH��rBBB�p�B�L�����S�V��=z��� �������?�HҤI���� ��?� �k����ݻר�5u�TM�6�R�%>>���&|0�f=���4i����I�<y�V�\�:���nݺ)55UÇ�q�d2iڴiZ�|�ڵkW���3F���c�p�^{�֬Y�'�x����7}b����۷��������={��ԩS*,,4����P5j�H-[�T�5p�@��ݻ�o�A����JLL�ƍ�o�>�:uJEEEem6�������z��UZZ�^`�ի��͛�[�n4h� T�N�P���ܒ4m�4M�6�����7o��͛'�g��P'��� ������� ������� ������� ������� ������� ������� ������� ������� ���@�������@�������@�������@�������@�������@�������@�������@�������@�������������������������������������������������������������������������������������������������������������������������������������� ������� ������� ������� ������� ������� ������� ������� ������� ���@�������@�������@�������@�������@�������@�������@�������@�������@�������������������������������������������������������������������������������������������������������������������������������������� ������� ������� ������� ������� ������� ������� ������� ����������@�������@�������@�������@�������@�������@����>t�?�n�Jo��P��|�7Ir�%���-�������� +��T�{����IEND�B`� \ No newline at end of file diff --git a/web/modules/menu_breadcrumb/logo.svg b/web/modules/menu_breadcrumb/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..923566a7b4888005265e2c399852afa99af13809 --- /dev/null +++ b/web/modules/menu_breadcrumb/logo.svg @@ -0,0 +1,25 @@ +<!-- Menu Breadcrumb logo - https://www.drupal.org/project/menu_breadcrumb/issues/3474524 --> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> + <!-- White background --> + <rect width="512" height="512" fill="#FFFFFF"/> + + <!-- Top Menu Bar --> + <rect x="0" y="0" width="512" height="100" fill="#999"/> + + <!-- Aligned Drupal Droplet --> + <path d="M50 20 C50 20 70 40 70 60 C70 72.5 62.5 80 50 80 C37.5 80 30 72.5 30 60 C30 40 50 20 50 20 Z" + fill="#FFF" stroke="#0678BE" stroke-width="5"/> + + <!-- Letters in top menubar --> + <text x="90" y="75" font-family="Chicago" fill="#FF2222" font-size="60">M</text> + <text x="160" y="75" font-family="Chicago" fill="#00FF00" font-size="60">B</text> + <text x="210" y="75" font-family="Chicago" fill="#0000FF" font-size="60">C</text> + + <!-- Dropdown menu rectangle --> + <rect x="0" y="100" width="512" height="412" fill="#EEE" stroke="#000000" stroke-width="5"/> + + <!-- Menu entries --> + <text x="30" y="180" font-family="Chicago" fill="#000000" font-size="60">Menu</text> + <text x="30" y="260" font-family="Chicago" fill="#000000" font-size="60">Bread</text> + <text x="30" y="340" font-family="Chicago" fill="#000000" font-size="60">Crumb</text> +</svg> \ No newline at end of file diff --git a/web/modules/menu_breadcrumb/menu_breadcrumb.info.yml b/web/modules/menu_breadcrumb/menu_breadcrumb.info.yml index 74154ade8c48cd59252e0ed1dda8e74cb30a8c1b..f35997364246374af849170e2e707b82ec36a88e 100644 --- a/web/modules/menu_breadcrumb/menu_breadcrumb.info.yml +++ b/web/modules/menu_breadcrumb/menu_breadcrumb.info.yml @@ -1,10 +1,10 @@ name: Menu Breadcrumb type: module description: 'Create breadcrumbs from nested menu titles and/or taxonomy membership.' -core_version_requirement: ^8.8 || ^9 || ^10 +core_version_requirement: ^9 || ^10 || ^11 configure: menu_breadcrumb.settings -# Information added by Drupal.org packaging script on 2023-02-06 -version: '2.0.0-alpha0' +# Information added by Drupal.org packaging script on 2025-01-12 +version: '2.0.0' project: 'menu_breadcrumb' -datestamp: 1675717888 +datestamp: 1736662459 diff --git a/web/modules/menu_breadcrumb/menu_breadcrumb.module b/web/modules/menu_breadcrumb/menu_breadcrumb.module index c91eda170cf55d0e3c5104804219bda56822c3c9..b4b80d096bdb7967d0065ae958ea70f03ddd0678 100644 --- a/web/modules/menu_breadcrumb/menu_breadcrumb.module +++ b/web/modules/menu_breadcrumb/menu_breadcrumb.module @@ -5,6 +5,7 @@ * menu_breadcrumb.module */ +use Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Core\Routing\RouteMatchInterface; /** @@ -20,9 +21,9 @@ function menu_breadcrumb_help($route_name, RouteMatchInterface $route_match) { Menu Breadcrumb: Generate breadcrumbs based on menu position/titles. </h5> <p> -On the module Settings page, select options regarding the apperarance of breadcrumbs, +On the module Settings page, select options regarding the appearance of breadcrumbs, and select menus on which to generate menu-based breadcrumbs. -This basic behaviour is similar to the Drupal 7 version, +This basic behavior is similar to the Drupal 7 version, which in Drupal 8 is extended as follows: </p> <ul> @@ -76,7 +77,7 @@ function menu_breadcrumb_help($route_name, RouteMatchInterface $route_match) { <p> Taxonomy terms are searched in the order that their entity reference fields appear in the current page's field listing. -One way to change an unwanted taxonomy term taking precendence over the one +One way to change an unwanted taxonomy term taking precedence over the one on which you want to "attach" would be to change the order of those fields. </p> <p> @@ -115,3 +116,16 @@ function menu_breadcrumb_help($route_name, RouteMatchInterface $route_match) { } return $output; } + +/** + * Implements hook_system_breadcrumb_alter(). + * + * Add url.path context to all breadcrumbs to prevent pages not handled by Menu + * Breadcrumbs to have their breadcrumb replace other pages that should be + * handled by the module. + * + * @see https://www.drupal.org/project/menu_breadcrumb/issues/3230481 + */ +function menu_breadcrumb_system_breadcrumb_alter(Breadcrumb &$breadcrumb, RouteMatchInterface $route_match, array $context) { + $breadcrumb->addCacheContexts(['url.path']); +} diff --git a/web/modules/menu_breadcrumb/phpstan.neon.dist b/web/modules/menu_breadcrumb/phpstan.neon.dist new file mode 100644 index 0000000000000000000000000000000000000000..69210687148b3013b359c20ccf9bccd9bf625ff7 --- /dev/null +++ b/web/modules/menu_breadcrumb/phpstan.neon.dist @@ -0,0 +1,9 @@ +includes: + - phar://phpstan.phar/conf/bleedingEdge.neon + +parameters: + level: 1 + paths: + - . + ignoreErrors: + - "#^Unsafe usage of new static#" diff --git a/web/modules/menu_breadcrumb/src/Form/SettingsForm.php b/web/modules/menu_breadcrumb/src/Form/SettingsForm.php index 22bb6cf493dbaba09631aa26a8b9ddd41ac8caa9..8b6b57f60416e272e897e0b1b92153838f2c0e9f 100644 --- a/web/modules/menu_breadcrumb/src/Form/SettingsForm.php +++ b/web/modules/menu_breadcrumb/src/Form/SettingsForm.php @@ -4,6 +4,7 @@ use Drupal\Component\Utility\SortArray; use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Config\TypedConfigManagerInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; @@ -26,14 +27,17 @@ class SettingsForm extends ConfigFormBase { * * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * Used to obtain configuration information. + * @param \Drupal\Core\Config\TypedConfigManagerInterface $typedConfigManager + * The typed config manager. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. */ public function __construct( ConfigFactoryInterface $config_factory, - EntityTypeManagerInterface $entity_type_manager + TypedConfigManagerInterface $typedConfigManager, + EntityTypeManagerInterface $entity_type_manager, ) { - parent::__construct($config_factory); + parent::__construct($config_factory, $typedConfigManager); $this->entityTypeManager = $entity_type_manager; } @@ -43,6 +47,7 @@ public function __construct( public static function create(ContainerInterface $container) { return new static( $container->get('config.factory'), + $container->get('config.typed'), $container->get('entity_type.manager') ); } diff --git a/web/modules/menu_breadcrumb/src/MenuBasedBreadcrumbBuilder.php b/web/modules/menu_breadcrumb/src/MenuBasedBreadcrumbBuilder.php index a957bf8fc63827c57eef898052cbab6e0e09ddc5..9a1c8914688dfe44df419a60c1ab0aba5faaeafe 100644 --- a/web/modules/menu_breadcrumb/src/MenuBasedBreadcrumbBuilder.php +++ b/web/modules/menu_breadcrumb/src/MenuBasedBreadcrumbBuilder.php @@ -2,11 +2,11 @@ namespace Drupal\menu_breadcrumb; -use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Component\Utility\SortArray; use Drupal\Core\Breadcrumb\Breadcrumb; use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface; use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Controller\TitleResolverInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; @@ -21,11 +21,12 @@ use Drupal\Core\Menu\MenuLinkManagerInterface; use Drupal\Core\Routing\AdminContext; use Drupal\Core\Routing\RouteMatchInterface; +use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Url; use Drupal\menu_link_content\Plugin\Menu\MenuLinkContent; use Drupal\node\NodeInterface; -use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\RequestStack; /** * {@inheritdoc} @@ -151,7 +152,7 @@ public function __construct( LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, CacheBackendInterface $cache_menu, - LockBackendInterface $lock + LockBackendInterface $lock, ) { $this->configFactory = $config_factory; $this->menuActiveTrail = $menu_active_trail; @@ -169,7 +170,11 @@ public function __construct( /** * {@inheritdoc} */ - public function applies(RouteMatchInterface $route_match) { + public function applies(RouteMatchInterface $route_match, ?CacheableMetadata $cacheable_metadata = NULL) { + // @todo Remove null safe operator in Drupal 12.0.0, see + // https://www.drupal.org/project/drupal/issues/3459277. + $cacheable_metadata?->addCacheContexts(['route']); + // This may look heavyweight for applies() but we have to check all ways the // current path could be attached to the selected menus before turning over // breadcrumb building (and caching) to another builder. Generally this @@ -292,6 +297,10 @@ public function build(RouteMatchInterface $route_match) { $breadcrumb->addCacheContexts(['languages:language_content']); } + // @todo Remove in Drupal 12.0.0, will be added from ::applies(). See + // https://www.drupal.org/project/drupal/issues/3459277 + $breadcrumb->addCacheContexts(['route']); + // Changing the <front> page will invalidate any breadcrumb generated here: $site_config = $this->configFactory->get('system.site'); $breadcrumb->addCacheableDependency($site_config); @@ -405,7 +414,7 @@ protected function addMissingCurrentPage(array &$links, RouteMatchInterface $rou $last_url = end($links)->getUrl(); if ($last_url->isRouted() && $last_url->getRouteName() === $route_match->getRouteName() && - !array_diff($last_url->getRouteParameters(), $route_match->getRawParameters()->all()) + $last_url->getRouteParameters() === $route_match->getRawParameters()->all() ) { // We already have a link, so no need to add one. return; diff --git a/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbFunctionalTestBase.php b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbFunctionalTestBase.php new file mode 100644 index 0000000000000000000000000000000000000000..b9b6f0123ce305e1c8cf865e5b56eff73cb254cc --- /dev/null +++ b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbFunctionalTestBase.php @@ -0,0 +1,193 @@ +<?php + +namespace Drupal\Tests\menu_breadcrumb\Functional; + +use Drupal\Tests\BrowserTestBase; +use Drupal\Tests\node\Traits\ContentTypeCreationTrait; +use Drupal\Tests\system\Functional\Menu\AssertBreadcrumbTrait; +use Drupal\menu_link_content\Entity\MenuLinkContent; +use Drupal\taxonomy\Entity\Vocabulary; + +/** + * Base class for Menu Breadcrumb functional tests. + * + * @coversDefaultClass \Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder + * + * @group menu_breadcrumb + */ +class MenuBreadcrumbFunctionalTestBase extends BrowserTestBase { + + use AssertBreadcrumbTrait; + use ContentTypeCreationTrait; + + /** + * The breadcrumb builder service. + * + * @var \Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface + */ + protected $breadcrumbBuilder; + + /** + * The ID of the vocabulary for testing. + * + * @var string + */ + protected $vocabularyId = 'mb_vocab'; + + /** + * The ID of a content type bundle for testing. + * + * @var string + */ + protected $contentTypeId = 'mb_content'; + + /** + * The ID of a field for relating entities and terms. + * + * @var string + */ + protected $fieldId = 'mb_term'; + + /** + * The menu to use. + * + * @var string + */ + protected $menuId = 'main'; + + /** + * Node storage. + * + * @var \Drupal\Core\Entity\RevisionableStorageInterface + */ + protected $nodeStorage; + + /** + * Term storage. + * + * @var \Drupal\Core\Entity\RevisionableStorageInterface + */ + protected $termStorage; + + /** + * Field config. + * + * @var \Drupal\field\FieldConfigInterface + */ + protected $fieldConfig; + + /** + * A route to test with. + * + * @var \Symfony\Component\Routing\Route + */ + protected $testRoute; + + /** + * An administrative user. + * + * @var \Drupal\user\UserInterface + */ + protected $adminUser; + + /** + * A regular user. + * + * @var \Drupal\user\UserInterface + */ + protected $webUser; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'olivero'; + + /** + * {@inheritdoc} + */ + protected function setup() : void { + parent::setUp(); + + $this->breadcrumbBuilder = $this->container->get('menu_breadcrumb.breadcrumb.default'); + $this->termStorage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); + $this->nodeStorage = \Drupal::entityTypeManager()->getStorage('node'); + + $this->setupEntityStructure(); + $this->setupConfiguration(); + $this->setupContent(); + } + + /** + * Set up content types and vocabularies. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + protected function setupEntityStructure() : void { + $this->createContentType([ + 'type' => $this->contentTypeId, + 'name' => ucfirst($this->contentTypeId), + ]); + + $vocabulary = Vocabulary::create([ + 'name' => $this->vocabularyId, + 'vid' => $this->vocabularyId, + ]); + $vocabulary->save(); + } + + /** + * Set up theme and breadcrumb blocks. + */ + protected function setupConfiguration() : void { + $this->container->get('theme_installer')->install(['claro']); + $this->config('system.theme')->set('admin', 'claro')->save(); + $this->config('system.site')->set('page.front', '/node')->save(); + $this->drupalPlaceBlock('system_menu_block:tools', [ + 'region' => 'content', + 'theme' => $this->config('system.theme')->get('admin'), + ]); + $this->drupalPlaceBlock('system_menu_block:tools', [ + 'region' => 'content', + 'theme' => 'olivero', + ]); + } + + /** + * Set up content & users. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + protected function setupContent() : void { + $perms = array_keys(\Drupal::service('user.permissions')->getPermissions()); + $this->adminUser = $this->drupalCreateUser($perms); + $this->webUser = $this->drupalCreateUser([]); + } + + /** + * Helper to create menu links with parents. + * + * @param array $item + * Array with title, uri, parent. + * + * @return \Drupal\menu_link_content\Entity\MenuLinkContent + * The created menu link content item. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + protected function createMenuLink($item) : MenuLinkContent { + /** @var \Drupal\menu_link_content\Entity\MenuLinkContent $item['parent'] */ + $menu_item = [ + 'title' => $item['title'], + 'menu_name' => 'main', + 'link' => ['uri' => $item['uri']], + 'expanded' => TRUE, + ]; + if (isset($item['parent'])) { + $menu_item['parent'] = $item['parent']; + } + $menu_link = MenuLinkContent::create($menu_item); + $menu_link->save(); + return $menu_link; + } + +} diff --git a/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbMiscTest.php b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbMiscTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a766e658266ba3695d1183b53b94291a81b53e34 --- /dev/null +++ b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbMiscTest.php @@ -0,0 +1,92 @@ +<?php + +namespace Drupal\Tests\menu_breadcrumb\Functional; + +use Drupal\Tests\node\Traits\ContentTypeCreationTrait; +use Drupal\Tests\system\Functional\Menu\AssertBreadcrumbTrait; + +/** + * Tests handling of breadcrumb generation. + * + * @coversDefaultClass \Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder + * + * @group menu_breadcrumb + */ +class MenuBreadcrumbMiscTest extends MenuBreadcrumbFunctionalTestBase { + + use AssertBreadcrumbTrait; + use ContentTypeCreationTrait; + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'block', + 'field', + 'menu_link_content', + 'menu_breadcrumb', + 'node', + 'system', + 'taxonomy', + 'user', + ]; + + /** + * Test behavior of setting to link current page. + */ + public function testCurrentPageAsLink() { + $level0Term = $this->termStorage->create([ + 'name' => 'Level 0 Term 0', + 'vid' => $this->vocabularyId, + ]); + $level0Term->save(); + $level0MenuLink = $this->createMenuLink([ + 'title' => $level0Term->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level0Term->id(), + ]); + $level1TermA = $this->termStorage->create([ + 'name' => 'Level 1 Term A', + 'vid' => $this->vocabularyId, + 'parent' => $level0Term->id(), + ]); + $level1TermA->save(); + $level1MenuLinkA = $this->createMenuLink([ + 'title' => $level1TermA->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level1TermA->id(), + 'parent' => $level0MenuLink->getPluginId(), + ]); + /** @var \Drupal\node\NodeInterface $level3Node */ + $level2Node = $this->nodeStorage->create([ + 'title' => 'Level 2 Node', + 'type' => $this->contentTypeId, + ]); + $level2Node->save(); + $this->createMenuLink([ + 'title' => $level2Node->get('title')->value, + 'uri' => 'internal:/node/' . $level2Node->id(), + 'parent' => $level1MenuLinkA->getPluginId(), + ]); + + // Test breadcrumbs with current page linked. + $this->config('menu_breadcrumb.settings') + ->set('current_page_as_link', TRUE) + ->save(); + // Node will appear in the breadcrumb links. + $this->assertBreadcrumb('/node/' . $level2Node->id(), [ + $level0Term->toUrl()->toString() => $level0Term->get('name')->value, + $level1TermA->toUrl()->toString() => $level1TermA->get('name')->value, + $level2Node->toUrl()->toString() => $level2Node->get('title')->value, + ]); + + // Test breadcrumbs with current page unlinked. + $this->config('menu_breadcrumb.settings') + ->set('current_page_as_link', FALSE) + ->save(); + // Node will not appear in the breadcrumb links. + $this->assertBreadcrumb('/node/' . $level2Node->id(), [ + $level0Term->toUrl()->toString() => $level0Term->get('name')->value, + $level1TermA->toUrl()->toString() => $level1TermA->get('name')->value, + ]); + } + +} diff --git a/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbTaxonomyAttachedTest.php b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbTaxonomyAttachedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7f75d2ec29b2ae4db7588f5108827631b17b63e9 --- /dev/null +++ b/web/modules/menu_breadcrumb/tests/src/Functional/MenuBreadcrumbTaxonomyAttachedTest.php @@ -0,0 +1,125 @@ +<?php + +namespace Drupal\Tests\menu_breadcrumb\Functional; + +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; + +/** + * Tests handling of breadcrumb generation. + * + * @coversDefaultClass \Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder + * + * @group menu_breadcrumb + */ +class MenuBreadcrumbTaxonomyAttachedTest extends MenuBreadcrumbFunctionalTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'block', + 'field', + 'filter', + 'menu_ui', + 'menu_breadcrumb', + 'node', + 'system', + 'taxonomy', + 'text', + 'user', + ]; + + /** + * Tests the Menu Breadcrumb builder with taxonomy attachment. + */ + public function testMenuBreadcrumbsWithTaxonomyAttachment() { + // Add a field which will relate node to parent terms. + $field_storage = FieldStorageConfig::create([ + 'field_name' => $this->fieldId, + 'type' => 'entity_reference', + 'entity_type' => 'node', + 'cardinality' => 1, + 'settings' => [ + 'target_type' => 'taxonomy_term', + ], + ]); + $field_storage->save(); + $this->fieldConfig = FieldConfig::create([ + 'field_storage' => $field_storage, + 'bundle' => $this->contentTypeId, + 'label' => 'Test Reference', + 'settings' => [ + 'handler' => 'default', + ], + ]); + $this->fieldConfig->save(); + + // From module defaults, enable taxattach for $this->menu_id. + $menu_settings = $this->config('menu_breadcrumb.settings')->get('menu_breadcrumb_menus'); + $menu_settings[$this->menuId]['taxattach'] = 1; + $this->config('menu_breadcrumb.settings')->set('append_member_page', TRUE); + $this->config('menu_breadcrumb.settings')->set('menu_breadcrumb_menus', $menu_settings); + $this->config('menu_breadcrumb.settings')->save(); + // Create term/node content tree with menu items. + $level0Term = $this->termStorage->create([ + 'name' => 'Level 0 Term 0', + 'vid' => $this->vocabularyId, + ]); + $level0Term->save(); + $level0MenuLink = $this->createMenuLink([ + 'title' => $level0Term->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level0Term->id(), + ]); + $level1TermA = $this->termStorage->create([ + 'name' => 'Level 1 Term A', + 'vid' => $this->vocabularyId, + 'parent' => $level0Term->id(), + ]); + $level1TermA->save(); + $level1MenuLinkA = $this->createMenuLink([ + 'title' => $level1TermA->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level1TermA->id(), + 'parent' => $level0MenuLink->getPluginId(), + ]); + $level2TermB = $this->termStorage->create([ + 'name' => 'Level 2 Term B', + 'vid' => $this->vocabularyId, + 'parent' => $level0Term->id(), + ]); + $level2TermB->save(); + $this->createMenuLink([ + 'title' => $level2TermB->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level2TermB->id(), + 'parent' => $level0MenuLink->getPluginId(), + ]); + $level2TermC = $this->termStorage->create([ + 'name' => 'Level 2 Term C', + 'vid' => $this->vocabularyId, + 'parent' => $level1TermA->id(), + ]); + $level2TermC->save(); + $this->createMenuLink([ + 'title' => $level2TermC->get('name')->value, + 'uri' => 'internal:/taxonomy/term/' . $level2TermC->id(), + 'parent' => $level1MenuLinkA->getPluginId(), + ]); + + // No menu link for this node, it has a relation to the parent term. + /** @var \Drupal\node\NodeInterface $level3Node */ + $level3Node = $this->nodeStorage->create([ + 'title' => 'Level 3 Node 1', + 'type' => $this->contentTypeId, + $this->fieldId => $level2TermC->id(), + ]); + $level3Node->save(); + + // Taxonomy attachment breadcrumbs present without node menu item. + $this->assertBreadcrumb('/node/' . $level3Node->id(), [ + $level0Term->toUrl()->toString() => $level0Term->get('name')->value, + $level1TermA->toUrl()->toString() => $level1TermA->get('name')->value, + $level2TermC->toUrl()->toString() => $level2TermC->get('name')->value, + ]); + } + +} diff --git a/web/modules/menu_breadcrumb/tests/src/Functional/SettingsFormTest.php b/web/modules/menu_breadcrumb/tests/src/Functional/SettingsFormTest.php new file mode 100644 index 0000000000000000000000000000000000000000..93d29f80ee62a1a97169d2bb8df5ffdb831ce754 --- /dev/null +++ b/web/modules/menu_breadcrumb/tests/src/Functional/SettingsFormTest.php @@ -0,0 +1,226 @@ +<?php + +namespace Drupal\Tests\menu_breadcrumb\Functional; + +use Drupal\Core\Url; +use Drupal\Tests\BrowserTestBase; +use Drupal\Tests\RandomGeneratorTrait; +use Drupal\Tests\user\Traits\UserCreationTrait; + +/** + * Test Settings form for the Menu Breadcrumb module. + * + * @group menu_breadcrumb + */ +class SettingsFormTest extends BrowserTestBase { + + use UserCreationTrait; + use RandomGeneratorTrait; + + /** + * Modules to install. + * + * @var array + */ + protected static $modules = ['menu_breadcrumb']; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + + /** + * A user with no special permissions. + * + * @var \Drupal\user\UserInterface + */ + protected $regularUser; + + /** + * Permissions required to administer this module. + * + * @var string[] + */ + protected static $adminPermissions = [ + 'administer site configuration', + ]; + + /** + * A user with permissions defined in $this::adminPermissions. + * + * @var \Drupal\user\UserInterface + */ + protected $adminUser; + + /** + * Perform initial setup tasks that run before every test method. + */ + public function setUp() : void { + parent::setUp(); + $this->regularUser = $this->createUser([]); + $this->adminUser = $this->createUser($this::$adminPermissions); + } + + /** + * Tests access without permission. + */ + public function testSettingsPathAccessDeniedAnonymous() { + $this->drupalGet(Url::fromRoute('menu_breadcrumb.settings')); + $this->assertSession()->statusCodeEquals(403); + } + + /** + * Tests access without permission. + */ + public function testSettingsPathAccessDeniedUnprivileged() { + $this->drupalLogin($this->regularUser); + $this->drupalGet(Url::fromRoute('menu_breadcrumb.settings')); + $this->assertSession()->statusCodeEquals(403); + } + + /** + * Tests settings form access and functionality. + */ + public function testSettingsForm() { + $this->drupalLogin($this->adminUser); + $this->drupalGet(Url::fromRoute('menu_breadcrumb.settings')); + + // Test that access is granted to the form by the permission. + $this->assertSession()->statusCodeEquals(200); + + // Test form elements exist, and state matches configured values. + $mapFieldsToConfig = [ + 'determine_menu' => 'determine_menu', + 'disable_admin_page' => 'disable_admin_page', + 'append_current_page' => 'append_current_page', + 'current_page_as_link' => 'current_page_as_link', + 'stop_on_first_match' => 'stop_on_first_match', + 'append_member_page' => 'append_member_page', + 'member_page_as_link' => 'member_page_as_link', + 'remove_home' => 'remove_home', + 'add_home' => 'add_home', + 'front_title' => 'front_title', + 'exclude_empty_url' => 'exclude_empty_url', + 'exclude_disabled_menu_items' => 'exclude_disabled_menu_items', + 'derived_active_trail' => 'derived_active_trail', + ]; + $config = $this->config('menu_breadcrumb.settings'); + foreach ($mapFieldsToConfig as $key => $value) { + $this->assertSession()->fieldValueEquals( + $key, + $config->get($value), + ); + } + + $page = $this->getSession()->getPage(); + + // Specify a configuration, then ensure it's saved. + $page->checkField('disable_admin_page'); + $page->checkField('append_current_page'); + $page->checkField('current_page_as_link'); + $page->checkField('stop_on_first_match'); + $page->checkField('append_member_page'); + $page->checkField('member_page_as_link'); + $page->checkField('remove_home'); + $page->checkField('add_home'); + $page->checkField('exclude_empty_url'); + $page->checkField('exclude_disabled_menu_items'); + $page->checkField('derived_active_trail'); + $page->selectFieldOption('front_title', 1); + $page->pressButton('Save configuration'); + $this->assertSession()->checkboxChecked('disable_admin_page'); + $this->assertSession()->checkboxChecked('append_current_page'); + $this->assertSession()->checkboxChecked('current_page_as_link'); + $this->assertSession()->checkboxChecked('stop_on_first_match'); + $this->assertSession()->checkboxChecked('append_member_page'); + $this->assertSession()->checkboxChecked('member_page_as_link'); + $this->assertSession()->checkboxChecked('remove_home'); + $this->assertSession()->checkboxChecked('add_home'); + $this->assertSession()->checkboxChecked('exclude_empty_url'); + $this->assertSession()->checkboxChecked('exclude_disabled_menu_items'); + $this->assertSession()->checkboxChecked('derived_active_trail'); + $this->assertSession()->fieldValueEquals('front_title', 1); + + // Specify a configuration then ensure it's saved. + $page->checkField('disable_admin_page'); + $page->checkField('append_current_page'); + $page->checkField('current_page_as_link'); + $page->checkField('stop_on_first_match'); + $page->checkField('append_member_page'); + $page->checkField('member_page_as_link'); + $page->checkField('remove_home'); + $page->checkField('add_home'); + $page->checkField('exclude_empty_url'); + $page->checkField('exclude_disabled_menu_items'); + $page->checkField('derived_active_trail'); + $page->selectFieldOption('front_title', 1); + $page->pressButton('Save configuration'); + $this->assertSession()->checkboxChecked('disable_admin_page'); + $this->assertSession()->checkboxChecked('append_current_page'); + $this->assertSession()->checkboxChecked('current_page_as_link'); + $this->assertSession()->checkboxChecked('stop_on_first_match'); + $this->assertSession()->checkboxChecked('append_member_page'); + $this->assertSession()->checkboxChecked('member_page_as_link'); + $this->assertSession()->checkboxChecked('remove_home'); + $this->assertSession()->checkboxChecked('add_home'); + $this->assertSession()->checkboxChecked('exclude_empty_url'); + $this->assertSession()->checkboxChecked('exclude_disabled_menu_items'); + $this->assertSession()->checkboxChecked('derived_active_trail'); + $this->assertSession()->fieldValueEquals('front_title', 1); + + // Specify a configuration, then ensure it's saved. + $page->checkField('disable_admin_page'); + $page->checkField('append_current_page'); + $page->checkField('current_page_as_link'); + $page->checkField('stop_on_first_match'); + $page->checkField('append_member_page'); + $page->checkField('member_page_as_link'); + $page->checkField('remove_home'); + $page->checkField('add_home'); + $page->checkField('exclude_empty_url'); + $page->checkField('exclude_disabled_menu_items'); + $page->checkField('derived_active_trail'); + $page->selectFieldOption('front_title', 1); + $page->pressButton('Save configuration'); + $this->assertSession()->checkboxChecked('disable_admin_page'); + $this->assertSession()->checkboxChecked('append_current_page'); + $this->assertSession()->checkboxChecked('current_page_as_link'); + $this->assertSession()->checkboxChecked('stop_on_first_match'); + $this->assertSession()->checkboxChecked('append_member_page'); + $this->assertSession()->checkboxChecked('member_page_as_link'); + $this->assertSession()->checkboxChecked('remove_home'); + $this->assertSession()->checkboxChecked('add_home'); + $this->assertSession()->checkboxChecked('exclude_empty_url'); + $this->assertSession()->checkboxChecked('exclude_disabled_menu_items'); + $this->assertSession()->checkboxChecked('derived_active_trail'); + $this->assertSession()->fieldValueEquals('front_title', 1); + + // Specify another configuration then ensure it's saved. + $page->unCheckField('disable_admin_page'); + $page->unCheckField('append_current_page'); + $page->unCheckField('current_page_as_link'); + $page->unCheckField('stop_on_first_match'); + $page->unCheckField('append_member_page'); + $page->unCheckField('member_page_as_link'); + $page->unCheckField('remove_home'); + $page->unCheckField('add_home'); + $page->unCheckField('exclude_empty_url'); + $page->unCheckField('exclude_disabled_menu_items'); + $page->unCheckField('derived_active_trail'); + $page->selectFieldOption('front_title', 0); + $page->pressButton('Save configuration'); + $this->assertSession()->checkboxNotChecked('disable_admin_page'); + $this->assertSession()->checkboxNotChecked('append_current_page'); + $this->assertSession()->checkboxNotChecked('current_page_as_link'); + $this->assertSession()->checkboxNotChecked('stop_on_first_match'); + $this->assertSession()->checkboxNotChecked('append_member_page'); + $this->assertSession()->checkboxNotChecked('member_page_as_link'); + $this->assertSession()->checkboxNotChecked('remove_home'); + $this->assertSession()->checkboxNotChecked('add_home'); + $this->assertSession()->checkboxNotChecked('exclude_empty_url'); + $this->assertSession()->checkboxNotChecked('exclude_disabled_menu_items'); + $this->assertSession()->checkboxNotChecked('derived_active_trail'); + $this->assertSession()->fieldValueEquals('front_title', 0); + } + +} diff --git a/web/modules/menu_breadcrumb/tests/src/Unit/MenuBasedBreadcrumbBuilderTest.php b/web/modules/menu_breadcrumb/tests/src/Unit/MenuBasedBreadcrumbBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..27af93e4f6a594c1c28b0f8ab392d0f7dc80ee05 --- /dev/null +++ b/web/modules/menu_breadcrumb/tests/src/Unit/MenuBasedBreadcrumbBuilderTest.php @@ -0,0 +1,147 @@ +<?php + +namespace Drupal\Tests\menu_breadcrumb\Unit\Breadcrumbs; + +use Drupal\Tests\UnitTestCase; +use Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder; +use Symfony\Component\Yaml\Yaml; + +/** + * @coversDefaultClass \Drupal\menu_breadcrumb\MenuBasedBreadcrumbBuilder + * @group menu_breadcrumb + */ +class MenuBasedBreadcrumbBuilderTest extends UnitTestCase { + + /** + * The path based breadcrumb builder object to test. + * + * @var \Drupal\system\PathBasedBreadcrumbBuilder + */ + protected $builder; + + /** + * The stubbed configuration factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface|\PHPUnit\Framework\MockObject\MockBuilder + */ + protected $configFactory; + + /** + * The mocked menu active trail. + * + * @var \Drupal\Core\Menu\MenuActiveTrailInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $menuActiveTrail; + + /** + * The mocked menu link manager. + * + * @var \Drupal\Core\Menu\MenuLinkManagerInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $menuLinkManager; + + /** + * The mocked router admin context. + * + * @var \PHPUnit\Framework\MockObject\MockObject + */ + protected $routerAdminContext; + + /** + * The mocked title resolver. + * + * @var \Drupal\Core\Controller\TitleResolverInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $titleResolver; + + /** + * The mocked request stack. + * + * @var \Symfony\Component\HttpFoundation\RequestStack|\PHPUnit\Framework\MockObject\MockObject + */ + protected $requestStack; + + /** + * The mocked language manager. + * + * @var \Drupal\Core\Language\LanguageManager|\PHPUnit\Framework\MockObject\MockObject + */ + protected $languageManager; + + /** + * The mocked entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $entityTypeManager; + + /** + * The mocked cache backend. + * + * @var \Drupal\Core\Cache\CacheBackendInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $cache; + + /** + * The mocked lock. + * + * @var \Drupal\Core\Lock\LockBackendInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $lock; + + /** + * The default configuration. + * + * @var array + */ + protected $installConfiguration = []; + + /** + * {@inheritdoc} + * + * @covers ::__construct + */ + protected function setUp(): void { + parent::setUp(); + + // Path to module default install configuration. + $modulePath = dirname(__FILE__) . '/../../..'; + + // Default configuration state at install. + $this->installConfiguration = Yaml::parseFile("{$modulePath}/config/install/menu_breadcrumb.settings.yml"); + + $this->configFactory = $this->getConfigFactoryStub(['menu_breadcrumb.settings' => $this->installConfiguration]); + $this->menuActiveTrail = $this->createMock('\Drupal\Core\Menu\MenuActiveTrailInterface'); + $this->menuLinkManager = $this->createMock('Drupal\Core\Menu\MenuLinkManagerInterface'); + $this->routerAdminContext = $this->createMock('\Drupal\Core\Routing\AdminContext'); + $this->titleResolver = $this->createMock('\Drupal\Core\Controller\TitleResolverInterface'); + $this->requestStack = $this->createMock('\Symfony\Component\HttpFoundation\RequestStack'); + $this->languageManager = $this->createMock('\Drupal\Core\Language\LanguageManagerInterface'); + $this->entityTypeManager = $this->createMock('\Drupal\Core\Entity\EntityTypeManagerInterface'); + $this->cache = $this->createMock('\Drupal\Core\Cache\DatabaseBackend'); + $this->lock = $this->createMock('\Drupal\Core\Lock\LockBackendInterface'); + + $this->builder = new MenuBasedBreadcrumbBuilder( + $this->configFactory, + $this->menuActiveTrail, + $this->menuLinkManager, + $this->routerAdminContext, + $this->titleResolver, + $this->requestStack, + $this->languageManager, + $this->entityTypeManager, + $this->cache, + $this->lock + ); + } + + /** + * Test that we can initialize our builder. + * + * @covers ::__construct + */ + public function testInitialize() { + $this->assertInstanceOf(MenuBasedBreadcrumbBuilder::class, $this->builder); + } + +} diff --git a/web/modules/roleassign/.cspell-project-words.txt b/web/modules/roleassign/.cspell-project-words.txt new file mode 100644 index 0000000000000000000000000000000000000000..f5828ea03ee165fb9482fe65c4a84e658630957a --- /dev/null +++ b/web/modules/roleassign/.cspell-project-words.txt @@ -0,0 +1,15 @@ +roleassign +Barregren +salvis +svendecabooter +tkuldeep +Ankit +Babbar +webankit +Salvisberg +nord +olstad +Decabooter +Sjösten +tobiassjosten +siteadmin diff --git a/web/modules/roleassign/.gitlab-ci.yml b/web/modules/roleassign/.gitlab-ci.yml index 9d0905ead214bfbee1dc070ed4efbe50ceeabb0d..46ec2c80d8f81a74f642b498cf4ff696c8677b77 100644 --- a/web/modules/roleassign/.gitlab-ci.yml +++ b/web/modules/roleassign/.gitlab-ci.yml @@ -1,106 +1,43 @@ ################ -# DrupalCI GitLabCI template +# GitLabCI template for Drupal projects. # -# Gitlab-ci.yml to replicate DrupalCI testing for Contrib -# -# With thanks to: -# * The GitLab Acceleration Initiative participants -# * DrupalSpoons -################ - -################ -# Guidelines -# -# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained. -# -# However, you can modify this template if you have additional needs for your project. -################ - -################ -# Includes -# -# Additional configuration can be provided through includes. -# One advantage of include files is that if they are updated upstream, the changes affect all pipelines using that include. -# -# Includes can be overridden by re-declaring anything provided in an include, here in gitlab-ci.yml -# https://docs.gitlab.com/ee/ci/yaml/includes.html#override-included-configuration-values +# This template is designed to give any Contrib maintainer everything they need to test, without requiring modification. +# It is also designed to keep up to date with Core Development automatically through the use of include files that can be centrally maintained. +# As long as you include the project, ref and three files below, any future updates added by the Drupal Association will be used in your +# pipelines automatically. However, you can modify this template if you have additional needs for your project. +# The full documentation is on https://project.pages.drupalcode.org/gitlab_templates/ ################ +# For information on alternative values for 'ref' see https://project.pages.drupalcode.org/gitlab_templates/info/templates-version/ +# To test a Drupal 7 project, change the first include filename from .main.yml to .main-d7.yml include: - ################ - # DrupalCI includes: - # As long as you include this, any future includes added by the Drupal Association will be accessible to your pipelines automatically. - # View these include files at https://git.drupalcode.org/project/gitlab_templates/ - ################ - project: $_GITLAB_TEMPLATES_REPO - # "ref" value can be: - # - Recommended (default) - `ref: $_GITLAB_TEMPLATES_REF` - The Drupal Association will update this value to the recommended tag for contrib. - # - Latest - `ref: main` - Get the latest additions and bug fixes as they are merged into the templates. - # - Minor or Major latests - `ref: 1.x-latest` or `ref: 1.0.x-latest` - Get the latest additions within a minor (mostly bugfixes) or major (bugs and new features). - # - Fixed tag - `ref: 1.0.1` - Set the value to a known tag. This will not get any updates. ref: $_GITLAB_TEMPLATES_REF file: - - '/includes/include.drupalci.main.yml' - # EXPERIMENTAL: For Drupal 7, remove the above line and uncomment the below. - # - '/includes/include.drupalci.main-d7.yml' - - '/includes/include.drupalci.variables.yml' - - '/includes/include.drupalci.workflows.yml' + - "/includes/include.drupalci.main.yml" + - "/includes/include.drupalci.variables.yml" + - "/includes/include.drupalci.workflows.yml" ################ -# Pipeline configuration variables -# -# These are the variables provided to the Run Pipeline form that a user may want to override. -# -# Docs at https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes/include.drupalci.variables.yml +# Pipeline configuration variables are defined with default values and descriptions in the file +# https://git.drupalcode.org/project/gitlab_templates/-/blob/main/includes/include.drupalci.variables.yml +# Uncomment the lines below if you want to override any of the variables. The following is just an example. ################ # variables: # SKIP_ESLINT: '1' +# OPT_IN_TEST_NEXT_MAJOR: '1' +# _CURL_TEMPLATES_REF: 'main' -variables: - SKIP_CSPELL: '1' - -################################################################################### # -# * -# /( -# ((((, -# /((((((( -# ((((((((((* -# ,((((((((((((((( -# ,((((((((((((((((((( -# ((((((((((((((((((((((((* -# *((((((((((((((((((((((((((((( -# ((((((((((((((((((((((((((((((((((* -# *(((((((((((((((((( .(((((((((((((((((( -# ((((((((((((((((((. /(((((((((((((((((* -# /((((((((((((((((( .(((((((((((((((((, -# ,(((((((((((((((((( (((((((((((((((((( -# .(((((((((((((((((((( .((((((((((((((((( -# ((((((((((((((((((((((( ((((((((((((((((/ -# (((((((((((((((((((((((((((/ ,(((((((((((((((* -# .((((((((((((((/ /(((((((((((((. ,((((((((((((((( -# *(((((((((((((( ,(((((((((((((/ *((((((((((((((. -# ((((((((((((((, /(((((((((((((. ((((((((((((((, -# (((((((((((((/ ,(((((((((((((* ,(((((((((((((, -# *((((((((((((( .((((((((((((((( ,((((((((((((( -# ((((((((((((/ /((((((((((((((((((. ,((((((((((((/ -# ((((((((((((( *(((((((((((((((((((((((* *(((((((((((( -# ((((((((((((( ,(((((((((((((..((((((((((((( *(((((((((((( -# ((((((((((((, /((((((((((((* /((((((((((((/ (((((((((((( -# ((((((((((((( /((((((((((((/ (((((((((((((* (((((((((((( -# (((((((((((((/ /(((((((((((( ,((((((((((((, *(((((((((((( -# (((((((((((((( *(((((((((((/ *((((((((((((. ((((((((((((/ -# *((((((((((((((((((((((((((, /((((((((((((((((((((((((( -# ((((((((((((((((((((((((( ((((((((((((((((((((((((, -# .(((((((((((((((((((((((/ ,((((((((((((((((((((((( -# ((((((((((((((((((((((/ ,(((((((((((((((((((((/ -# *((((((((((((((((((((( (((((((((((((((((((((, -# ,(((((((((((((((((((((, ((((((((((((((((((((/ -# ,(((((((((((((((((((((* /(((((((((((((((((((( -# ((((((((((((((((((((((, ,/((((((((((((((((((((, -# ,((((((((((((((((((((((((((((((((((((((((((((((((((( -# .((((((((((((((((((((((((((((((((((((((((((((( -# .((((((((((((((((((((((((((((((((((((,. -# .,(((((((((((((((((((((((((. +# Start custom overrides. +# Based on https://git.drupalcode.org/project/keycdn/-/blob/8.x-1.x/.gitlab-ci.yml # -################################################################################### + +variables: + OPT_IN_TEST_CURRENT: 1 + OPT_IN_TEST_MAX_PHP: 1 + # Broaden test coverage. + OPT_IN_TEST_PREVIOUS_MAJOR: 0 + OPT_IN_TEST_PREVIOUS_MINOR: 1 + OPT_IN_TEST_NEXT_MINOR: 1 + OPT_IN_TEST_NEXT_MAJOR: 1 diff --git a/web/modules/roleassign/README.md b/web/modules/roleassign/README.md index 5a0328aefafc053c7657817624b32ea083ed69b7..3ad9f8e17478b8a78dde1c389805866bb24e85e9 100644 --- a/web/modules/roleassign/README.md +++ b/web/modules/roleassign/README.md @@ -13,25 +13,48 @@ ## Introduction -RoleAssign specifically allows site administrators to further delegate the task of managing user's roles while withholding the _Administer permissions_ permission. - -RoleAssign introduces a new permission called _Assign roles_. Users with this permission are able to assign selected roles to still other users. Only users with the _Administer permissions_ permission may select which roles are available for assignment through this module. - -RoleAssign is ideal for smaller sites with a system administrator and one assistant administrator role that should be reasonably restricted in what it allows. For larger sites with multiple levels of administrators or whenever you need finer-grained control over which role can assign which other role, check out [Role Delegation](https://www.drupal.org/project/role_delegation). See [#961682: Does the role delegation module supersede this module?](https://www.drupal.org/project/roleassign/issues/961682) for a short discussion of the relative merits of the two modules. - -This module was developped by TBarregren and is now maintained by salvis. +RoleAssign specifically allows site administrators to further delegate the task +of managing user's roles while withholding the _Administer permissions_ +permission. + +RoleAssign introduces a new permission called _Assign roles_. Users with this +permission are able to assign selected roles to still other users. Only users +with the _Administer permissions_ permission may select which roles are +available for assignment through this module. + +RoleAssign is ideal for smaller sites with a system administrator and one +assistant administrator role that should be reasonably restricted in what it +allows. For larger sites with multiple levels of administrators or whenever you +need finer-grained control over which role can assign which other role, check +out [Role Delegation](https://www.drupal.org/project/role_delegation). +See [#961682: Does the role delegation module supersede this module?](https://www.drupal.org/project/roleassign/issues/961682) +for a short discussion of the relative merits of the two modules. + +This module was developed by TBarregren and is now maintained by salvis. Drupal 7 port by salvis. Drupal 8 port by svendecabooter and tkuldeep17. ## Background -It is possible for site administrators to delegate the user administration through the _Administer users_ permission. But that doesn't include the right to assign roles to users. That is necessary if the delegatee should be able to administrate user accounts without intervention from a site administrator. +It is possible for site administrators to delegate the user administration +through the _Administer users_ permission. But that doesn't include the right to +assign roles to users. That is necessary if the delegatee should be able to +administrate user accounts without intervention from a site administrator. -To delegate the assignment of roles, site administrators have had until now no other choice than also grant the _Administer permissions_ permission. But that is not advisable, since it gives right to access all roles, and worse, to grant any rights to any role. That can be abused by the delegatee, who can assign himself all rights and thereby take control over the site. +To delegate the assignment of roles, site administrators have had until now no +other choice than also grant the _Administer permissions_ permission. But that +is not advisable, since it gives right to access all roles, and worse, to grant +any rights to any role. That can be abused by the delegatee, who can assign +himself all rights and thereby take control over the site. -This module solves this dilemma by introducing the _Assign roles_ permission. While editing a user's account information, a user with this permission will be able to select roles for the user from a set of available roles. Roles available are configured by users with the _Administer permissions_ permission. +This module solves this dilemma by introducing the _Assign roles_ permission. +While editing a user's account information, a user with this permission will be +able to select roles for the user from a set of available roles. Roles available +are configured by users with the _Administer permissions_ permission. -CodeKarate has a [nice introductory video](https://www.youtube.com/watch?v=U_DnhKbcpVc) showing how to use RoleAssign. +CodeKarate has +a [nice introductory video](https://www.youtube.com/watch?v=U_DnhKbcpVc) showing +how to use RoleAssign. ## Requirements @@ -39,32 +62,46 @@ This module requires no modules outside of Drupal core. ## Installation -Install as you would normally install a contributed Drupal module. Visit https://www.drupal.org/node/1897420 for further information. +Install as you would normally install a contributed Drupal module. +Visit https://www.drupal.org/node/1897420 for further information. ## Configuration 1. Log in as a Site Administrator. 2. Navigate to People > Permissions (/admin/people/permissions) -3. Grant the _Assign roles_ permission to roles that should be able to assign roles for other users - - **Note:** These roles also must have the _Administer users_ permission +3. Grant the _Assign roles_ permission to roles that should be able to assign + roles for other users + - **Note:** These roles also must have the _Administer users_ permission 4. Navigate to People > Role assign (/admin/people/roleassign) -5. Select roles that should be available for to be assigned by users with the _Assign roles_ permission +5. Select roles that should be available for to be assigned by users with the + _Assign roles_ permission 6. Navigate to a user's edit page -7. Grant that user a role that has the _Assign roles_ and _Administer users_ permissions +7. Grant that user a role that has the _Assign roles_ and _Administer users_ + permissions 8. Repeat Step 6 to 7 for all applicable users ## Usage -1. Log in as a user with that has the _Assign roles_ and _Administer users_ permissions +1. Log in as a user with that has the _Assign roles_ and _Administer users_ + permissions 2. Navigate to a user's edit page 3. Review the Assignable roles and modify them, as necessary 4. Save the user ## Usage Notes -- The _Administer users_ permission is and remains a security-critical permission that must NOT be given to untrusted users! -- Granting the _Administer users_ permission to users will allow them to modify admin passwords or email addresses. The [User Protect](https://www.drupal.org/project/userprotect) module can help to prevent this. RoleAssign will protect user 1's name, email, and password fields, but it won't protect any other accounts. -- RoleAssign will keep your assistant admins within their limits, but if you introduce alternative ways to edit users, assign roles, or give permissions (like the "Administration: Users" view in the popular Administration Views module), then you may be opening up ways for your assistant admins to gain additional privileges. +- The _Administer users_ permission is and remains a security-critical + permission that must NOT be given to untrusted users! +- Granting the _Administer users_ permission to users will allow them to modify + admin passwords or email addresses. + The [User Protect](https://www.drupal.org/project/userprotect) module can help + to prevent this. RoleAssign will protect user 1's name, email, and password + fields, but it won't protect any other accounts. +- RoleAssign will keep your assistant admins within their limits, but if you + introduce alternative ways to edit users, assign roles, or give permissions ( + like the "Administration: Users" view in the popular Administration Views + module), then you may be opening up ways for your assistant admins to gain + additional privileges. ## Maintainers diff --git a/web/modules/roleassign/composer.json b/web/modules/roleassign/composer.json index bdce8cca12505d58a90ad9fa4fb43c144eb8f224..342015f9cc42b1669ea9d2b68a9393c80cdcbada 100644 --- a/web/modules/roleassign/composer.json +++ b/web/modules/roleassign/composer.json @@ -8,6 +8,6 @@ }, "license": "GPL-2.0-or-later", "require": { - "drupal/core": "^9.1 || ^10" + "drupal/core": "^10.1 || ^11" } } diff --git a/web/modules/roleassign/roleassign.info.yml b/web/modules/roleassign/roleassign.info.yml index 8635ca813dcab7057f6abfd64505707d863135e2..4678b87a07db7972dbb7e3d550e4b1a4c796dad3 100644 --- a/web/modules/roleassign/roleassign.info.yml +++ b/web/modules/roleassign/roleassign.info.yml @@ -1,10 +1,10 @@ name: RoleAssign description: 'Allows site administrators to further delegate the task of managing user''s roles.' type: module -core_version_requirement: ^9.1 || ^10 +core_version_requirement: ^10.1 || ^11 configure: roleassign.settings -# Information added by Drupal.org packaging script on 2024-04-15 -version: '2.0.2' +# Information added by Drupal.org packaging script on 2025-01-13 +version: '2.0.3' project: 'roleassign' -datestamp: 1713184819 +datestamp: 1736794222 diff --git a/web/modules/roleassign/roleassign.module b/web/modules/roleassign/roleassign.module index 601fc973cef44e8924e9a634d99f6de54ffb9542..5041a0d47a50149bfe8f7b44c1c7566f8f5c97bf 100755 --- a/web/modules/roleassign/roleassign.module +++ b/web/modules/roleassign/roleassign.module @@ -103,7 +103,7 @@ function roleassign_form_alter(&$form, FormStateInterface $form_state, $form_id) ******************************/ default: /****************************** - * Get currently asssigned roles + * Get currently assigned roles ******************************/ if ($form_id === 'user_form') { $current_account = $form_state->getFormObject()->getEntity(); diff --git a/web/modules/roleassign/src/Form/RoleAssignAdminForm.php b/web/modules/roleassign/src/Form/RoleAssignAdminForm.php index a04bd5e4c3122327cefa66dd24430cd40b226d5c..a71a82d36f22ef754f55d2c0ea595f739234fce6 100644 --- a/web/modules/roleassign/src/Form/RoleAssignAdminForm.php +++ b/web/modules/roleassign/src/Form/RoleAssignAdminForm.php @@ -4,14 +4,30 @@ use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; -use Drupal\user\Entity\Role; use Drupal\user\RoleInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Configure RoleAssign settings. */ class RoleAssignAdminForm extends ConfigFormBase { + /** + * Entity type manager service. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + $instance = parent::create($container); + $instance->entityTypeManager = $container->get('entity_type.manager'); + return $instance; + } + /** * {@inheritdoc} */ @@ -35,7 +51,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { * - 'anonymous user' * - 'authenticated user' ******************************/ - $roles = Role::loadMultiple(); + $roles = $this->entityTypeManager->getStorage('user_role')->loadMultiple(); unset($roles[RoleInterface::ANONYMOUS_ID]); unset($roles[RoleInterface::AUTHENTICATED_ID]); $roles = array_map(fn(RoleInterface $role) => $role->label(), $roles); diff --git a/web/modules/roleassign/src/Plugin/views/field/RoleAssignUserBulkForm.php b/web/modules/roleassign/src/Plugin/views/field/RoleAssignUserBulkForm.php index a181e45258ba40d59c1077e67af2c65007266b3b..e4b07ba0fe2ce3351b748e7cde470f0fa2298b76 100644 --- a/web/modules/roleassign/src/Plugin/views/field/RoleAssignUserBulkForm.php +++ b/web/modules/roleassign/src/Plugin/views/field/RoleAssignUserBulkForm.php @@ -16,7 +16,7 @@ class RoleAssignUserBulkForm extends UserBulkForm { /** * {@inheritdoc} */ - public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) { + public function init(ViewExecutable $view, DisplayPluginBase $display, ?array &$options = NULL) { parent::init($view, $display, $options); if (_roleassign_restrict_access()) { diff --git a/web/modules/scheduler/.cspell-project-words.txt b/web/modules/scheduler/.cspell-project-words.txt index 30939606a2233d9c9af00c3689624924299ef45a..613e31976d3e9a77dc9fd187f382f3dbabcd5fd7 100644 --- a/web/modules/scheduler/.cspell-project-words.txt +++ b/web/modules/scheduler/.cspell-project-words.txt @@ -1,5 +1,6 @@ # Drupal components, module names and programming terms commerceproduct +commerceguys mediatype nodetype taxonomyterm @@ -13,6 +14,10 @@ drupalspoons backported tnid randomstring +logfile +oneline +mkdocs +testgroup # Scheduler words timecheck @@ -32,3 +37,6 @@ Wenlock # Real words missing from dictionary unrequired + +# Other +Rnnn diff --git a/web/modules/scheduler/.gitlab-ci.yml b/web/modules/scheduler/.gitlab-ci.yml index ec3487604bd5030349c9c579aea8d41a92d1cc83..3ba4664e1b9ed20914bd75c75f1096e489f9c81d 100644 --- a/web/modules/scheduler/.gitlab-ci.yml +++ b/web/modules/scheduler/.gitlab-ci.yml @@ -21,11 +21,14 @@ variables: OPT_IN_TEST_PREVIOUS_MAJOR: 1 OPT_IN_TEST_NEXT_MINOR: 1 OPT_IN_TEST_NEXT_MAJOR: 1 + OPT_IN_TEST_DRUPAL9: 1 OPT_IN_TEST_DRUPAL8: 1 RUN_JOB_UPGRADE_STATUS: 1 + _SHOW_ENVIRONMENT_VARIABLES: 1 _PHPUNIT_CONCURRENT: 1 _PHPUNIT_TESTGROUPS: '' + _CSPELL_EXTRA: '--dot' ################ # Job overrides @@ -44,13 +47,18 @@ variables: printf "CI_PAGES_URL = %s\n" $CI_PAGES_URL && printf "CI_PROJECT_NAME = %s\n" $CI_PROJECT_NAME && printf "CI_JOB_NAME = %s\n" "$CI_JOB_NAME" && - printf "CI_JOB_NAME chopped = %s\n" "${CI_JOB_NAME%:*}" && + printf "CI_JOB_NAME trimmed from : = %s\n" "${CI_JOB_NAME%:*}" && printf "DRUPAL_CORE = %s\n" $DRUPAL_CORE && printf "PHP_VERSION = %s\n" $PHP_VERSION && - printf "MODULE_NAME = %s\n" $MODULE_NAME + printf "PHP_IMAGE_VARIANT = %s\n" $PHP_IMAGE_VARIANT && + printf "PHP_IMAGE_TAG = %s\n" $PHP_IMAGE_TAG # -------------------------------- BUILD --------------------------------------- +.opt-in-drupal9-rule: &opt-in-drupal9-rule + if: '$OPT_IN_TEST_DRUPAL9 != "1"' + when: never + .opt-in-drupal8-rule: &opt-in-drupal8-rule if: '$OPT_IN_TEST_DRUPAL8 != "1"' when: never @@ -72,16 +80,21 @@ variables: - if [[ $DRUPAL_CORE =~ ^11 ]]; then rm composer.json; mv composer_for_d11_testing.json composer.json; echo "Using composer_for_d11_testing.json"; fi; after_script: - !reference [ .create-environment-variables ] + - pwd && echo "Top-level directories" && ls -tldr */ + - printf "Top 10 folders by size:\n" && du -m web/* | sort -n -r | head -n 10 || true # Show the last two commits. Current directory /builds/project/scheduler ($CI_PROJECT_DIR) is correct. - git show -2 --stat --oneline + - | + [[ $CI_PIPELINE_SOURCE == "merge_request_event" ]] && BASELINE=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-$CI_MERGE_REQUEST_DIFF_BASE_SHA} && git diff --stat $BASELINE && git diff $BASELINE -- .gitlab-ci.yml | head -n 30 || true - *show-variables # - cat composer.json - - COLUMNS=120 composer show | grep -E '\/(core |rules|commerce|entity|inline_entity_form|workbench|drush|devel_generate|address)' + - COLUMNS=130 composer show | grep -E '\/(core |rules|commerce|entity|inline_entity_form|workbench|drush|devel_generate|address|coder)' composer (max PHP version): # Using when: manual needs 'allow failure: true' otherwise the overall pipeline status shows 'blocked' rules: - !reference [ .opt-in-max-php-rule ] + - !reference [ .check-max-php-version-rule ] - when: manual allow_failure: true @@ -94,7 +107,8 @@ composer (previous minor): composer (previous major): rules: - !reference [ .opt-in-previous-major-rule ] - - *manual-if-not-mr-rule + - when: manual + allow_failure: true composer (next minor): rules: @@ -107,21 +121,66 @@ composer (next major): - !reference [ .opt-in-next-major-rule ] - *manual-if-not-mr-rule +composer (drupal 9): + extends: .composer-base + rules: + - *opt-in-drupal9-rule + - when: manual + allow_failure: true + variables: + PHP_VERSION: 8.1 + DRUPAL_CORE: ^9.5 + PHP_IMAGE_VARIANT: 'apache' + composer (drupal 8): extends: .composer-base rules: - *opt-in-drupal8-rule - - *manual-if-not-mr-rule + - when: manual + allow_failure: true variables: PHP_VERSION: 7.4 - DRUPAL_CORE: 8.9.20 + DRUPAL_CORE: ^8.9 + PHP_IMAGE_VARIANT: 'apache' + before_script: + - !reference [.composer-base, before_script] + # Some tests need to be modified to allow running on Drupal 8 + # See https://www.drupal.org/project/scheduler/issues/3356800 + - patch -p1 < tests/3356800-d8.patch + +# Custom job to check MkDocs files for incorrectly formatted links before they are published. +mkdocs: + stage: build + image: $_CONFIG_DOCKERHUB_ROOT/php-$PHP_VERSION-$PHP_IMAGE_VARIANT:$PHP_IMAGE_TAG + rules: + - if: '$SKIP_MKDOCS == "1"' + when: never + - changes: + - docs/**/* + - mkdocs.yml + when: on_success + script: + - !reference ['.calculate-gitlab-ref'] + - !reference [ .create-environment-variables ] + - *show-variables + - EXIT_CODE=0; + - echo -e "Get the script from gitlab_templates\nExecuting curl -L --output scripts/unformatted-links.php https://git.drupalcode.org/$_CURL_TEMPLATES_REPO/-/raw/$_CURL_TEMPLATES_REF/scripts/unformatted-links.php" + - curl -L --output scripts/unformatted-links.php https://git.drupalcode.org/$_CURL_TEMPLATES_REPO/-/raw/$_CURL_TEMPLATES_REF/scripts/unformatted-links.php + - pwd && ls -la scripts/* + - php scripts/unformatted-links.php || EXIT_CODE=1 + - exit $EXIT_CODE # -------------------------------- VALIDATE ------------------------------------ eslint: allow_failure: false after_script: + - echo "Change to directory above the project" + - cd $CI_PROJECT_DIR/$_WEB_ROOT/modules/custom + - ls -lG .{eslint,prettier}* || true + - echo "Change to the project directory" - cd $CI_PROJECT_DIR/$_WEB_ROOT/modules/custom/$CI_PROJECT_NAME + - ls -lG .{eslint,prettier}* || true - test -f .eslintignore && echo "=== This is .eslintignore ===" && cat .eslintignore || true - test -f .prettierignore && echo "=== This is .prettierignore ===" && cat .prettierignore || true @@ -138,18 +197,31 @@ phpstan: # -------------------------------- TEST ---------------------------------------- +.scheduler-testgroup-rule: &scheduler-testgroup-rule + # Run some test groups manually not automatically. + # @todo put back "scheduler_drush" when https://www.drupal.org/project/scheduler/issues/3359998 is solved. + # @todo put back "scheduler_workbench" when https://www.drupal.org/project/scheduler/issues/3495229 is solved. + - if: $_MATRIX_VALUE == "scheduler_drush" || $_MATRIX_VALUE == "scheduler_workbench" + when: manual + allow_failure: true + - when: on_success + phpunit: parallel: matrix: # Run test groups in parallel. This also speeds up identification of failing tests. - # @todo put back "scheduler_drush" when https://www.drupal.org/i/3359998 is solved. - _MATRIX_VALUE: - scheduler - scheduler_api - # - scheduler_drush + - scheduler_drush - scheduler_js - scheduler_kernel - scheduler_rules_integration + - scheduler_workbench + rules: + - !reference [ .opt-in-current-rule ] + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule before_script: # If any variation also needs a before_script then add - !reference [phpunit, before_script] to include this script. - *show-variables @@ -158,7 +230,8 @@ phpunit: printf "_PHPUNIT_CONCURRENT = %s\n" $_PHPUNIT_CONCURRENT && printf "_PHPUNIT_TESTGROUPS = %s\n" "$_PHPUNIT_TESTGROUPS" && printf "_PHPUNIT_EXTRA = %s\n" "$_PHPUNIT_EXTRA" && - printf "SYMFONY_DEPRECATIONS_HELPER = %s\n" $SYMFONY_DEPRECATIONS_HELPER + printf "SYMFONY_DEPRECATIONS_HELPER = %s\n" "$SYMFONY_DEPRECATIONS_HELPER" && + printf "MINK_DRIVER_ARGS_WEBDRIVER = %s\n" "$MINK_DRIVER_ARGS_WEBDRIVER" - | if [[ "$_MATRIX_VALUE" != "" ]]; then if [[ "$_PHPUNIT_CONCURRENT" == "0" ]]; then @@ -173,31 +246,71 @@ phpunit: fi # Patch to disable strict config schema validation on older versions of core. # See https://www.drupal.org/project/scheduler/issues/3451750 - - if [[ $DRUPAL_CORE =~ ^(8.9|9.5|10.2) ]]; then patch -p1 --verbose < tests/3451750-strict-config-schema.patch; fi + - vendor/bin/drush status | awk "NR==1{print \$4}" | grep -E '^(8.|9.|10.2)' && echo 'Core version is before 10.3, patching to remove strict config validation' && patch -p1 < tests/3451750-strict-config-schema.patch - echo "End of before_script _PHPUNIT_CONCURRENT=$_PHPUNIT_CONCURRENT _PHPUNIT_EXTRA=$_PHPUNIT_EXTRA" +phpunit (max PHP version): + rules: + - !reference [ .opt-in-max-php-rule ] + - !reference [ .skip-phpunit-rule ] + - !reference [ .check-max-php-version-rule ] + - *scheduler-testgroup-rule + +phpunit (previous minor): + rules: + - !reference [ .opt-in-previous-minor-rule ] + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule + +phpunit (previous major): + rules: + - !reference [ .opt-in-previous-major-rule ] + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule + phpunit (next minor): + rules: + - !reference [ .opt-in-next-minor-rule ] + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule variables: # Use core ignoreFile to show deprecations. This is only used when $_PHPUNIT_CONCURRENT=1 so make sure that is also set. _PHPUNIT_CONCURRENT: 1 SYMFONY_DEPRECATIONS_HELPER: "ignoreFile=$CI_PROJECT_DIR/$_WEB_ROOT/core/.deprecation-ignore.txt" phpunit (next major): + rules: + - !reference [ .opt-in-next-major-rule ] + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule variables: # Use core ignoreFile to show deprecations. This is only used when $_PHPUNIT_CONCURRENT=1 so make sure that is also set. _PHPUNIT_CONCURRENT: 1 SYMFONY_DEPRECATIONS_HELPER: "ignoreFile=$CI_PROJECT_DIR/$_WEB_ROOT/core/.deprecation-ignore.txt" -phpunit (drupal 8): +phpunit (drupal 9): extends: phpunit + services: + - !reference [ .with-database ] + - !reference [ .with-chrome-legacy ] + rules: + - *opt-in-drupal9-rule + - !reference [ .skip-phpunit-rule ] + - *scheduler-testgroup-rule + needs: + - "composer (drupal 9)" + allow_failure: true + variables: + MINK_DRIVER_ARGS_WEBDRIVER: $MINK_DRIVER_ARGS_WEBDRIVER_LEGACY + +phpunit (drupal 8): + extends: phpunit (drupal 9) rules: - *opt-in-drupal8-rule - !reference [ .skip-phpunit-rule ] - - !reference [ .phpunit-tests-exist-rule ] - - when: on_success + - *scheduler-testgroup-rule needs: - "composer (drupal 8)" - allow_failure: true test-only changes: # Remove the parallel definition that is defined in the customized phpunit. diff --git a/web/modules/scheduler/.gitlab/merge_request_templates/gitlab_templates_mr.md b/web/modules/scheduler/.gitlab/merge_request_templates/gitlab_templates_mr.md new file mode 100644 index 0000000000000000000000000000000000000000..955897af0216f271ca7163d6d40e442e25175cd8 --- /dev/null +++ b/web/modules/scheduler/.gitlab/merge_request_templates/gitlab_templates_mr.md @@ -0,0 +1,4 @@ +Draft: MRnnn #gt-issue-num Description +- Gitlab Templates issue #gt-issue-num +- Gitlab Templates [MRnnn](https://git.drupalcode.org/project/gitlab_templates/-/merge_requests/nnn) +- Scheduler test issue #3445052 (2.x) #3480501 (7.x-1.x) diff --git a/web/modules/scheduler/.travis.yml b/web/modules/scheduler/.travis.yml deleted file mode 100644 index d7ac36f22732ef19c66a2013b2b10488181117d3..0000000000000000000000000000000000000000 --- a/web/modules/scheduler/.travis.yml +++ /dev/null @@ -1,167 +0,0 @@ -language: php -os: linux -dist: xenial - -services: - - mysql - -env: - global: - # Make the script re-usable for other modules. - - MODULE=scheduler - # Initialize the real SYMFONY_DEPRECATIONS_HELPER variable. - - SYMFONY_DEPRECATIONS_HELPER=0 - # Create a default for the allowed deprecations per branch. - - DEPRECATIONS=0 - -jobs: - fast_finish: true - include: - - php: 7.4 - env: - - DRUPAL_CORE=9.5.x - # Run the Node and Product tests, with Rules included. - - NODE=YES - - PRODUCT=YES - - RULES=YES - # ---- Remaining self deprecation notices (0) - # ---- Other deprecation notices (0) - - DEPRECATIONS=0 - - php: 8.1 - env: - - DRUPAL_CORE=9.5.x - - MEDIA=YES - - TAXONOMY=YES - # ---- Unsilenced deprecation notices (6) - # 6 strlen(): Passing null to parameter #1 ($string) is deprecated (SchedulerDrushTest) - # ---- Remaining self deprecation notices (0) - # ---- Other deprecation notices (0) - - DEPRECATIONS=6 - - php: 8.1 - env: - # Run the Node tests only. - - DRUPAL_CORE=10.0.x - - NODE=YES - # ---- Remaining self deprecation notices (4) - # 2 Behat\Mink\Element\ElementInterface::getText() might add "string" - # 2 Behat\Mink\Element\ElementInterface::waitFor()" might add "mixed" - # ---- Remaining direct deprecation notices (3) - # 1 PHPUnit\TextUI\DefaultResultPrinter class is considered internal - # 2 Drupal\Tests\Listeners\DrupalListener - # ---- Other deprecation notices (2) - # 2 PHPUnit\Framework\TestCase::addWarning() method is considered internal - - DEPRECATIONS=9 - -# Be sure to cache composer downloads. -cache: - directories: - - $HOME/.composer - -before_script: - # At job start-up Composer is installed at 1.8.4 then self-update is run. From - # 24 October 2020 this bumped the version to Composer 2. - - composer --version - - echo $MODULE - - # Remove Xdebug as we don't need it and it causes - # PHP Fatal error: Maximum function nesting level of '256' reached. - # We also don't care if that file exists or not on PHP 7. - - phpenv config-rm xdebug.ini || true - - # Navigate up out of $TRAVIS_BUILD_DIR to prevent blown stack on recursive module lookup. - - pwd - - cd .. - - # Create database. - - mysql -e "create database $MODULE" - # Export database variable for kernel tests. - - export SIMPLETEST_DB=mysql://root:@127.0.0.1/$MODULE - - # Download Drupal core from the Github mirror because it is faster. - - travis_retry git clone --branch $DRUPAL_CORE --depth 1 https://github.com/drupal/drupal.git - - cd drupal - # Store the path to Drupal root. - - DRUPAL_ROOT=$(pwd) - - echo $DRUPAL_ROOT - - # Make a directory for our module and copy the built source into it. - - mkdir $DRUPAL_ROOT/modules/$MODULE - - cp -R $TRAVIS_BUILD_DIR/* $DRUPAL_ROOT/modules/$MODULE/ - - # Install the site dependencies via Composer. - - travis_retry composer install - - # Install the testing dependencies via Composer. - - travis_retry composer require drupal/devel:"^4 || ^5" - - travis_retry composer require drush/drush:"^9 || ^10 || ^11" - - # Need to get Rules dev because 3.0.0-alpha7 has deprecation warnings. - - if [ "$RULES" == "YES" ]; then travis_retry composer require drupal/rules:"3.x-dev"; fi - - travis_retry composer require drupal/workbench_moderation - # Use * because only the dev version of WBMA is compatible with D9. None for D10. - - if [[ $DRUPAL_CORE =~ ^(8|9) ]]; then travis_retry composer require drupal/workbench_moderation_actions:*; fi - - travis_retry composer require commerceguys/addressing - - travis_retry composer require drupal/commerce - - # Coder is already installed as part of composer install. We just need to set - # the installed_paths to pick up the Drupal standards. This is only for Coder - # up to version 8.3.13. From 8.3.14 onwards this is done at install time. - - | - if [[ "$DRUPAL_CORE" == "8.9.x" || "$DRUPAL_CORE" == "9.2.x" || "$DRUPAL_CORE" == "9.3.x" ]]; then - $DRUPAL_ROOT/vendor/bin/phpcs --config-set installed_paths $DRUPAL_ROOT/vendor/drupal/coder/coder_sniffer - fi - - # Start a web server on port 8888, run in the background. - - php -S localhost:8888 & - - # Export web server URL for browser tests. - - export SIMPLETEST_BASE_URL=http://localhost:8888 - - # Get the allowed number of deprecation warnings. - - SYMFONY_DEPRECATIONS_HELPER=$DEPRECATIONS || $SYMFONY_DEPRECATIONS_HELPER - - echo $SYMFONY_DEPRECATIONS_HELPER - -script: - - echo "NODE=$NODE MEDIA=$MEDIA PRODUCT=$PRODUCT TAXONOMY=$TAXONOMY RULES=$RULES" - # By default the specific entity type tests will be excluded unless explicitly - # included via a YES variable value. - - EXCLUDE=() - - if [ "$NODE" != "YES" ]; then EXCLUDE+=('node|HooksLegacy|Multilingual|WorkbenchModeration|Migrate'); fi - - if [ "$MEDIA" != "YES" ]; then EXCLUDE+=('media'); fi - - if [ "$PRODUCT" != "YES" ]; then EXCLUDE+=('product'); fi - - if [ "$TAXONOMY" != "YES" ]; then EXCLUDE+=('taxonomy'); fi - - if [ "$RULES" != "YES" ]; then EXCLUDE+=('rules'); fi - - if [ "$DRUPAL_CORE" == "10.0.x" ]; then EXCLUDE+=('HooksLegacy|WorkbenchModeration'); fi - - EXCLUDE=${EXCLUDE[@]} # create a space delimited string from array - - # Run the PHPUnit tests, excluding the javascript test group. - - cd $DRUPAL_ROOT - - | - if [ "$EXCLUDE" != "" ]; then - echo "Running tests excluding $EXCLUDE ..." - export FILTER="/^(?!.*(${EXCLUDE// /|})).*/i" # use parameter expansion to substitute spaces with | - echo "FILTER=$FILTER" - ./vendor/bin/phpunit -c ./core/phpunit.xml.dist --debug ./modules/$MODULE/ --exclude-group=scheduler_js --filter "$FILTER" - else - echo "Running all tests ..." - ./vendor/bin/phpunit -c ./core/phpunit.xml.dist --debug ./modules/$MODULE/ --exclude-group=scheduler_js - fi - # Display the parameters again at the end of the test run. - - echo "NODE=$NODE MEDIA=$MEDIA PRODUCT=$PRODUCT TAXONOMY=$TAXONOMY RULES=$RULES" - - echo "EXCLUDE=$EXCLUDE" - - # Check for coding standards. First show the versions. - - composer show drupal/coder | egrep 'name |vers' - - composer show squizlabs/php_codesniffer | egrep 'name |vers' - - $DRUPAL_ROOT/vendor/bin/phpcs --version - - $DRUPAL_ROOT/vendor/bin/phpcs --config-show installed_paths - - - # Change into $MODULE directory to avoid having to add --standard=$DRUPAL_ROOT/modules/$MODULE/phpcs.xml.dist - - cd $DRUPAL_ROOT/modules/$MODULE - - # List the standards and the sniffs that are used. - - $DRUPAL_ROOT/vendor/bin/phpcs -i - - $DRUPAL_ROOT/vendor/bin/phpcs -e - - # Show the violations in detail, plus summary and source report. - - $DRUPAL_ROOT/vendor/bin/phpcs . --report-full --report-summary --report-source -s; diff --git a/web/modules/scheduler/.tugboat/config.yml b/web/modules/scheduler/.tugboat/config.yml index d6e1b1b2db00a2bd8fad2506a0331703d026d834..91d0ca056bd2e2e6576f72303f66ac662a7d780a 100644 --- a/web/modules/scheduler/.tugboat/config.yml +++ b/web/modules/scheduler/.tugboat/config.yml @@ -1,16 +1,18 @@ +# cspell:ignore q0rban tugboatqa bcmath updatedb services: php: - image: q0rban/tugboat-drupal:10.0 + image: q0rban/tugboat-drupal:10 default: true http: false depends: mysql commands: init: | - # Install the bcmath extension, required for commerce_product - docker-php-ext-install bcmath + # Install the bcmath extension, required for commerce_product. + # Added > /dev/null because the commands print a huge amount to the log. + docker-php-ext-install bcmath > /dev/null # JPEG support is not included by default, but it is needed when generating content. - docker-php-ext-configure gd --enable-gd --with-jpeg - docker-php-ext-install gd + docker-php-ext-configure gd --enable-gd --with-jpeg > /dev/null + docker-php-ext-install gd > /dev/null update: | set -eux @@ -31,7 +33,7 @@ services: # Composer package repository. composer config repositories.tugboat vcs $TUGBOAT_ROOT - # Now we can require this module, specifing the branch name we created + # Now we can require this module, specifying the branch name we created # above that uses the $TUGBOAT_REPO_ID environment variable. composer require drupal/scheduler:dev-$TUGBOAT_REPO_ID @@ -39,10 +41,13 @@ services: vendor/bin/drush \ --yes \ --db-url=mysql://tugboat:tugboat@mysql:3306/tugboat \ - --site-name="${TUGBOAT_PREVIEW_NAME}" \ + --site-name="Scheduler ${TUGBOAT_PREVIEW_NAME}" \ --account-pass=admin \ site:install standard + # Add the trusted host pattern for tugboat previews. + echo "\$settings['trusted_host_patterns'] = ['\.tugboatqa\.com\$'];" >> $DOCROOT/sites/default/settings.php + # Show site status and GD image support status. vendor/bin/drush status-report vendor/bin/drush php:eval 'phpinfo()' | grep GD @@ -56,15 +61,11 @@ services: composer require drupal/inline_entity_form ^1.0@RC composer require drupal/commerce - # Get other useful modules. - composer require drupal/devel_generate + # Get config_update specifying 2 because the latest stable release is 1.7 which is only compatible up to D9. + composer require drupal/config_update:^2@alpha - # These modules are not compatible with Drupal 10 (yet) so only get them - # when running Drupal 9. - vendor/bin/drush core:status | awk "NR==1{print \$2\$3\$4}" - vendor/bin/drush core:status | awk "NR==1{print \$2\$3\$4}" | \ - grep version:9 && composer require drupal/module_filter drupal/workbench_moderation \ - drupal/workbench_moderation_actions:1.x-dev drupal/admin_toolbar + # Get other useful modules. + composer require drupal/devel_generate drupal/module_filter drupal/admin_toolbar # Set up the files directory permissions. mkdir -p $DRUPAL_DOCROOT/sites/default/files @@ -73,11 +74,7 @@ services: chmod -R g+w $DRUPAL_DOCROOT/sites/default/files # Enable modules. - vendor/bin/drush --yes pm:enable scheduler devel devel_generate media commerce_product - - # Enable modules that are only available at Drupal 9. - vendor/bin/drush core:status | awk "NR==1{print \$2\$3\$4}" | \ - grep version:9 && vendor/bin/drush --yes pm:enable module_filter admin_toolbar + vendor/bin/drush --yes pm:enable scheduler devel devel_generate module_filter admin_toolbar media commerce_product taxonomy config_update_ui # Show versions. composer show drupal/scheduler | egrep 'name |vers' @@ -85,6 +82,16 @@ services: composer show drupal/devel | egrep 'name |vers' vendor/bin/drush pml | grep devel + # Add some more items to the Devel toolbar. The default is 7 items, stored as 0 - 6, so new items start 7. These items + # are already available in the devel toolbar 'config' but adding them here is equivalent to ticking the checkbox. + vendor/bin/drush -y config-set devel.toolbar.settings toolbar_items.7 devel_generate.generate2 + vendor/bin/drush -y config-set devel.toolbar.settings toolbar_items.8 devel.configs_list + vendor/bin/drush -y config-set devel.toolbar.settings toolbar_items.9 devel.switch_user + vendor/bin/drush config-get devel.toolbar.settings + + # Site settings + vendor/bin/drush -y config-set system.date timezone.default Europe/London + # Scheduler general settings. vendor/bin/drush -y config-set scheduler.settings allow_date_only 1 vendor/bin/drush -y config-set scheduler.settings default_time '22:06:00' @@ -114,56 +121,73 @@ services: vendor/bin/drush -y config-set commerce_product.commerce_product_type.default third_party_settings.scheduler.fields_display_mode 'fieldset' vendor/bin/drush config-get commerce_product.commerce_product_type.default third_party_settings + # Scheduler taxonomy settings. + vendor/bin/drush -y config-set taxonomy.vocabulary.tags third_party_settings.scheduler.publish_enable 1 + vendor/bin/drush -y config-set taxonomy.vocabulary.tags third_party_settings.scheduler.unpublish_enable 1 + vendor/bin/drush -y config-set taxonomy.vocabulary.tags third_party_settings.scheduler.publish_past_date 'schedule' + vendor/bin/drush -y config-set taxonomy.vocabulary.tags third_party_settings.scheduler.expand_fieldset 'always' + vendor/bin/drush -y config-set taxonomy.vocabulary.tags third_party_settings.scheduler.fields_display_mode 'fieldset' + vendor/bin/drush config-get taxonomy.vocabulary.tags third_party_settings + # Media settings. vendor/bin/drush -y config-set media.settings standalone_url 1 vendor/bin/drush config-get media.settings vendor/bin/drush -y config-set field.field.media.image.field_media_image required 0 vendor/bin/drush config-get field.field.media.image.field_media_image - # Create roles for each of the scheduler user permissions. - vendor/bin/drush role-create 'my_content_editor' 'Content Editor' - vendor/bin/drush role-add-perm 'my_content_editor' 'schedule publishing of nodes' - vendor/bin/drush role-create 'content_viewer' 'Content Viewer' + # Create and update roles for scheduler permissions. We can re-use the pre-existing content_editor role. + vendor/bin/drush role-add-perm 'content_editor' 'schedule publishing of nodes' + vendor/bin/drush role-create 'content_viewer' 'Content viewer' vendor/bin/drush role-add-perm 'content_viewer' 'view scheduled content' - vendor/bin/drush role-create 'media_editor' 'Media Editor' + vendor/bin/drush role-create 'media_editor' 'Media editor' vendor/bin/drush role-add-perm 'media_editor' 'schedule publishing of media' - vendor/bin/drush role-create 'media_viewer' 'Media Viewer' + vendor/bin/drush role-create 'media_viewer' 'Media viewer' vendor/bin/drush role-add-perm 'media_viewer' 'view scheduled media' - vendor/bin/drush role-create 'product_editor' 'Product Editor' + vendor/bin/drush role-create 'product_editor' 'Product editor' vendor/bin/drush role-add-perm 'product_editor' 'schedule publishing of commerce_product' - vendor/bin/drush role-create 'product_viewer' 'Product Viewer' + vendor/bin/drush role-create 'product_viewer' 'Product viewer' vendor/bin/drush role-add-perm 'product_viewer' 'view scheduled commerce_product' + vendor/bin/drush role-create 'term_editor' 'Taxonomy editor' + vendor/bin/drush role-add-perm 'term_editor' 'schedule publishing of taxonomy_term' + vendor/bin/drush role-create 'term_viewer' 'Taxonomy viewer' + vendor/bin/drush role-add-perm 'term_viewer' 'view scheduled taxonomy_term' # Add some permissions for all authenticated users. vendor/bin/drush role-add-perm 'authenticated' \ - "create article content, edit any article content, delete any article content, \ - access content overview, view own unpublished content, switch users" + "switch users, access toolbar, access administration pages, access devel information" + vendor/bin/drush role-add-perm 'authenticated' \ + "create article content, edit any article content, delete any article content, view own unpublished content, access content overview" + vendor/bin/drush role-add-perm 'authenticated' \ + "create media, update any media, delete any media, view own unpublished media, access media overview" vendor/bin/drush role-add-perm 'authenticated' \ - "create media, update any media, delete any media, access media overview, view own unpublished media" + "create default commerce_product, update any default commerce_product, delete any default commerce_product, \ + view own unpublished commerce_product, administer commerce_store, access commerce_product overview" vendor/bin/drush role-add-perm 'authenticated' \ - "create default commerce_product, update any default commerce_product, \ - delete any default commerce_product, access commerce_product overview, \ - view own unpublished commerce_product, administer commerce_store" + "create terms in tags, delete terms in tags, edit terms in tags, access taxonomy overview" # Create users and give them roles. vendor/bin/drush user-create 'Eddy content editor' - vendor/bin/drush user-add-role 'my_content_editor' 'Eddy content editor' + vendor/bin/drush user-add-role 'content_editor' 'Eddy content editor' vendor/bin/drush user-create 'Vera content viewer' vendor/bin/drush user-add-role 'content_viewer' 'Vera content viewer' vendor/bin/drush user-create 'Madeline media editor' vendor/bin/drush user-add-role 'media_editor' 'Madeline media editor' vendor/bin/drush user-create 'Marvin media viewer' vendor/bin/drush user-add-role 'media_viewer' 'Marvin media viewer' - vendor/bin/drush user-create 'Prodie product editor' - vendor/bin/drush user-add-role 'product_editor' 'Prodie product editor' + vendor/bin/drush user-create 'Prodigy product editor' + vendor/bin/drush user-add-role 'product_editor' 'Prodigy product editor' vendor/bin/drush user-create 'Proctor product viewer' vendor/bin/drush user-add-role 'product_viewer' 'Proctor product viewer' + vendor/bin/drush user-create 'Terra term editor' + vendor/bin/drush user-add-role 'term_editor' 'Terra term editor' + vendor/bin/drush user-create 'Tevet term viewer' + vendor/bin/drush user-add-role 'term_viewer' 'Tevet term viewer' - # Generate content. - vendor/bin/drush devel-generate-content 3 --bundles=article --authors=1,2 --verbose - vendor/bin/drush devel-generate-content 3 --bundles=page --authors=1,2 --verbose - vendor/bin/drush devel-generate-media 3 --media-types=document --verbose - vendor/bin/drush devel-generate-media 3 --media-types=image --verbose + # Generate content for bundles that have scheduling enabled. + vendor/bin/drush devel-generate-terms 3 --bundles=tags + vendor/bin/drush devel-generate-content 3 --bundles=article --authors=1,2,3 + # Note: The --authors option does not exist in devel-generate-media + vendor/bin/drush devel-generate-media 3 --media-types=image # Update form displays to match the entity type settings. vendor/bin/drush ev "\Drupal::service('scheduler.manager')->resetFormDisplayFields()" @@ -171,9 +195,6 @@ services: # @todo Place the 'Switch users' block in first sidebar. # @todo Add 'content overview' and 'media overview' to tools menu. # @todo Create a store for products. Then create some products. - # @todo Generate a vocabulary and some terms. Create users for taxonomy. - # @todo page entity type should not be promoted to front page. - # @todo Create a menu of links to the pages? build: | set -eux @@ -186,7 +207,7 @@ services: # Update this module, including all dependencies. composer update drupal/scheduler --with-all-dependencies - vendor/bin/drush --yes updb + vendor/bin/drush --yes updatedb vendor/bin/drush cache:rebuild mysql: diff --git a/web/modules/scheduler/composer_for_d11_testing.json b/web/modules/scheduler/composer_for_d11_testing.json index f4af42475c697727468bba85cdbaa3867300ccd3..54b90a4dea06ab8fb40c7d50f81fb5943b87b7fe 100644 --- a/web/modules/scheduler/composer_for_d11_testing.json +++ b/web/modules/scheduler/composer_for_d11_testing.json @@ -10,15 +10,11 @@ "drupal/devel_generate": ">=4", "drupal/workbench_moderation": "*", "drupal/workbench_moderation_actions": "dev-3435732-automated-drupal-11", - "drupal/entity": "dev-3465393-EntityDuplicateSubscriber-array-return as 1.0", + "drupal/entity": "1.x-dev as 1.0", "drupal/inline_entity_form": "dev-3438428-automated-drupal-11 as 3.1.0", "drupal/commerce": "^2 || ^3" }, "repositories": { - "entity": { - "type": "vcs", - "url": "https://git.drupalcode.org/issue/entity-3465393.git" - }, "inline_entity_form": { "type": "vcs", "url": "https://git.drupalcode.org/issue/inline_entity_form-3438428.git" diff --git a/web/modules/scheduler/docs/index.md b/web/modules/scheduler/docs/index.md new file mode 100644 index 0000000000000000000000000000000000000000..868d3ada4950731a96f92a2ff0e1d17df9e221f9 --- /dev/null +++ b/web/modules/scheduler/docs/index.md @@ -0,0 +1,10 @@ +--- +hide: + - toc +--- + +# Scheduler + +The [Scheduler module](https://www.drupal.org/project/scheduler) gives editors the ability to schedule content, media, commerce products and taxonomy terms for publishing and unpublishing at specified dates and times in the future. + +## Documentation diff --git a/web/modules/scheduler/docs/plugin.md b/web/modules/scheduler/docs/plugin.md new file mode 100644 index 0000000000000000000000000000000000000000..fa8c4dc273b2723e16aa7f18796396c80f833d6a --- /dev/null +++ b/web/modules/scheduler/docs/plugin.md @@ -0,0 +1,9 @@ +# Scheduler Plugin System + +The 2.x branch of Scheduler introduced a plugin system to allow scheduled processing of more entity types. Plugins have been developed to schedule Content, Media, Commerce Products and Taxonomy Terms, and these plugins are included in the project. + +Other implementations of the plugin are being developed in 3rd-party modules, and these can be stored in that 3rd-party module's codebase. If an implementation is developed for another core entity type, or a commonly-used module, then these may be added to Scheduler in future. + +The primary requirement is that the entity type has to have the concept of "being published" which is boolean true/false. This can be any field, it does not need to be the core `status` field. The field just needs to implement the method `->setPublished(bool)`. + +The entity type also needs to have a "bundle" field, but there is an open issue for [supporting non-bundled entities](https://www.drupal.org/project/scheduler/issues/3355087). diff --git a/web/modules/scheduler/docs/plugin_create.md b/web/modules/scheduler/docs/plugin_create.md new file mode 100644 index 0000000000000000000000000000000000000000..29db8f0af20a69b69ecd01877e85163cd8b3a4a8 --- /dev/null +++ b/web/modules/scheduler/docs/plugin_create.md @@ -0,0 +1,36 @@ +# Create a Scheduler plugin for an entity type + +Here are step-by-step instructions for creating a plugin for a new entity type. The following naming conventions are used: + +- `{entity_type_id}` refers to the actual entity type id, the lower-case machine name, for example ‘node’, ‘media’ and ‘commerce_product’. +- `{Type}` refers to the equivalent UpperCamelCase non-underscore version used in class names, for example ‘Node’, ‘Media’ and ‘CommerceProduct’. + +## Steps + +1. Create the new plugin definition file, named `/src/Plugin/Scheduler/{Type}Scheduler.php` +1. The complete list of plugin definition properties, with examples, is as follows: +``` + * @SchedulerPlugin( + * id = "example_scheduler", + * label = @Translation("Example Scheduler Plugin"), + * description = @Translation("Support for scheduling Example entities"), + * entityType = "example", + * dependency = "example_product", + * typeFieldName = "category", + * develGenerateForm = "devel_generate_form_example", + * collectionRoute = "entity.example.overview" + * userViewRoute = "view.scheduler_scheduled_example.user_page", + * schedulerEventClass = "\Drupal\scheduler\Event\SchedulerExampleEvents", + * publishAction = "example_publish", + * unpublishAction = "example_unpublish" + * ) +``` +1. Keep the properties in the order shown above. The first five properties are mandatory and the remaining seven are optional. See [src/SchedulerPluginBase.php](https://git.drupalcode.org/project/scheduler/-/blob/2.x/src/SchedulerPluginBase.php) and [src/Annotation/SchedulerPlugin.php](https://git.drupalcode.org/project/scheduler/-/blob/2.x/src/Annotation/SchedulerPlugin.php) for detailed explanations. +1. Create a new file `src/Event/Scheduler{Type}Events` using a copy of the media file `src/Event/SchedulerMediaEvents.php` as a basis. Do not use the node file as this has the legacy non-generic event naming convention. +1. Add extra two lines in `config/schema/scheduler.schema.yml` to use the saved alias for the new third party settings. If this is not done we get “Configuration inspector - The site's configuration does not match the associated schema” error on the status report. Do not add a new comment line before the reuse of the alias, as oddly this causes a parse error. +1. Create a new view definition and save it as `config/optional/views.view.scheduler_scheduled_{entity_type_id}.yml`. Note, this should be in `config/optional` because only the node content view is stored in `config/install`. +1. A main admin view is not mandatory but is highly desirable, and the view url should be an extension of the entity collection url, for example admin/content/media/scheduled. A user view variant is optional, but if created, the url should be user/{uid}/scheduled_{entity_type_id} +1. In `scheduler.install` add a hook_update function to load the new view. +1. Add the required local task tab definition in `src/Plugin/Derivative/DynamicLocalTasks.php`. The new route should be `view.scheduler_scheduled_{entity_type_id}.overview`. If there is no tab for the general view then add it. This was the case for Media and Commerce Products, but there is a [Core issue](https://www.drupal.org/project/drupal/issues/3199682) to create them automatically. +1. Scheduler Rules Integration - create `scheduler_rules_integration/src/Event/Rules{Type}Event.php` copying from the Media version of this class. In the `CONST` definitions use the entity type id, including underscore if necessary. +1. Update `README.md` to include the new entity in the list of implementations. diff --git a/web/modules/scheduler/docs/plugin_test.md b/web/modules/scheduler/docs/plugin_test.md new file mode 100644 index 0000000000000000000000000000000000000000..4cbc600f70bb99596dc4720a7cf4200849fe650f --- /dev/null +++ b/web/modules/scheduler/docs/plugin_test.md @@ -0,0 +1,20 @@ +# Add test coverage for a Scheduler plugin + +Here are step-by-step instructions for adding test coverage for a new entity type. The following naming conventions are used: + +- `{entity_type_id}` refers to the actual entity type id, the lower-case machine name, for example ‘node’, ‘media’ and ‘commerce_product’. +- `{Type}` refers to the equivalent UpperCamelCase non-underscore version used in class names, for example ‘Node’, ‘Media’ and ‘CommerceProduct’. + +When adding new array values or case statement sections, if possible add the new values at the end of the existing values or after the current lines. + +1. Before changing any test files, run all tests to make sure that any changes to common functions have not created new errors. All tests should pass because the new plugin will not be loaded due the provider module not being installed. +1. The first change is in `tests/src/Functional/SchedulerBrowserTestBase.php` to add the new dependency module into the `$modules` array, and if this is not a core module then also add it to the `"require-dev"` list in [composer.json](https://git.drupalcode.org/project/scheduler/-/blob/2.x/composer.json). After this addition there will probably be test failures, even without explicitly testing the new entity type. +1. In `tests/modules/scheduler_api_test/scheduler_api_test.module` add two use statements for the `entity\{Type}` and `{Type}Interface`. +1. In function `_scheduler_api_test_get_entities()` add a new case for new entity type id. This is done first because it is needed even when the new entity type is not tested explicitly. +1. In `tests/src/Traits` add a new setup trait for the entity type, basing it on `SchedulerMediaSetupTrait.php`. As a start, you can do a case-sensitive replacement of all ‘media’ with the value of `{entity_type_id}` and ‘Media’ with the value of `{Type}`. +1. In `tests/src/Traits/SchedulerSetupTrait.php` add the new entity type to the array in function `dataStandardEntityTypes()` and add the new non-scheduler entity type into `dataNonEnabledTypes()` - these providers are used in 19 tests, so will automatically provide a reasonable coverage of the new plugin. +1. Add a new case section in `createEntity()`, `getEntityByTitle()`, `titleField()` and `entityAddUrl()`. Expand the array of types in `entityTypeObject()` +1. In `SchedulerBrowserTestBase` add a use statement for the new trait and use it at the top of the trait. Execute the trait setUp() function from inside the base setUp(). +1. Make the same changes in `tests/src/FunctionalJavascript/SchedulerJavascriptTestBase.php` +1. Make a new test `tests/src/Functional/SchedulerBasic{Type}Test.php` - use a copy of SchedulerBasicMediaTest as a starting point. +1. In `tests/modules/scheduler_extras/scheduler_extras.module` function `scheduler_extras_form_alter()` include the form id for adding the new entity type. diff --git a/web/modules/scheduler/docs/setup.md b/web/modules/scheduler/docs/setup.md new file mode 100644 index 0000000000000000000000000000000000000000..90f4c4fde150f2d12b6f715799c56819d314a783 --- /dev/null +++ b/web/modules/scheduler/docs/setup.md @@ -0,0 +1 @@ +# Scheduler Set-up diff --git a/web/modules/scheduler/logo.png b/web/modules/scheduler/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..043bc702467a48414943abbe08050ee3bdfc619f --- /dev/null +++ b/web/modules/scheduler/logo.png @@ -0,0 +1,49 @@ +�PNG + +��� IHDR���������æ$���CPLTE���Db��ŕ�F�P����nd|��������Z:Z��������ͩ����������x�������ɠr������ѳ���e���Mi�������8X�����D��ᜬ����Db�Pl����������>]��D:Z�C\�;Y��H�Ѣ�����rNk�B`��zi�xk��⏡����Oa}Zfyg����Wr�>Z�������?[����A\��������F���o����_���j��<Z����b{��G���Ni�d}��~e�\���Yt�Jg���c�b���z���|gښL���������Qm�gku�O�EaiwǑS�K�J��춋Y���<\����\v���]��������ѕP���}��Lh�oor~um��[�WÐT���w�����s��To�I_���]w�A_�djvܛK������Ge��F_y��G����Ɗ�g���^hx��ߡ�a��V���͓Q����nztn�����䫹�����̖B\���ܬ�\��[^x�E]��������Ud{������K`~��|����ذQk�rpqԗNF^��y����������S�������ysn�ÔG^�B]�������tRNS�������������������������������T2���+�IDATx��1j�@Eu���`0Z��b_��M+�;�J��Y�[#,��DU�y�7�{J�ɸ��){�}bp�C������Sl�I@�|���4r1�|�~�1���LQLO;�F23��7�q�C��o��)��i�O�E�ߘT�kȎ��&����+ ��3 +������$�B� +bz�blN���W��)���^ލ�(�l ��7n�)��"�^^jr��T�XD�lL�`u��������E-&��ͳeu���b�IJ�d@��' �:����� +���N�w��n���P*�\f� pP'��P'`�d'�u�8���g$��X��ǎ�|���W{�u��Ґ��5� �:v��{�]��R���^�T�y�?ď�%����#@f��H�_���� H2�c�ݑ7`e�8$��F� @��!@��!@��!@��!@�g��i��a �U���|��+�V������������������������������������������ԣ@M��Ԥ@���Ԥ�kn`���8=��գN�`������1��������������������������{g��4��qQ���i�ۮo�K+XrzЀ�bq�5R+ы�r0��� -HO^�w�=�a]�Ķۙ$�`��f���<=E �P(��J�%�@ �P(��J�%�@ �P(��J�%�����8�bTu/��rx&�j�wf������ѝb�,�0#� ��9t`��Q�u�,@Y��8����CoK��8���蟍�J�6n���l��ƕ������\���T"A�YFm=��ȱGR�%�����Bo{B���+�s���5�1�}���9W���l9��e]��snc�� �0{���Xls�X��qL,��˺8�������V��T���љ% �do���,�@d<�P�"�j�1�P�.�)E@�[�07��]�-Y��`z��8�<�-�z���d:���hA�SbE���<��$�bo"�!�"�ԐIY@�A�8v`J�8�'�a�pPd?G��9#x �\�ly� �� ØK�c�hC���]O����_��E���p�� �X[��[lX��,�k��� �#�����{`G@�/�!��@ ٔ��9�� ��vxc Pb��@7�3"��Mp�� �� �0��@|g�?O��d��}����π� ]��I� �?�J1&VH�ލ���\�&�� P�e�/�N����i��)X�Y���ی���78���8�1� ̸�h9 ���GX=<���^�� ��M��,B�{��� B4P��Bl����\0��ġ�b���������0]�A�����FC]��`~�9�����>��9��/��_��Z���1����o�~0P�?���]�~ +�!;��6���_�d����p�& �S�N�����n���/��#@�۞��˞뎋Ԗ<�hv�ML&�O\�-�%�|N�&c��5�oEZ��HG`ќ&?�Ԋ<'�q�P����b쟰z0��¹\���D��7A���ωjD�?�7��5'�u&`�G9�S�A}� �#߿|NO-���&='Hzxk���uo������z$�:�(�%<'H��f �1z/�K~A��61"}x���K�@�s�d��6Q�8]�L_:99]V����cډ�IH������Г�_n���o����p�|�5XAi����<��b,�+�Ъ��`���}��9-��m &�����/W�7��8ڑ�qP�\]��+�#�I@ ]}��_W1 �����CLgi��s7t��0�� `���$�PD�ь��:UL�yQ�t�����8ڂ +y���30�k����d0���9I��$��躞��d����o_�������0��;�6!�>߁cV��o�ܾ�,�������.�#`uǶ5�c�S��k��:���h�m��'C\�� ۶��u0|�8�ٜL\4'��F�P�j��)G �r��)G �r��)G �r��)G �r��)G �r��)G �r��)G �rܼS�_es�ްk(�:��o�+ܨ��se��]I��n�D4�7�� +��Ae��F��� Θ`e_o�_�T.��[y��AO�[u��{��� +�+_>?��H����oI��Tn=��0%�����uv���{��_H�����kM +���Q�C�,/�&!LY�I%ґ4���e��-�WӍY�^"�B�r�Aa_q���<cy~_@��ߓ��9���T.�� a��i)�o܁2g�)�o����+��2��H!�u��]U�>y-q�yr�7��+qvo\.��c�j�WɃN<=Ư��J��^g�wp���'е�xR�Ǡ�,�r���{����c��ف�O�]��}���Ϯ31/�D��u�&6�>'�-@cх%���}�6c"�w��>ɶ.��鈉X lz��.`�mOtau0�g.ʿJ�5�?;�a�-V�kǀ�s��tG���!�%��x���!0��h �(;��sCV�2ɴX��=u���b��k��{�餀�⬌?4�߅�`����u�5 +0� +XI���Zַ+s{h����`��2yX_��z?M�Ζ�)�����1�/DS��O�\���X�� XΘ�����X��Xf��Yŀ�^j �(;��� Es@4�B���,�����p�@�����O��y�8�B����;�r�@�h��h%�V�]������6���~��D;�hO � � +�.���]��� :ܛTvW�kZ�c�����w���y/Kc��2ᨃ!���}�1I��N��9g��v�_�tP�vt����+_�3�<4��� Ү�h�mט�UZ�|��fߙ�k�ɻ�?[��� v����� .�n�c�Y7��<7�}�t��ɔ��Ng�to��������cC�>Mf=����O��C�?�/�7Kn�8 �LM��;*ܦ�l��t0�*��*��*��*��*��T���G�8*@�Q*� +PqT���T���G�8*@�Q*� +PqT���T���'Q����Үr�)�kO9�(-�-�I;^Ŀ� <��Lѣ�_)^��^>X���6Ű?}�Uⷲ�����H�R +�jv(� m[f?�>!_$FာV����=�����b��"\�%,�0~�eV�B�ٻ�ִ�(���\r��E"XAGGI0L�-X0�Q2G�f�t�v� )���{����9������7続����:�D�g,orY&~�[�淦D��',MV��["~�[[Y�����n@`�J���4��`��j��c~c{���� ��涅\N�.�r-V�.d;k��@��ݽ�� W�ְ�j!_�7��!_C��(p���!�e���:�V�������6���G������z���(�^�[{V���F��(��(�:�0� �L0N��.�PB� ��������|�Ȇ�`�ȇ@>�DC�U�m e��m��~Zc�B��5�D��}B�ږS��T$�R��%�]�D(�����g�P�@π�J�=z\��=z!J��� p@�V�}V�ξ��A^�:P�g[��x(Ռ������(�^W�82�W�:�L*_�U/��{{�ő!���z ��S�҈��H���Z^�����M�@9sQ�(�&�y +(��f�g��'��U�:����ձ���WǞ�W��������R��(my<�.P��b�Jw�R�m�#��'�$)JuU�W�YŏQ,����T�9Q]�JF�@���8�����(T�T| +�S��)�4/�v3F��h_P���FCi�o�v�D����IEҁZ�G��x 4?�Pċ}���-���A�"��U��z��C�o��5;(b�Zv|6PdБ�����>(^����٩x�0��|��C@>��C@>��! ��$.�- +�_S�ݯ��/��>�}(���!Wj��T ��&�@�4E��O��F�a�?��E��<�z3E�S/ϟ��:)�h7=� Y�o�Xan]š;Z�%S�X��z>X����'X��::O�Ou_©�hM�4���-�,Z����4�߮Q蕻/����3����"��F�i�����K� L^gًk�_�� +� ��Yӵ5�λk(�o��km��>���gc�V3[^P����k�%��&ǧ���8:��?���1�q��l,�f+�e��e��I�0'���`�wj[�L�.���hAL���=U�l�W����� �@����P���C��!���q�8@ ���C��!���q�801��FJ�V��rimx�803|no�.�R]e]��Gs�++ӷ�W.�r �)�N��3���ݫ�dP,��y?�����G����y�l�g?���Dp��e��Fb�/��{[ ժ�1�p + fu9KS�|�� �ҚŁ���^�u�v��_pYr��Ƽ~����z�q&�BWw����|���q�����y�B�΄8^������SU��O�MB��4#P %R��� �j�D��ДREi�b�o� *�:�鋣�t���M�M� нϽOb��{>+J�o�97/���#X���v�@C��08Ff��>⏩Fh��偳�d��U�*$,a�{�\^�A���q���~��A]�2a��_���?�c`�$�$a`�$c��ӻ�GV�#�q����C�'5�Cl�+Kp���Y��t�i:��)8�ъ'T��� �����S��Og`��@<�@Ƥ�%��ZڍQb56�n�"�_U��X̌*�1�za�H}~�1"�{�Ƽ~��0b��@�J�P������� @)�B�J� +�T� _�q����`��D��8U}�^NU-�W�W�V(���W +��|�;�����?�+�^��d'X���P廃G�wp~��� ��W}�|1��Pm��sX���oe��hw�x��j$ſ���J����dLNV�@_��������W����@��t������8q�:w�����0b�1P*����*!Ox/)����_����R0^K��K}<�!��xoI��E��˯h���`��"�ĿF��@R~���5��/���0��U��KwG���(�Jj�����Og*@����P����w~al�Z�G.��p ��?J�o�O�� ���@�?���(�k�H�����}͵#���@�O���Պ�_}>�K�د�([��x��CW��C������ņ��"��o�/��� X��=&���v0��o�Y?��u�y��@��>�:�D���q)��\�o�� �O}��1@'�@�?���}-7�; +�{�����O�:�{��aE��C�N������I�`��T������P���d�P�������Y��k&1��Ǔ-�ȅ2�8�w��'�ëR-�@�����A�Og�`��P��!2��v����`�������t��2w�����i���P����쟽b����g���� �_���~*��P2�+����R+'��~p�.c*V$��axgH �x����h��2r�Ea� ��P���~��#��x�������(�~*\����Y����@w����ն�H���'P/ +{�����y���JN� ��J�$� s��|�ɬꪕ����������]�J�?��E� z���S�����R�w�%�_��������������B�i���ww~���G����3�f��[��O|�?����@�fO�~x��U����E������������W'm���+�;���r����Wb������])�!����k��?��̲蜯�p=� +��qY��D(� �8�@V��s9�������p9�P�h� .����m5�x[A����v�r�0���������7���V��!F���J����LN����C�� ~��~|#s%�Us�w)��t�8�Ya��l�09E�b����r�&���8w����C�;���f�0%�7M#�n��?v3���O�k�d��^����*լ���A��j���Ğ �7L�5�%c� e,@Y�������L�$#���? ��)75���d?���&�.��A��к%$�+i��u�I�?�O翅˘L<������ �k�����&5�6�\]s3L��=�.c��ո~�e�+'��� W@a������H�q���w@8`���8�;��/`f��@���p�a *����ae�5��Ip�@�����0��45�b��<��Ah��~`���D���R܁��w�KCG��<�)N��`�����)f���A���4Q/��O��#�@����,�yN��(�P�?w �A�}X���h��O݁����<�-�J0뜪�]� x`�0a���ϸ����n�D@�������ձ�����M���0��~@�HW��ؘQ��cC������Xg@+.������+�]c����R��Z����U�:��/�}ul> �0H)�:,Ga��+�Nx�U�:����W�.��+��������T=�����,�*���t�=xH&�`�8�D @H����l�ϩJ�����7@~n&5� W@���oe������� +4n0�Y����)� ���t��%j�n1{;Gm�nf��E�\�RU�M�`�k�_F�@��x��� ��(�4G<��@�����g�`h@�{V�Qq�`�u�R��)�$M*� ���e 4�]���^{�el "������%@.�(�P�Q���\V�b�_U' p�!�r����R�!�x����`]�����l��GtC�����O2�"�.���c ����c�1lD-P#�,�-�5��k���: bfN���ca�U���N�X"��-�����[l�3�����Q�%oΥ����{�~)u,�@+� ���>Z�0(86v��cA��H㭱�Ch���LI������t�].�v��F,����e�E.�=������ f����N��~��#���@�)��u��l5�@���4:�4 W@v�Yr��z���>��r�u�� �%�m�z� +��dl&��:�s;\@�id�������Ǝ�W��6���\�Bv�{)7P7�l�4��c�0�@��3y]�S�J���p�� � + �-��E�B�>;��Jr�?~��%V�2��_����a����"��V� �/����>;e/�"���r�smH K�����1�sm���&�B.�c?��/�@��"�:'Q�a�s�/�m0P���h�h�_��/�����7�������8���)��T�w�/�������ПEm��|W�6#�qp���Q���Jc�R ��qp�� ����]�����`x�� 7� F\��� 7��4����������x'Hg�xZ���>Ž̟Kg�BR�@��ПŽ�w�5�y8z�`O�#{N�:O��==�P�����X��$��>� ��c�>�[<E�@| +���;ӟ&�(��)oFF�#i�P(��5.("*"�q�HDk\�R����5.���,n��2���;��������ޛ%������[{�H�d6^���!3��ˇ��!��K-�;�m�"���4���8������G���Ҥe�tJ���|��@�8v*Y���%������d�]��P4������-�X� .!Ϳ�x���]b'8� OgH���%�z��u��w�M�(�@��Fւ����^�kt:@8#����[�t��]a�L�X��Z�G������F��0�����?���p4�@��]�!\~q`�|���(�3w��Zb��G�گ�̾�b�#�8s�����N[ni\%w����/� +@�[��w�K�_зVN��g���r�����c7D���{�}k��G-+�Т�ոE�)�_v[�~]��f�a<��s�o�;<�|�������Mƌ9@��}A|����ON�@�B��3OJX��~#��>�郳�t�>�z�3��ɳ�r�>��"a����ߋ}�@�*�%��8�hq�Bt���p ��S�%`rʛ��7����F���!�}��zf_�{������^���,�k]�{�`H��6�}����ps ��p��� +L�6����-_ܪ���[�E@��U0? ��!�����������������A(g\�z�"�kak�U�n1��k�}�an�!�tf=�]N�C$�Dy��8���'��6�8�?��Ѕn� ����'1`��#��5�����"AԾ2���$���x[�|M.nZ-ħb�U{�����SG`�$Z7]n1���h��!���u ��I(�m�=�z>����2�V��^F?������2��ZO4��/i��45���c`���UP{ �������[��\�`��{�������`;}�� ��&�����u ���h���X�c�y�*P���@����V���[�������+Qf3��Q�C��,�6��i�k<sSG429Ż@����x +@|���n�}}�����^���d�]��`\���� F�ó]*@{ �A% ����������?I�� x�B,��� +T��I��8�Q�~�nx4�S ��T�b��bTg&��*����#�ӡ�R�@� +������mA�>�/�@%����x4��1�7;%��m�@)��Q�NaƓ1z�A6+� ˺P +��0���ФĿ^ԾTS�KAݡV���@J��#�&`K�NbسP��:Z-�."�x<���L�'��B)��j4�x@��ɛ=\��ZH�rP������3��\��)�~F t��ϕ�/P���]���@J���c`g��7�]�H-�D�.����l� + V@zP��ݺ�-`��K3* ������O[�l2�>*�"W� ��m������8�/r������-��gIlI�;i����P ��z��� ����Ό�&P���*D�� 1�y�>~�"З�~�HuF��I/�?���"O��e�>�^r�C �������Q?���"O��f�@[�-����r ����:��lmH�F;���F�K=�"q��ϋ_Ji�4@����q�/�������g�A��` �"�q����/AR 0�/[U@Dq�w�z^HD@I���> +$�P�l �z�B������d-� ��v�� @<J�5 +�4@)P�����v"�����0-�P�_#��( +�n����5� +��i�*��(J�y�׀� ��W���R������?�T����,�R�.'���5��PY�D��i ���ۭyM���q�����R��(N@8���-�r��ťۢ��@,�Q=� �4Oɺ!���� �%�P�qH�t��C��5�[��Q��He�z�j�7 ��� +@šy @e�D��S���@i�z��$��?=��@,�*I��=Z�Uw�?����B�~1���X��@���z�����0��V+r���F�Y P(�X���U%-�Q��_2�T�7*M�..���?;�T�z�c����!����4�еI���s�h�������� ?���?�X�+��j�c������A�P����Qc�c�0~�P�@0L����������PߔG�6� p���i�?����������7�TRs_fm�y����,��������9Pw�L�*���\�P�1�9�����m������@ �@͌`��o�����t�<��T�!�������c�p��ච(���/�F�to�`���?��Y + &�����O��s�����R @���Tr�3�oL����G���pp`Ip����$|�Q���?��!����V��������ϟ��B��@�w���<���ԑ�b�ݟ?���tK����3Vۘ4-�ᯨ�m���/��S7�� +��kK�����wL�6��Ga�����?.d���^�g��ulUU��fw(�lec��Լ���L�?:�P. +�}�f@ww��z�@F�(����Y�0)5���0y��!����!���pF����@`��C�3�a���?��O�3�����ݞ�@a�������a�����V/ �@�-QMm�xG�� +?��+�`^�������/;�E�?�`^�� �p��va�H$�Ԇ ���gE�?����< +��a���*o�Y5%ھ�O��8�����*�@�U��A���YՇ)>�cM���K:.����I+��N��VV�^���A ��Q�k���E8��ԴР !������H9G���E~D<�̢]���n����d���c�b/�Ͽ�u���!��{ H�_���H�5��_ �@C�G@}�X��(_>�Z`Y�G�t6�#��E�����B��(�%_@�(/�v�#�5bJ���3�M�8]�����A�[Q��iP?�sU�B�۽S�&�4�G����R��"%���`'!��om���¹�-5���?C�*�}�Wi=�3�un���/)�_ ���v +�MU�A�|������ڙ�燐*��,��AN���Sݞ�j��8��z�n��~����C�q.����f����g��G�N������������_�ͥ� ����IEND�B`� \ No newline at end of file diff --git a/web/modules/scheduler/mkdocs.yml b/web/modules/scheduler/mkdocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..34f47d2cd2b4be8153920e30aba507769c9c0257 --- /dev/null +++ b/web/modules/scheduler/mkdocs.yml @@ -0,0 +1,40 @@ +site_name: 'Scheduler' +repo_url: https://git.drupalcode.org/project/scheduler +repo_name: drupal/scheduler +edit_uri: /-/edit/2.x/docs/ +theme: + name: material + logo: logo.png + favicon: logo.png + palette: + # Palette toggle for automatic mode + - media: '(prefers-color-scheme)' + primary: blue + toggle: + icon: material/brightness-auto + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + primary: blue + scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + primary: blue + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to system preference +nav: + - Home: 'index.md' + - Set Up: 'setup.md' + - Extend with a new entity plugin: + - Introduction: 'plugin.md' + - Create a new entity plugin: 'plugin_create.md' + - Add test coverage: 'plugin_test.md' +plugins: + - search + - privacy: + enabled: !ENV [CI, false] diff --git a/web/modules/scheduler/phpcs.xml b/web/modules/scheduler/phpcs.xml index b10897756252fc0b09b806f5908a6554c1c8787c..6cac09f34ae5159550d391425421be1a5fc10163 100644 --- a/web/modules/scheduler/phpcs.xml +++ b/web/modules/scheduler/phpcs.xml @@ -16,6 +16,13 @@ <!-- .yml files are not processed by phpcs --> <arg name="extensions" value="php,module,inc,install,css,md"/> + <!-- Ignore all files that match these patterns. By default the full file --> + <!-- path is checked, unless type=relative is used. There is an implied * --> + <!-- wildcard at each end and periods and slashes must be escaped using \ --> + <exclude-pattern>\/_+ignore</exclude-pattern> + <exclude-pattern>interdif</exclude-pattern> + <exclude-pattern>node_modules\/</exclude-pattern> + <!-- Use 's' to print the full sniff name in the report. --> <arg value="s"/> <arg value="-colors"/> @@ -26,7 +33,8 @@ <exclude name="DrupalPractice.Commenting.CommentEmptyLine.SpacingAfter"/> </rule> <rule ref="Drupal"> - <!-- There appears to be two rules checking nearly the same thing. --> + <!-- Allow empty lines after comments. There appears to be two rules + checking nearly the same thing. --> <exclude name="Drupal.Commenting.InlineComment.SpacingAfter"/> </rule> @@ -37,17 +45,15 @@ <severity>5</severity> </rule> - <!-- Ignore all files that match these patterns. By default the full file --> - <!-- path is checked, unless type=relative is used. There is an implied * --> - <!-- wildcard at each end and periods and slashes must be escaped using \ --> - <exclude-pattern>\/_+ignore</exclude-pattern> - <exclude-pattern>interdif</exclude-pattern> + <!-- Allow long lines in .md files. --> + <rule ref="Drupal.Files.TxtFileLineLength.TooLong"> + <exclude-pattern>docs/*\.md</exclude-pattern> + </rule> - <!-- Increase the allowed line length for inline array declarations. --> - <rule ref="Drupal.Arrays.Array"> - <properties> - <property name="lineLimit" value="120"/> - </properties> + <!-- Ignore the AlphabeticallySortedUses rule because this was added to Coder before being agreed by Coding Standards team --> + <!-- Coding Standards https://www.drupal.org/i/1624564 and Coder https://www.drupal.org/i/3483028--> + <rule ref="SlevomatCodingStandard.Namespaces.AlphabeticallySortedUses"> + <severity>0</severity> </rule> </ruleset> diff --git a/web/modules/scheduler/scheduler.info.yml b/web/modules/scheduler/scheduler.info.yml index 88681ab772e1d1394a41d24e88625526e7fc5a3c..ff49a11280f55e105cb65b24454bf9f2d4c740fc 100644 --- a/web/modules/scheduler/scheduler.info.yml +++ b/web/modules/scheduler/scheduler.info.yml @@ -20,7 +20,7 @@ libraries: - vertical-tabs - default-time -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/scheduler.module b/web/modules/scheduler/scheduler.module index e246af37cb97eef1e1c5876437c4b4bc5fe2be1d..c6d74aa09dc6cef0dbde16e52faf10e456a74284 100644 --- a/web/modules/scheduler/scheduler.module +++ b/web/modules/scheduler/scheduler.module @@ -26,6 +26,25 @@ use Drupal\workbench_moderation\Plugin\Action\ModerationOptOutPublishNode; use Drupal\workbench_moderation\Plugin\Action\ModerationOptOutUnpublishNode; +/** + * Create class aliases to maintain backwards-compatibility. + * + * Scheduler 2.x supports non-node entities and each entity type has to have its + * own specific event class named 'Scheduler{Type}Events'. These are now located + * in the Drupal\scheduler\Event\ namespace, with all event files being stored + * in a src/Event folder. + * + * The event classes in 8.x-1.x were just for nodes, and they were named + * Drupal\scheduler\SchedulerEvent and Drupal\scheduler\SchedulerEvents. These + * namespaces must remain for backwards-compatibility with existing + * implementations of event subscribers for Node events. The namespace should + * have been Drupal\scheduler\Event in the first place. + * + * These two aliases allow existing event subscribers to continue unchanged. + */ +class_alias('Drupal\scheduler\Event\SchedulerEvent', 'Drupal\scheduler\SchedulerEvent'); +class_alias('Drupal\scheduler\Event\SchedulerNodeEvents', 'Drupal\scheduler\SchedulerEvents'); + /** * Implements hook_help(). */ @@ -909,7 +928,8 @@ function scheduler_entity_presave(EntityInterface $entity) { $unpublishing_percent = @$entity->devel_generate['scheduler_unpublishing'] ?: 0; $entity_created = isset($entity->created) ? $entity->created->value : $request_time; // Reuse the selected 'creation' time range for our future date span. - $time_range = $entity->devel_generate['time_range']; + // If not set, default to 1 week (60 * 60 * 24 * 7 seconds). + $time_range = @$entity->devel_generate['time_range'] ?: 604800; } if ($publishing_percent && $publishing_enabled) { if (rand(1, 100) <= $publishing_percent) { diff --git a/web/modules/scheduler/scheduler_rules_integration/scheduler_rules_integration.info.yml b/web/modules/scheduler/scheduler_rules_integration/scheduler_rules_integration.info.yml index 834354192a9e60017d48d2c2d9e013955dbfb22b..c2893a331bcf2a7cd6a3af0384d630370b88b604 100644 --- a/web/modules/scheduler/scheduler_rules_integration/scheduler_rules_integration.info.yml +++ b/web/modules/scheduler/scheduler_rules_integration/scheduler_rules_integration.info.yml @@ -6,7 +6,7 @@ dependencies: - rules:rules - scheduler:scheduler -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesActionsTest.php b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesActionsTest.php index a7457a98e46020c62759e9ab8b474f0fc006c2dd..cb863d390faceaa3943cf54a8efc1db90e083071 100644 --- a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesActionsTest.php +++ b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesActionsTest.php @@ -3,8 +3,8 @@ namespace Drupal\Tests\scheduler_rules_integration\Functional; use Drupal\Core\Logger\RfcLogLevel; -use Drupal\rules\Context\ContextConfig; use Drupal\Tests\scheduler\Functional\SchedulerBrowserTestBase; +use Drupal\rules\Context\ContextConfig; /** * Tests the six actions that Scheduler provides for use in Rules module. diff --git a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesConditionsTest.php b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesConditionsTest.php index a3844eaff88ad370345a7ac58d3b43572cca5eae..ac1f3a4f9f93f02fa3c69c6f89ee428da1c1f04e 100644 --- a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesConditionsTest.php +++ b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesConditionsTest.php @@ -2,8 +2,8 @@ namespace Drupal\Tests\scheduler_rules_integration\Functional; -use Drupal\rules\Context\ContextConfig; use Drupal\Tests\scheduler\Functional\SchedulerBrowserTestBase; +use Drupal\rules\Context\ContextConfig; /** * Tests the four conditions that Scheduler provides for use in Rules module. diff --git a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesEventsTest.php b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesEventsTest.php index eaa1cb0a435047e066bce60bb4686461ee3151aa..59389553f6b866f41780e2f66aaba912a0fbba2b 100644 --- a/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesEventsTest.php +++ b/web/modules/scheduler/scheduler_rules_integration/tests/src/Functional/SchedulerRulesEventsTest.php @@ -2,8 +2,8 @@ namespace Drupal\Tests\scheduler_rules_integration\Functional; -use Drupal\rules\Context\ContextConfig; use Drupal\Tests\scheduler\Functional\SchedulerBrowserTestBase; +use Drupal\rules\Context\ContextConfig; /** * Tests the six events that Scheduler provides for use in Rules module. @@ -117,7 +117,7 @@ protected function setUp(): void { * The ids of the messages that should be showing on the current page. All * other messages should not be displayed. */ - public function checkMessages(string $entityTypeId = NULL, array $expectedMessages = []) { + public function checkMessages(?string $entityTypeId = NULL, array $expectedMessages = []) { // Add the required entity offset to each message id in the expected array. $offset = ['node' => 0, 'media' => 6, 'commerce_product' => 12, 'taxonomy_term' => 18]; array_walk($expectedMessages, function (&$item) use ($offset, $entityTypeId) { diff --git a/web/modules/scheduler/src/Annotation/SchedulerPlugin.php b/web/modules/scheduler/src/Annotation/SchedulerPlugin.php index ce0fd2b09480792e7fa49e339c96721817524448..c435b44305570e5f8780418beef47d8e1f7e7e6b 100644 --- a/web/modules/scheduler/src/Annotation/SchedulerPlugin.php +++ b/web/modules/scheduler/src/Annotation/SchedulerPlugin.php @@ -16,6 +16,8 @@ class SchedulerPlugin extends Plugin { /** * The internal id / machine name of the plugin. * + * This is usually the entity_type_id followed by '_scheduler'. + * * @var string */ public $id; @@ -46,18 +48,21 @@ class SchedulerPlugin extends Plugin { public $entityType; /** - * The name of the type/bundle field. + * Module name that plugin requires. * * @var string */ - public $typeFieldName; + public $dependency; /** - * Module name that plugin requires. + * The name of the type/bundle field for the entity (optional). + * + * The default is the value of entity type 'bundle' key, so this property is + * only needed if the entity type does not have a 'bundle' field. * * @var string */ - public $dependency; + public $typeFieldName; /** * The Form ID of the devel generate form (optional). @@ -67,7 +72,7 @@ class SchedulerPlugin extends Plugin { public $develGenerateForm = ''; /** - * The route of the collection overview page. + * The route of the collection overview page (optional). * * The default is entity.{$entityType}.collection so this property only needs * to be specified if that route is not the correct one. diff --git a/web/modules/scheduler/src/SchedulerEvent.php b/web/modules/scheduler/src/SchedulerEvent.php deleted file mode 100644 index feaa9f006a79b5ee226da0a09832399ae93ee6ca..0000000000000000000000000000000000000000 --- a/web/modules/scheduler/src/SchedulerEvent.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -/** - * @file - * Class alias for Drupal\scheduler\SchedulerEvent. - */ - -/** - * Create event class alias to maintain backwards-compatibility. - * - * The original event classes, named Drupal\scheduler\SchedulerEvent and - * Drupal\scheduler\SchedulerEvents must remain for backwards-compatibility - * with existing implementations of event subscribers for Node events. The - * namespace should have been Drupal\scheduler\Event and all the event-related - * files stored in a src/Event folder, but instead they were just in /src. - * - * Now that Scheduler supports non-node entities and each type has to have its - * own specific event class named 'Scheduler{Type}Events', they can be moved - * into a Drupal\scheduler\Event namespace, with all event files being stored in - * a src/Event folder. These two aliases, for the original node events, ensure - * that any existing event subscribers will continue work unchanged. - */ - -class_alias('Drupal\scheduler\Event\SchedulerEvent', 'Drupal\scheduler\SchedulerEvent'); diff --git a/web/modules/scheduler/src/SchedulerEvents.php b/web/modules/scheduler/src/SchedulerEvents.php deleted file mode 100644 index c5df9f5a36ff85163b6a9f3b644112126ceb9ec4..0000000000000000000000000000000000000000 --- a/web/modules/scheduler/src/SchedulerEvents.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -/** - * @file - * Class alias for Drupal\scheduler\SchedulerEvents. - */ - -/** - * Create event class alias to maintain backwards-compatibility. - * - * The original event classes, named Drupal\scheduler\SchedulerEvent and - * Drupal\scheduler\SchedulerEvents must remain for backwards-compatibility - * with existing implementations of event subscribers for Node events. The - * namespace should have been Drupal\scheduler\Event and all the event-related - * files stored in a src/Event folder, but instead they were just in /src. - * - * Now that Scheduler supports non-node entities and each type has to have its - * own specific event class named 'Scheduler{Type}Events', they can be moved - * into a Drupal\scheduler\Event namespace, with all event files being stored in - * a src/Event folder. These two aliases, for the original node events, ensure - * that any existing event subscribers will continue work unchanged. - */ - -class_alias('Drupal\scheduler\Event\SchedulerNodeEvents', 'Drupal\scheduler\SchedulerEvents'); diff --git a/web/modules/scheduler/src/SchedulerManager.php b/web/modules/scheduler/src/SchedulerManager.php index c8fd9037acd719f5f40e3399ccae75dcc4988539..10f6c8830093a298705dcf0fabfb71ef3bb5040f 100644 --- a/web/modules/scheduler/src/SchedulerManager.php +++ b/web/modules/scheduler/src/SchedulerManager.php @@ -962,7 +962,7 @@ public function getPluginDefinitions() { * @return array * Array of plugin objects, keyed by the entity type the plugin supports. */ - public function getPlugins(string $provider = NULL) { + public function getPlugins(?string $provider = NULL) { $cache = \Drupal::cache()->get('scheduler.plugins'); if (!empty($cache) && !empty($cache->data) && empty($provider)) { return $cache->data; @@ -1008,7 +1008,7 @@ public function invalidatePluginCache() { * @return array * A list of the entity type ids. */ - public function getPluginEntityTypes(string $provider = NULL) { + public function getPluginEntityTypes(?string $provider = NULL) { return array_keys($this->getPlugins($provider)); } @@ -1044,7 +1044,7 @@ public function getPlugin($entityTypeId) { public function getEnabledTypes($entityTypeId, $process) { if (!$plugin = $this->getPlugin($entityTypeId)) { return []; - }; + } $types = $plugin->getTypes(); $types = array_filter($types, function ($bundle) use ($process) { return $bundle->getThirdPartySetting('scheduler', $process . '_enable', $this->setting('default_' . $process . '_enable')); diff --git a/web/modules/scheduler/src/SchedulerPluginBase.php b/web/modules/scheduler/src/SchedulerPluginBase.php index fb5ca8facda06b49450f85374fc5f0ef9e9ba0a8..ec17735fa3f34238999543fe161b2f3e7b2eac67 100644 --- a/web/modules/scheduler/src/SchedulerPluginBase.php +++ b/web/modules/scheduler/src/SchedulerPluginBase.php @@ -100,6 +100,16 @@ public function dependency() { return $this->pluginDefinition['dependency']; } + /** + * Get the field name for the 'type' or 'bundle'. + * + * @return string + * The name of the type/bundle field for this entity type. + */ + public function typeFieldName() { + return $this->entityTypeObject->getKey('bundle'); + } + /** * Get the id of the Devel Generate form for this entity type. * @@ -172,16 +182,6 @@ public function unpublishAction() { return $this->pluginDefinition['unpublishAction'] ?? $this->entityType() . '_unpublish_action'; } - /** - * Get the field name for the 'type' or 'bundle'. - * - * @return string - * The name of the type/bundle field for this entity type. - */ - public function typeFieldName() { - return $this->entityTypeObject->getKey('bundle'); - } - /** * Get all the type/bundle objects for this entity. * diff --git a/web/modules/scheduler/src/SchedulerPluginInterface.php b/web/modules/scheduler/src/SchedulerPluginInterface.php index 2b49a5dc1f01ea428870a63fa232560d5509f3aa..89e10da1fddebef484f8a8505c5615f98d7e1e9a 100644 --- a/web/modules/scheduler/src/SchedulerPluginInterface.php +++ b/web/modules/scheduler/src/SchedulerPluginInterface.php @@ -32,20 +32,20 @@ public function description(); public function entityType(); /** - * Get the name of the "type" field for the entity. + * Get module dependency. * * @return string - * The name of the type/bundle field for this entity type. + * The name of the required module. */ - public function typeFieldName(); + public function dependency(); /** - * Get module dependency. + * Get the name of the "type" field for the entity. * * @return string - * The name of the required module. + * The name of the type/bundle field for this entity type. */ - public function dependency(); + public function typeFieldName(); /** * Get the id of the Devel Generate form for this entity type. Optional. diff --git a/web/modules/scheduler/tests/3356800-d8.patch b/web/modules/scheduler/tests/3356800-d8.patch new file mode 100644 index 0000000000000000000000000000000000000000..014f06c7ff4d16e90816dba6f96bb731643671c0 --- /dev/null +++ b/web/modules/scheduler/tests/3356800-d8.patch @@ -0,0 +1,134 @@ +diff --git a/composer.json b/composer.json +index f5f380a..beab6ee 100644 +--- a/composer.json ++++ b/composer.json +@@ -10,6 +10,7 @@ + "drupal/devel_generate": ">=4", + "drupal/workbench_moderation": "*", + "drupal/workbench_moderation_actions": "*", ++ "commerceguys/addressing": "1.3", + "drupal/commerce": "^2 || ^3" + }, + "repositories": { +diff --git a/tests/src/Functional/SchedulerNonEnabledTypeTest.php b/tests/src/Functional/SchedulerNonEnabledTypeTest.php +index 150714b..1e5fa93 100644 +--- a/tests/src/Functional/SchedulerNonEnabledTypeTest.php ++++ b/tests/src/Functional/SchedulerNonEnabledTypeTest.php +@@ -40,14 +40,10 @@ class SchedulerNonEnabledTypeTest extends SchedulerBrowserTestBase { + 'scheduler_publish_enable' => $publishing_enabled, + 'scheduler_unpublish_enable' => $unpublishing_enabled, + ]; +- if ($entityTypeId == 'commerce_product') { +- // Products need an extra checkbox to be ticked. +- // cspell:ignore variationtypes . +- $edit['edit-variationtypes-default'] = TRUE; +- } ++ // The version of Commerce Product used before Drupal 9 does not have ++ // the extra 'edit-variationtypes-default' field. Also the function ++ // statusMessageNotExists() does not exist. So just save() here. + $this->submitForm($edit, 'Save'); +- // Check that the save was successful with no error message. +- $this->assertSession()->statusMessageNotExists('error'); + + // Show the form display page for info. + $this->drupalGet($this->adminUrl('bundle_form_display', $entityTypeId, $bundle)); +diff --git a/tests/src/FunctionalJavascript/SchedulerJavascriptTestBase.php b/tests/src/FunctionalJavascript/SchedulerJavascriptTestBase.php +index f4f86b2..778921c 100644 +--- a/tests/src/FunctionalJavascript/SchedulerJavascriptTestBase.php ++++ b/tests/src/FunctionalJavascript/SchedulerJavascriptTestBase.php +@@ -3,7 +3,6 @@ abstract class SchedulerJavascriptTestBase extends WebDriverTestBase { + namespace Drupal\Tests\scheduler\FunctionalJavascript; + + use Drupal\FunctionalJavascriptTests\WebDriverTestBase; +-use Drupal\Tests\DocumentElement; + use Drupal\Tests\scheduler\Traits\SchedulerCommerceProductSetupTrait; + use Drupal\Tests\scheduler\Traits\SchedulerMediaSetupTrait; + use Drupal\Tests\scheduler\Traits\SchedulerSetupTrait; +@@ -44,10 +43,11 @@ abstract class SchedulerJavascriptTestBase extends WebDriverTestBase { + * The default theme. + * + * The vertical tabs test needs 'claro' theme not 'stark'. ++ * For Drupal 8 use 'bartik'. + * + * @var string + */ +- protected $defaultTheme = 'claro'; ++ protected $defaultTheme = 'bartik'; + + /** + * {@inheritdoc} +@@ -97,7 +97,7 @@ abstract class SchedulerJavascriptTestBase extends WebDriverTestBase { + */ + public function waitForNoText($text, $timeout = 10000) { + $page = $this->getSession()->getPage(); +- return (bool) $page->waitFor($timeout / 1000, function (DocumentElement $page) use ($text) { ++ return (bool) $page->waitFor($timeout / 1000, function () use ($page, $text) { + $actual = preg_replace('/\\s+/u', ' ', $page->getText()); + // Negative look-ahead on the text that should be hidden. + $regex = '/^((?!' . preg_quote($text, '/') . ').)*$/ui'; +diff --git a/tests/src/FunctionalJavascript/SchedulerJavascriptVerticalTabsTest.php b/tests/src/FunctionalJavascript/SchedulerJavascriptVerticalTabsTest.php +index 671c36f..af8e067 100644 +--- a/tests/src/FunctionalJavascript/SchedulerJavascriptVerticalTabsTest.php ++++ b/tests/src/FunctionalJavascript/SchedulerJavascriptVerticalTabsTest.php +@@ -15,6 +15,11 @@ class SchedulerJavascriptVerticalTabsTest extends SchedulerJavascriptTestBase { + * @dataProvider dataStandardEntityTypes() + */ + public function testEditEntitySummary($entityTypeId, $bundle) { ++ // In Drupal8, the Product and Term forms do not have vertical tabs so skip ++ // testing with these entity types. ++ if ($entityTypeId == 'commerce_product' || $entityTypeId == 'taxonomy_term') { ++ return; ++ } + $this->drupalLogin($this->schedulerUser); + /** @var \Drupal\Tests\WebAssert $assert */ + $assert = $this->assertSession(); +@@ -53,9 +58,8 @@ class SchedulerJavascriptVerticalTabsTest extends SchedulerJavascriptTestBase { + // vertical tabs are implemented in a different way to 10.2. We now need to + // click to bring focus on that tab, ready for filling the date fields. + $page = $this->getSession()->getPage(); +- if ($entityTypeId == 'media' || ($entityTypeId == 'taxonomy_term' && version_compare(\Drupal::VERSION, '10.3', '>='))) { +- $page->clickLink('Scheduling options'); +- } ++ // In Bartik theme, click 'Scheduling options' for all entity types. ++ $page->clickLink('Scheduling options'); + + // Fill in a publish_on date and check the summary text. + $page->fillField('edit-publish-on-0-value-date', '05/02/' . (date('Y') + 1)); +@@ -108,6 +112,11 @@ class SchedulerJavascriptVerticalTabsTest extends SchedulerJavascriptTestBase { + * @dataProvider dataStandardEntityTypes() + */ + public function testConfigureEntityTypeSummary($entityTypeId, $bundle) { ++ // In Drupal8, the Product and Term forms do not have vertical tabs so skip ++ // testing with these entity types. ++ if ($entityTypeId == 'commerce_product' || $entityTypeId == 'taxonomy_term') { ++ return; ++ } + /** @var \Drupal\Tests\WebAssert $assert */ + $assert = $this->assertSession(); + +diff --git a/tests/src/Kernel/MigrateSchedulerNodeTypeConfigTest.php b/tests/src/Kernel/MigrateSchedulerNodeTypeConfigTest.php +index 349e43b..8c3b8e1 100644 +--- a/tests/src/Kernel/MigrateSchedulerNodeTypeConfigTest.php ++++ b/tests/src/Kernel/MigrateSchedulerNodeTypeConfigTest.php +@@ -14,7 +14,7 @@ class MigrateSchedulerNodeTypeConfigTest extends MigrateSchedulerTestBase { + /** + * {@inheritdoc} + */ +- protected static $modules = ['menu_ui']; ++ public static $modules = ['menu_ui']; + + /** + * {@inheritdoc} +diff --git a/tests/src/Kernel/MigrateSchedulerTestBase.php b/tests/src/Kernel/MigrateSchedulerTestBase.php +index 419b508..2d5ce12 100644 +--- a/tests/src/Kernel/MigrateSchedulerTestBase.php ++++ b/tests/src/Kernel/MigrateSchedulerTestBase.php +@@ -12,7 +12,7 @@ abstract class MigrateSchedulerTestBase extends MigrateDrupal7TestBase { + /** + * {@inheritdoc} + */ +- protected static $modules = [ ++ public static $modules = [ + 'node', + 'scheduler', + 'text', diff --git a/web/modules/scheduler/tests/modules/scheduler_access_test/scheduler_access_test.info.yml b/web/modules/scheduler/tests/modules/scheduler_access_test/scheduler_access_test.info.yml index d2063cb5797d7a8b214728a61505bbe3e3774d6c..36391e7647f539e817384b485f0946b3e9f67268 100644 --- a/web/modules/scheduler/tests/modules/scheduler_access_test/scheduler_access_test.info.yml +++ b/web/modules/scheduler/tests/modules/scheduler_access_test/scheduler_access_test.info.yml @@ -5,7 +5,7 @@ package: Testing dependencies: - scheduler:scheduler -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.info.yml b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.info.yml index b35fb8f7742d54fa9ac1d2f153d115e043086188..0369f95f6d3d37d3b12edae2c21e153ea440b396 100644 --- a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.info.yml +++ b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.info.yml @@ -1,12 +1,12 @@ name: 'Scheduler API Legacy Test' type: module -description: 'Sub-module containing the legacy hook implementations.' +description: 'Sub-module containing the legacy hook implementations and event namespaces.' package: Testing dependencies: - scheduler:scheduler - scheduler_api_test:scheduler_api_test -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.services.yml b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.services.yml new file mode 100644 index 0000000000000000000000000000000000000000..93765c2ed7b268eb542c8877ccdc28760b40eaaf --- /dev/null +++ b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/scheduler_api_legacy_test.services.yml @@ -0,0 +1,5 @@ +services: + scheduler_api_legacy_test.event_subscriber: + class: Drupal\scheduler_api_legacy_test\EventSubscriber + tags: + - { name: event_subscriber } diff --git a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/src/EventSubscriber.php b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/src/EventSubscriber.php new file mode 100644 index 0000000000000000000000000000000000000000..2bbc3f283436f67fd81d2c07b6114a17f8b49554 --- /dev/null +++ b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_legacy_test/src/EventSubscriber.php @@ -0,0 +1,135 @@ +<?php + +namespace Drupal\scheduler_api_legacy_test; + +use Drupal\scheduler\SchedulerEvent; +use Drupal\scheduler\SchedulerEvents; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +/** + * Tests events fired on node objects. + * + * These tests use the legacy Scheduler event namespaces, to demonstrate that + * the aliases created for the original node events work correctly. + */ +class EventSubscriber implements EventSubscriberInterface { + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array { + + // Initialize the array to avoid 'variable is undefined' phpcs error. + $events = []; + + // The values in the arrays give the function names below. + // These six events are the originals, dispatched for Nodes. + $events[SchedulerEvents::PRE_PUBLISH][] = ['apiTestNodePrePublish']; + $events[SchedulerEvents::PUBLISH][] = ['apiTestNodePublish']; + $events[SchedulerEvents::PRE_UNPUBLISH][] = ['apiTestNodePreUnpublish']; + $events[SchedulerEvents::UNPUBLISH][] = ['apiTestNodeUnpublish']; + $events[SchedulerEvents::PRE_PUBLISH_IMMEDIATELY][] = ['apiTestNodePrePublishImmediately']; + $events[SchedulerEvents::PUBLISH_IMMEDIATELY][] = ['apiTestNodePublishImmediately']; + + return $events; + } + + /** + * Operations to perform before Scheduler publishes a node. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodePrePublish(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // Before publishing a node make it sticky. + if (!$node->isPublished() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setSticky(TRUE); + $event->setNode($node); + } + } + + /** + * Operations to perform after Scheduler publishes a node. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodePublish(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // After publishing a node promote it to the front page. + if ($node->isPublished() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setPromoted(TRUE)->save(); + $event->setNode($node); + } + } + + /** + * Operations to perform before Scheduler unpublishes a node. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodePreUnpublish(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // Before unpublishing a node make it unsticky. + if ($node->isPublished() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setSticky(FALSE); + $event->setNode($node); + } + } + + /** + * Operations to perform after Scheduler unpublishes a node. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodeUnpublish(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // After unpublishing a node remove it from the front page. + if (!$node->isPublished() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setPromoted(FALSE)->save(); + $event->setNode($node); + } + } + + /** + * Operations before Scheduler publishes a node immediately not via cron. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodePrePublishImmediately(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // Before publishing immediately set the node to sticky. + if (!$node->isPromoted() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setSticky(TRUE); + $event->setNode($node); + } + } + + /** + * Operations after Scheduler publishes a node immediately not via cron. + * + * @param \Drupal\scheduler\SchedulerEvent $event + * The scheduler event. + */ + public function apiTestNodePublishImmediately(SchedulerEvent $event) { + /** @var \Drupal\node\Entity\Node $node */ + $node = $event->getNode(); + // After publishing immediately set the node to promoted and change the + // title. + if (!$node->isPromoted() && strpos($node->title->value, 'API LEGACY TEST') === 0) { + $node->setTitle('Published immediately') + ->setPromoted(TRUE); + $event->setNode($node); + } + } + +} diff --git a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.info.yml b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.info.yml index b289dfdcdf61d52fc35e561e4f8e7fa541e823bd..fe56feaad80460ab009c1678238b55a193c87cde 100644 --- a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.info.yml +++ b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.info.yml @@ -6,7 +6,7 @@ dependencies: - scheduler:scheduler - drupal:media -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.module b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.module index a61a9dd84c21dee3a7304f2bb6d4928c7170d0e0..0fc63c6cf22803dd744915ee3773fc474e9eda1d 100644 --- a/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.module +++ b/web/modules/scheduler/tests/modules/scheduler_api_test/scheduler_api_test.module @@ -12,9 +12,9 @@ * Taxonomy Terms. */ +use Drupal\Core\Entity\EntityInterface; use Drupal\commerce_product\Entity\Product; use Drupal\commerce_product\Entity\ProductInterface; -use Drupal\Core\Entity\EntityInterface; use Drupal\media\Entity\Media; use Drupal\media\MediaInterface; use Drupal\node\Entity\Node; diff --git a/web/modules/scheduler/tests/modules/scheduler_extras/scheduler_extras.info.yml b/web/modules/scheduler/tests/modules/scheduler_extras/scheduler_extras.info.yml index 66ddf280e77084f9208d2634c13050afb2e86c70..867751355cea1d999d9b4bed274b2af21ed5168b 100644 --- a/web/modules/scheduler/tests/modules/scheduler_extras/scheduler_extras.info.yml +++ b/web/modules/scheduler/tests/modules/scheduler_extras/scheduler_extras.info.yml @@ -5,7 +5,7 @@ package: Testing dependencies: - scheduler:scheduler -# Information added by Drupal.org packaging script on 2024-08-15 -version: '2.1.0' +# Information added by Drupal.org packaging script on 2025-01-09 +version: '2.2.0' project: 'scheduler' -datestamp: 1723712693 +datestamp: 1736416857 diff --git a/web/modules/scheduler/tests/src/Functional/SchedulerEventsTest.php b/web/modules/scheduler/tests/src/Functional/SchedulerEventsTest.php index 6201f72e10bb0c705ea5704dbb293f2f541f946f..d5e192e6020a31798846e518f8933c282d94d8ff 100644 --- a/web/modules/scheduler/tests/src/Functional/SchedulerEventsTest.php +++ b/web/modules/scheduler/tests/src/Functional/SchedulerEventsTest.php @@ -18,7 +18,7 @@ class SchedulerEventsTest extends SchedulerBrowserTestBase { * the entity_form_display. Could these be removed from the config files and * then not needed here? */ - protected static $modules = ['scheduler_api_test', 'menu_ui', 'path']; + protected static $modules = ['scheduler_api_test', 'scheduler_api_legacy_test', 'menu_ui', 'path']; /** * Covers six events for nodes. @@ -26,8 +26,10 @@ class SchedulerEventsTest extends SchedulerBrowserTestBase { * The events allow other modules to react to the Scheduler process being run. * The API test implementations of the event listeners alter the nodes * 'promote' and 'sticky' settings and changes the title. + * + * @dataProvider dataNodeEvents() */ - public function testNodeEvents() { + public function testNodeEvents($legacyNamespace = FALSE) { $this->drupalLogin($this->schedulerUser); // Create a test node. @@ -36,7 +38,7 @@ public function testNodeEvents() { 'type' => $this->type, 'promote' => FALSE, 'sticky' => FALSE, - 'title' => 'API TEST node action', + 'title' => $legacyNamespace ? 'API LEGACY TEST node action' : 'API TEST node action', ]; $node = $this->drupalCreateNode($settings); @@ -87,6 +89,22 @@ public function testNodeEvents() { $this->assertEquals('Published immediately', $node->title->value, 'API action "PUBLISH_IMMEDIATELY" has changed the node title correctly.'); } + /** + * Provides test data for the node events test. + * + * The node tests are run twice. The first run tests the event subscriber in + * scheduler_api_test module, which uses the new namespaces. The second run + * tests the event subscriber defined in scheduler_api_legacy_test which still + * uses the old namespaces. + * + * @return array + * True / False whether to use the legacy namespaces. + */ + public static function dataNodeEvents() { + $data = ['#new-namespace' => [FALSE], '#legacy-namespace' => [TRUE]]; + return $data; + } + /** * Tests six scheduler events for entity types other than node. * diff --git a/web/modules/scheduler/tests/src/Functional/SchedulerNonEnabledTypeTest.php b/web/modules/scheduler/tests/src/Functional/SchedulerNonEnabledTypeTest.php index 41b684f363ecf552df775528666beb552d661369..150714b65cfb451d3a68f3ef7ea30cbd20651741 100644 --- a/web/modules/scheduler/tests/src/Functional/SchedulerNonEnabledTypeTest.php +++ b/web/modules/scheduler/tests/src/Functional/SchedulerNonEnabledTypeTest.php @@ -40,7 +40,14 @@ public function testNonEnabledType($id, $entityTypeId, $bundle, $description, $p 'scheduler_publish_enable' => $publishing_enabled, 'scheduler_unpublish_enable' => $unpublishing_enabled, ]; + if ($entityTypeId == 'commerce_product') { + // Products need an extra checkbox to be ticked. + // cspell:ignore variationtypes . + $edit['edit-variationtypes-default'] = TRUE; + } $this->submitForm($edit, 'Save'); + // Check that the save was successful with no error message. + $this->assertSession()->statusMessageNotExists('error'); // Show the form display page for info. $this->drupalGet($this->adminUrl('bundle_form_display', $entityTypeId, $bundle)); diff --git a/web/modules/scheduler/tests/src/Functional/SchedulerWorkbenchModerationTest.php b/web/modules/scheduler/tests/src/Functional/SchedulerWorkbenchModerationTest.php index 532e9bc8c31458806130757535e3925be2d91662..aa2be84c82976571cc5df05b34e688ca1e75372a 100644 --- a/web/modules/scheduler/tests/src/Functional/SchedulerWorkbenchModerationTest.php +++ b/web/modules/scheduler/tests/src/Functional/SchedulerWorkbenchModerationTest.php @@ -5,7 +5,7 @@ /** * Tests Scheduler with Workbench Moderation installed. * - * @group scheduler + * @group scheduler_workbench */ class SchedulerWorkbenchModerationTest extends SchedulerBrowserTestBase { diff --git a/web/modules/scheduler/tests/src/Traits/SchedulerCommerceProductSetupTrait.php b/web/modules/scheduler/tests/src/Traits/SchedulerCommerceProductSetupTrait.php index 58f3246945226c87c4c54ba5b87d52df59ff6139..9e13035c0a28de033190eb9bab44d00b7c636961 100644 --- a/web/modules/scheduler/tests/src/Traits/SchedulerCommerceProductSetupTrait.php +++ b/web/modules/scheduler/tests/src/Traits/SchedulerCommerceProductSetupTrait.php @@ -184,7 +184,7 @@ public function createProduct(array $values = []) { * @return \Drupal\commerce_product\Entity\ProductInterface * The commerce product object. */ - public function getProduct(string $name = NULL) { + public function getProduct(?string $name = NULL) { $query = $this->productStorage->getQuery() ->accessCheck(FALSE) ->sort('product_id', 'DESC'); diff --git a/web/modules/scheduler/tests/src/Traits/SchedulerMediaSetupTrait.php b/web/modules/scheduler/tests/src/Traits/SchedulerMediaSetupTrait.php index e14a456eafbefea1b7a3a45668729e392477a5d6..c4bbe1db18303b2035cb8e6c955d8371d1a23c2c 100644 --- a/web/modules/scheduler/tests/src/Traits/SchedulerMediaSetupTrait.php +++ b/web/modules/scheduler/tests/src/Traits/SchedulerMediaSetupTrait.php @@ -180,7 +180,7 @@ public function createMediaItem(array $values) { * @return \Drupal\media\MediaInterface * The media object. */ - public function getMediaItem(string $name = NULL) { + public function getMediaItem(?string $name = NULL) { $query = $this->mediaStorage->getQuery() ->accessCheck(FALSE) ->sort('mid', 'DESC'); diff --git a/web/modules/scheduler/tests/src/Traits/SchedulerSetupTrait.php b/web/modules/scheduler/tests/src/Traits/SchedulerSetupTrait.php index a927cd49a66a72bb377d64673e72426a40417fd8..7451643dca9dbed18176f8cea2825c656783ae79 100644 --- a/web/modules/scheduler/tests/src/Traits/SchedulerSetupTrait.php +++ b/web/modules/scheduler/tests/src/Traits/SchedulerSetupTrait.php @@ -4,8 +4,8 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; -use Drupal\Tests\node\Traits\NodeCreationTrait; use Drupal\Tests\Traits\Core\CronRunTrait; +use Drupal\Tests\node\Traits\NodeCreationTrait; /** * Generic setup for all Scheduler tests. @@ -244,7 +244,7 @@ public function addPermissionsToUser(AccountInterface $user, array $permissions) * @return \Drupal\Core\Entity\EntityInterface * The created entity object. */ - public function createEntity(string $entityTypeId, string $bundle = NULL, array $values = []) { + public function createEntity(string $entityTypeId, ?string $bundle = NULL, array $values = []) { switch ($entityTypeId) { case 'node': @@ -329,7 +329,7 @@ public function getEntityByTitle(string $entityTypeId, string $title) { * @return \Drupal\Core\Entity\EntityTypeInterface * The stored entity type object. */ - public function entityTypeObject(string $entityTypeId, string $bundle = NULL) { + public function entityTypeObject(string $entityTypeId, ?string $bundle = NULL) { if (empty($bundle) || $bundle == 'non-enabled') { $default_types = [ 'node' => $this->type, @@ -350,7 +350,7 @@ public function entityTypeObject(string $entityTypeId, string $bundle = NULL) { if (!$entity_type = $entityTypeManager->getStorage($bundleEntityType)->load($bundle)) { // Incorrect parameter values. throw new \Exception(sprintf('Unrecognized combination of entityTypeId "%s" and bundle "%s" passed to entityTypeObject()', $entityTypeId, $bundle)); - }; + } return $entity_type; } @@ -448,7 +448,7 @@ public function entitySavedMessage(string $entityTypeId, string $title) { * @return \Drupal\Core\Url * The url object for adding the required entity. */ - public function entityAddUrl(string $entityTypeId, string $bundle = NULL) { + public function entityAddUrl(string $entityTypeId, ?string $bundle = NULL) { switch ($entityTypeId) { case 'node': $bundle = ($bundle == 'non-enabled') ? $this->nonSchedulerType : ($bundle ?? $this->type); diff --git a/web/modules/scheduler/tests/src/Traits/SchedulerTaxonomyTermSetupTrait.php b/web/modules/scheduler/tests/src/Traits/SchedulerTaxonomyTermSetupTrait.php index 230da484fadd67102ac60dbd7aa48d7770f20edc..058221b816788085c26451a19d001fe3e2247ec6 100644 --- a/web/modules/scheduler/tests/src/Traits/SchedulerTaxonomyTermSetupTrait.php +++ b/web/modules/scheduler/tests/src/Traits/SchedulerTaxonomyTermSetupTrait.php @@ -152,7 +152,7 @@ public function createTaxonomyTerm(array $values) { * @return \Drupal\taxonomy\Entity\Term * The taxonomy term object. */ - public function getTaxonomyTerm(string $name = NULL) { + public function getTaxonomyTerm(?string $name = NULL) { $query = $this->taxonomyTermStorage->getQuery() ->accessCheck(FALSE) ->sort('tid', 'DESC'); diff --git a/web/modules/svg_image/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php b/web/modules/svg_image/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php index 75bcc0f3647512ea5af08c43766fefacb2ee5611..f2594f5248dde6ea1c7974cccf38704268c3696a 100755 --- a/web/modules/svg_image/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php +++ b/web/modules/svg_image/modules/svg_image_responsive/src/Plugin/Field/FieldFormatter/SvgResponsiveImageFormatter.php @@ -74,7 +74,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { if ($responsiveImageStyle) { $imageStylesToLoad = $responsiveImageStyle->getImageStyleIds(); $imageStyles = $this->imageStyleStorage->loadMultiple($imageStylesToLoad); - $imageStyle = $imageStyles[$responsiveImageStyle->getFallbackImageStyle()]; + $imageStyle = $imageStyles[$responsiveImageStyle->getFallbackImageStyle()] ?? NULL; } foreach ($files as $delta => $file) { diff --git a/web/modules/svg_image/modules/svg_image_responsive/svg_image_responsive.info.yml b/web/modules/svg_image/modules/svg_image_responsive/svg_image_responsive.info.yml index d747b4cf3eb34bc046779a4ce50bafef533b620c..288342ef956b927343eaf2f6ac5cef6bb1b68aaa 100644 --- a/web/modules/svg_image/modules/svg_image_responsive/svg_image_responsive.info.yml +++ b/web/modules/svg_image/modules/svg_image_responsive/svg_image_responsive.info.yml @@ -8,7 +8,7 @@ dependencies: - svg_image:svg_image - drupal:responsive_image -# Information added by Drupal.org packaging script on 2024-12-04 -version: '3.2.0' +# Information added by Drupal.org packaging script on 2025-01-14 +version: '3.2.1' project: 'svg_image' -datestamp: 1733298093 +datestamp: 1736865069 diff --git a/web/modules/svg_image/svg_image.info.yml b/web/modules/svg_image/svg_image.info.yml index 3aa395ee35fc29d3131ad59f6d2cd43243d00dda..9380df0498a8e75d63a9cc868774efdf22eabbbc 100644 --- a/web/modules/svg_image/svg_image.info.yml +++ b/web/modules/svg_image/svg_image.info.yml @@ -7,7 +7,7 @@ core_version_requirement: ^10.3 || ^11 dependencies: - drupal:image -# Information added by Drupal.org packaging script on 2024-12-04 -version: '3.2.0' +# Information added by Drupal.org packaging script on 2025-01-14 +version: '3.2.1' project: 'svg_image' -datestamp: 1733298093 +datestamp: 1736865069