diff --git a/.env.dist b/.env.dist index 8318c4a9b2..05608b40ec 100644 --- a/.env.dist +++ b/.env.dist @@ -50,13 +50,13 @@ # Drupal settings. -DRUPAL_BASE_URL=http://web:8080 +DRUPAL_BASE_URL=http://web:8080/web # The hash salt is required and needs to be present in the environment or .env. # Generate a random hash salt with the following command: # cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9+/' | fold -w ${1:-55} | head -n 1 DRUPAL_HASH_SALT= -# Absolute or relative to project root. -DRUPAL_PRIVATE_FILE_SYSTEM=./private +# Always relative to Drupal webroot. +DRUPAL_PRIVATE_FILE_SYSTEM=../private # Absolute or relative to project root. DRUPAL_FILE_TEMP_PATH=./tmp DRUPAL_SYSTEM_LOG_ERROR_LEVEL=verbose @@ -71,23 +71,25 @@ DRUPAL_DATABASE_HOST=mysql DRUPAL_DATABASE_PORT=3306 DRUPAL_DATABASE_USERNAME=root DRUPAL_DATABASE_PASSWORD= -DRUPAL_DATABASE_NAME=joinup +DRUPAL_DATABASE_NAME=drupal # SPARQL connection. -SPARQL_HOST=virtuoso -SPARQL_PORT=8890 -SPARQL_USER=dba -SPARQL_PASSWORD=dba -SPARQL_PUBLIC_ENDPOINT=https://joinup.ec.europa.eu/sparql/ - -# Apache Solr endpoints. -SOLR_CORE_PUBLISHED_NAME=drupal_published -SOLR_CORE_PUBLISHED_URL=http://solr:8983/solr -SOLR_CORE_UNPUBLISHED_NAME=drupal_unpublished -SOLR_CORE_UNPUBLISHED_URL=http://solr:8983/solr +DRUPAL_SPARQL_HOSTNAME=sparql +DRUPAL_SPARQL_PORT=8890 +DRUPAL_SPARQL_USER=dba +DRUPAL_SPARQL_PASSWORD=dba +DRUPAL_SPARQL_PUBLIC_ENDPOINT=https://joinup.ec.europa.eu/sparql/ + +# Mail transport. +DRUPAL_MAIL_SENDMAIL_PATH=/scripts/sendmail.pl +DRUPAL_MAIL_SENDMAIL_MODE=bs +DRUPAL_MAIL_SPOOL_DIR=/tmp/spool + +# Apache Solr endpoint. +SOLR_CORE=digit-joinup +SOLR_URL=http://solr:8983/solr # Redis. -REDIS_INTERFACE=Predis REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD= @@ -109,6 +111,15 @@ ASDA_URL= ASDA_USER= ASDA_PASSWORD= +# Artifacts dir, used to store test artifacts. Either absolute or relative to +# the webroot directory. Configure it in .env file. E.g.: +# ARTIFACTS_DIR="${DRUPAL_FILE_TEMP_PATH}" + +# Monolog logs file paths. This is ONLY used in production and acceptance. Items +# are separated by semi-colon. The Monolog handler ID is separated by its path +# by a colon. +# DRUPAL_MONOLOG_PATHS=default_handler:/var/log/drupal/default.log;php_handler:/var/log/drupal/php.log + # Testing webdriver. WEBDRIVER_URL=http://selenium:4444/wd/hub @@ -121,9 +132,9 @@ AWS_SECRET_ACCESS_KEY= # PHPUnit configuration. These environment variables are documented in the # configuration file (./phpunit.xml). -SIMPLETEST_BASE_URL=http://web:8080 -SIMPLETEST_DB=mysql://root@mysql:3306/joinup -SIMPLETEST_SPARQL_DB=sparql://virtuoso:8890?module=sparql_entity_storage +SIMPLETEST_BASE_URL=http://web:8080/web +SIMPLETEST_DB=mysql://root@mysql:3306/drupal +SIMPLETEST_SPARQL_DB=sparql://sparql:8890?module=sparql_entity_storage BROWSERTEST_OUTPUT_DIRECTORY=./web/sites/simpletest/browser_output BROWSERTEST_OUTPUT_BASE_URL= SYMFONY_DEPRECATIONS_HELPER=99999 @@ -131,7 +142,7 @@ MINK_DRIVER_CLASS= MINK_DRIVER_ARGS= MINK_DRIVER_ARGS_PHANTOMJS= MINK_DRIVER_ARGS_WEBDRIVER="[\"chrome\", { \"chromeOptions\": { \"w3c\": false } }, \"http://selenium:4444/wd/hub\"]" -DTT_BASE_URL=http://web:8080 +DTT_BASE_URL=http://web:8080/web DTT_API_URL=http://selenium:4444/wd/hub DTT_MINK_DRIVER_ARGS="['chrome', null, 'http://selenium:4444/wd/hub']" @@ -141,12 +152,13 @@ DTT_MINK_DRIVER_ARGS="['chrome', null, 'http://selenium:4444/wd/hub']" # production databases. DOCKER_RESTORE_PRODUCTION=no -# Debugging -# TODO: The following vars were not tested. They were inherited from a previous -# Docker setup. To investigate if we still need them. -# -# XDebug configuration. For Xdebug setup, run this command in the terminal: -# - macOS users: sudo ifconfig en0 alias 10.254.254.254 255.255.255.0 -# - Linux users: sudo ip addr add 10.254.254.254/32 dev lo label lo:1 -# XDEBUG_CONFIG="remote_enable=1 remote_host=10.254.254.254 remote_port=9000 idekey=PHPSTORM remote_autostart=1" -# PHP_IDE_CONFIG="serverName=Docker" +# Copy any of these variable in .env file and set the value to "True" in order +# to start the Docker web service with XDebug and/or Blackfire.io disabled. Note +# that you can anytime enable XDebug and/or Blackfire.io manually by issuing: +# $ docker-compose exec web phpenmod xdebug +# $ docker-compose exec web phpenmod blackfire +# or disable it with: +# $ docker-compose exec web phpdismod xdebug +# $ docker-compose exec web phpdismod blackfire +DISABLE_XDEBUG="False" +DISABLE_BLACKFIRE="False" diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..f09447bebb --- /dev/null +++ b/.eslintignore @@ -0,0 +1,22 @@ +# Ignore generated files. +behat.yml +docker-compose.override.yml +runner.yml + +# Ignore third party dependencies. +/node_modules/ +/vendor/ +/web/core/ +/web/modules/contrib/ +/web/themes/contrib/ + +# Ignore user uploaded content. +/private/ +/web/sites/default/files/ + +# Ignore the distribution build directory. +/dist/ + +# Ignore database backups and temporary files directories. +/db/ +/tmp/ diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..8255f8b197 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "extends": "./web/.eslintrc.json", + "overrides": [ + // Empty mappings are allowed in the docker-compose file. This indicates + // options that will inherit their value from the environment variables. + { + "files": ["docker-compose.yml"], + "rules": { + "yml/no-empty-mapping-value": "off" + } + } + ] +} diff --git a/.gitattributes b/.gitattributes index 3d82461eb0..048be498db 100644 --- a/.gitattributes +++ b/.gitattributes @@ -75,10 +75,8 @@ .github export-ignore .editorconfig export-ignore .gitattributes export-ignore -build.continuousphp.xml export-ignore -build.project.xml export-ignore LICENSE export-ignore phpcs-ruleset.xml.dist export-ignore phpstan.neon export-ignore -phpunit.xml.dist export-ignore +phpunit.xml export-ignore README.md export-ignore diff --git a/.gitignore b/.gitignore index 674824b88f..23acfe3f5b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ -# Ignore directories generated by Composer +# Ignore third party dependencies. /bin/ /drush/contrib/ +/node_modules/ /vendor/ /web/core/ /web/libraries/ @@ -28,10 +29,11 @@ # Ignore environment specific settings /.env +/.env.pipeline +/behat.yml /grumphp.yml /phpcs.xml /runner.yml -/tests/behat.yml /web/sites/default/services.yml # Ignore compiled CSS. @@ -53,9 +55,9 @@ # Ignore local docker compose file. /docker-compose.override.yml -# CPHP Behat files. -/tests/behat-* - # Ignore project specific temporary generated files. /latest.sh1 /temporary_inputfile.txt + +# Used by the CI for artifacts. +/debug/ diff --git a/.opts.yml b/.opts.yml index 72e61bb813..449cce74e5 100644 --- a/.opts.yml +++ b/.opts.yml @@ -8,5 +8,32 @@ upgrade_commands: - ./vendor/bin/drush state:set system.maintenance_mode 1 --input-format=integer --yes - touch disable-config-readonly - ./vendor/bin/drush deploy --yes + - ./vendor/bin/drush search-api:reset-tracker --yes + - ./vendor/bin/drush php:eval "if(node_access_needs_rebuild()) { node_access_rebuild(); }" - rm disable-config-readonly - ./vendor/bin/drush state:set system.maintenance_mode 0 --input-format=integer --yes + # These are release v1.75.0 one-time-tasks and will be removed after a + # successful deployment on production, in the scope of the release ticket. + # The unpublished content Solr core/server has been removed. We reindex + # unpublished content into the unified Solr core/server. + - ./vendor/bin/drush search-api:clear unpublished + - ./vendor/bin/drush search-api:index unpublished + append: + acceptance: + - touch disable-config-readonly + - ./vendor/bin/drush pm:enable joinup_acceptance --yes + - rm disable-config-readonly + +php_version: 7.4 + +solr: True +solr_version: 6 +solr_core: custom + +virtuoso_image: registry.fpfis.eu/ec-europa/digit-joinup-reference:virtuoso + +install_clean: Yes +install_clone: False + +solr_refresh_acc: True +virtuoso_refresh_acc: True diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..1cda54be93 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +*.yml diff --git a/README.md b/README.md index c4950d1fd1..82768183a8 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ DRUPAL_HASH_SALT=some-unique-random-string-like-37h+2BQEQx83YLa/uFdsfG55 SOLR_CORE_PUBLISHED_URL=http://localhost:8983/solr SOLR_CORE_UNPUBLISHED_URL=http://localhost:8983/solr -SPARQL_HOST=localhost +DRUPAL_SPARQL_HOSTNAME=localhost REDIS_HOST=localhost SIMPLETEST_BASE_URL=http://my-base-url.local @@ -160,11 +160,11 @@ DTT_MINK_DRIVER_ARGS="['chrome', null, 'http://localhost:4444/wd/hub']" #### Build the project -Execute the Task Runner command `toolkit:build-dev` to build a development -instance, then install the site with `toolkit:install-clean`: +Run Composer install to get all dependencies and prepare the code base, then +install the site with `toolkit:install-clean`: ``` -$ ./vendor/bin/run toolkit:build-dev +$ composer install $ ./vendor/bin/run toolkit:install-clean ``` diff --git a/behat.yml.dist b/behat.yml.dist new file mode 100644 index 0000000000..a2608d4113 --- /dev/null +++ b/behat.yml.dist @@ -0,0 +1,200 @@ +# Suites defaults. +.paths: &paths + - '%paths.base%/tests/features' +.contexts: &contexts + - Drupal\joinup\Context\BootstrapDrupalContext + - Drupal\DrupalExtension\Context\DrushContext + - Drupal\DrupalExtension\Context\MarkupContext + - Drupal\DrupalExtension\Context\MessageContext + # Todo: Restore alphabetical ordering for TallinnContext once it is + # possible to determine the execution order of Behat hooks. + # Ref. https://github.com/Behat/Behat/issues/62 + # Ref. https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6060 + - Drupal\joinup\Context\TallinnContext + - Drupal\joinup\Context\AdmsValidatorContext + - Drupal\joinup\Context\AssetDistributionContext + - Drupal\joinup\Context\AssetReleaseContext + - Drupal\joinup\Context\CollectionContext + - Drupal\joinup\Context\ContactFormContext + - Drupal\joinup\Context\ContactInformationContext + - Drupal\joinup\Context\CustomPageContext + - Drupal\joinup\Context\DigitQaPipelineContext + - Drupal\joinup\Context\DrupalContext + - Drupal\joinup\Context\EifContext + - Drupal\joinup\Context\EntityQueueContext + - Drupal\joinup\Context\EuplContext + - Drupal\joinup\Context\HeaderContext + - Drupal\joinup\Context\HomepageContext + - Drupal\joinup\Context\Isa2AnalyticsContext + - Drupal\joinup\Context\JoinupCollectionContext + - Drupal\joinup\Context\JoinupCommunityContentContext + - Drupal\joinup\Context\JoinupContext + - Drupal\joinup\Context\JoinupCoreContext + - Drupal\joinup\Context\JoinupDiscussionContext + - Drupal\joinup\Context\JoinupDocumentContext + - Drupal\joinup\Context\JoinupEuLoginContext + - Drupal\joinup\Context\JoinupEventContext + - Drupal\joinup\Context\JoinupFeaturedContext + - Drupal\joinup\Context\JoinupGroupContext + - Drupal\joinup\Context\JoinupInviteContext + - Drupal\joinup\Context\JoinupLegalContext + - Drupal\joinup\Context\JoinupLicenceContext + - Drupal\joinup\Context\JoinupNewsContext + - Drupal\joinup\Context\JoinupNewsletterContext + - Drupal\joinup\Context\JoinupNotificationContext + - Drupal\joinup\Context\JoinupParagraphsContext + - Drupal\joinup\Context\JoinupSearchContext + - Drupal\joinup\Context\JoinupSeoContext + - Drupal\joinup\Context\JoinupSubscriptionContext + - Drupal\joinup\Context\JoinupUserContext + - Drupal\joinup\Context\MinkContext + - Drupal\joinup\Context\ModerationContext + - Drupal\joinup\Context\OeNewsroomNewsletterContext + - Drupal\joinup\Context\OwnerContext + - Drupal\joinup\Context\RdfEntityProvenanceContext + - Drupal\joinup\Context\RdfGraphContext + - Drupal\joinup\Context\RssContext + - Drupal\joinup\Context\ScreenshotContext: + localDir: ${behat.screenshots.local.dir} + - Drupal\joinup\Context\SolutionContext + - Drupal\joinup\Context\WhatsNewContext + - Drupal\joinup\Context\WysiwygContext + - Drupal\Tests\cas_mock_server\Context\CasMockServerContext: + attributes_map: + firstName: First name + lastName: Last name + - Drupal\Tests\honeypot\Behat\HoneypotContext + - Drupal\Tests\message_digest\Behat\MessageDigestContext + - Drupal\Tests\oe_webtools\Behat\WebtoolsETransContext + - Drupal\Tests\oe_webtools\Behat\WebtoolsMapsContext + - Drupal\Tests\pipeline\Behat\PipelineContext + - Drupal\Tests\spdx\Behat\SpdxContext + - Drupal\joinup\Context\FeatureContext + - LoversOfBehat\TableExtension\Context\TableContext + +# Default profile. +default: + suites: + group_a: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-a' + group_b: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-b' + group_c: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-c' + group_d: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-d' + group_e: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-e' + group_f: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-f' + group_g: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&@group-g' + default: + contexts: *contexts + paths: *paths + filters: + tags: '~@wip&&~@group-a&&~@group-b&&~@group-c&&~@group-d&&~@group-e&&~@group-f&&~@group-g' + extensions: + Drupal\MinkExtension: + base_url: ${env.DRUPAL_BASE_URL} + ajax_timeout: 10 + files_path: ${joinup.dir}/tests/fixtures/files + goutte: ~ + javascript_session: selenium2 + browser_name: ${behat.browser_name} + selenium2: + wd_host: ${env.WEBDRIVER_URL} + capabilities: {"browserName": "chrome", "browser": "chrome", 'chrome': {'switches':['--no-sandbox']}} + LoversOfBehat\TableExtension: + table_map: + 'group menu edit table': '#menu-overview' + 'eif recommendations': '.eif-recommendations table' + 'member administration': '.og-members-overview table' + 'member permissions': 'table.form-table__member-permissions' + 'licence comparer': 'table[data-drupal-selector="licence-comparer"]' + 'pipeline log': 'table.joinup-pipeline-log-table' + 'subscribers report': 'table' + Drupal\DrupalExtension: + api_driver: 'drupal' + blackbox: ~ + region_map: + Administration toolbar: '#toolbar-administration' + Comment: '.comments-section' + Content listing field filter form: '.field--name-field-content-listing' + Contact information inline form: '#edit-field-ar-contact-information-wrapper' + Content: '.section--content-middle, main .layout-content' + Cookie consent banner: '#cookie-consent-banner' + Discover topics block: '.block-views-blockdiscover-topics-block' + Entity actions: '.block-joinup-local-tasks-block' + Explore block: '.block-joinup-front-page-explore-block' + Featured: '.region-featured' + Footer: '.section--footer, footer' + Hamburger menu: 'nav.joinup-navbar ul.navbar-nav ul.accordion-list' + Header menu: '#block-joinup-theme-main-menu' + Header: '.section--featured, .section-header' + Highlighted event: '.block-entityqueue--highlighted-event' + Highlighted solution: '.block-entityqueue--highlighted-solution' + In the spotlight: '.block-views-blockin-the-spotlight-block' + Left sidebar: '.section--sidebar-left' + Main solution vertical tab: '#edit-group-main' + Management solution vertical tab: '#edit-group-management' + Members admin form header: '#edit-header' + Members admin form actions: '#edit-action' + Modal buttons: '.ui-dialog-buttonpane' + Modal content: '#drupal-modal' + Modal title: '.ui-dialog-title' + My unpublished content area: '.block-user-unpublished' + Navigation bar: 'nav.joinup-navbar' + Navigation menu block: '#block-navigation' + Navigation menu: 'div.navigation-menu ul' + Page title: 'div.page__title-wrapper' + Pager: 'nav.pager' + Plus button menu: 'div.add-content-menu' + Primary menu: '.region-primary-menu' + Related solutions: '.field--name-field-is-related-solutions' + SevenHeader: '.region-header' + Statistics: '#block-statistics, #block-ventuno-statistics' + Table of contents: '#block-table-of-contents' + Table of contents outline: '#block-toc-outline' + Unpublished content area: '.block-entity-unpublished' + drupal: + drupal_root: ${joinup.site_dir} + selectors: + message_selector: '.alert, .messages' + error_message_selector: '.alert.alert--error, .messages.messages--error' + success_message_selector: '.alert.alert--status, .messages.messages--status' + warning_message_selector: '.alert.alert--warning, .messages.messages--warning' + login_form_selector: '#user-login-form' + subcontexts: + autoload: false + paths: [] + text: + log_in: 'Sign in' + log_out: 'Sign out' + username_field: 'Email or username' + FriendsOfBehat\ServiceContainerExtension: + imports: + - ${joinup.dir}/vendor/drupaltest/behat-one-time-login/behat.services.yml + formatters: + ${behat.formatter.name}: ~ diff --git a/composer.json b/composer.json index fec7c8f504..e100a28016 100644 --- a/composer.json +++ b/composer.json @@ -4,12 +4,11 @@ "type": "project", "license": "EUPL-1.2", "require": { - "php": ">=7.1.0", + "php": ">=7.4", "ext-dom": "*", "ext-json": "*", "ext-pdo": "*", "composer/installers": "^1.9", - "cpliakas/git-wrapper": "~1.7", "cweagans/composer-patches": "^1.7", "dkarv/mdl-chip-input": "dev-master", "drupal/allowed_formats": "^1.3", @@ -59,6 +58,7 @@ "drupal/message_digest": "^1.0.0", "drupal/message_notify": "~1.2", "drupal/meta_entity": "^1.0-alpha2", + "drupal/monolog": "^1.3", "drupal/og": "dev-neutral-access-result as 1.x-dev", "drupal/og_menu": "^1.0-alpha4", "drupal/page_manager": "^4.0@beta", @@ -75,6 +75,7 @@ "drupal/schema_metatag": "^2", "drupal/schema_social_media_posting": "dev-1.0.x", "drupal/search_api": "1.13", + "drupal/search_api_autocomplete": "^1.5", "drupal/search_api_solr": "2.2", "drupal/simple_block": "^1.3", "drupal/simple_sitemap": "^3.10", @@ -86,7 +87,7 @@ "drupal/spdx": "^1.0", "drupal/state_machine": "^1.0", "drupal/subpathauto": "dev-1.x#fcd7c1c4c49d5ee1648630d92eb9da46e6bf25f0", - "drupal/swiftmailer": "dev-1.x#694cbf25d8c026b0c7c118093696d151a7874754", + "drupal/swiftmailer": "dev-2.x", "drupal/theme_rule": "^1.0", "drupal/token": "~1.7", "drupal/video_embed_field": "^2", @@ -138,15 +139,15 @@ "drupal/filecache": "^1", "drupal/renderviz": "^1.0", "drupal/restui": "^1.18", - "drupal/stage_file_proxy": "^1.1", "drupaltest/behat-one-time-login": "^1.0", - "ec-europa/toolkit": "^4.4.6", + "ec-europa/toolkit": "^4.4.11", + "foxy/foxy": "^1.1", "jcalderonzumba/gastonjs": "^1.2@dev", "lovers-of-behat/table-extension": "^1.2.0", "mglaman/phpstan-drupal": "^0.12.12", "mikey179/vfsstream": "~1.6", "openeuropa/composer-artifacts": "^0.1.3", - "openeuropa/task-runner": "dev-php-7.1 as 1.0.0-beta7", + "openeuropa/task-runner": "dev-master as 1.0.0-beta7", "pear/http_request2": "~2.4", "pfrenssen/phpcs-pre-push": "1.1", "php-task-runner/composer": "dev-master", @@ -172,7 +173,7 @@ "config": { "sort-packages": true, "platform": { - "php": "7.1.9" + "php": "7.4.0" } }, "autoload": { @@ -213,16 +214,17 @@ }, "scripts": { "post-install-cmd": [ - "Joinup\\Composer\\CaptureGitReleaseTag::capture", "Joinup\\Composer\\ScriptHandler::createRequiredFiles", "Joinup\\Composer\\RemoveWrongPatchedObjects::remove", - "test ! -f ./vendor/bin/grumphp || ./vendor/bin/grumphp git:deinit" + "test ! -f ./vendor/bin/grumphp || ./vendor/bin/grumphp git:deinit", + "test ! -f ./vendor/bin/run || ./vendor/bin/run toolkit:build-dev" ], "post-update-cmd": [ - "Joinup\\Composer\\CaptureGitReleaseTag::capture", "Joinup\\Composer\\ScriptHandler::createRequiredFiles", "Joinup\\Composer\\RemoveWrongPatchedObjects::remove", - "test ! -f ./vendor/bin/grumphp || ./vendor/bin/grumphp git:deinit" + "test ! -f ./vendor/bin/grumphp || ./vendor/bin/grumphp git:deinit", + "test ! -f ./vendor/bin/run || ./vendor/bin/run toolkit:build-dev", + "rm -rf ./resources/solr/conf && cp -r ./web/modules/contrib/search_api_solr/solr-conf/6.x ./resources/solr/conf" ] }, "extra": { @@ -242,6 +244,7 @@ "web-root": "web/" }, "file-mapping": { + "[web-root]/.eslintrc.json": false, "[web-root]/robots.txt": { "append": "resources/drupal-scaffold/robots.txt.append" }, @@ -336,6 +339,13 @@ "Some bulk form field options are missing schema @see https://www.drupal.org/project/search_api/issues/3195199": "https://git.drupalcode.org/project/search_api/-/merge_requests/6.diff", "Duplicate dependencies @see https://www.drupal.org/project/search_api/issues/3111635": "https://www.drupal.org/files/issues/2020-02-08/3111635-8--fix_duplicate_dependencies.patch" }, + "drupal/search_api_autocomplete": { + "Clear timeout autosubmit used in views_autosubmit.": "resources/patch/search_api_autocomplete_override_views_autosubmit.patch", + "Trying to access array offset on value of type int @see https://www.drupal.org/project/search_api_solr/issues/3173950": "resources/patch/search_api_solr-3173950.diff" + }, + "drupal/search_api_solr": { + "Missing config schema @see https://www.drupal.org/project/search_api_solr/issues/3236773": "https://git.drupalcode.org/project/search_api_solr/-/merge_requests/8.diff" + }, "drupal/site_alert": { "Add drush commands @see https://www.drupal.org/project/site_alert/issues/3118800": "https://www.drupal.org/files/issues/2020-10-26/3118800-44.patch" }, @@ -344,33 +354,37 @@ }, "drupal/sparql_entity_storage": { "Bundle classes support @see https://github.com/ec-europa/sparql_entity_storage/pull/11": "https://patch-diff.githubusercontent.com/raw/ec-europa/sparql_entity_storage/pull/11.diff", - "Allow routes to filter by bundle @see https://github.com/ec-europa/sparql_entity_storage/pull/32": "https://github.com/idimopoulos/sparql_entity_storage/compare/8.x-1.x...idimopoulos:e9b6e36.diff" + "Allow routes to filter by bundle @see https://github.com/ec-europa/sparql_entity_storage/pull/32": "https://github.com/idimopoulos/sparql_entity_storage/compare/8.x-1.x...idimopoulos:e9b6e36.diff", + "Allow more information shown on a query exception @see https://www.drupal.org/project/sparql_entity_storage/issues/3239395": "https://git.drupalcode.org/project/sparql_entity_storage/-/merge_requests/1.diff" }, "drupal/subpathauto": { "Subpaths with redirect not resolved @see https://www.drupal.org/project/subpathauto/issues/3175637": "https://git.drupalcode.org/project/subpathauto/-/merge_requests/1/diffs.diff" }, "drupal/swiftmailer": { - "Add spooling for increased performance @see https://www.drupal.org/project/swiftmailer/issues/3000553": "https://www.drupal.org/files/issues/2019-08-26/3000553-18.patch", - "Allow Cc and Bcc headers @see https://www.drupal.org/project/swiftmailer/issues/2892104": "https://www.drupal.org/files/issues/2019-08-26/2892104-21.patch" + "Add spooling for increased performance @see https://www.drupal.org/project/swiftmailer/issues/3000553": "https://git.drupalcode.org/project/swiftmailer/-/merge_requests/2.diff", + "Allow Cc and Bcc headers @see https://www.drupal.org/project/swiftmailer/issues/2892104": "https://www.drupal.org/files/issues/2021-10-11/2892104-38.patch" }, "drupal/video_embed_field": { "Extend support for embed URLs. Option to force privacy @see https://www.drupal.org/project/video_embed_field/issues/3060201 (originally on https://www.drupal.org/node/2899093)": "https://www.drupal.org/files/issues/2019-06-11/privacy_mode-3060201-D8-6.patch" }, "drupal/views_autosubmit": { - "The views plugin options are missing schema @see https://www.drupal.org/i/3195213": "https://git.drupalcode.org/project/views_autosubmit/-/merge_requests/2.diff" + "Stop auto submitting first character entered in an Autocomplete Filter field. @see https://www.drupal.org/project/views_autosubmit/issues/3160600" : "https://www.drupal.org/files/issues/2021-09-06/3160600_views_autosubmit_16.patch" }, "drupal/views_block_area": { "Views block area missing schema @see https://www.drupal.org/project/views_block_area/issues/3157188": "https://www.drupal.org/files/issues/2020-07-06/views_block_area-missing_schema-3157188-2.patch" }, - "openeuropa/oe_bootstrap_theme": { - "Preserve link attributes in navigation menus @see https://github.com/openeuropa/oe_bootstrap_theme/pull/38": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_bootstrap_theme/pull/38.diff" - }, "openeuropa/oe_webtools": { "Allow to pass an optional referer. @see https://github.com/openeuropa/oe_webtools/pull/96": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/96.diff", "Place the webtools loader on the head. @see https://github.com/openeuropa/oe_webtools/pull/102": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/102.diff", - "Add the possibility to display a marker on the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://github.com/openeuropa/oe_webtools/compare/master...cbee0e9.diff", + "Add the possibility to display a marker on the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://github.com/openeuropa/oe_webtools/compare/1.7.0...cbee0e99a3a17972e1e4553e0b67d8b812ae074d.diff", "Integrate with Webtools eTrans component @see https://github.com/openeuropa/oe_webtools/pull/146": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/146.diff", "Avoid CORS issues by requesting the Webtools Smartloader script over HTTPS @see https://github.com/openeuropa/oe_webtools/pull/149": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/149.diff" + }, + "openeuropa/oe_bootstrap_theme": { + "Preserve link attributes in navigation menus @see https://github.com/openeuropa/oe_bootstrap_theme/pull/38": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_bootstrap_theme/pull/38.diff" + }, + "solarium/solarium": { + "implode() deprecated usage": "resources/patch/solarium.diff" } }, "patches-ignore": { @@ -426,10 +440,6 @@ "type": "vcs", "url": "https://github.com/gizra/og.git" }, - { - "type": "vcs", - "url": "https://github.com/pfrenssen/task-runner.git" - }, { "type": "composer", "url": "https://packages.drupal.org/8" diff --git a/composer.lock b/composer.lock index e1a7add8df..cf82b88af9 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": "d84b68fa25515d08182f6deebe6892f9", + "content-hash": "a9aa624ac05867d87540ccd3f57a0d5f", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -1235,62 +1235,6 @@ "abandoned": "psr/container", "time": "2017-02-14T19:40:03+00:00" }, - { - "name": "cpliakas/git-wrapper", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/cpliakas/git-wrapper.git", - "reference": "1a2f1131ec9ebe04a0b729b141396fa55f992d44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cpliakas/git-wrapper/zipball/1a2f1131ec9ebe04a0b729b141396fa55f992d44", - "reference": "1a2f1131ec9ebe04a0b729b141396fa55f992d44", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "symfony/event-dispatcher": "~2.3|~3.0", - "symfony/process": "~2.3|~3.0" - }, - "require-dev": { - "pdepend/pdepend": "~1.0", - "phploc/phploc": "~2.0", - "phpmd/phpmd": "~1.0", - "phpunit/phpunit": "~3.0", - "psr/log": "~1.0", - "scrutinizer/ocular": "~1.0", - "sebastian/phpcpd": "~2.0", - "symfony/filesystem": "~2.0" - }, - "suggest": { - "monolog/monolog": "Enables logging of executed git commands" - }, - "type": "library", - "autoload": { - "psr-0": { - "GitWrapper": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Pliakas", - "email": "opensource@chrispliakas.com" - } - ], - "description": "A PHP wrapper around the Git command line utility.", - "homepage": "https://github.com/cpliakas/git-wrapper", - "keywords": [ - "git" - ], - "abandoned": "symplify/git-wrapper", - "time": "2016-04-19T16:12:33+00:00" - }, { "name": "cweagans/composer-patches", "version": "1.7.1", @@ -5876,6 +5820,68 @@ "docs": "https://www.drupal.org/docs/8/modules/metatag" } }, + { + "name": "drupal/monolog", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/monolog.git", + "reference": "8.x-1.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/monolog-8.x-1.3.zip", + "reference": "8.x-1.3", + "shasum": "939642830811428b5a17afb5c9d4243c72fa796d" + }, + "require": { + "drupal/core": "~8.0", + "monolog/monolog": ">=1.6.0,<2.0.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.3", + "datestamp": "1558959784", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "autoload": { + "psr-0": { + "Drupal\\Monolog": "src/" + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Chris Pliakas", + "homepage": "https://www.drupal.org/user/1011436", + "email": "opensource@chrispliakas.com", + "role": "Project Lead" + }, + { + "name": "See contributors", + "homepage": "http://drupal.org/node/1937716/committers", + "role": "Developer" + }, + { + "name": "lussoluca", + "homepage": "https://www.drupal.org/user/138068" + } + ], + "description": "A Framework and UI for integrating with the Monolog library.", + "homepage": "http://drupal.org/project/monolog", + "support": { + "source": "https://git.drupalcode.org/project/monolog", + "issues": "http://drupal.org/project/issues/monolog" + } + }, { "name": "drupal/og", "version": "dev-neutral-access-result", @@ -6887,6 +6893,63 @@ "irc": "irc://irc.freenode.org/drupal-search-api" } }, + { + "name": "drupal/search_api_autocomplete", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/search_api_autocomplete.git", + "reference": "8.x-1.5" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/search_api_autocomplete-8.x-1.5.zip", + "reference": "8.x-1.5", + "shasum": "b9ae7e69e95da0910a65b23f2810da4be579ecdd" + }, + "require": { + "drupal/core": "^8 || ^9", + "drupal/search_api": "1.x" + }, + "require-dev": { + "drupal/search_api_page": "1.x-dev" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.5", + "datestamp": "1626685059", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "patches_applied": { + "Clear timeout autosubmit used in views_autosubmit.": "resources/patch/search_api_autocomplete_override_views_autosubmit.patch" + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Thomas Seidl", + "homepage": "https://www.drupal.org/u/drunken-monkey" + }, + { + "name": "See other contributors", + "homepage": "https://www.drupal.org/node/1142202/committers" + } + ], + "description": "Adds autocomplete functionality to searches.", + "homepage": "https://www.drupal.org/project/search_api_autocomplete", + "support": { + "source": "http://git.drupal.org/project/search_api_autocomplete.git", + "issues": "https://www.drupal.org/project/issues/search_api_autocomplete", + "irc": "irc://irc.freenode.org/drupal-search-api" + } + }, { "name": "drupal/search_api_solr", "version": "2.2.0", @@ -6934,6 +6997,10 @@ "status": "covered", "message": "Covered by Drupal's security advisory policy" } + }, + "patches_applied": { + "Missing config schema @see https://www.drupal.org/project/search_api_solr/issues/3236773": "https://git.drupalcode.org/project/search_api_solr/-/merge_requests/8.diff", + "Trying to access array offset on value of type int @see https://www.drupal.org/project/search_api_solr/issues/3173950": "resources/patch/search_api_solr-3173950.diff" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -7460,7 +7527,8 @@ }, "patches_applied": { "Bundle classes support @see https://github.com/ec-europa/sparql_entity_storage/pull/11": "https://patch-diff.githubusercontent.com/raw/ec-europa/sparql_entity_storage/pull/11.diff", - "Allow routes to filter by bundle @see https://github.com/ec-europa/sparql_entity_storage/pull/32": "https://github.com/idimopoulos/sparql_entity_storage/compare/8.x-1.x...idimopoulos:e9b6e36.diff" + "Allow routes to filter by bundle @see https://github.com/ec-europa/sparql_entity_storage/pull/32": "https://github.com/idimopoulos/sparql_entity_storage/compare/8.x-1.x...idimopoulos:e9b6e36.diff", + "Allow more information shown on a query exception @see https://www.drupal.org/project/sparql_entity_storage/issues/3239395": "https://git.drupalcode.org/project/sparql_entity_storage/-/merge_requests/1.diff" } }, "autoload": { @@ -7668,39 +7736,42 @@ }, { "name": "drupal/swiftmailer", - "version": "dev-1.x", + "version": "dev-2.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/swiftmailer.git", - "reference": "694cbf25d8c026b0c7c118093696d151a7874754" + "reference": "0fcfeef94b2b5dd37e31305d2c22c5d73232dfaf" }, "require": { - "drupal/core": "~8.0", - "drupal/mailsystem": "*", - "html2text/html2text": "~4.0.1", - "swiftmailer/swiftmailer": "~5.4.5" + "drupal/core": "^8.9.11 || ^9.0.10", + "drupal/mailsystem": "^4.1.0", + "egulias/email-validator": "^2.0", + "html2text/html2text": "^4.0.1", + "php": ">=7.0.0", + "swiftmailer/swiftmailer": "^6.1.3", + "tijsverkoyen/css-to-inline-styles": "^2.2" }, "type": "drupal-module", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-2.x": "2.x-dev" }, "drupal": { - "version": "8.x-1.0-beta2+11-dev", - "datestamp": "1554499381", + "version": "8.x-2.0+1-dev", + "datestamp": "1628154387", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." } }, "patches_applied": { - "Add spooling for increased performance @see https://www.drupal.org/project/swiftmailer/issues/3000553": "https://www.drupal.org/files/issues/2019-08-26/3000553-18.patch", - "Allow Cc and Bcc headers @see https://www.drupal.org/project/swiftmailer/issues/2892104": "https://www.drupal.org/files/issues/2019-08-26/2892104-21.patch" + "Add spooling for increased performance @see https://www.drupal.org/project/swiftmailer/issues/3000553": "https://git.drupalcode.org/project/swiftmailer/-/merge_requests/2.diff", + "Allow Cc and Bcc headers @see https://www.drupal.org/project/swiftmailer/issues/2892104": "https://www.drupal.org/files/issues/2021-10-11/2892104-38.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -7733,7 +7804,7 @@ "support": { "source": "https://git.drupalcode.org/project/swiftmailer" }, - "time": "2019-04-05T21:22:03+00:00" + "time": "2021-09-04T15:57:00+00:00" }, { "name": "drupal/theme_rule", @@ -8220,7 +8291,7 @@ } }, "patches_applied": { - "The views plugin options are missing schema @see https://www.drupal.org/i/3195213": "https://git.drupalcode.org/project/views_autosubmit/-/merge_requests/2.diff" + "Stop auto submitting first character entered in an Autocomplete Filter field. @see https://www.drupal.org/project/views_autosubmit/issues/3160600": "https://www.drupal.org/files/issues/2021-09-06/3160600_views_autosubmit_16.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -9366,16 +9437,16 @@ }, { "name": "html2text/html2text", - "version": "4.0.1", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/mtibben/html2text.git", - "reference": "f55104b7c9f99b0937f0e20fe051b19f9c0ecad1" + "reference": "61ad68e934066a6f8df29a3d23a6460536d0855c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mtibben/html2text/zipball/f55104b7c9f99b0937f0e20fe051b19f9c0ecad1", - "reference": "f55104b7c9f99b0937f0e20fe051b19f9c0ecad1", + "url": "https://api.github.com/repos/mtibben/html2text/zipball/61ad68e934066a6f8df29a3d23a6460536d0855c", + "reference": "61ad68e934066a6f8df29a3d23a6460536d0855c", "shasum": "" }, "require-dev": { @@ -9396,10 +9467,10 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "GPLv2" + "GPL-2.0-or-later" ], "description": "Converts HTML to formatted plain text", - "time": "2016-03-16T23:24:34+00:00" + "time": "2020-04-16T23:44:31+00:00" }, { "name": "jacklmoore/autosize", @@ -9410,7 +9481,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2021-06-30T06:04:10+00:00" + "time": "2021-05-17T17:56:07+00:00" }, { "name": "kub-at/php-simple-html-dom-parser", @@ -10151,6 +10222,88 @@ ], "time": "2020-06-16T17:45:06+00:00" }, + { + "name": "monolog/monolog", + "version": "1.26.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c6b00f05152ae2c9b04a448f99c7590beb6042f5", + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-05-28T08:32:12+00:00" + }, { "name": "neilime/php-css-lint", "version": "v1.1.0", @@ -10391,7 +10544,7 @@ "patches_applied": { "Allow to pass an optional referer. @see https://github.com/openeuropa/oe_webtools/pull/96": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/96.diff", "Place the webtools loader on the head. @see https://github.com/openeuropa/oe_webtools/pull/102": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/102.diff", - "Add the possibility to display a marker on the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://github.com/openeuropa/oe_webtools/compare/master...cbee0e9.diff", + "Add the possibility to display a marker on the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://github.com/openeuropa/oe_webtools/compare/1.7.0...cbee0e99a3a17972e1e4553e0b67d8b812ae074d.diff", "Integrate with Webtools eTrans component @see https://github.com/openeuropa/oe_webtools/pull/146": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/146.diff", "Avoid CORS issues by requesting the Webtools Smartloader script over HTTPS @see https://github.com/openeuropa/oe_webtools/pull/149": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/149.diff" } @@ -11655,6 +11808,9 @@ "extra": { "branch-alias": { "dev-4.0.x": "4.0.x-dev" + }, + "patches_applied": { + "implode() deprecated usage": "resources/patch/solarium.diff" } }, "autoload": { @@ -11690,7 +11846,7 @@ "reference": "master" }, "type": "library", - "time": "2020-10-26T14:41:29+00:00" + "time": "2021-05-20T17:05:25+00:00" }, { "name": "stack/builder", @@ -11828,29 +11984,36 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.12", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" + "reference": "15f7faf8508e04471f666633addacf54c0ab5933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/15f7faf8508e04471f666633addacf54c0ab5933", + "reference": "15f7faf8508e04471f666633addacf54c0ab5933", "shasum": "" }, "require": { - "php": ">=5.3.3" + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "6.2-dev" } }, "autoload": { @@ -11878,7 +12041,17 @@ "mail", "mailer" ], - "time": "2018-07-31T09:26:32+00:00" + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "time": "2021-03-09T12:30:35+00:00" }, { "name": "symfony-cmf/routing", @@ -12086,33 +12259,96 @@ "time": "2020-10-24T10:57:07+00:00" }, { - "name": "symfony/debug", - "version": "v4.4.31", + "name": "symfony/css-selector", + "version": "v4.4.27", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0" + "url": "https://github.com/symfony/css-selector.git", + "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/43ede438d4cb52cd589ae5dc070e9323866ba8e0", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", + "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", "shasum": "" }, "require": { "php": ">=7.1.3", - "psr/log": "^1|^2|^3" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-21T12:19:41+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.31", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/43ede438d4cb52cd589ae5dc070e9323866ba8e0", + "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -13886,6 +14122,55 @@ ], "time": "2020-10-24T10:57:07+00:00" }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2020-07-13T06:12:54+00:00" + }, { "name": "twig/twig", "version": "v1.43.1", @@ -16171,83 +16456,6 @@ "source": "https://git.drupalcode.org/project/restui" } }, - { - "name": "drupal/stage_file_proxy", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://git.drupalcode.org/project/stage_file_proxy.git", - "reference": "8.x-1.1" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/stage_file_proxy-8.x-1.1.zip", - "reference": "8.x-1.1", - "shasum": "bad4d500e56f4e77adb2704ec5d4efdf52340df8" - }, - "require": { - "drupal/core": ">=8.7.7" - }, - "type": "drupal-module", - "extra": { - "drupal": { - "version": "8.x-1.1", - "datestamp": "1601040732", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" - } - }, - "drush": { - "services": { - "stage_file_proxy.drush.services.yml": "^9 || ^10" - } - } - }, - "notification-url": "https://packages.drupal.org/8/downloads", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "BarisW", - "homepage": "https://www.drupal.org/user/107229" - }, - { - "name": "geek-merlin", - "homepage": "https://www.drupal.org/user/229048" - }, - { - "name": "greggles", - "homepage": "https://www.drupal.org/user/36762" - }, - { - "name": "markdorison", - "homepage": "https://www.drupal.org/user/346106" - }, - { - "name": "moshe weitzman", - "homepage": "https://www.drupal.org/user/23" - }, - { - "name": "msonnabaum", - "homepage": "https://www.drupal.org/user/75278" - }, - { - "name": "netaustin", - "homepage": "https://www.drupal.org/user/199298" - }, - { - "name": "robwilmshurst", - "homepage": "https://www.drupal.org/user/144488" - } - ], - "description": "Provides stage_file_proxy module.", - "homepage": "https://www.drupal.org/project/stage_file_proxy", - "support": { - "source": "https://git.drupalcode.org/project/stage_file_proxy" - } - }, { "name": "drupaltest/behat-one-time-login", "version": "1.0.1", @@ -16309,20 +16517,20 @@ }, { "name": "ec-europa/qa-automation", - "version": "4.0.4", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/ec-europa/qa-automation.git", - "reference": "8707138803f0c86115cf352101f92dfbcaec7721" + "reference": "93838e643109c69eed5b5cbfce09a09a6ba71836" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/8707138803f0c86115cf352101f92dfbcaec7721", - "reference": "8707138803f0c86115cf352101f92dfbcaec7721", + "url": "https://api.github.com/repos/ec-europa/qa-automation/zipball/93838e643109c69eed5b5cbfce09a09a6ba71836", + "reference": "93838e643109c69eed5b5cbfce09a09a6ba71836", "shasum": "" }, "require": { - "openeuropa/code-review": "^1.0@beta", + "openeuropa/code-review": "^1.1.0", "phpcompatibility/php-compatibility": "^9.1" }, "require-dev": { @@ -16347,33 +16555,31 @@ "phpcs", "standards" ], - "time": "2020-02-28T08:38:08+00:00" + "time": "2020-10-20T08:22:40+00:00" }, { "name": "ec-europa/toolkit", - "version": "4.4.6", + "version": "4.4.18", "source": { "type": "git", "url": "https://github.com/ec-europa/toolkit.git", - "reference": "8a84fdc4105379629fdb09c71ca348bf5c543abe" + "reference": "06b6b9c3f1d8acce340a767c0cdb0b54b89246d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/8a84fdc4105379629fdb09c71ca348bf5c543abe", - "reference": "8a84fdc4105379629fdb09c71ca348bf5c543abe", + "url": "https://api.github.com/repos/ec-europa/toolkit/zipball/06b6b9c3f1d8acce340a767c0cdb0b54b89246d3", + "reference": "06b6b9c3f1d8acce340a767c0cdb0b54b89246d3", "shasum": "" }, "require": { "cweagans/composer-patches": "^1.4", "drush/drush": "^9.7.1 || ^10.0.0", - "ec-europa/qa-automation": "^4.0.0", + "ec-europa/qa-automation": "^4.2", "ext-json": "*", "guzzlehttp/guzzle": "^6.3", "openeuropa/task-runner": "^1.0.0-beta6", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "~6.0" + "php": "^7.1", + "phpunit/phpunit": "^6.0 || ^7.5 || ^9.5" }, "suggest": { "drupal/console": "The Drupal CLI, tool to generate boilerplate code, interact with and debug Drupal." @@ -16394,7 +16600,7 @@ ], "description": "Toolkit packaged for Drupal 8.", "homepage": "https://github.com/ec-europa/toolkit", - "time": "2021-05-26T22:33:38+00:00" + "time": "2021-09-07T21:53:38+00:00" }, { "name": "fabpot/goutte", @@ -16451,6 +16657,76 @@ ], "time": "2020-11-01T09:30:18+00:00" }, + { + "name": "foxy/foxy", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/fxpio/foxy.git", + "reference": "f9b17ec6701413a17358af21f47a35f2dc690616" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fxpio/foxy/zipball/f9b17ec6701413a17358af21f47a35f2dc690616", + "reference": "f9b17ec6701413a17358af21f47a35f2dc690616", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1|^2.0", + "php": ">=5.3.3" + }, + "require-dev": { + "composer/composer": "^1.5.0|^2.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Foxy\\Foxy", + "branch-alias": { + "dev-1.1": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Foxy\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Pluchino", + "email": "francois.pluchino@gmail.com" + } + ], + "description": "Fast, reliable, and secure NPM/Yarn bridge for Composer", + "homepage": "https://github.com/fxpio/foxy", + "keywords": [ + "Bridge", + "asset", + "composer", + "dependency manager", + "nodejs", + "npm", + "package", + "yarn" + ], + "funding": [ + { + "url": "https://paypal.me/francoispluchino", + "type": "custom" + }, + { + "url": "https://github.com/francoispluchino", + "type": "github" + } + ], + "time": "2021-08-09T16:18:51+00:00" + }, { "name": "friends-of-behat/service-container-extension", "version": "v1.0.1", @@ -17023,88 +17299,6 @@ "homepage": "http://vfs.bovigo.org/", "time": "2021-09-25T08:05:01+00:00" }, - { - "name": "monolog/monolog", - "version": "1.26.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c6b00f05152ae2c9b04a448f99c7590beb6042f5", - "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpstan/phpstan": "^0.12.59", - "phpunit/phpunit": "~4.5", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2021-05-28T08:32:12+00:00" - }, { "name": "mtdowling/jmespath.php", "version": "2.6.1", @@ -17401,21 +17595,22 @@ }, { "name": "openeuropa/code-review", - "version": "1.0.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/openeuropa/code-review.git", - "reference": "99802c32dcecb0939d90d9f5c0c1d0e4fbef7b19" + "reference": "89e90d3016b4bfded98c15052628ecf7dcb1d50e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openeuropa/code-review/zipball/99802c32dcecb0939d90d9f5c0c1d0e4fbef7b19", - "reference": "99802c32dcecb0939d90d9f5c0c1d0e4fbef7b19", + "url": "https://api.github.com/repos/openeuropa/code-review/zipball/89e90d3016b4bfded98c15052628ecf7dcb1d50e", + "reference": "89e90d3016b4bfded98c15052628ecf7dcb1d50e", "shasum": "" }, "require": { "cweagans/composer-patches": "^1.0", - "drupal/coder": "^8.3.2", + "drupal/coder": "^8.3.4", + "php": ">=7.2", "phpmd/phpmd": "^2.6", "phpro/grumphp": "^0.15.2", "squizlabs/php_codesniffer": "^3.5" @@ -17438,7 +17633,7 @@ "EUPL-1.2" ], "description": "OpenEuropa code review component.", - "time": "2019-10-16T13:52:28+00:00" + "time": "2020-09-02T14:39:16+00:00" }, { "name": "openeuropa/composer-artifacts", @@ -17486,16 +17681,16 @@ }, { "name": "openeuropa/task-runner", - "version": "dev-php-7.1", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/pfrenssen/task-runner.git", - "reference": "ec9791bc4426d4ab76a44aeb08dbcb353efb854d" + "url": "https://github.com/openeuropa/task-runner.git", + "reference": "f7d91155e9f84be4aa46af0343fa3d8b97aa9140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pfrenssen/task-runner/zipball/ec9791bc4426d4ab76a44aeb08dbcb353efb854d", - "reference": "ec9791bc4426d4ab76a44aeb08dbcb353efb854d", + "url": "https://api.github.com/repos/openeuropa/task-runner/zipball/f7d91155e9f84be4aa46af0343fa3d8b97aa9140", + "reference": "f7d91155e9f84be4aa46af0343fa3d8b97aa9140", "shasum": "" }, "require": { @@ -17503,7 +17698,7 @@ "gitonomy/gitlib": "^1.0", "jakeasmith/http_build_url": "^1.0.1", "nuvoleweb/robo-config": "^0.2.1", - "php": ">=7.1", + "php": ">=7.2", "symfony/console": "^3.4.21|^4|^5" }, "require-dev": { @@ -17524,26 +17719,18 @@ "OpenEuropa\\TaskRunner\\": "./src/" } }, - "autoload-dev": { - "psr-4": { - "OpenEuropa\\TaskRunner\\Tests\\": "./tests/", - "My\\Custom\\": "./tests/custom/src/" - } - }, + "notification-url": "https://packagist.org/downloads/", "license": [ "EUPL-1.2" ], "description": "PHP task runner based on Robo, focused on extensibility.", "keywords": [ - "Robo", "automation", + "robo", "task-runner", "yaml" ], - "support": { - "source": "https://github.com/pfrenssen/task-runner/tree/php-7.1" - }, - "time": "2021-09-10T10:44:20+00:00" + "time": "2021-09-14T08:26:33+00:00" }, { "name": "pdepend/pdepend", @@ -20180,69 +20367,6 @@ ], "time": "2021-08-04T20:31:23+00:00" }, - { - "name": "symfony/css-selector", - "version": "v4.4.27", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", - "reference": "5194f18bd80d106f11efa8f7cd0fbdcc3af96ce6", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Converts CSS selectors to XPath expressions", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-21T12:19:41+00:00" - }, { "name": "symfony/dom-crawler", "version": "v4.4.30", @@ -20776,7 +20900,7 @@ { "alias": "1.0.0-beta7", "alias_normalized": "1.0.0.0-beta7", - "version": "dev-php-7.1", + "version": "9999999-dev", "package": "openeuropa/task-runner" } ], @@ -20808,7 +20932,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=7.1.0", + "php": ">=7.4", "ext-dom": "*", "ext-json": "*", "ext-pdo": "*" @@ -20818,7 +20942,7 @@ "ext-libxml": "*" }, "platform-overrides": { - "php": "7.1.9" + "php": "7.4.0" }, "plugin-api-version": "1.1.0" } diff --git a/config/sync/config_ignore.settings.yml b/config/sync/config_ignore.settings.yml index 34854f9da5..860f046cc3 100644 --- a/config/sync/config_ignore.settings.yml +++ b/config/sync/config_ignore.settings.yml @@ -2,4 +2,3 @@ ignored_config_entities: - cas_mock_server.settings - core.menu.static_menu_link_overrides - joinup_core.outdated_content_threshold - - stage_file_proxy.settings diff --git a/config/sync/core.entity_view_display.node.custom_page.search_result.yml b/config/sync/core.entity_view_display.node.custom_page.search_result.yml new file mode 100644 index 0000000000..589c50d1e8 --- /dev/null +++ b/config/sync/core.entity_view_display.node.custom_page.search_result.yml @@ -0,0 +1,65 @@ +uuid: 409cad3f-c09b-448d-bd33-d8a3260575fe +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.custom_page.field_attachment + - field.field.node.custom_page.field_custom_page_logo + - field.field.node.custom_page.field_paragraphs_body + - field.field.node.custom_page.og_audience + - node.type.custom_page + module: + - field_group + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_attachment: + children: + - field_attachment + parent_name: '' + weight: 7 + format_type: html_element + format_settings: + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + id: '' + classes: '' + label: Attachments + region: hidden + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: ZZ0APhON-5FpA-vKXTwx_A1Bz6FHZzw2XG7t7MvvXO8 +id: node.custom_page.search_result +targetEntityType: node +bundle: custom_page +mode: search_result +content: + published_at: + type: timestamp + weight: 0 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_custom_page_logo: true + field_paragraphs_body: true + langcode: true + links: true + og_audience: true + report: true diff --git a/config/sync/core.entity_view_display.node.custom_page.search_result_featured.yml b/config/sync/core.entity_view_display.node.custom_page.search_result_featured.yml new file mode 100644 index 0000000000..0eb1f85d6a --- /dev/null +++ b/config/sync/core.entity_view_display.node.custom_page.search_result_featured.yml @@ -0,0 +1,65 @@ +uuid: 66e9838b-b5d0-4b87-803a-f160e38ff00f +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.custom_page.field_attachment + - field.field.node.custom_page.field_custom_page_logo + - field.field.node.custom_page.field_paragraphs_body + - field.field.node.custom_page.og_audience + - node.type.custom_page + module: + - field_group + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_attachment: + children: + - field_attachment + parent_name: '' + weight: 7 + format_type: html_element + format_settings: + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + id: '' + classes: '' + label: Attachments + region: hidden + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: ZZ0APhON-5FpA-vKXTwx_A1Bz6FHZzw2XG7t7MvvXO8 +id: node.custom_page.search_result_featured +targetEntityType: node +bundle: custom_page +mode: search_result_featured +content: + published_at: + type: timestamp + weight: 0 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_custom_page_logo: true + field_paragraphs_body: true + langcode: true + links: true + og_audience: true + report: true diff --git a/config/sync/core.entity_view_display.node.discussion.search_result.yml b/config/sync/core.entity_view_display.node.discussion.search_result.yml new file mode 100644 index 0000000000..57718bee0e --- /dev/null +++ b/config/sync/core.entity_view_display.node.discussion.search_result.yml @@ -0,0 +1,79 @@ +uuid: 6cf146cb-68d3-4b38-9505-c9f01556f070 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.discussion.body + - field.field.node.discussion.field_attachment + - field.field.node.discussion.field_keywords + - field.field.node.discussion.field_replies + - field.field.node.discussion.field_shared_in + - field.field.node.discussion.field_site_featured + - field.field.node.discussion.field_state + - field.field.node.discussion.field_topic + - field.field.node.discussion.og_audience + - node.type.discussion + module: + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: MH5IsqzkjyHQwMAIhBMkvdrrpJeonD3UC7kQpOvXJX0 +id: node.discussion.search_result +targetEntityType: node +bundle: discussion +mode: search_result +content: + body: + weight: 1 + label: hidden + settings: + trim_length: 300 + third_party_settings: + template_suggestion: + template_suggestion: '' + type: joinup_html_stripper_stripped + region: content + field_topic: + weight: 0 + label: hidden + settings: + link: true + third_party_settings: + template_suggestion: + template_suggestion: comma_separated + type: entity_reference_label + region: content + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_keywords: true + field_replies: true + field_shared_in: true + field_site_featured: true + field_state: true + flag_subscribe_discussions: true + invite_link: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml b/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml new file mode 100644 index 0000000000..9a2ead414b --- /dev/null +++ b/config/sync/core.entity_view_display.node.discussion.search_result_featured.yml @@ -0,0 +1,79 @@ +uuid: f0892f6e-34d1-4964-80a2-3b9ae1532e48 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.discussion.body + - field.field.node.discussion.field_attachment + - field.field.node.discussion.field_keywords + - field.field.node.discussion.field_replies + - field.field.node.discussion.field_shared_in + - field.field.node.discussion.field_site_featured + - field.field.node.discussion.field_state + - field.field.node.discussion.field_topic + - field.field.node.discussion.og_audience + - node.type.discussion + module: + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: MH5IsqzkjyHQwMAIhBMkvdrrpJeonD3UC7kQpOvXJX0 +id: node.discussion.search_result_featured +targetEntityType: node +bundle: discussion +mode: search_result_featured +content: + body: + weight: 1 + label: hidden + settings: + trim_length: 300 + third_party_settings: + template_suggestion: + template_suggestion: '' + type: joinup_html_stripper_stripped + region: content + field_topic: + weight: 0 + label: hidden + settings: + link: true + third_party_settings: + template_suggestion: + template_suggestion: comma_separated + type: entity_reference_label + region: content + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_keywords: true + field_replies: true + field_shared_in: true + field_site_featured: true + field_state: true + flag_subscribe_discussions: true + invite_link: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.document.search_result.yml b/config/sync/core.entity_view_display.node.document.search_result.yml new file mode 100644 index 0000000000..30280b880c --- /dev/null +++ b/config/sync/core.entity_view_display.node.document.search_result.yml @@ -0,0 +1,134 @@ +uuid: af9d6cea-aa61-417a-8373-20c224dbbeb8 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.document.body + - field.field.node.document.field_comments + - field.field.node.document.field_document_logo + - field.field.node.document.field_document_publication_date + - field.field.node.document.field_document_spatial_coverage + - field.field.node.document.field_file + - field.field.node.document.field_keywords + - field.field.node.document.field_licence + - field.field.node.document.field_shared_in + - field.field.node.document.field_short_title + - field.field.node.document.field_site_featured + - field.field.node.document.field_state + - field.field.node.document.field_topic + - field.field.node.document.field_type + - field.field.node.document.og_audience + - node.type.document + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_categorisation: + children: + - field_licence + - field_type + parent_name: '' + weight: 17 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Categorisation + region: hidden + group_attachment: + children: + - field_file + parent_name: '' + weight: 18 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Attachment + region: hidden + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: IBVftmfYLkfapLokxuyLrv1me4toJj5yidZu0ixGxQM +id: node.document.search_result +targetEntityType: node +bundle: document +mode: search_result +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 1 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 0 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_comments: true + field_document_logo: true + field_document_publication_date: true + field_document_spatial_coverage: true + field_file: true + field_keywords: true + field_licence: true + field_shared_in: true + field_short_title: true + field_site_featured: true + field_state: true + field_type: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.document.search_result_featured.yml b/config/sync/core.entity_view_display.node.document.search_result_featured.yml new file mode 100644 index 0000000000..1eae8a4f27 --- /dev/null +++ b/config/sync/core.entity_view_display.node.document.search_result_featured.yml @@ -0,0 +1,134 @@ +uuid: aa0b650c-dbbd-4188-a0ae-6da945869eb7 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.document.body + - field.field.node.document.field_comments + - field.field.node.document.field_document_logo + - field.field.node.document.field_document_publication_date + - field.field.node.document.field_document_spatial_coverage + - field.field.node.document.field_file + - field.field.node.document.field_keywords + - field.field.node.document.field_licence + - field.field.node.document.field_shared_in + - field.field.node.document.field_short_title + - field.field.node.document.field_site_featured + - field.field.node.document.field_state + - field.field.node.document.field_topic + - field.field.node.document.field_type + - field.field.node.document.og_audience + - node.type.document + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_categorisation: + children: + - field_licence + - field_type + parent_name: '' + weight: 18 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Categorisation + region: hidden + group_attachment: + children: + - field_file + parent_name: '' + weight: 19 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Attachment + region: hidden + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: IBVftmfYLkfapLokxuyLrv1me4toJj5yidZu0ixGxQM +id: node.document.search_result_featured +targetEntityType: node +bundle: document +mode: search_result_featured +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 1 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 0 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_comments: true + field_document_logo: true + field_document_publication_date: true + field_document_spatial_coverage: true + field_file: true + field_keywords: true + field_licence: true + field_shared_in: true + field_short_title: true + field_site_featured: true + field_state: true + field_type: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.event.search_result.yml b/config/sync/core.entity_view_display.node.event.search_result.yml new file mode 100644 index 0000000000..c5654559d3 --- /dev/null +++ b/config/sync/core.entity_view_display.node.event.search_result.yml @@ -0,0 +1,109 @@ +uuid: 978a5028-f962-4c23-a304-51db11556438 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.event.body + - field.field.node.event.field_attachment + - field.field.node.event.field_comments + - field.field.node.event.field_event_agenda + - field.field.node.event.field_event_contact_email + - field.field.node.event.field_event_coordinates + - field.field.node.event.field_event_date + - field.field.node.event.field_event_logo + - field.field.node.event.field_event_online_location + - field.field.node.event.field_event_spatial_coverage + - field.field.node.event.field_event_web_url + - field.field.node.event.field_keywords + - field.field.node.event.field_location + - field.field.node.event.field_organisation + - field.field.node.event.field_organisation_type + - field.field.node.event.field_scope + - field.field.node.event.field_shared_in + - field.field.node.event.field_short_title + - field.field.node.event.field_site_featured + - field.field.node.event.field_state + - field.field.node.event.field_topic + - field.field.node.event.og_audience + - node.type.event + module: + - field_delimiter + - field_formatter_range + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +id: node.event.search_result +targetEntityType: node +bundle: event +mode: search_result +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 0 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 1 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_comments: true + field_event_agenda: true + field_event_contact_email: true + field_event_coordinates: true + field_event_date: true + field_event_logo: true + field_event_online_location: true + field_event_spatial_coverage: true + field_event_web_url: true + field_keywords: true + field_location: true + field_organisation: true + field_organisation_type: true + field_scope: true + field_shared_in: true + field_short_title: true + field_site_featured: true + field_state: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.event.search_result_featured.yml b/config/sync/core.entity_view_display.node.event.search_result_featured.yml new file mode 100644 index 0000000000..719b748383 --- /dev/null +++ b/config/sync/core.entity_view_display.node.event.search_result_featured.yml @@ -0,0 +1,109 @@ +uuid: 8a8f5d51-2acd-4375-a965-bbcaa4787524 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.event.body + - field.field.node.event.field_attachment + - field.field.node.event.field_comments + - field.field.node.event.field_event_agenda + - field.field.node.event.field_event_contact_email + - field.field.node.event.field_event_coordinates + - field.field.node.event.field_event_date + - field.field.node.event.field_event_logo + - field.field.node.event.field_event_online_location + - field.field.node.event.field_event_spatial_coverage + - field.field.node.event.field_event_web_url + - field.field.node.event.field_keywords + - field.field.node.event.field_location + - field.field.node.event.field_organisation + - field.field.node.event.field_organisation_type + - field.field.node.event.field_scope + - field.field.node.event.field_shared_in + - field.field.node.event.field_short_title + - field.field.node.event.field_site_featured + - field.field.node.event.field_state + - field.field.node.event.field_topic + - field.field.node.event.og_audience + - node.type.event + module: + - field_delimiter + - field_formatter_range + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +id: node.event.search_result_featured +targetEntityType: node +bundle: event +mode: search_result_featured +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 1 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 0 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_comments: true + field_event_agenda: true + field_event_contact_email: true + field_event_coordinates: true + field_event_date: true + field_event_logo: true + field_event_online_location: true + field_event_spatial_coverage: true + field_event_web_url: true + field_keywords: true + field_location: true + field_organisation: true + field_organisation_type: true + field_scope: true + field_shared_in: true + field_short_title: true + field_site_featured: true + field_state: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.news.search_result.yml b/config/sync/core.entity_view_display.node.news.search_result.yml new file mode 100644 index 0000000000..d03ca68ec1 --- /dev/null +++ b/config/sync/core.entity_view_display.node.news.search_result.yml @@ -0,0 +1,112 @@ +uuid: b854db9b-f987-4771-91ec-b6353ceac0e4 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.news.body + - field.field.node.news.field_attachment + - field.field.node.news.field_comments + - field.field.node.news.field_keywords + - field.field.node.news.field_news_headline + - field.field.node.news.field_news_logo + - field.field.node.news.field_news_referenced_solution + - field.field.node.news.field_news_source_url + - field.field.node.news.field_news_spatial_coverage + - field.field.node.news.field_shared_in + - field.field.node.news.field_site_featured + - field.field.node.news.field_state + - field.field.node.news.field_topic + - field.field.node.news.og_audience + - node.type.news + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_references: + children: + - field_news_source_url + parent_name: '' + weight: 4 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: References + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: node.news.search_result +targetEntityType: node +bundle: news +mode: search_result +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 1 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 0 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_comments: true + field_keywords: true + field_news_headline: true + field_news_logo: true + field_news_referenced_solution: true + field_news_source_url: true + field_news_spatial_coverage: true + field_shared_in: true + field_site_featured: true + field_state: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.news.search_result_featured.yml b/config/sync/core.entity_view_display.node.news.search_result_featured.yml new file mode 100644 index 0000000000..a930a1de1c --- /dev/null +++ b/config/sync/core.entity_view_display.node.news.search_result_featured.yml @@ -0,0 +1,112 @@ +uuid: 0700c773-17bd-45e4-919c-8481934768f2 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.news.body + - field.field.node.news.field_attachment + - field.field.node.news.field_comments + - field.field.node.news.field_keywords + - field.field.node.news.field_news_headline + - field.field.node.news.field_news_logo + - field.field.node.news.field_news_referenced_solution + - field.field.node.news.field_news_source_url + - field.field.node.news.field_news_spatial_coverage + - field.field.node.news.field_shared_in + - field.field.node.news.field_site_featured + - field.field.node.news.field_state + - field.field.node.news.field_topic + - field.field.node.news.og_audience + - node.type.news + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_references: + children: + - field_news_source_url + parent_name: '' + weight: 19 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: References + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: node.news.search_result_featured +targetEntityType: node +bundle: news +mode: search_result_featured +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 1 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_topic: + type: entity_reference_label + weight: 0 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 2 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_attachment: true + field_comments: true + field_keywords: true + field_news_headline: true + field_news_logo: true + field_news_referenced_solution: true + field_news_source_url: true + field_news_spatial_coverage: true + field_shared_in: true + field_site_featured: true + field_state: true + langcode: true + links: true + og_audience: true + read_more: true + report: true + share_link: true diff --git a/config/sync/core.entity_view_display.node.tallinn_report.search_result.yml b/config/sync/core.entity_view_display.node.tallinn_report.search_result.yml new file mode 100644 index 0000000000..24178f4050 --- /dev/null +++ b/config/sync/core.entity_view_display.node.tallinn_report.search_result.yml @@ -0,0 +1,229 @@ +uuid: 640a9d19-7edc-4c57-bb05-d63baa8883da +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.tallinn_report.field_tallinn_action_1 + - field.field.node.tallinn_report.field_tallinn_action_10 + - field.field.node.tallinn_report.field_tallinn_action_11 + - field.field.node.tallinn_report.field_tallinn_action_12 + - field.field.node.tallinn_report.field_tallinn_action_13 + - field.field.node.tallinn_report.field_tallinn_action_14 + - field.field.node.tallinn_report.field_tallinn_action_15 + - field.field.node.tallinn_report.field_tallinn_action_16 + - field.field.node.tallinn_report.field_tallinn_action_17 + - field.field.node.tallinn_report.field_tallinn_action_18 + - field.field.node.tallinn_report.field_tallinn_action_19 + - field.field.node.tallinn_report.field_tallinn_action_2 + - field.field.node.tallinn_report.field_tallinn_action_20 + - field.field.node.tallinn_report.field_tallinn_action_21 + - field.field.node.tallinn_report.field_tallinn_action_22 + - field.field.node.tallinn_report.field_tallinn_action_23 + - field.field.node.tallinn_report.field_tallinn_action_24 + - field.field.node.tallinn_report.field_tallinn_action_25 + - field.field.node.tallinn_report.field_tallinn_action_3 + - field.field.node.tallinn_report.field_tallinn_action_4 + - field.field.node.tallinn_report.field_tallinn_action_5 + - field.field.node.tallinn_report.field_tallinn_action_6 + - field.field.node.tallinn_report.field_tallinn_action_7 + - field.field.node.tallinn_report.field_tallinn_action_8 + - field.field.node.tallinn_report.field_tallinn_action_9 + - field.field.node.tallinn_report.og_audience + - node.type.tallinn_report + module: + - layout_builder + - tallinn + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: qHzX86R6h5_Ts2E4exQ4benbPyNsPCmB9Z6yCmvWPys +id: node.tallinn_report.search_result +targetEntityType: node +bundle: tallinn_report +mode: search_result +content: + field_tallinn_action_1: + type: tallinn_entry + weight: 0 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_10: + type: tallinn_entry + weight: 9 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_11: + type: tallinn_entry + weight: 10 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_12: + type: tallinn_entry + weight: 11 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_13: + type: tallinn_entry + weight: 12 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_14: + type: tallinn_entry + weight: 13 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_15: + type: tallinn_entry + weight: 14 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_16: + type: tallinn_entry + weight: 15 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_17: + type: tallinn_entry + weight: 16 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_18: + type: tallinn_entry + weight: 17 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_19: + type: tallinn_entry + weight: 18 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_2: + type: tallinn_entry + weight: 1 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_20: + type: tallinn_entry + weight: 19 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_21: + type: tallinn_entry + weight: 20 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_22: + type: tallinn_entry + weight: 21 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_23: + type: tallinn_entry + weight: 22 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_24: + type: tallinn_entry + weight: 23 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_25: + type: tallinn_entry + weight: 24 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_3: + type: tallinn_entry + weight: 2 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_4: + type: tallinn_entry + weight: 3 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_5: + type: tallinn_entry + weight: 4 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_6: + type: tallinn_entry + weight: 5 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_7: + type: tallinn_entry + weight: 6 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_8: + type: tallinn_entry + weight: 7 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_9: + type: tallinn_entry + weight: 8 + region: content + label: hidden + settings: { } + third_party_settings: { } +hidden: + langcode: true + links: true + og_audience: true + published_at: true + report: true diff --git a/config/sync/core.entity_view_display.node.tallinn_report.search_result_featured.yml b/config/sync/core.entity_view_display.node.tallinn_report.search_result_featured.yml new file mode 100644 index 0000000000..59d0373c6b --- /dev/null +++ b/config/sync/core.entity_view_display.node.tallinn_report.search_result_featured.yml @@ -0,0 +1,229 @@ +uuid: 77845680-28a5-4c1f-8762-611f045f80db +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.tallinn_report.field_tallinn_action_1 + - field.field.node.tallinn_report.field_tallinn_action_10 + - field.field.node.tallinn_report.field_tallinn_action_11 + - field.field.node.tallinn_report.field_tallinn_action_12 + - field.field.node.tallinn_report.field_tallinn_action_13 + - field.field.node.tallinn_report.field_tallinn_action_14 + - field.field.node.tallinn_report.field_tallinn_action_15 + - field.field.node.tallinn_report.field_tallinn_action_16 + - field.field.node.tallinn_report.field_tallinn_action_17 + - field.field.node.tallinn_report.field_tallinn_action_18 + - field.field.node.tallinn_report.field_tallinn_action_19 + - field.field.node.tallinn_report.field_tallinn_action_2 + - field.field.node.tallinn_report.field_tallinn_action_20 + - field.field.node.tallinn_report.field_tallinn_action_21 + - field.field.node.tallinn_report.field_tallinn_action_22 + - field.field.node.tallinn_report.field_tallinn_action_23 + - field.field.node.tallinn_report.field_tallinn_action_24 + - field.field.node.tallinn_report.field_tallinn_action_25 + - field.field.node.tallinn_report.field_tallinn_action_3 + - field.field.node.tallinn_report.field_tallinn_action_4 + - field.field.node.tallinn_report.field_tallinn_action_5 + - field.field.node.tallinn_report.field_tallinn_action_6 + - field.field.node.tallinn_report.field_tallinn_action_7 + - field.field.node.tallinn_report.field_tallinn_action_8 + - field.field.node.tallinn_report.field_tallinn_action_9 + - field.field.node.tallinn_report.og_audience + - node.type.tallinn_report + module: + - layout_builder + - tallinn + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: qHzX86R6h5_Ts2E4exQ4benbPyNsPCmB9Z6yCmvWPys +id: node.tallinn_report.search_result_featured +targetEntityType: node +bundle: tallinn_report +mode: search_result_featured +content: + field_tallinn_action_1: + type: tallinn_entry + weight: 0 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_10: + type: tallinn_entry + weight: 9 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_11: + type: tallinn_entry + weight: 10 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_12: + type: tallinn_entry + weight: 11 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_13: + type: tallinn_entry + weight: 12 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_14: + type: tallinn_entry + weight: 13 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_15: + type: tallinn_entry + weight: 14 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_16: + type: tallinn_entry + weight: 15 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_17: + type: tallinn_entry + weight: 16 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_18: + type: tallinn_entry + weight: 17 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_19: + type: tallinn_entry + weight: 18 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_2: + type: tallinn_entry + weight: 1 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_20: + type: tallinn_entry + weight: 19 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_21: + type: tallinn_entry + weight: 20 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_22: + type: tallinn_entry + weight: 21 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_23: + type: tallinn_entry + weight: 22 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_24: + type: tallinn_entry + weight: 23 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_25: + type: tallinn_entry + weight: 24 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_3: + type: tallinn_entry + weight: 2 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_4: + type: tallinn_entry + weight: 3 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_5: + type: tallinn_entry + weight: 4 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_6: + type: tallinn_entry + weight: 5 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_7: + type: tallinn_entry + weight: 6 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_8: + type: tallinn_entry + weight: 7 + region: content + label: hidden + settings: { } + third_party_settings: { } + field_tallinn_action_9: + type: tallinn_entry + weight: 8 + region: content + label: hidden + settings: { } + third_party_settings: { } +hidden: + langcode: true + links: true + og_audience: true + published_at: true + report: true diff --git a/config/sync/core.entity_view_display.node.video.search_result.yml b/config/sync/core.entity_view_display.node.video.search_result.yml new file mode 100644 index 0000000000..ce59290d45 --- /dev/null +++ b/config/sync/core.entity_view_display.node.video.search_result.yml @@ -0,0 +1,60 @@ +uuid: 313de807-9cb4-4a04-8026-b6a2b841797b +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result + - field.field.node.video.body + - field.field.node.video.field_comments + - field.field.node.video.field_keywords + - field.field.node.video.field_video + - field.field.node.video.field_video_spatial_coverage + - field.field.node.video.og_audience + - node.type.video + module: + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: xzNt7hZhWznm3WI85j5QUiqV3UiicNTPcB6Y0nm5icM +id: node.video.search_result +targetEntityType: node +bundle: video +mode: search_result +content: + body: + type: joinup_html_stripper_stripped + weight: 0 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + published_at: + type: timestamp + weight: 1 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_comments: true + field_keywords: true + field_video: true + field_video_spatial_coverage: true + langcode: true + links: true + og_audience: true + report: true diff --git a/config/sync/core.entity_view_display.node.video.search_result_featured.yml b/config/sync/core.entity_view_display.node.video.search_result_featured.yml new file mode 100644 index 0000000000..b7a9ba8b2a --- /dev/null +++ b/config/sync/core.entity_view_display.node.video.search_result_featured.yml @@ -0,0 +1,60 @@ +uuid: cc963e5d-8fa4-4a6e-a070-68340ed90544 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.search_result_featured + - field.field.node.video.body + - field.field.node.video.field_comments + - field.field.node.video.field_keywords + - field.field.node.video.field_video + - field.field.node.video.field_video_spatial_coverage + - field.field.node.video.og_audience + - node.type.video + module: + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: xzNt7hZhWznm3WI85j5QUiqV3UiicNTPcB6Y0nm5icM +id: node.video.search_result_featured +targetEntityType: node +bundle: video +mode: search_result_featured +content: + body: + label: hidden + type: joinup_html_stripper_stripped + weight: 0 + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + published_at: + type: timestamp + weight: 1 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_comments: true + field_keywords: true + field_video: true + field_video_spatial_coverage: true + langcode: true + links: true + og_audience: true + report: true diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml new file mode 100644 index 0000000000..1154726abc --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result.yml @@ -0,0 +1,143 @@ +uuid: b559f00c-9e85-48df-b706-2e6c5781f8f1 +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.asset_distribution.field_ad_access_url + - field.field.rdf_entity.asset_distribution.field_ad_description + - field.field.rdf_entity.asset_distribution.field_ad_file_size + - field.field.rdf_entity.asset_distribution.field_ad_format + - field.field.rdf_entity.asset_distribution.field_ad_gitb_compliant + - field.field.rdf_entity.asset_distribution.field_ad_licence + - field.field.rdf_entity.asset_distribution.field_ad_repr_technique + - field.field.rdf_entity.asset_distribution.field_status + - field.field.rdf_entity.asset_distribution.og_audience + - rdf_entity.rdfentity.asset_distribution + module: + - asset_distribution + - digital_size_formatter + - field_group + - layout_builder + - template_suggestion + - text + - user +third_party_settings: + field_group: + group_categorisation: + children: + - field_ad_format + - field_status + - field_ad_repr_technique + parent_name: '' + weight: 20 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Categorisation + region: content + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: yuBnsBjApVTopV3xSPFpHg406x-7OVMswqbIvjnhFlU +id: rdf_entity.asset_distribution.search_result +targetEntityType: rdf_entity +bundle: asset_distribution +mode: search_result +content: + field_ad_access_url: + type: tracked_hosted_file_download + weight: 4 + region: content + label: hidden + settings: + hosted_files_title: Download + show_remote_files: true + remote_files_title: External + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + field_ad_description: + weight: 1 + label: hidden + settings: { } + third_party_settings: + template_suggestion: + template_suggestion: '' + type: text_default + region: content + field_ad_file_size: + type: digital_size + weight: 3 + label: hidden + settings: { } + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content + field_ad_format: + type: entity_reference_label + weight: 0 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + field_ad_licence: + weight: 2 + label: hidden + settings: + link: true + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + type: entity_reference_label + region: content + field_ad_repr_technique: + type: entity_reference_label + weight: 2 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + field_status: + type: entity_reference_label + weight: 1 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + changed: true + created: true + field_ad_creation_date: true + field_ad_gitb_compliant: true + field_ad_modification_date: true + langcode: true + og_audience: true diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml new file mode 100644 index 0000000000..acacaadd5b --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.asset_distribution.search_result_featured.yml @@ -0,0 +1,143 @@ +uuid: a4d2d32a-d63f-474c-ad84-7344062285fc +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.asset_distribution.field_ad_access_url + - field.field.rdf_entity.asset_distribution.field_ad_description + - field.field.rdf_entity.asset_distribution.field_ad_file_size + - field.field.rdf_entity.asset_distribution.field_ad_format + - field.field.rdf_entity.asset_distribution.field_ad_gitb_compliant + - field.field.rdf_entity.asset_distribution.field_ad_licence + - field.field.rdf_entity.asset_distribution.field_ad_repr_technique + - field.field.rdf_entity.asset_distribution.field_status + - field.field.rdf_entity.asset_distribution.og_audience + - rdf_entity.rdfentity.asset_distribution + module: + - asset_distribution + - digital_size_formatter + - field_group + - layout_builder + - template_suggestion + - text + - user +third_party_settings: + field_group: + group_categorisation: + children: + - field_ad_format + - field_status + - field_ad_repr_technique + parent_name: '' + weight: 20 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: true + label_element: h3 + attributes: '' + effect: none + speed: fast + label: Categorisation + region: content + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: yuBnsBjApVTopV3xSPFpHg406x-7OVMswqbIvjnhFlU +id: rdf_entity.asset_distribution.search_result_featured +targetEntityType: rdf_entity +bundle: asset_distribution +mode: search_result_featured +content: + field_ad_access_url: + type: tracked_hosted_file_download + weight: 4 + region: content + label: hidden + settings: + hosted_files_title: Download + show_remote_files: true + remote_files_title: External + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + field_ad_description: + weight: 1 + label: hidden + settings: { } + third_party_settings: + template_suggestion: + template_suggestion: '' + type: text_default + region: content + field_ad_file_size: + type: digital_size + weight: 3 + label: hidden + settings: { } + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content + field_ad_format: + type: entity_reference_label + weight: 0 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + field_ad_licence: + weight: 2 + label: hidden + settings: + link: true + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + type: entity_reference_label + region: content + field_ad_repr_technique: + type: entity_reference_label + weight: 2 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + field_status: + type: entity_reference_label + weight: 1 + region: content + label: above + settings: + link: false + third_party_settings: + template_suggestion: + template_suggestion: fieldset + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + changed: true + created: true + field_ad_creation_date: true + field_ad_gitb_compliant: true + field_ad_modification_date: true + langcode: true + og_audience: true diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result.yml new file mode 100644 index 0000000000..8c98a75500 --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result.yml @@ -0,0 +1,250 @@ +uuid: f19af437-7256-4ffe-afee-4eea0a777582 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.asset_release.field_isr_banner + - field.field.rdf_entity.asset_release.field_isr_contact_information + - field.field.rdf_entity.asset_release.field_isr_description + - field.field.rdf_entity.asset_release.field_isr_distribution + - field.field.rdf_entity.asset_release.field_isr_documentation + - field.field.rdf_entity.asset_release.field_isr_included_asset + - field.field.rdf_entity.asset_release.field_isr_is_version_of + - field.field.rdf_entity.asset_release.field_isr_language + - field.field.rdf_entity.asset_release.field_isr_logo + - field.field.rdf_entity.asset_release.field_isr_owner + - field.field.rdf_entity.asset_release.field_isr_related_solutions + - field.field.rdf_entity.asset_release.field_isr_release_notes + - field.field.rdf_entity.asset_release.field_isr_release_number + - field.field.rdf_entity.asset_release.field_isr_solution_type + - field.field.rdf_entity.asset_release.field_isr_state + - field.field.rdf_entity.asset_release.field_isr_translation + - field.field.rdf_entity.asset_release.field_keywords + - field.field.rdf_entity.asset_release.field_spatial_coverage + - field.field.rdf_entity.asset_release.field_status + - field.field.rdf_entity.asset_release.field_topic + - rdf_entity.rdfentity.asset_release + module: + - field_delimiter + - field_formatter_range + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: 6TU2yaRx-8gnBAe_fj82W97jbt8PB3XYR3iKr6p9KS0 +id: rdf_entity.asset_release.search_result +targetEntityType: rdf_entity +bundle: asset_release +mode: search_result +content: + changed: + type: timestamp + weight: 4 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + created: + weight: 3 + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + type: timestamp + region: content + field_isr_affiliations_requests: + weight: 22 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_asset_release_category: + weight: 3 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_asset_release_type: + weight: 4 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_issue_tracker: + weight: 19 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_landing_page: + weight: 17 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_metrics_page: + weight: 18 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_moderation: + weight: 14 + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + type: boolean + region: content + field_isr_related_asset_releases: + weight: 2 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_release_notes: + type: joinup_html_stripper_stripped + weight: 2 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + field_isr_source_code_repository: + weight: 21 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_webdav_creation: + weight: 15 + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + type: boolean + region: content + field_isr_webdav_url: + weight: 16 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_wiki: + weight: 20 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_topic: + type: entity_reference_label + weight: 1 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + field_isr_banner: true + field_isr_contact_information: true + field_isr_description: true + field_isr_distribution: true + field_isr_documentation: true + field_isr_included_asset: true + field_isr_is_version_of: true + field_isr_language: true + field_isr_logo: true + field_isr_owner: true + field_isr_related_solutions: true + field_isr_release_number: true + field_isr_solution_type: true + field_isr_state: true + field_isr_translation: true + field_keywords: true + field_spatial_coverage: true + field_status: true + langcode: true + og_audience: true diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result_featured.yml new file mode 100644 index 0000000000..f405f5966c --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.search_result_featured.yml @@ -0,0 +1,250 @@ +uuid: 9e456b2c-778a-4123-995b-07ba93acbeb6 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.asset_release.field_isr_banner + - field.field.rdf_entity.asset_release.field_isr_contact_information + - field.field.rdf_entity.asset_release.field_isr_description + - field.field.rdf_entity.asset_release.field_isr_distribution + - field.field.rdf_entity.asset_release.field_isr_documentation + - field.field.rdf_entity.asset_release.field_isr_included_asset + - field.field.rdf_entity.asset_release.field_isr_is_version_of + - field.field.rdf_entity.asset_release.field_isr_language + - field.field.rdf_entity.asset_release.field_isr_logo + - field.field.rdf_entity.asset_release.field_isr_owner + - field.field.rdf_entity.asset_release.field_isr_related_solutions + - field.field.rdf_entity.asset_release.field_isr_release_notes + - field.field.rdf_entity.asset_release.field_isr_release_number + - field.field.rdf_entity.asset_release.field_isr_solution_type + - field.field.rdf_entity.asset_release.field_isr_state + - field.field.rdf_entity.asset_release.field_isr_translation + - field.field.rdf_entity.asset_release.field_keywords + - field.field.rdf_entity.asset_release.field_spatial_coverage + - field.field.rdf_entity.asset_release.field_status + - field.field.rdf_entity.asset_release.field_topic + - rdf_entity.rdfentity.asset_release + module: + - field_delimiter + - field_formatter_range + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: 6TU2yaRx-8gnBAe_fj82W97jbt8PB3XYR3iKr6p9KS0 +id: rdf_entity.asset_release.search_result_featured +targetEntityType: rdf_entity +bundle: asset_release +mode: search_result_featured +content: + changed: + type: timestamp + weight: 3 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + created: + weight: 2 + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + type: timestamp + region: content + field_isr_affiliations_requests: + weight: 22 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_asset_release_category: + weight: 3 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_asset_release_type: + weight: 4 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_issue_tracker: + weight: 19 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_landing_page: + weight: 17 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_metrics_page: + weight: 18 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_moderation: + weight: 14 + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + type: boolean + region: content + field_isr_related_asset_releases: + weight: 2 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: content + field_isr_release_notes: + type: joinup_html_stripper_stripped + weight: 1 + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + region: content + field_isr_source_code_repository: + weight: 21 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_webdav_creation: + weight: 15 + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } + type: boolean + region: content + field_isr_webdav_url: + weight: 16 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_isr_wiki: + weight: 20 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: content + field_topic: + type: entity_reference_label + weight: 4 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + field_isr_banner: true + field_isr_contact_information: true + field_isr_description: true + field_isr_distribution: true + field_isr_documentation: true + field_isr_included_asset: true + field_isr_is_version_of: true + field_isr_language: true + field_isr_logo: true + field_isr_owner: true + field_isr_related_solutions: true + field_isr_release_number: true + field_isr_solution_type: true + field_isr_state: true + field_isr_translation: true + field_keywords: true + field_spatial_coverage: true + field_status: true + langcode: true + og_audience: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml new file mode 100644 index 0000000000..1042a9a959 --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.collection.search_result.yml @@ -0,0 +1,147 @@ +uuid: f29f4415-c9b6-4ede-9d39-a71f32642953 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.collection.field_ar_abstract + - field.field.rdf_entity.collection.field_ar_access_url + - field.field.rdf_entity.collection.field_ar_affiliates + - field.field.rdf_entity.collection.field_ar_banner + - field.field.rdf_entity.collection.field_ar_closed + - field.field.rdf_entity.collection.field_ar_contact_information + - field.field.rdf_entity.collection.field_ar_content_creation + - field.field.rdf_entity.collection.field_ar_description + - field.field.rdf_entity.collection.field_ar_logo + - field.field.rdf_entity.collection.field_ar_moderation + - field.field.rdf_entity.collection.field_ar_owner + - field.field.rdf_entity.collection.field_ar_state + - field.field.rdf_entity.collection.field_collection_content + - field.field.rdf_entity.collection.field_keywords + - field.field.rdf_entity.collection.field_newsletter + - field.field.rdf_entity.collection.field_short_id + - field.field.rdf_entity.collection.field_site_featured + - field.field.rdf_entity.collection.field_spatial_coverage + - field.field.rdf_entity.collection.field_topic + - rdf_entity.rdfentity.collection + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_abstract_wrapper: + children: + - field_ar_abstract + - read_more + parent_name: '' + weight: 29 + format_type: html_element + format_settings: + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + id: '' + classes: '' + label: 'Abstract wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.collection.search_result +targetEntityType: rdf_entity +bundle: collection +mode: search_result +content: + created: + type: timestamp + weight: 3 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + field_ar_description: + type: joinup_html_stripper_stripped + weight: 2 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + field_topic: + type: entity_reference_label + weight: 1 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: { } + region: content + last_update: + type: timestamp + weight: 4 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + changed: true + field_ar_abstract: true + field_ar_access_url: true + field_ar_affiliates: true + field_ar_banner: true + field_ar_closed: true + field_ar_contact_information: true + field_ar_content_creation: true + field_ar_logo: true + field_ar_moderation: true + field_ar_owner: true + field_ar_state: true + field_collection_content: true + field_keywords: true + field_newsletter: true + field_short_id: true + field_site_featured: true + field_spatial_coverage: true + join_collection: true + langcode: true + members: true + og_group: true + rdf_entity_field_collection_content_inline_facets: true + rdf_entity_field_collection_content_top: true + read_more: true + solutions: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml new file mode 100644 index 0000000000..4a3ad0582c --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.collection.search_result_featured.yml @@ -0,0 +1,147 @@ +uuid: 63f0dc10-0b09-4b00-be06-924a046e6813 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.collection.field_ar_abstract + - field.field.rdf_entity.collection.field_ar_access_url + - field.field.rdf_entity.collection.field_ar_affiliates + - field.field.rdf_entity.collection.field_ar_banner + - field.field.rdf_entity.collection.field_ar_closed + - field.field.rdf_entity.collection.field_ar_contact_information + - field.field.rdf_entity.collection.field_ar_content_creation + - field.field.rdf_entity.collection.field_ar_description + - field.field.rdf_entity.collection.field_ar_logo + - field.field.rdf_entity.collection.field_ar_moderation + - field.field.rdf_entity.collection.field_ar_owner + - field.field.rdf_entity.collection.field_ar_state + - field.field.rdf_entity.collection.field_collection_content + - field.field.rdf_entity.collection.field_keywords + - field.field.rdf_entity.collection.field_newsletter + - field.field.rdf_entity.collection.field_short_id + - field.field.rdf_entity.collection.field_site_featured + - field.field.rdf_entity.collection.field_spatial_coverage + - field.field.rdf_entity.collection.field_topic + - rdf_entity.rdfentity.collection + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_abstract_wrapper: + children: + - field_ar_abstract + - read_more + parent_name: '' + weight: 29 + format_type: html_element + format_settings: + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + id: '' + classes: '' + label: 'Abstract wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.collection.search_result_featured +targetEntityType: rdf_entity +bundle: collection +mode: search_result_featured +content: + created: + type: timestamp + weight: 3 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + field_ar_description: + type: joinup_html_stripper_stripped + weight: 1 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + field_topic: + type: entity_reference_label + weight: 2 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: { } + region: content + last_update: + type: timestamp + weight: 4 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + changed: true + field_ar_abstract: true + field_ar_access_url: true + field_ar_affiliates: true + field_ar_banner: true + field_ar_closed: true + field_ar_contact_information: true + field_ar_content_creation: true + field_ar_logo: true + field_ar_moderation: true + field_ar_owner: true + field_ar_state: true + field_collection_content: true + field_keywords: true + field_newsletter: true + field_short_id: true + field_site_featured: true + field_spatial_coverage: true + join_collection: true + langcode: true + members: true + og_group: true + rdf_entity_field_collection_content_inline_facets: true + rdf_entity_field_collection_content_top: true + read_more: true + solutions: true diff --git a/config/sync/core.entity_view_display.rdf_entity.licence.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.licence.search_result.yml new file mode 100644 index 0000000000..ad07e9b89b --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.licence.search_result.yml @@ -0,0 +1,82 @@ +uuid: f62cae77-099c-4972-8482-88f5529271dd +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.licence.field_licence_deprecated + - field.field.rdf_entity.licence.field_licence_description + - field.field.rdf_entity.licence.field_licence_legal_type + - field.field.rdf_entity.licence.field_licence_spdx_licence + - field.field.rdf_entity.licence.field_licence_type + - rdf_entity.rdfentity.licence + module: + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_licence_wrapper: + children: + - field_licence_legal_type + - field_licence_spdx_licence + - spdx_licence_id + - spdx_licence_text + - spdx_see_also + parent_name: '' + weight: 3 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + label: 'Licence wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.licence.search_result +targetEntityType: rdf_entity +bundle: licence +mode: search_result +content: + field_licence_description: + weight: 1 + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + type: joinup_html_stripper_stripped + region: content + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + changed: true + created: true + field_licence_deprecated: true + field_licence_legal_type: true + field_licence_spdx_licence: true + field_licence_type: true + langcode: true + spdx_licence_external_url: true + spdx_licence_id: true + spdx_licence_label: true + spdx_licence_text: true + spdx_see_also: true diff --git a/config/sync/core.entity_view_display.rdf_entity.licence.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.licence.search_result_featured.yml new file mode 100644 index 0000000000..d178049791 --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.licence.search_result_featured.yml @@ -0,0 +1,81 @@ +uuid: dc60cf69-d0ba-4338-a769-3fb41d3a11f2 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.licence.field_licence_deprecated + - field.field.rdf_entity.licence.field_licence_description + - field.field.rdf_entity.licence.field_licence_legal_type + - field.field.rdf_entity.licence.field_licence_spdx_licence + - field.field.rdf_entity.licence.field_licence_type + - rdf_entity.rdfentity.licence + module: + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_licence_wrapper: + children: + - field_licence_spdx_licence + - spdx_licence_id + - spdx_licence_text + - spdx_see_also + parent_name: '' + weight: 5 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + label: 'Licence wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.licence.search_result_featured +targetEntityType: rdf_entity +bundle: licence +mode: search_result_featured +content: + field_licence_description: + weight: 1 + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + type: joinup_html_stripper_stripped + region: content + label: + label: hidden + type: string + weight: 0 + settings: + link_to_entity: false + third_party_settings: + template_suggestion: + template_suggestion: no_wrappers + region: content +hidden: + changed: true + created: true + field_licence_deprecated: true + field_licence_legal_type: true + field_licence_spdx_licence: true + field_licence_type: true + langcode: true + spdx_licence_external_url: true + spdx_licence_id: true + spdx_licence_label: true + spdx_licence_text: true + spdx_see_also: true diff --git a/config/sync/core.entity_view_display.rdf_entity.owner.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.owner.search_result.yml new file mode 100644 index 0000000000..6ef14aafac --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.owner.search_result.yml @@ -0,0 +1,53 @@ +uuid: 612fb333-bd46-4977-b59e-27623a73de19 +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.owner.field_owner_name + - field.field.rdf_entity.owner.field_owner_state + - field.field.rdf_entity.owner.field_owner_type + - rdf_entity.rdfentity.owner + module: + - layout_builder + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: fy6D0LYYE1mq9NgSVFKTRIYDMwjQ32cfT4cIshjpOcA +id: rdf_entity.owner.search_result +targetEntityType: rdf_entity +bundle: owner +mode: search_result +content: + field_owner_name: + type: string + weight: 1 + region: content + label: above + settings: + link_to_entity: false + third_party_settings: { } + field_owner_type: + type: entity_reference_label + weight: 2 + region: content + label: above + settings: + link: true + third_party_settings: { } + label: + label: hidden + type: string + weight: 0 + region: content + settings: + link_to_entity: false + third_party_settings: { } +hidden: + changed: true + created: true + field_owner_state: true + langcode: true diff --git a/config/sync/core.entity_view_display.rdf_entity.owner.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.owner.search_result_featured.yml new file mode 100644 index 0000000000..d54aa09c8d --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.owner.search_result_featured.yml @@ -0,0 +1,53 @@ +uuid: fa0acb05-e2ef-425d-8a08-fe4e7fd43b7d +langcode: en +status: false +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.owner.field_owner_name + - field.field.rdf_entity.owner.field_owner_state + - field.field.rdf_entity.owner.field_owner_type + - rdf_entity.rdfentity.owner + module: + - layout_builder + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +_core: + default_config_hash: fy6D0LYYE1mq9NgSVFKTRIYDMwjQ32cfT4cIshjpOcA +id: rdf_entity.owner.search_result_featured +targetEntityType: rdf_entity +bundle: owner +mode: search_result_featured +content: + field_owner_name: + type: string + weight: 1 + region: content + label: above + settings: + link_to_entity: false + third_party_settings: { } + field_owner_type: + type: entity_reference_label + weight: 2 + region: content + label: above + settings: + link: true + third_party_settings: { } + label: + label: hidden + type: string + weight: 0 + region: content + settings: + link_to_entity: false + third_party_settings: { } +hidden: + changed: true + created: true + field_owner_state: true + langcode: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml b/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml new file mode 100644 index 0000000000..0ead8882c8 --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.solution.search_result.yml @@ -0,0 +1,196 @@ +uuid: 98c1faf2-ebfe-49fd-b8d7-9750814ff1f2 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result + - field.field.rdf_entity.solution.field_is_actor + - field.field.rdf_entity.solution.field_is_affiliations_requests + - field.field.rdf_entity.solution.field_is_banner + - field.field.rdf_entity.solution.field_is_business_process + - field.field.rdf_entity.solution.field_is_contact_information + - field.field.rdf_entity.solution.field_is_content + - field.field.rdf_entity.solution.field_is_content_creation + - field.field.rdf_entity.solution.field_is_description + - field.field.rdf_entity.solution.field_is_distribution + - field.field.rdf_entity.solution.field_is_documentation + - field.field.rdf_entity.solution.field_is_eif_category + - field.field.rdf_entity.solution.field_is_eif_recommendation + - field.field.rdf_entity.solution.field_is_has_version + - field.field.rdf_entity.solution.field_is_included_asset + - field.field.rdf_entity.solution.field_is_issue_tracker + - field.field.rdf_entity.solution.field_is_landing_page + - field.field.rdf_entity.solution.field_is_language + - field.field.rdf_entity.solution.field_is_logo + - field.field.rdf_entity.solution.field_is_metrics_page + - field.field.rdf_entity.solution.field_is_moderation + - field.field.rdf_entity.solution.field_is_owner + - field.field.rdf_entity.solution.field_is_product_type + - field.field.rdf_entity.solution.field_is_related_solutions + - field.field.rdf_entity.solution.field_is_shared_in + - field.field.rdf_entity.solution.field_is_show_eira_related + - field.field.rdf_entity.solution.field_is_solution_type + - field.field.rdf_entity.solution.field_is_source_code_repository + - field.field.rdf_entity.solution.field_is_standardization_level + - field.field.rdf_entity.solution.field_is_state + - field.field.rdf_entity.solution.field_is_test_resource_type + - field.field.rdf_entity.solution.field_is_translation + - field.field.rdf_entity.solution.field_is_version + - field.field.rdf_entity.solution.field_is_webdav_creation + - field.field.rdf_entity.solution.field_is_webdav_url + - field.field.rdf_entity.solution.field_is_wiki + - field.field.rdf_entity.solution.field_keywords + - field.field.rdf_entity.solution.field_short_id + - field.field.rdf_entity.solution.field_site_featured + - field.field.rdf_entity.solution.field_spatial_coverage + - field.field.rdf_entity.solution.field_status + - field.field.rdf_entity.solution.field_topic + - rdf_entity.rdfentity.solution + module: + - field_delimiter + - field_formatter_range + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_solution_abstract_wrapper: + children: + - label + - changed + - field_topic + - field_is_description + - field_is_content_creation + parent_name: '' + weight: 54 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + label: 'Abstract wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.solution.search_result +targetEntityType: rdf_entity +bundle: solution +mode: search_result +content: + changed: + type: timestamp + weight: 1 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + created: + type: timestamp + weight: 4 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + field_is_description: + type: joinup_html_stripper_stripped + weight: 3 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + field_topic: + type: entity_reference_label + weight: 2 + region: content + label: hidden + settings: + link: false + third_party_settings: + field_delimiter: + delimiter: '' + field_formatter_range: + order: 0 + limit: 0 + offset: 0 + template_suggestion: + template_suggestion: '' + label: + type: string + weight: 0 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } +hidden: + collections: true + download_total: true + field_is_actor: true + field_is_affiliations_requests: true + field_is_banner: true + field_is_business_process: true + field_is_contact_information: true + field_is_content: true + field_is_content_creation: true + field_is_distribution: true + field_is_documentation: true + field_is_eif_category: true + field_is_eif_recommendation: true + field_is_has_version: true + field_is_included_asset: true + field_is_issue_tracker: true + field_is_landing_page: true + field_is_language: true + field_is_logo: true + field_is_metrics_page: true + field_is_moderation: true + field_is_owner: true + field_is_product_type: true + field_is_related_solutions: true + field_is_shared_in: true + field_is_show_eira_related: true + field_is_solution_type: true + field_is_source_code_repository: true + field_is_standardization_level: true + field_is_state: true + field_is_test_resource_type: true + field_is_translation: true + field_is_version: true + field_is_webdav_creation: true + field_is_webdav_url: true + field_is_wiki: true + field_keywords: true + field_short_id: true + field_site_featured: true + field_spatial_coverage: true + field_status: true + langcode: true + og_group: true + rdf_entity_field_is_content_inline_facets: true + rdf_entity_field_is_content_top: true + read_more: true + related_solutions: true + releases_overview: true + share_link: true + solution_subscribe: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml b/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml new file mode 100644 index 0000000000..56dda2ee13 --- /dev/null +++ b/config/sync/core.entity_view_display.rdf_entity.solution.search_result_featured.yml @@ -0,0 +1,190 @@ +uuid: 253b7559-f557-4dd3-a5cd-acde2900b708 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.rdf_entity.search_result_featured + - field.field.rdf_entity.solution.field_is_actor + - field.field.rdf_entity.solution.field_is_affiliations_requests + - field.field.rdf_entity.solution.field_is_banner + - field.field.rdf_entity.solution.field_is_business_process + - field.field.rdf_entity.solution.field_is_contact_information + - field.field.rdf_entity.solution.field_is_content + - field.field.rdf_entity.solution.field_is_content_creation + - field.field.rdf_entity.solution.field_is_description + - field.field.rdf_entity.solution.field_is_distribution + - field.field.rdf_entity.solution.field_is_documentation + - field.field.rdf_entity.solution.field_is_eif_category + - field.field.rdf_entity.solution.field_is_eif_recommendation + - field.field.rdf_entity.solution.field_is_has_version + - field.field.rdf_entity.solution.field_is_included_asset + - field.field.rdf_entity.solution.field_is_issue_tracker + - field.field.rdf_entity.solution.field_is_landing_page + - field.field.rdf_entity.solution.field_is_language + - field.field.rdf_entity.solution.field_is_logo + - field.field.rdf_entity.solution.field_is_metrics_page + - field.field.rdf_entity.solution.field_is_moderation + - field.field.rdf_entity.solution.field_is_owner + - field.field.rdf_entity.solution.field_is_product_type + - field.field.rdf_entity.solution.field_is_related_solutions + - field.field.rdf_entity.solution.field_is_shared_in + - field.field.rdf_entity.solution.field_is_show_eira_related + - field.field.rdf_entity.solution.field_is_solution_type + - field.field.rdf_entity.solution.field_is_source_code_repository + - field.field.rdf_entity.solution.field_is_standardization_level + - field.field.rdf_entity.solution.field_is_state + - field.field.rdf_entity.solution.field_is_test_resource_type + - field.field.rdf_entity.solution.field_is_translation + - field.field.rdf_entity.solution.field_is_version + - field.field.rdf_entity.solution.field_is_webdav_creation + - field.field.rdf_entity.solution.field_is_webdav_url + - field.field.rdf_entity.solution.field_is_wiki + - field.field.rdf_entity.solution.field_keywords + - field.field.rdf_entity.solution.field_short_id + - field.field.rdf_entity.solution.field_site_featured + - field.field.rdf_entity.solution.field_spatial_coverage + - field.field.rdf_entity.solution.field_status + - field.field.rdf_entity.solution.field_topic + - rdf_entity.rdfentity.solution + module: + - field_group + - joinup_html_stripper + - layout_builder + - template_suggestion + - user +third_party_settings: + field_group: + group_solution_abstract_wrapper: + children: + - field_topic + - label + - field_is_description + - changed + - created + - field_is_content + - field_is_logo + - rdf_entity_field_is_content_top + - read_more + parent_name: '' + weight: 47 + format_type: html_element + format_settings: + id: '' + classes: '' + element: div + show_label: false + label_element: h3 + attributes: '' + effect: none + speed: fast + label: 'Abstract wrapper' + region: hidden + layout_builder: + allow_custom: false + enabled: false +id: rdf_entity.solution.search_result_featured +targetEntityType: rdf_entity +bundle: solution +mode: search_result_featured +content: + changed: + type: timestamp + weight: 5 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + created: + type: timestamp + weight: 6 + region: content + label: hidden + settings: + date_format: date_only + custom_date_format: '' + timezone: '' + third_party_settings: + template_suggestion: + template_suggestion: '' + field_is_description: + type: joinup_html_stripper_stripped + weight: 4 + region: content + label: hidden + settings: + trim_length: 200 + third_party_settings: + template_suggestion: + template_suggestion: '' + field_topic: + type: entity_reference_label + weight: 1 + region: content + label: hidden + settings: + link: true + third_party_settings: { } + label: + type: string + weight: 2 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } +hidden: + collections: true + download_total: true + field_is_actor: true + field_is_affiliations_requests: true + field_is_banner: true + field_is_business_process: true + field_is_contact_information: true + field_is_content: true + field_is_content_creation: true + field_is_distribution: true + field_is_documentation: true + field_is_eif_category: true + field_is_eif_recommendation: true + field_is_has_version: true + field_is_included_asset: true + field_is_issue_tracker: true + field_is_landing_page: true + field_is_language: true + field_is_logo: true + field_is_metrics_page: true + field_is_moderation: true + field_is_owner: true + field_is_product_type: true + field_is_related_solutions: true + field_is_shared_in: true + field_is_show_eira_related: true + field_is_solution_type: true + field_is_source_code_repository: true + field_is_standardization_level: true + field_is_state: true + field_is_test_resource_type: true + field_is_translation: true + field_is_version: true + field_is_webdav_creation: true + field_is_webdav_url: true + field_is_wiki: true + field_keywords: true + field_short_id: true + field_site_featured: true + field_spatial_coverage: true + field_status: true + langcode: true + og_group: true + rdf_entity_field_is_content_inline_facets: true + rdf_entity_field_is_content_top: true + read_more: true + related_solutions: true + releases_overview: true + share_link: true + solution_subscribe: true diff --git a/config/sync/core.entity_view_display.user.user.search_result.yml b/config/sync/core.entity_view_display.user.user.search_result.yml new file mode 100644 index 0000000000..1a75cad870 --- /dev/null +++ b/config/sync/core.entity_view_display.user.user.search_result.yml @@ -0,0 +1,67 @@ +uuid: 93ff535e-f1c2-45fa-878b-aeb8462e12a6 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.user.search_result + - field.field.user.user.field_last_password_reset + - field.field.user.user.field_password_expiration + - field.field.user.user.field_social_media + - field.field.user.user.field_user_business_title + - field.field.user.user.field_user_content + - field.field.user.user.field_user_family_name + - field.field.user.user.field_user_first_name + - field.field.user.user.field_user_frequency + - field.field.user.user.field_user_nationality + - field.field.user.user.field_user_organisation + - field.field.user.user.field_user_photo + - field.field.user.user.field_user_professional_domain + module: + - layout_builder + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +id: user.user.search_result +targetEntityType: user +bundle: user +mode: search_result +content: + field_user_business_title: + type: string + weight: 2 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + field_user_family_name: + type: string + weight: 0 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + field_user_first_name: + type: string + weight: 1 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } +hidden: + field_last_password_reset: true + field_password_expiration: true + field_social_media: true + field_user_content: true + field_user_frequency: true + field_user_nationality: true + field_user_organisation: true + field_user_photo: true + field_user_professional_domain: true + langcode: true + member_for: true + user_field_user_content_top: true diff --git a/config/sync/core.entity_view_display.user.user.search_result_featured.yml b/config/sync/core.entity_view_display.user.user.search_result_featured.yml new file mode 100644 index 0000000000..04b11f177b --- /dev/null +++ b/config/sync/core.entity_view_display.user.user.search_result_featured.yml @@ -0,0 +1,80 @@ +uuid: a0ed59f7-03a4-4a95-a535-8ceab98ecb8a +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.user.search_result_featured + - field.field.user.user.field_last_password_reset + - field.field.user.user.field_password_expiration + - field.field.user.user.field_social_media + - field.field.user.user.field_user_business_title + - field.field.user.user.field_user_content + - field.field.user.user.field_user_family_name + - field.field.user.user.field_user_first_name + - field.field.user.user.field_user_frequency + - field.field.user.user.field_user_nationality + - field.field.user.user.field_user_organisation + - field.field.user.user.field_user_photo + - field.field.user.user.field_user_professional_domain + - image.style.horizontal_medium_image + module: + - image + - layout_builder + - template_suggestion + - user +third_party_settings: + layout_builder: + allow_custom: false + enabled: false +id: user.user.search_result_featured +targetEntityType: user +bundle: user +mode: search_result_featured +content: + field_user_business_title: + type: string + weight: 3 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + field_user_family_name: + type: string + weight: 1 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + field_user_first_name: + type: string + weight: 2 + region: content + label: hidden + settings: + link_to_entity: false + third_party_settings: { } + field_user_photo: + type: image + weight: 0 + region: content + label: hidden + settings: + image_style: horizontal_medium_image + image_link: content + third_party_settings: + template_suggestion: + template_suggestion: '' +hidden: + field_last_password_reset: true + field_password_expiration: true + field_social_media: true + field_user_content: true + field_user_frequency: true + field_user_nationality: true + field_user_organisation: true + field_user_professional_domain: true + langcode: true + member_for: true + user_field_user_content_top: true diff --git a/config/sync/core.entity_view_mode.node.search_result.yml b/config/sync/core.entity_view_mode.node.search_result.yml index c202648896..bd610c174b 100644 --- a/config/sync/core.entity_view_mode.node.search_result.yml +++ b/config/sync/core.entity_view_mode.node.search_result.yml @@ -7,6 +7,6 @@ dependencies: _core: default_config_hash: 6GCOQ-jP2RbdbHA5YWQ6bT8CfGbqrBYKOSC_XY4E3ZM id: node.search_result -label: 'Search result highlighting input' +label: 'Search result item' targetEntityType: node cache: true diff --git a/config/sync/core.entity_view_mode.node.search_result_featured.yml b/config/sync/core.entity_view_mode.node.search_result_featured.yml new file mode 100644 index 0000000000..c1f5b1c450 --- /dev/null +++ b/config/sync/core.entity_view_mode.node.search_result_featured.yml @@ -0,0 +1,10 @@ +uuid: 421465b2-ed59-47b6-b18c-0a5717b50000 +langcode: en +status: true +dependencies: + module: + - node +id: node.search_result_featured +label: 'Search result item (featured)' +targetEntityType: node +cache: true diff --git a/config/sync/core.entity_view_mode.rdf_entity.search_result.yml b/config/sync/core.entity_view_mode.rdf_entity.search_result.yml new file mode 100644 index 0000000000..a3c921d0f7 --- /dev/null +++ b/config/sync/core.entity_view_mode.rdf_entity.search_result.yml @@ -0,0 +1,10 @@ +uuid: bd9593d3-b380-48a2-9960-6ce2b22298d8 +langcode: en +status: true +dependencies: + module: + - rdf_entity +id: rdf_entity.search_result +label: 'Search result item' +targetEntityType: rdf_entity +cache: true diff --git a/config/sync/core.entity_view_mode.rdf_entity.search_result_featured.yml b/config/sync/core.entity_view_mode.rdf_entity.search_result_featured.yml new file mode 100644 index 0000000000..d9b568b634 --- /dev/null +++ b/config/sync/core.entity_view_mode.rdf_entity.search_result_featured.yml @@ -0,0 +1,10 @@ +uuid: 41ba90be-29b7-4d40-99b9-2fb1274cc576 +langcode: en +status: true +dependencies: + module: + - rdf_entity +id: rdf_entity.search_result_featured +label: 'Search result item (featured)' +targetEntityType: rdf_entity +cache: true diff --git a/config/sync/core.entity_view_mode.user.search_result.yml b/config/sync/core.entity_view_mode.user.search_result.yml new file mode 100644 index 0000000000..5327f7ca0f --- /dev/null +++ b/config/sync/core.entity_view_mode.user.search_result.yml @@ -0,0 +1,10 @@ +uuid: 0e8564d6-4d52-408f-a111-d4963c323fcb +langcode: en +status: true +dependencies: + module: + - user +id: user.search_result +label: 'Search result item' +targetEntityType: user +cache: true diff --git a/config/sync/core.entity_view_mode.user.search_result_featured.yml b/config/sync/core.entity_view_mode.user.search_result_featured.yml new file mode 100644 index 0000000000..e690b13d2c --- /dev/null +++ b/config/sync/core.entity_view_mode.user.search_result_featured.yml @@ -0,0 +1,10 @@ +uuid: eeb7ab15-857c-4d3b-a6f7-e691fbec8306 +langcode: en +status: true +dependencies: + module: + - user +id: user.search_result_featured +label: 'Search result item (featured)' +targetEntityType: user +cache: true diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 79d3322808..1bae226cba 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -132,6 +132,7 @@ module: metatag: 0 metatag_open_graph: 0 moderation: 0 + monolog: 0 nio: 0 node: 0 oe_bootstrap_theme_helper: 0 @@ -175,6 +176,7 @@ module: schema_social_media_posting: 0 search_api: 0 search_api_arbitrary_facet: 0 + search_api_autocomplete: 0 search_api_db: 0 search_api_field: 0 search_api_solr: 0 @@ -196,7 +198,6 @@ module: state_machine_revisions: 0 subpathauto: 0 swiftmailer: 0 - syslog: 0 system: 0 tallinn: 0 taxonomy: 0 diff --git a/config/sync/field.field.message.group_content_subscription.field_group_content.yml b/config/sync/field.field.message.group_content_subscription.field_group_content.yml index 2f5813f9bd..26a518dbb0 100644 --- a/config/sync/field.field.message.group_content_subscription.field_group_content.yml +++ b/config/sync/field.field.message.group_content_subscription.field_group_content.yml @@ -275,4 +275,7 @@ settings: facets_summary: handler: 'default:facets_summary' handler_settings: { } + search_api_autocomplete_search: + handler: 'default:search_api_autocomplete_search' + handler_settings: { } field_type: dynamic_entity_reference diff --git a/config/sync/filter.format.simple_html.yml b/config/sync/filter.format.simple_html.yml index 352fd398f0..9bd332877e 100644 --- a/config/sync/filter.format.simple_html.yml +++ b/config/sync/filter.format.simple_html.yml @@ -59,17 +59,17 @@ filters: status: false weight: -42 settings: { } - filter_align: - id: filter_align + filter_html_image_secure: + id: filter_html_image_secure provider: filter - status: false - weight: -41 + status: true + weight: -47 settings: { } - filter_autop: - id: filter_autop + filter_html_escape: + id: filter_html_escape provider: filter status: false - weight: -40 + weight: -44 settings: { } filter_caption: id: filter_caption @@ -77,17 +77,17 @@ filters: status: false weight: -39 settings: { } - filter_html_escape: - id: filter_html_escape + filter_align: + id: filter_align provider: filter status: false - weight: -44 + weight: -41 settings: { } - filter_html_image_secure: - id: filter_html_image_secure + filter_autop: + id: filter_autop provider: filter - status: true - weight: -47 + status: false + weight: -40 settings: { } filter_image_style: id: filter_image_style diff --git a/config/sync/search_api.index.published.yml b/config/sync/search_api.index.published.yml index 2598a75e12..f6de82712e 100644 --- a/config/sync/search_api.index.published.yml +++ b/config/sync/search_api.index.published.yml @@ -17,42 +17,42 @@ dependencies: - custom_page - joinup_search config: + - field.storage.meta_entity.count + - field.storage.meta_entity.field_featured + - field.storage.meta_entity.field_pinned_in - field.storage.node.body + - field.storage.node.field_event_agenda + - field.storage.node.field_event_date + - field.storage.node.field_location + - field.storage.node.field_news_headline + - field.storage.node.field_organisation + - field.storage.node.field_paragraphs_body + - field.storage.node.field_scope + - field.storage.node.field_short_title + - field.storage.paragraph.field_body - field.storage.rdf_entity.field_ad_description - field.storage.rdf_entity.field_ar_abstract - field.storage.rdf_entity.field_ar_description - - field.storage.taxonomy_term.field_eif_identifier - - field.storage.taxonomy_term.field_eif_related_term - - field.storage.node.field_event_agenda - - field.storage.node.field_event_date + - field.storage.rdf_entity.field_ci_name + - field.storage.rdf_entity.field_is_contact_information - field.storage.rdf_entity.field_is_description - field.storage.rdf_entity.field_is_eif_category - field.storage.rdf_entity.field_is_eif_recommendation + - field.storage.rdf_entity.field_is_owner - field.storage.rdf_entity.field_is_solution_type + - field.storage.rdf_entity.field_isr_contact_information - field.storage.rdf_entity.field_isr_description + - field.storage.rdf_entity.field_isr_owner - field.storage.rdf_entity.field_isr_release_notes - field.storage.rdf_entity.field_licence_description - field.storage.rdf_entity.field_licence_spdx_licence - - field.storage.node.field_location - - field.storage.node.field_news_headline - - field.storage.node.field_organisation - - field.storage.node.field_scope - - field.storage.node.field_short_title + - field.storage.rdf_entity.field_owner_name + - field.storage.taxonomy_term.field_eif_identifier + - field.storage.taxonomy_term.field_eif_related_term - field.storage.user.field_user_family_name - field.storage.user.field_user_first_name - field.storage.user.field_user_organisation - - field.storage.meta_entity.count - - field.storage.rdf_entity.field_ci_name - - field.storage.rdf_entity.field_is_contact_information - - field.storage.rdf_entity.field_is_owner - - field.storage.rdf_entity.field_owner_name - - field.storage.rdf_entity.field_isr_contact_information - - field.storage.rdf_entity.field_isr_owner - - field.storage.meta_entity.field_featured - - field.storage.meta_entity.field_pinned_in - - field.storage.node.field_paragraphs_body - - field.storage.paragraph.field_body - - search_api.server.solr_published + - search_api.server.joinup third_party_settings: search_api_solr: finalize: false @@ -869,4 +869,4 @@ tracker_settings: options: index_directly: true cron_limit: 50 -server: solr_published +server: joinup diff --git a/config/sync/search_api.index.unpublished.yml b/config/sync/search_api.index.unpublished.yml index 1bf5dafcbb..fc78d68c23 100644 --- a/config/sync/search_api.index.unpublished.yml +++ b/config/sync/search_api.index.unpublished.yml @@ -48,7 +48,7 @@ dependencies: - field.storage.rdf_entity.field_isr_owner - field.storage.node.field_paragraphs_body - field.storage.paragraph.field_body - - search_api.server.solr_unpublished + - search_api.server.joinup third_party_settings: search_api_solr: finalize: false @@ -688,4 +688,4 @@ tracker_settings: options: index_directly: true cron_limit: 50 -server: solr_unpublished +server: joinup diff --git a/config/sync/search_api.server.solr_published.yml b/config/sync/search_api.server.joinup.yml similarity index 82% rename from config/sync/search_api.server.solr_published.yml rename to config/sync/search_api.server.joinup.yml index 7d37f0e096..77996636e3 100644 --- a/config/sync/search_api.server.solr_published.yml +++ b/config/sync/search_api.server.joinup.yml @@ -4,18 +4,18 @@ status: true dependencies: module: - search_api_solr -id: solr_published -name: 'Server for published entities' +id: joinup +name: 'Joinup Search API Server' description: '' backend: search_api_solr backend_config: connector: standard connector_config: scheme: http - host: solr_published + host: solr port: '8983' path: /solr - core: drupal_published + core: joinup timeout: 5 index_timeout: 5 optimize_timeout: 10 diff --git a/config/sync/search_api.server.solr_unpublished.yml b/config/sync/search_api.server.solr_unpublished.yml deleted file mode 100644 index 1bb736b9ab..0000000000 --- a/config/sync/search_api.server.solr_unpublished.yml +++ /dev/null @@ -1,29 +0,0 @@ -uuid: 1ba243ee-4006-4d79-aa79-edb8a8281fa1 -langcode: en -status: true -dependencies: - module: - - search_api_solr -id: solr_unpublished -name: 'Server for unpublished entities' -description: '' -backend: search_api_solr -backend_config: - connector: standard - connector_config: - scheme: http - host: solr_unpublished - port: '8983' - path: /solr - core: drupal_unpublished - timeout: 5 - index_timeout: 5 - optimize_timeout: 10 - commit_within: 1000 - solr_version: '' - http_method: AUTO - retrieve_data: false - highlight_data: false - skip_schema_check: false - site_hash: true - domain: generic diff --git a/config/sync/search_api_autocomplete.search.search.yml b/config/sync/search_api_autocomplete.search.search.yml new file mode 100644 index 0000000000..a82e617b93 --- /dev/null +++ b/config/sync/search_api_autocomplete.search.search.yml @@ -0,0 +1,42 @@ +uuid: 239cf53c-6085-4c54-a92f-026191ed2a20 +langcode: en +status: true +dependencies: + config: + - search_api.index.published + - views.view.search + module: + - views + - search_api_autocomplete + - search_api_solr +id: search +label: Search +index_id: published +suggester_settings: + server: + fields: { } + search_api_solr_spellcheck: { } + search_api_solr_suggester: + search_api_solr/site_hash: 1 + search_api/index: published + drupal/langcode: any +suggester_weights: + server: 0 + search_api_solr_spellcheck: 0 + search_api_solr_suggester: 0 +suggester_limits: + server: 1 + search_api_solr_spellcheck: 1 + search_api_solr_suggester: 1 +search_settings: + 'views:search': + displays: + default: true + selected: { } +options: + limit: 10 + min_length: 1 + show_count: false + autosubmit: true + submit_button_selector: ':submit' + delay: null diff --git a/config/sync/search_api_autocomplete.settings.yml b/config/sync/search_api_autocomplete.settings.yml new file mode 100644 index 0000000000..3273938255 --- /dev/null +++ b/config/sync/search_api_autocomplete.settings.yml @@ -0,0 +1,3 @@ +enable_custom_scripts: false +_core: + default_config_hash: f5JKUdyiasGBAc7jPj5KjLWW570WHiKAwONf0nR3qN4 diff --git a/config/sync/swiftmailer.message.yml b/config/sync/swiftmailer.message.yml index 6c7535e67c..297aabe9a6 100644 --- a/config/sync/swiftmailer.message.yml +++ b/config/sync/swiftmailer.message.yml @@ -1,7 +1,6 @@ -format: text/html -respect_format: true -convert_mode: true +content_type: text/html +text_format: plain_text +generate_plain: true character_set: UTF-8 _core: default_config_hash: 1ErUI34W400SFVtJGG8W1mfDZ6-Dw3L9l9ZST2PsTMs -filter_format: plain_text diff --git a/config/sync/swiftmailer.transport.yml b/config/sync/swiftmailer.transport.yml index 2d89f79ec0..a4907c5157 100644 --- a/config/sync/swiftmailer.transport.yml +++ b/config/sync/swiftmailer.transport.yml @@ -1,15 +1,12 @@ -transport: native +transport: spool smtp_host: 127.0.0.1 smtp_port: 25 -smtp_encryption: '' +smtp_encryption: '0' smtp_credential_provider: swiftmailer smtp_credentials: swiftmailer: username: '' password: '' - key: - username: '' - password: '' sendmail_path: /usr/sbin/sendmail sendmail_mode: bs -spool_directory: '' +spool_directory: /tmp/spool/ diff --git a/config/sync/syslog.settings.yml b/config/sync/syslog.settings.yml deleted file mode 100644 index 2e066420b9..0000000000 --- a/config/sync/syslog.settings.yml +++ /dev/null @@ -1,5 +0,0 @@ -identity: drupal -facility: 128 -format: '!base_url|!timestamp|!type|!ip|!request_uri|!referer|!severity|!uid|!link|!message' -_core: - default_config_hash: vdXLRPZRg35PBykBRRXr6RTql5EJR_fUi2kxyZ8c5m0 diff --git a/config/sync/user.role.anonymous.yml b/config/sync/user.role.anonymous.yml index 51db06b8b9..c46d73fd4e 100644 --- a/config/sync/user.role.anonymous.yml +++ b/config/sync/user.role.anonymous.yml @@ -15,6 +15,7 @@ permissions: - 'legal view legal_notice' - 'never autoplay videos' - 'subscribe to newsletters' + - 'use search_api_autocomplete for search' - 'use text format basic_html' - 'use text format simple_text' - 'view compatibility documents' diff --git a/config/sync/user.role.authenticated.yml b/config/sync/user.role.authenticated.yml index ab053775a5..c8792c48d1 100644 --- a/config/sync/user.role.authenticated.yml +++ b/config/sync/user.role.authenticated.yml @@ -109,6 +109,7 @@ permissions: - 'update paragraph content accordion_item' - 'update paragraph content content_listing' - 'update paragraph content simple_paragraph' + - 'use search_api_autocomplete for search' - 'use text format basic_html' - 'use text format content_editor' - 'use text format essential_html' diff --git a/config/sync/views.view.group_feed.yml b/config/sync/views.view.group_feed.yml index 62e393c4cf..3e2dee2549 100644 --- a/config/sync/views.view.group_feed.yml +++ b/config/sync/views.view.group_feed.yml @@ -1140,7 +1140,7 @@ display: exclude: false alter: alter_text: true - text: '{{ view_node|trim(''/'', ''left'') }}{{ view_rdf_entity|trim(''/'', ''left'') }}' + text: '/{{ view_node|trim(''/'', ''left'') }}{{ view_rdf_entity|trim(''/'', ''left'') }}' make_link: false path: '' absolute: false diff --git a/config/sync/views.view.search.yml b/config/sync/views.view.search.yml index 9581a4d890..cec69609a4 100644 --- a/config/sync/views.view.search.yml +++ b/config/sync/views.view.search.yml @@ -5,7 +5,6 @@ dependencies: config: - search_api.index.published module: - - joinup_material_design - search_api - views_autosubmit - views_block_area @@ -69,32 +68,38 @@ display: offset_label: Offset quantity: 9 style: - type: tiles + type: default options: - row_class: '' - default_row_class: true + row_class: tile + default_row_class: false uses_fields: false row: type: search_api options: view_modes: 'entity:node': - custom_page: view_mode_tile - discussion: view_mode_tile - document: view_mode_tile - event: view_mode_tile - news: view_mode_tile - newsletter: view_mode_tile - tallinn_report: view_mode_tile - video: view_mode_tile + custom_page: search_result + discussion: search_result + document: search_result + event: search_result + news: search_result + tallinn_report: search_result + video: search_result 'entity:rdf_entity': - asset_distribution: view_mode_tile - asset_release: view_mode_tile - collection: view_mode_tile - licence: view_mode_tile - solution: view_mode_tile + asset_distribution: search_result + asset_release: search_result + collection: search_result + licence: search_result + solution: search_result + spdx_licence: default + 'entity:taxonomy_term': + eif_conceptual_model: default + eif_interoperability_layer: default + eif_principle: default + eif_recommendation: default + topic: default 'entity:user': - user: view_mode_tile + user: search_result fields: id: table: search_api_index_published diff --git a/db/solr/.gitignore b/db/solr/.gitignore index 3aa2f3ea69..12178a89a5 100644 --- a/db/solr/.gitignore +++ b/db/solr/.gitignore @@ -1,2 +1 @@ -/snapshot.published/ -/snapshot.unpublished/ +/snapshot.*/ diff --git a/docker-compose.override.yml.dist b/docker-compose.override.yml.dist index 027cfa5553..b8239d1302 100644 --- a/docker-compose.override.yml.dist +++ b/docker-compose.override.yml.dist @@ -16,6 +16,11 @@ services: # ports: # - '80:8080' +# macOS users should override this value by uncommenting the following +# 'environment:' block. +# environment: +# XDEBUG_CONFIG: client_host=host.docker.internal + # Create an .env.local file, in the project root directory, and uncomment the # 'env_file:' block in order override values provided in .env.dist file. # env_file: @@ -38,7 +43,7 @@ services: # - '3306:3306' - virtuoso: + sparql: # macOS users should override this value by uncommenting the following # 'volumes:' block. # volumes: diff --git a/docker-compose.yml b/docker-compose.yml index e81fdf90a0..3449a32481 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,7 @@ version: '3.8' services: web: - image: fpfis/httpd-php-dev:7.1 + image: fpfis/httpd-php-dev:7.4 working_dir: /var/www/html # macOS users should override 'volumes:' in docker-compose.override.yml. # See docker-compose.override.yml.dist. @@ -25,7 +25,7 @@ services: env_file: - .env.dist environment: - DOCUMENT_ROOT: "/var/www/html/web" + DOCUMENT_ROOT: "/var/www/html" SMTP_SERVER: mail SMTP_PORT: 1025 SMTP_FROM: contact@example.com @@ -39,9 +39,15 @@ services: ASDA_URL: ASDA_USER: ASDA_PASSWORD: + DISABLE_XDEBUG: + DISABLE_BLACKFIRE: + # For non-macOS hosts. For macOS, see docker-compose.override.yml.dist. + XDEBUG_CONFIG: "client_host=172.17.0.1" + XDEBUG_MODE: "develop, debug" + PHP_IDE_CONFIG: "serverName=Docker" depends_on: - mysql - - virtuoso + - sparql - solr - redis - mail @@ -64,7 +70,7 @@ services: MYSQL_DATABASE: 'joinup' DOCKER_RESTORE_PRODUCTION: - virtuoso: + sparql: image: tenforce/virtuoso # macOS users should override 'volumes:' in docker-compose.override.yml. # See docker-compose.override.yml.dist. @@ -97,6 +103,7 @@ services: - ./scripts/solr/restore_solr.sh:/opt/solr/bin/restore_solr.sh - ./scripts/docker/solr/precreate.sh:/docker-entrypoint-initdb.d/precreate.sh environment: + SOLR_CORE: digit-joinup DOCKER_RESTORE_PRODUCTION: redis: diff --git a/docs/docker/README.md b/docs/docker/README.md index 68218b2f05..4d8c41c186 100644 --- a/docs/docker/README.md +++ b/docs/docker/README.md @@ -1,129 +1,116 @@ -# Joinup on Docker +# Install Joinup with Docker ## Requirements + * Docker * docker-compose ## Getting started + ### Environment variables -Create an `.env` file in the root directory where you can place all your config overridden. -More information about the settings can be found at the .env.dist file. Copy the settings you want altered. -### Set up a random hash salt. -From the host environment, run -```bash -docker-compose exec web echo "DRUPAL_HASH_SALT=$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9+/' | fold -w ${1:-55} | head -n 1)" >> .env -``` -to generate the `DRUPAL_HASH_SALT` variable in the `.env` file. Note, that this variable, is required for Drupal but the -value can be arbitrary. You do not need to set a specific value e.g. to rebuild from the production database +Create an `.env` file in the root directory where you should assign values for +environment variables containing sensitive data, such as passwords, tokens, +hashes or even custom preferences. These variables are not committed in VCS and +due to their nature should be manually set. Here is a list of variables that +need to be set in the `.env` file: + +* `DRUPAL_HASH_SALT` +* `ASDA_URL` +* `ASDA_USER` +* `ASDA_PASSWORD` +* `DOCKER_RESTORE_PRODUCTION` + +Other variable, dealing with custom developer preferences can also override +their `.env.dist` default value: + +* `DISABLE_XDEBUG` +* `DISABLE_BLACKFIRE` + +More information about these environment variables can be found in the +`.env.dist` file. ### Set up the config override -Copy `docker-compose.override.yml.dist` over to `docker-compose.override.yml`. This file will include the overrides for -the `docker-compose.yml` file. -Uncomment the lines your wish to change and also uncomment the ports so that the web container is accessible over the -web. + +Configuration from `docker-compose.yml` can be overwritten in +`docker-compose.override.yml` file. Copy `docker-compose.override.yml.dist` over +to `docker-compose.override.yml`. Port mappings are not declared in the main +`docker-compose.yml` file because this is developer custom setting, so you'll +need to uncomment and edit, if case, the port mappings in the override file. +Port mapping for the web container is required for accessing the webpage from +the host machine so the override file is required in a normal workflow. + +**macOS users**: As Docker has performance issues when the host machine is a +_macOS_ system, the setup needs more attention. Please read carefully all the +suggestions documented in the `docker-compose.override.yml.dist` file, specific +to _macOS_ users and fix the lines in `docker-compose.override.yml` file. ## Starting the containers -To start the containers, you can execute the following command from the project root directory: + +To start the containers, you can execute the following command from the project +root directory: + ```bash -docker-compose up -d +$ docker-compose up -d ``` -This will automatically read the `docker-compose.yml` file as a source. The `-d` command will start the containers in -the background. You can ommit the `-d` parameter and docker-compose will run in the foreground. + +This will automatically read the `docker-compose.yml` file as a source. The `-d` +options will start the containers in the background. If you omit the `-d` +option, `docker-compose` will run in the foreground. ## Stopping the containers -To stop the containers, you can use the command `docker-compose down` from the same directory as the docker-compose.yml. -Using this command however, will only stop the machine and will not destroy the volume that was created with it. To -clean the volume as well, use the `-v` parameter as `docker-compose down -v`. -## Installing dependencies -Run the following command to install all packages in the vendor folder: -```bash -docker-compose exec --user www-data web composer install -``` -A Github authentication token will be required to download all packages. -**Note:** If you have permission issues, please check known issue [Apache daemon user](#apache-daemon-user). -**Note 2:** For the authentication token, you can map your local directories to the container in order to reuse all keyes -and tokens from your local account. Check [Reuse local configuration](#reuse-local-configuration) for more info. +To stop the containers, you can use the command `docker-compose down` from the +same directory as the `docker-compose.yml`. Using this command, however, will +only stop the machine and will not destroy the volume that was created with it. +To clean the volume as well, use the `-v` parameter as `docker-compose down -v`. ## Before installing -Before installing, check the [Known issues and tips](#known-issues-and-tips) for possible issues and optimizations. -## Install the website -From the project root, run: +By default, the `web` container starts with Xdebug and Blackfire.io enabled, in +order to support debugging. However, having them enabled while running Composer +install or installing the site will dramatically slow the operations. It's +recommended to enable them only when debugging and start the container with +Xdebug and Blackfire.io disabled. In order to do that, you should declare these +environment variables in your `.env` file: + +``` +DISABLE_XDEBUG="True" +DISABLE_BLACKFIRE="True" +``` + +During development the PHP modules can be manually disabled or enabled: + ```bash -docker-compose exec --user www-data web ./vendor/bin/run toolkit:build-dev -docker-compose exec --user www-data web ./vendor/bin/run toolkit:install-clean +# Enable +$ docker-compose exec web phpenmod xdebug +$ docker-compose exec web phpenmod blackfire +# Disable +$ docker-compose exec web phpdismod xdebug +$ docker-compose exec web phpdismod blackfire ``` -You can now access the website at `http://localhost` or the corresponding endpoint if you have overridden the -settings. -## Accessing the containers -All containers are accessible through the command +## Installing the codebase + +Run the following command to install all packages in the vendor folder: + ```bash -docker-compose exec my_container_name "/bin/bash" +$ docker-compose exec --user www-data web composer install ``` -Depending on the container (and its base image), it might be that `/bin/bash` is not available. In that case, `/bin/sh` -and `sh` are good substitutes. -**Note:** Depending on your configuration, it might be that you have to change the ownership of all the files in -order to have a successful installation and to be able to run the tests properly. For a possible solution, please, refer -to the section [Handling permissions](#handling-permissions) +### Known issues -## Accessing the volumes -Some containers, like solr, define volumes that allow the container to directly access files and folders on the host -machine. These volumes are constructed using the top-level `volumes` entry in the docker-compose file and inherit all -properties from the containers. -These volumes help retain the data between builds. The since no directory is defined, the local driver will set the -default directory, which is `/var/lib/docker/volumes/[volume identifier]`. -This directory is owned by the user that creates it within the container so the directory listing will have to run with -root privileges. -Please, note that the volume names, as with the docker services, will be prefixed with the name of the folder that the -project lies within e.g. if you install the project on the `myproject` folder, the `mysql` volume, will be named -`myproject_mysql`. +#### Permission issues + +There is a known issue related to the permissions of the host and container. In +order for the permissions to work properly, the user owning the files in the +host machine, the user executing commands in the container, the user running +Apache in the container and the user running the IDE, must all be able to +perform all necessary actions in the files. To workaround this, the user ID and +the group ID of the user that runs apache must be updated. To do this, before +building the containers, in the `docker-compose.override.yml` file, copy over +the web service, and replace the `image` entry with the following `build` -## Useful commands -* When a service is not based on an image, but is built through a Dockerfile, the image is cached in docker-compose -after first build. If changes are made, it can be rebuild using `docker-compose build --no-cache`. -* To rebuild all containers on startup use the `--force-recreate` flag as such: `docker-compose up --force-recreate` -* If a container persists still, use `docker-compose rm ` to remove it from the docker-compose cache and -then recreate the containers. - -## Debugging tests -The web container contains XDEBUG version `^2.9`. Please, refer to your IDE settings in order to set up a debug session -with docker. - -## Rebuild from existing databases -Follow the instructions from the main README in order to set up the ASDA credentials. -Download both the SPARQL and SQL database dumps using the following command: -``` -$ docker-compose exec --user www-data web php -d memory_limit=-1 ./vendor/bin/run dev:download-databases -``` -**Note:** If you are changing from a clean install to a restored environment, you need to destroy the volumes with -`docker-compose down -v` (the `-v` is the key) in order to destroy the volumes, -and subsequently `docker-compose up -d` to rebuild. - -## Launch containers using production databases -To start the containers using the production database, in your `.env` file, set the variable `DOCKER_RESTORE_PRODUCTION` -to yes. The fire up the containers. -After the images have been built, and the databases have been restored, run the following command to execute the -updates: -``` -$ docker-compose exec --user www-data web ./vendor/bin/run toolkit:run-deploy -``` -**Note**: All images start normally, and the web server is available almost immediately. However, mysql container -will not start until the backup is restored so for the first few minutes, depending on the size of the database dump, -the web server will receive connection denials. Please, wait until the mysql import is finishes before accessing the -site. - -## Known issues and tips -### Apache daemon user -There is a known issue related to the permissions of the host and container. In order for the permissions to work -properly, the user owning the files in the host machine, the user executing commands in the container, the user running -Apache in the container and the user running the IDE, must all be able to perform all necessary actions in the files. -To workaround this, the user ID and the group ID of the user that runs apache must be updated. To do this, before -building the containers, in the `docker-compose.override.yml` file, copy over the web service, and replace the -`image` entry with the following `build` ```yaml services: web: @@ -133,33 +120,45 @@ services: USER_ID: 1000 GROUP_ID: 1000 ``` -where `./local` is a untracked directory (the name can be different) somewhere on your system (this one is on the -project root). -Then, in the directory declared above, create the following `Dockerfile` file. + +where `./local` is a untracked directory (the name can be different) somewhere +on your system (this one is on the project root). Then, in the directory +declared above, create the following `Dockerfile` file. + ```dockerfile -FROM fpfis/httpd-php-dev:7.1 +FROM fpfis/httpd-php-dev:7.4 ARG USER_ID=1000 ARG GROUP_ID=1000 RUN usermod -u ${USER_ID} www-data && \ groupmod -g ${GROUP_ID} www-data ``` -Change the user ID and group ID according to your needs. The value 1000 is the value of the default login user of the -Linux OS. -To rebuild the containers, first stop them by running from the host machine + +Change the user ID and group ID according to your needs. The value 1000 is the +value of the default login user of the Linux OS. To rebuild the containers, +first stop them by running from the host machine: + ```bash -docker-compose down -v +$ docker-compose down -v ``` -and then recreate them by running + +and then recreate them by running: + ```bash -docker-compose up -d --build -force-recreate +$ docker-compose up -d --build -force-recreate ``` -The above workaround will result the user `www-data` having the user ID and group ID of the host login user. -Now, running any command in the container as `www-data`, will have the same effect on the files as running it locally. -### Reuse local configuration -If you want to have your personal git, composer and ssh settings persist over the web container, -you can add the following entries in the `volumes` key in your `web` container. +The above workaround will result the user `www-data` having the user ID and +group ID of the host login user. Now, running any command in the container as +`www-data`, will have the same effect on the files as running it locally. + +#### GitHub authentication token + +During Composer install, you might be asked for GitHub authentication token. If +you want to have your personal Git, Composer and SSH settings persist over the +web container, you can add the following entries in the `volumes` key under your +`web` container, in `docker-compose.override.yml` file: + ```yaml version: '3.8' services: @@ -171,22 +170,150 @@ services: - ~/.composer:/var/www/.composer - ~/.ssh:/var/www/.ssh ``` -Note that in the above snippet the first line is also part of the main `docker-composer.yml`. This is because -the `volumes` entry here will completely override the parent entry and will not merge with it. -### XDEBUG and Blackfire -The web container includes the `phpenmod` and `phpdismod` commands that can enable and disable PHP modules. -Two of the modules can slow the processes very much, XDEBUG and Blackfire. You can enable and disable them by running -the following commands +Note that in the above snippet the first line is also part of the main +`docker-composer.yml`. This is because the `volumes` entry here will completely +override the parent entry and will not merge with it. + +## Install an empty website + +From the project root, run: + +```bash +$ docker-compose exec web ./vendor/bin/run toolkit:install-clean +``` +You can now access the website at `http://localhost/web` on the host machine, if +the port mapping is `80:8080`. If you define a different port mapping, such as +`8080:8080`, the website is accessible at `http://localhost:8080/web`. + +## Install a cloned site + +A _cloned site_ install is also restoring the databases from the production and +is running all update scripts. + +### Downloading databases dump/snapshots + +Before proceeding, make sure you set manually the `ASDA_*` environment variables +in `.env` file. The values should be provided by DevOps team. + +#### Download all dumps/snapshots at once + +```bash +$ docker-compose exec web ./vendor/bin/run ./vendor/bin/run dev:download-databases +``` + +#### Download only the MySQL dump + +```bash +$ docker-compose exec web ./vendor/bin/run ./vendor/bin/run mysql:download-dump +``` + +#### Download only the Virtuoso snapshot + +```bash +$ docker-compose exec web ./vendor/bin/run ./vendor/bin/run virtuoso:download-snapshot +``` + +#### Download only the Solr snapshot + ```bash -# Enable xdebug. -docker-compose exec web phpenmod xdebug -# Enable blackfire. -docker-compose exec web phpenmod blackfire +$ docker-compose exec web ./vendor/bin/run ./vendor/bin/run solr:download-snapshot +``` + +**Note:** If you are changing from a clean install to a restored environment, +you'll need to destroy the volumes with `docker-compose down -v` (the `-v` is +the key option) in order to destroy the volumes, and subsequently +`docker-compose up -d` to rebuild. + +### Tell Docker to install a cloned site + +In order to make Docker start the database service containers (`mysql`, `sparql` +and `solr`) with production data, you should declare this in the `.env` file +before staring the services: -# Disable xdebug. -docker-compose exec web phpdismod xdebug -# Disable blackfire. -docker-compose exec web phpdismod blackfire ``` -It is highly recommended that these modules are disabled for long processes, e.g. the installation of the website. +DOCKER_RESTORE_PRODUCTION=yes +``` + +After starting the containers, you may need to wait up to 1 minute because the +database dump and snapshots are being imported. Check the logs to find when +these operations are complete. If you plan to run all operations in a script, it +might be safe to start with a one minute _sleep_. + +### Install the cloned site + +After containers are up and got the chance to import from dump/snapshots, run +this sequence of commands: + +```bash +$ docker-compose exec web ./vendor/bin/run dev:rebuild-environment +# Installs the development modules, such as `devel`. +$ docker-compose exec web ./vendor/bin/run dev:install-modules +``` + +But you can create your own Task Runner command, to include all steps, in the +`runner.yml` file, which is not under VCS control: + +```yaml +commands: + restore: + - task: exec + command: sleep + arguments: + - 60 + - task: run + command: dev:rebuild-environment + - task: run + command: dev:install-modules +``` + +Then simply run this script from the host machine: + +```bash +$ docker-compose exec web ./vendor/bin/run restore +``` + +## Accessing the containers + +All containers are accessible through the command + +```bash +$ docker-compose exec my_container_name "/bin/bash" +``` + +Depending on the container (and its base image), it might be that `/bin/bash` is +not available. In that case, `/bin/sh` and `sh` are good substitutes. + +## Accessing the volumes + +Some containers, like `solr`, define volumes that allow the container to +directly access files and folders on the host machine. These volumes are +constructed using the top-level `volumes` entry in the `docker-compose.yml` file +and inherit all properties from the containers. These volumes help retain the +data between builds. The since no directory is defined, the local driver will +set the default directory `/var/lib/docker/volumes/[volume identifier]`. This +directory is owned by the user that creates it within the container so the +directory listing will have to run with root privileges. + +Please, note that the volume names, as with the docker services, will be +prefixed with the name of the folder that the project lies within e.g. if you +install the project on the `myproject` folder, the `mysql` volume, will be named +`myproject_mysql`. + +## Useful commands + +* When a service is not based on an image, but is built through a Dockerfile, + the image is cached in `docker-compose` after first build. If changes are + made, it can be rebuild using `docker-compose build --no-cache`. +* To rebuild all containers on startup use the `--force-recreate` flag as such: + `docker-compose up --force-recreate`. +* If a container persists still, use `docker-compose rm ` to + remove it from the docker-compose cache and then recreate the containers. + +## Debugging + +The web container contains Xdebug. Please, refer to your IDE settings in order +to set up a debug session with Docker. + +**Note:** _macOS_ users should set a different Xdebug configuration. See the +`docker-compose.override.yml.dist` file for details. diff --git a/drush/sites/self.site.yml b/drush/sites/self.site.yml deleted file mode 100644 index fda7194097..0000000000 --- a/drush/sites/self.site.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Edit or remove this file as needed. -# Docs at https://github.com/drush-ops/drush/blob/master/examples/example.site.yml - -#prod: -# host: prod.domain.com -# user: www-admin -# root: /path/to/drupal -# uri: http://www.example.com -# -#stage: -# host: stage.domain.com -# user: www-admin -# root: /path/to/drupal -# uri: http://stage.example.com diff --git a/grumphp.yml.dist b/grumphp.yml.dist new file mode 100644 index 0000000000..23c8cc1d80 --- /dev/null +++ b/grumphp.yml.dist @@ -0,0 +1,8 @@ +imports: + - { resource: vendor/ec-europa/qa-automation/dist/qa-conventions.yml } + +parameters: + ascii: ~ + git_dir: . + bin_dir: vendor/bin + tasks: { } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..e3259d72e0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4338 @@ +{ + "name": "joinup-dev", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "license": "EUPL-1.2", + "devDependencies": { + "eslint": "^7.32.0", + "eslint-config-airbnb": "^18.2.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.25.1", + "eslint-plugin-yml": "^0.10.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/axe-core": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "node_modules/core-js-pure": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", + "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "dependencies": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4 || ^3 || ^2.3.0 || ^1.7.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz", + "integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-yml": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.10.1.tgz", + "integrity": "sha512-af0WgO3qaH+RW6jv1s6RzXKlg2NZLisN95lqGUf1KqBT6rEJyGSCpM49QYaSTvzmMaB/gcdbrnAfNoYwUn0Yig==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash": "^4.17.19", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^0.4.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.4.1.tgz", + "integrity": "sha512-GoJ/p1EW8O2tbTbuhfxjo1XhfUFU3uX3kwvfEQoOaZjO2Lubx8POjlsSqB+18b3SxkujAdQYT9r9nURaUWNYWQ==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.1.0", + "lodash": "^4.17.20", + "yaml": "^1.10.0" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dev": true, + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "array.prototype.flatmap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "axe-core": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", + "dev": true + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "core-js-pure": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", + "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + } + }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz", + "integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "eslint-plugin-yml": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-0.10.1.tgz", + "integrity": "sha512-af0WgO3qaH+RW6jv1s6RzXKlg2NZLisN95lqGUf1KqBT6rEJyGSCpM49QYaSTvzmMaB/gcdbrnAfNoYwUn0Yig==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "lodash": "^4.17.19", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^0.4.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsx-ast-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", + "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "object.assign": "^4.1.2" + } + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", + "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "peer": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + } + } + }, + "string.prototype.matchall": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", + "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yaml-eslint-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.4.1.tgz", + "integrity": "sha512-GoJ/p1EW8O2tbTbuhfxjo1XhfUFU3uX3kwvfEQoOaZjO2Lubx8POjlsSqB+18b3SxkujAdQYT9r9nURaUWNYWQ==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.1.0", + "lodash": "^4.17.20", + "yaml": "^1.10.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..4ca89c58a0 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "license": "EUPL-1.2", + "devDependencies": { + "eslint": "^7.32.0", + "eslint-config-airbnb": "^18.2.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.25.1", + "eslint-plugin-yml": "^0.10.1" + } +} diff --git a/phpcs-ruleset.xml.dist b/phpcs-ruleset.xml.dist index acf9329cd3..b6022ebd6f 100644 --- a/phpcs-ruleset.xml.dist +++ b/phpcs-ruleset.xml.dist @@ -28,6 +28,8 @@ + + diff --git a/phpstan.neon b/phpstan.neon index 89beb51738..b7423b40b4 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,6 +1,8 @@ parameters: customRulesetUsed: true reportUnmatchedIgnoredErrors: false + drupal: + drupal_root: %currentWorkingDirectory%/web ignoreErrors: - # The rule that suggests to use dependency injection instead of diff --git a/resources/drupal-scaffold/.gitattributes.append b/resources/drupal-scaffold/.gitattributes.append index d07af1eed1..61c1bb162f 100644 --- a/resources/drupal-scaffold/.gitattributes.append +++ b/resources/drupal-scaffold/.gitattributes.append @@ -13,10 +13,8 @@ .github export-ignore .editorconfig export-ignore .gitattributes export-ignore -build.continuousphp.xml export-ignore -build.project.xml export-ignore LICENSE export-ignore phpcs-ruleset.xml.dist export-ignore phpstan.neon export-ignore -phpunit.xml.dist export-ignore +phpunit.xml export-ignore README.md export-ignore diff --git a/resources/mac/README.md b/resources/mac/README.md index e001f7c92b..566a451c6e 100644 --- a/resources/mac/README.md +++ b/resources/mac/README.md @@ -64,96 +64,90 @@ Redis](https://medium.com/@petehouston/install-and-config-redis-on-mac-os-x-via- ## Setting up the project -1. Clone the respository of this project +### Clone the repository - ```bash - $ git clone https://github.com/ec-europa/joinup-dev.git - ``` +```bash +$ git clone https://github.com/ec-europa/joinup-dev.git +``` -1. Create a local task runner configuration file +### Create a local task runner configuration file - In order to override any configuration of the task runner - (`./vendor/bin/run`), create a `runner.yml` file in the project's top - directory. You can override there any default runner configuration, or any - other declared in `./resources/runner` files or in `runner.yml.dist`. Note - that the `runner.yml` file is not under VCS control. +In order to override any configuration of the task runner (`./vendor/bin/run`), +create a `runner.yml` file in the project's top directory. You can override +there any default runner configuration, or any other declared in +`./resources/runner` files or in `runner.yml.dist`. Note that the `runner.yml` +file is not under VCS control. -1. Setup environment variables +### Environment variables Sensitive data will be stored in [environment variables]( https://en.wikipedia.org/wiki/Environment_variable). See `.env.dist` for details. -**! Important: For the ASDA settings please contact your local developer !** +**Important!** For the ASDA settings please contact your local developer -3. Run composer +## Build the codebase - ```bash - $ composer install - ``` - -4. Run `toolkit:build-dev` - - ```bash - $ ./vendor/bin/run toolkit:build-dev - ``` +```bash +$ composer install +``` -5. Install and/or relink +### Install and/or relink - ```bash - $ brew unlink unixodbc - $ brew install virtuoso - $ brew unlink virtuoso - $ brew link unixodbc - $ brew link --overwrite virtuoso - ``` +```bash +$ brew unlink unixodbc +$ brew install virtuoso +$ brew unlink virtuoso +$ brew link unixodbc +$ brew link --overwrite virtuoso +``` -6. Setup Virtuoso +### Setup Virtuoso - ```bash - $ ./vendor/bin/run virtuoso:setup - $ ./vendor/bin/run virtuoso:start - ``` +```bash +$ ./vendor/bin/run virtuoso:setup +$ ./vendor/bin/run virtuoso:start +``` - [Check Virtuoso](http://localhost:8890/sparql) +[Check Virtuoso](http://localhost:8890/sparql) -7. Run `toolkit:install-clean` +### Run `toolkit:install-clean` - ```bash - $ ./vendor/bin/run toolkit:install-clean - ``` +```bash +$ ./vendor/bin/run toolkit:install-clean +``` -8. Setup Solr and check if it's running +### Setup Solr and check if it's running - ```bash - $ ./vendor/bin/run solr:setup - ``` +```bash +$ ./vendor/bin/run solr:setup +``` - [Check Solr](http://localhost:8983/solr/#/) +[Check Solr](http://localhost:8983/solr/#/) -9. Download production Databases +### Download production databases - ```bash - $ ./vendor/bin/run dev:download-databases - ``` +```bash +$ ./vendor/bin/run dev:download-databases +``` -10. Rebuild environment +### Rebuild environment - ```bash - $ ./vendor/bin/run toolkit:install-clone - ``` +```bash +$ ./vendor/bin/run toolkit:install-clone +``` -12. Unblock the admin user +### Unblock the admin user - ```bash - $ drush user:unblock - ``` +```bash +$ drush user:unblock +``` -13. Login with the admin user +### Login with the admin user - ```bash - $ drush uli - ``` +```bash +$ drush uli +``` ## Switching between branches @@ -162,6 +156,5 @@ date: ```bash $ ./vendor/bin/composer install -$ ./vendor/bin/run toolkit:build-dev $ ./vendor/bin/run toolkit:install-clone ``` diff --git a/resources/patch/search_api_autocomplete_override_views_autosubmit.patch b/resources/patch/search_api_autocomplete_override_views_autosubmit.patch new file mode 100644 index 0000000000..1945f92dcd --- /dev/null +++ b/resources/patch/search_api_autocomplete_override_views_autosubmit.patch @@ -0,0 +1,27 @@ +diff --git a/js/search_api_autocomplete.js b/js/search_api_autocomplete.js +index 0b08e19..a2a8b77 100644 +--- a/js/search_api_autocomplete.js ++++ b/js/search_api_autocomplete.js +@@ -61,6 +61,14 @@ + .find('.ui-autocomplete-input[data-search-api-autocomplete-search]') + .once('search-api-autocomplete') + .each(function () { ++ ++ // Clear timeout autosubmit used in views_autosubmit. ++ if (Drupal.behaviors.ViewsAutoSubmit.alterTextInputTimeout) { ++ Drupal.behaviors.ViewsAutoSubmit.alterTextInputTimeout = function(timeoutID) { ++ return clearTimeout(timeoutID); ++ } ++ } ++ + var uiAutocomplete = $(this).data('ui-autocomplete'); + if (!uiAutocomplete) { + return; +@@ -69,6 +77,7 @@ + $element.data('search-api-autocomplete-input-id', this.id); + $element.addClass('search-api-autocomplete-search'); + var elementSettings = autocomplete.getSettings(this, settings); ++ + if (elementSettings['delay']) { + uiAutocomplete.options['delay'] = elementSettings['delay']; + } diff --git a/resources/patch/search_api_solr-3173950.diff b/resources/patch/search_api_solr-3173950.diff new file mode 100644 index 0000000000..67b9617329 --- /dev/null +++ b/resources/patch/search_api_solr-3173950.diff @@ -0,0 +1,17 @@ +Index: src/Plugin/search_api/backend/SearchApiSolrBackend.php +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php +--- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php ++++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php (date 1630050890891) +@@ -2803,7 +2803,7 @@ + foreach ($keys as $key_nr => $key) { + // We cannot use \Drupal\Core\Render\Element::children() anymore because + // $keys is not a valid render array. +- if ($key_nr[0] === '#' || !$key) { ++ if ((is_string($key_nr) && $key_nr[0] === '#') || !$key) { + continue; + } + if (is_array($key)) { diff --git a/resources/patch/solarium.diff b/resources/patch/solarium.diff new file mode 100644 index 0000000000..adecf615b3 --- /dev/null +++ b/resources/patch/solarium.diff @@ -0,0 +1,17 @@ +Index: src/Core/Query/AbstractRequestBuilder.php +IDEA additional info: +Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP +<+>UTF-8 +=================================================================== +diff --git a/src/Core/Query/AbstractRequestBuilder.php b/src/Core/Query/AbstractRequestBuilder.php +--- a/src/Core/Query/AbstractRequestBuilder.php ++++ b/src/Core/Query/AbstractRequestBuilder.php (date 1533819685000) +@@ -56,7 +56,7 @@ + } + + if (is_array($paramValue)) { +- $paramValue = implode($paramValue, ','); ++ $paramValue = implode(',', $paramValue); + } + + $params .= $paramName.'='.$paramValue.' '; diff --git a/resources/rpmbuild/SOURCES/template/sites/default/files b/resources/rpmbuild/SOURCES/template/sites/default/files deleted file mode 120000 index 26f8888e8b..0000000000 --- a/resources/rpmbuild/SOURCES/template/sites/default/files +++ /dev/null @@ -1 +0,0 @@ -../../../../shared/files \ No newline at end of file diff --git a/resources/rpmbuild/SOURCES/template/sites/default/services.yml b/resources/rpmbuild/SOURCES/template/sites/default/services.yml deleted file mode 120000 index b8d2b555ec..0000000000 --- a/resources/rpmbuild/SOURCES/template/sites/default/services.yml +++ /dev/null @@ -1 +0,0 @@ -../../../../common/services.yml \ No newline at end of file diff --git a/resources/rpmbuild/SOURCES/template/sites/default/settings.php b/resources/rpmbuild/SOURCES/template/sites/default/settings.php deleted file mode 120000 index 78a016f782..0000000000 --- a/resources/rpmbuild/SOURCES/template/sites/default/settings.php +++ /dev/null @@ -1 +0,0 @@ -../../../../common/settings.php \ No newline at end of file diff --git a/resources/rpmbuild/SPECS/joinup.spec b/resources/rpmbuild/SPECS/joinup.spec deleted file mode 100644 index 987b82cf02..0000000000 --- a/resources/rpmbuild/SPECS/joinup.spec +++ /dev/null @@ -1,82 +0,0 @@ -#=============================================================================== -# Copyright 2017 European Commission -# Name: joinup.spec -#------------------------------------------------------------------------------- -# $Id: joinup.spec,v 1.0 2017/9/13 rvanhoudt Exp $ -#------------------------------------------------------------------------------- -# Purpose: RPM Spec file for joinup website -# Version 1.00:13 Sep 2017 Created. -#=============================================================================== - -# No debuginfo: -%define debug_package %{nil} - -%define name Joinup -%define summary Joinup Main website -%define version %(echo $BUILD_VERSION) -%define release Base -%define license EUPL -%define group Website -%define source0 %{name}-%{version}.tar.gz -%define url http://www.joinup.ey -%define vendor European Commission -%define packager Rudi Van Houdt -#%define buildroot %{_tmppath}/%{name}-root -%define _prefix /web/content/joinup - -Name: %{name} -Summary: %{summary} -Version: %{version} -Release: %{release} -License: %{license} -Group: %{group} -Source0: %{source0} -BuildArch: noarch -Requires: filesystem, bash, grep -Provides: %{name} -URL: %{url} -Buildroot: %{buildroot} -AutoReqProv: no - -%description -Deploying website to different environments - -%changelog -* Wed Sep 13 2017 Joinup - European Commission -- initial creation - -%prep -%setup -c -n %{name}-%{version} - -%build - -%install -rm -rf ${RPM_BUILD_ROOT} -install -d ${RPM_BUILD_ROOT}/%{_prefix} -cd .. -mkdir -p ${RPM_BUILD_ROOT}/%{_prefix}/%{name}-%{version} -cp -r %{name}-%{version}/%{name}-%{version} ${RPM_BUILD_ROOT}/%{_prefix}/ - -%post -echo "--------------------------------------------------------" -echo " Deploy %{name}-%{version} on the server" -echo "--------------------------------------------------------" - -rm -rf %{_prefix}/current -ln -s %{_prefix}/%{name}-%{version}/ %{_prefix}/current -cd %{_prefix} -ls -td1 Join* | tail -n +4 | xargs sudo rm -rf - -cd current -mkdir -p config/sync -cd .. - -IS_USER=`cat /etc/passwd |grep '%{_prefix}' | tr ":" "\n" | head -n 1` - -if [ $IS_USER ]; then - echo "Changing access rights of deployed app !" - chown $IS_USER:apache %{name}-%{version} -R -fi - -%files -%{_prefix}/%{name}-%{version} diff --git a/resources/runner/cphp.yml b/resources/runner/cphp.yml deleted file mode 100644 index 707c8081b3..0000000000 --- a/resources/runner/cphp.yml +++ /dev/null @@ -1,25 +0,0 @@ -# ContinuousPHP configs and commands. - -commands: - # Sets-up the Behat configuration files. - cphp:behat-setup: - - task: process - source: ${joinup.dir}/tests/behat.yml.dist - destination: ${joinup.dir}/tests/behat-group-a-cphp.yml - - task: exec - command: perl -i -pe 's/~\@wip/\~\@wip&&\~\@javascript&&\@group-a/g' ${joinup.dir}/tests/behat-group-a-cphp.yml - - task: process - source: ${joinup.dir}/tests/behat.yml.dist - destination: ${joinup.dir}/tests/behat-group-b-cphp.yml - - task: exec - command: perl -i -pe 's/~\@wip/\~\@wip&&\~\@javascript&&\@group-b/g' ${joinup.dir}/tests/behat-group-b-cphp.yml - - task: process - source: ${joinup.dir}/tests/behat.yml.dist - destination: ${joinup.dir}/tests/behat-only-selenium-cphp.yml - - task: exec - command: perl -i -pe 's/~\@wip/\~\@wip&&\@javascript/g' ${joinup.dir}/tests/behat-only-selenium-cphp.yml - - task: process - source: ${joinup.dir}/tests/behat.yml.dist - destination: ${joinup.dir}/tests/behat-remainder-cphp.yml - - task: exec - command: perl -i -pe 's/~\@wip/\~\@wip&&\~\@javascript&&\~\@group-a&&\~\@group-b/g' ${joinup.dir}/tests/behat-remainder-cphp.yml diff --git a/resources/runner/dev.yml b/resources/runner/dev.yml index 05f4575f42..664a51934f 100644 --- a/resources/runner/dev.yml +++ b/resources/runner/dev.yml @@ -52,11 +52,6 @@ commands: - site-clone - task: run command: toolkit:install-clone - - task: exec - command: ${drush.bin} - arguments: - - php:eval - - if (node_access_needs_rebuild()) { node_access_rebuild(); } dev:install-modules: - task: run @@ -181,3 +176,77 @@ commands: root: ${joinup.site_dir} - task: run command: config-readonly:enable + + dev:import-sparql-fixtures: + - task: run + command: virtuoso:import-fixtures + arguments: + - resources/fixtures/actor.rdf + - resources/fixtures/adms-definition.rdf + - resources/fixtures/ADMS-SW-v1.00.rdf + - resources/fixtures/ADMS_SKOS_v1.00.rdf + - resources/fixtures/business-process.rdf + - resources/fixtures/countries-skos.rdf + - resources/fixtures/data-theme-skos.rdf + - resources/fixtures/eif_conceptual_model.rdf + - resources/fixtures/eif_interoperability_layer.rdf + - resources/fixtures/eif_principle.rdf + - resources/fixtures/eif_recommendation.rdf + - resources/fixtures/EIRA_SKOS.rdf + - resources/fixtures/filetypes-skos.rdf + - resources/fixtures/languages-skos.rdf + - resources/fixtures/licence-legal-type.rdf + - resources/fixtures/product_type.rdf + - resources/fixtures/solution_category.rdf + - resources/fixtures/standardization_level.rdf + - resources/fixtures/test_resource_type.rdf + - task: run + command: sparql:query + arguments: + # We get our languages from the Metadata Registry. The Metadata Registry + # maintains two authority tables, one for individual languages and one + # for groups of languages called multilingual. For legacy reasons the + # two tables are published as a merger of the two. The multilingual + # language groups are not useful for us and we need to filter them out + # to avoid having the language lists polluted with entries labeled + # 'Multilingual Code'. + # See http://publications.europa.eu/mdr/resource//documentation/schema/cat.html#element_languages + # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2764 + - DELETE FROM { ?entity ?field ?value. } WHERE { ?entity ?field ?value . FILTER(str(?value) = "Multilingual Code") } + # See ISAICP-3084 + - INSERT INTO { } + # The licences are defined in both the adms-sw and the adms-skos files. + # In adms-sw the version 1.1 is included while the adms-skos has the + # version 1.0. As a bundle can have only one uri mapped, the 1.0 version + # has to be removed. + # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2503 + - DELETE FROM { ?entity ?field ?value. } WHERE { ?entity ?field ?value . ?entity }; + # Remove any non english version of the taxonomy terms since we are only + # supporting english version in the website. If more terms are needed, + # the supported languages should be extended (the "en" below). This + # needs to repeat multiple times as the terms might. + - DELETE { GRAPH ?g { ?entity ?field ?value } } WHERE { GRAPH ?g { ?entity ?field ?value . FILTER (LANG(?value) != "" && LANG(?value) != "en") } }; + # See ISAICP-3216. Add the "Concept" type to all collection elements so + # that they are listed as Parent terms. + - WITH INSERT { ?subject a skos:Concept } WHERE { ?subject a skos:Collection . }; + # Add the link to all "Concept" type elements so that they are all + # considered as children of the EIRA vocabulary regardless of the depth. + - WITH INSERT INTO { ?subject skos:topConceptOf } WHERE { ?subject a skos:Concept .}; + # Create a backwards connection from the children to the parent. + - WITH INSERT { ?member skos:broaderTransitive ?collection } WHERE { ?collection a skos:Collection . ?collection skos:member ?member }; + # Remove deprecated countries from the country list. See ISAICP-3442. + - WITH DELETE { ?entity ?field ?value. } WHERE { ?entity ?field ?value . ?entity ?date . FILTER ( bound(?date) ) }; + # Languages are required to be of type http://purl.org/dc/terms/Location + # but are listed as http://www.w3.org/2004/02/skos/core#Concept which is + # also correct. Add the entry: + # { ?subject a } for each language + # in the graph. + # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-4566 + - WITH INSERT { ?entity } WHERE { ?entity a }; + # As with the EIRA vocabulary, for elements of type skos:Collection, add + # the skos:Concept as a type to the list so that the parent elements are + # properly mapped to a bundle, and add the skos:broader for the + # backwards connection from the child to the parent. + - WITH INSERT { ?subject a skos:Concept } WHERE { ?subject a skos:Collection . }; + - WITH INSERT { ?subject skos:topConceptOf } WHERE { ?subject a skos:Concept . FILTER NOT EXISTS { ?subject skos:topConceptOf } }; + - WITH INSERT { ?member skos:broaderTransitive ?collection } WHERE { ?collection a skos:Collection . ?collection skos:member ?member }; diff --git a/resources/runner/digit_qa_pipeline/pipeline.yml b/resources/runner/digit_qa_pipeline/pipeline.yml new file mode 100644 index 0000000000..1400cb467f --- /dev/null +++ b/resources/runner/digit_qa_pipeline/pipeline.yml @@ -0,0 +1,58 @@ +# Settings and commands only available inside Digit QA Pipeline. + +.before: &before + # Ensure writable public file directory. + - task: chgrp + file: ${joinup.site_dir}/sites/default/files + group: ${env.DAEMON_GROUP} + recursive: true + - task: chmod + file: ${joinup.site_dir}/sites/default/files + # Octal 0775. + permissions: 509 + umask: 0 + recursive: true + # Ensure writable private files directory. + - task: chgrp + file: ${joinup.files_private_dir} + group: ${env.DAEMON_GROUP} + recursive: true + - task: chmod + file: ${joinup.files_private_dir} + # Octal 0775. + permissions: 509 + umask: 0 + recursive: true + # Ensure writable temporary files directory. + - task: chgrp + file: ${toolkit.tmp_folder} + group: ${env.DAEMON_GROUP} + recursive: true + - task: chmod + file: ${toolkit.tmp_folder} + # Octal 0775. + permissions: 509 + umask: 0 + recursive: true + + # Digit QA pipeline installs the site in the 'install-clean' job and dumps the + # installed MySQL database, along with the codebase, as artifacts. Then + # subsequent Behat suite sub-jobs are restoring the codebase and MySQL dump + # from artifacts. While this might work for most of the sites, it's not enough + # for Joinup, as Joinup actively uses additional Virtuoso and a Solr backends, + # along with MySQL. Thus, before running the behat tests, we need to re-run + # again the import of SPARQL fixtures. + # See \Joinup\TaskRunner\ConfigProviders\DigitQaPipelineConfigProvider + - task: run + command: solr:empty + - task: run + command: sparql:empty + - task: run + command: dev:import-sparql-fixtures + +behat: + commands: + before: *before +phpunit: + commands: + before: *before diff --git a/resources/runner/drupal.yml b/resources/runner/drupal.yml index e03fd4d93c..fd68f0de31 100644 --- a/resources/runner/drupal.yml +++ b/resources/runner/drupal.yml @@ -35,6 +35,7 @@ drupal: - Matomo & OpenEuropa Webtools Analytics - Custom error handler - Permissions + - Null mail collector site-clone: - Main settings - Databases @@ -44,7 +45,7 @@ drupal: - Custom error handler - Permissions - Error logging - - Mail catch + - Development mail collector - Redis - Custom queue services site-clean: @@ -59,7 +60,7 @@ drupal: - OpenEuropa Newsroom Newsletter - OpenEuropa Webtools Geocoding Cache - Error logging - - Mail catch + - Development mail collector - Redis - Custom queue services behat: @@ -75,6 +76,7 @@ drupal: - OpenEuropa Webtools Geocoding Cache - Redis - Custom queue services + - Test mail collector error_page_test: - Main settings - Databases @@ -86,9 +88,11 @@ drupal: - Development - OpenEuropa Newsroom Newsletter - OpenEuropa Webtools Geocoding Cache + - Error logging - Redis - Pipe errors to a temporary file - Custom queue services + - Test mail collector phpunit: - Main settings - Databases @@ -102,8 +106,10 @@ drupal: - OpenEuropa Webtools Geocoding Cache - Error logging - Custom queue services + - Test mail collector prod: - Main settings + - Site email - Databases - Configuration - Search API @@ -111,6 +117,8 @@ drupal: - Custom error handler - Redis - Custom queue services + - Mail transport + - Monolog header: | 'mysql', ]; $databases['sparql_default']['default'] = [ - 'host' => getenv('SPARQL_HOST'), - 'port' => getenv('SPARQL_PORT'), + 'host' => getenv('DRUPAL_SPARQL_HOSTNAME'), + 'port' => getenv('DRUPAL_SPARQL_PORT'), 'namespace' => 'Drupal\\joinup_sparql\\Driver\\Database\\joinup_sparql', 'driver' => 'sparql', ]; - $settings['joinup']['sparql_public_endpoint'] = getenv('SPARQL_PUBLIC_ENDPOINT'); + $settings['joinup']['sparql_public_endpoint'] = getenv('DRUPAL_SPARQL_PUBLIC_ENDPOINT'); Permissions: | $settings['skip_permissions_hardening'] = TRUE; - Stage File Proxy: | - $config['stage_file_proxy.settings'] = [ - 'hotlink' => FALSE, - 'origin' => 'https://joinup.ec.europa.eu/', - 'origin_dir' => FALSE, - 'use_imagecache_root' => TRUE, - 'verify' => TRUE, - ]; - Mail catch: | + Null mail collector: | + $config['system.mail']['interface']['default'] = 'null'; + $config['mailsystem.settings']['defaults']['sender'] = 'null'; + Development mail collector: | $config['system.mail']['interface']['default'] = 'devel_mail_log'; $config['mailsystem.settings']['defaults']['sender'] = 'devel_mail_log'; + Test mail collector: | + $config['system.mail']['interface']['default'] = 'test_mail_collector'; + $config['mailsystem.settings']['defaults']['sender'] = 'test_mail_collector'; + Site email: + $config['system.site']['mail'] = getenv('DRUPAL_SITE_MAIL'); + Mail transport: | + $config['swiftmailer.transport']['sendmail_path'] = getenv('DRUPAL_MAIL_SENDMAIL_PATH'); + $config['swiftmailer.transport']['sendmail_mode'] = getenv('DRUPAL_MAIL_SENDMAIL_MODE'); + $config['swiftmailer.transport']['spool_directory'] = getenv('DRUPAL_MAIL_SPOOL_DIR'); Search API: | - $config['search_api.server.solr_published']['backend_config']['connector_config'] = parse_url(getenv('SOLR_CORE_PUBLISHED_URL')); - $config['search_api.server.solr_published']['backend_config']['connector_config']['core'] = getenv('SOLR_CORE_PUBLISHED_NAME'); - $config['search_api.server.solr_unpublished']['backend_config']['connector_config'] = parse_url(getenv('SOLR_CORE_UNPUBLISHED_URL')); - $config['search_api.server.solr_unpublished']['backend_config']['connector_config']['core'] = getenv('SOLR_CORE_UNPUBLISHED_NAME');; + $config['search_api.server.joinup']['backend_config']['connector_config'] = parse_url(getenv('SOLR_URL')); + $config['search_api.server.joinup']['backend_config']['connector_config']['core'] = getenv('SOLR_CORE'); Matomo & OpenEuropa Webtools Analytics: | $config['matomo.settings']['site_id'] = getenv('MATOMO_SITE_ID'); $config['matomo.settings']['url_http'] = getenv('MATOMO_SITE_URL_HTTP'); @@ -224,7 +240,7 @@ drupal: $config['oe_webtools_analytics.settings']['sitePath'] = getenv('OE_WEBTOOLS_ANALYTICS_SITE_PATH'); $config['oe_webtools_analytics.settings']['instance'] = getenv('OE_WEBTOOLS_ANALYTICS_SITE_INSTANCE'); Redis: | - $settings['redis.connection']['interface'] = getenv('REDIS_INTERFACE'); + $settings['redis.connection']['interface'] = 'Predis'; $settings['redis.connection']['host'] = getenv('REDIS_HOST'); $settings['redis.connection']['port'] = getenv('REDIS_PORT'); $settings['cache']['default'] = 'cache.backend.redis'; @@ -247,6 +263,8 @@ drupal: $settings['extension_discovery_scan_tests'] = TRUE; Error logging: | $config['system.logging']['error_level'] = 'verbose'; + Monolog: | + $settings['container_yamls'][] = 'modules/custom/joinup_core/joinup_core.monolog.services.yml'; Custom queue services: | $settings['queue_service_joinup_group:group_update'] = 'joinup_group.group_aware_queue'; $settings['queue_service_joinup_group:group_content_update'] = 'joinup_group.group_aware_queue'; diff --git a/resources/runner/joinup.yml b/resources/runner/joinup.yml index cd2b0cdd94..a106284a94 100644 --- a/resources/runner/joinup.yml +++ b/resources/runner/joinup.yml @@ -4,6 +4,7 @@ joinup: site_dir: ${joinup.dir}/web theme_dir: ${joinup.site_dir}/themes/joinup db_dir: ${joinup.dir}/db + files_private_dir: ${joinup.site_dir}/${env.DRUPAL_PRIVATE_FILE_SYSTEM} scss: import_dir: ${joinup.theme_dir}/scss diff --git a/resources/runner/solr.yml b/resources/runner/solr.yml index ca0b18b1df..a57476474f 100644 --- a/resources/runner/solr.yml +++ b/resources/runner/solr.yml @@ -8,10 +8,8 @@ solr: download_url: http://archive.apache.org/dist/lucene/solr/${solr.version}/solr-${solr.version}.tgz config_dir: ${joinup.site_dir}/modules/contrib/search_api_solr/solr-conf/6.x core: - published: - dir: ${solr.dir}/server/solr/${env.SOLR_CORE_PUBLISHED_NAME} - unpublished: - dir: ${solr.dir}/server/solr/${env.SOLR_CORE_UNPUBLISHED_NAME} + joinup: + dir: ${solr.dir}/server/solr/${env.SOLR_CORE} snapshot_dir: ${joinup.db_dir}/solr commands: @@ -39,9 +37,7 @@ commands: - task: remove file: ${solr.snapshot_dir}/solr.tar - task: remove - file: ${solr.snapshot_dir}/snapshot.published - - task: remove - file: ${solr.snapshot_dir}/snapshot.unpublished + file: ${solr.snapshot_dir}/snapshot.joinup # Download and unpack the archive. - task: run command: toolkit:download-dump @@ -51,12 +47,6 @@ commands: # Unpack and organize. - task: exec command: tar -xvf ${solr.snapshot_dir}/solr.tar -C ${solr.snapshot_dir} - - task: rename - from: ${solr.snapshot_dir}/snapshot.joinup - to: ${solr.snapshot_dir}/snapshot.published - - task: rename - from: ${solr.snapshot_dir}/snapshot.joinup-unpublished - to: ${solr.snapshot_dir}/snapshot.unpublished # Cleanup. - task: remove file: ${solr.snapshot_dir}/solr.tar @@ -66,15 +56,7 @@ commands: - task: exec command: curl arguments: - - ${env.SOLR_CORE_PUBLISHED_URL}/${env.SOLR_CORE_PUBLISHED_NAME}/update?commit=true&wt=json - options: - request: POST - header: 'Content-Type: application/xml' - data: '*:*' - - task: exec - command: curl - arguments: - - ${env.SOLR_CORE_UNPUBLISHED_URL}/${env.SOLR_CORE_UNPUBLISHED_NAME}/update?commit=true&wt=json + - ${env.SOLR_URL}/${env.SOLR_CORE}/update?commit=true&wt=json options: request: POST header: 'Content-Type: application/xml' @@ -87,22 +69,14 @@ commands: - task: run command: solr:restore-core arguments: - - published - - task: run - command: solr:restore-core - arguments: - - unpublished + - joinup # Takes a snapshot of the Solr index. solr:backup: - task: run command: solr:backup-core arguments: - - published - - task: run - command: solr:backup-core - arguments: - - unpublished + - joinup # Downloads and installs the Solr binary. solr:download-bin: @@ -134,6 +108,4 @@ commands: - task: run command: solr:start - task: exec - command: test -d ${solr.core.published.dir} || ${solr.bin} create_core -c ${env.SOLR_CORE_PUBLISHED_NAME} -d ${solr.config_dir} - - task: exec - command: test -d ${solr.core.unpublished.dir} || ${solr.bin} create_core -c ${env.SOLR_CORE_UNPUBLISHED_NAME} -d ${solr.config_dir} + command: test -d ${solr.core.joinup.dir} || ${solr.bin} create_core -c ${env.SOLR_CORE} -d ${solr.config_dir} diff --git a/resources/runner/testing.yml b/resources/runner/testing.yml index b671852b4f..a8dc17bdac 100644 --- a/resources/runner/testing.yml +++ b/resources/runner/testing.yml @@ -3,7 +3,7 @@ behat: screenshots: local: - dir: ${toolkit.tmp_folder}/behat + dir: ${env.ARTIFACTS_DIR} # Either 'firefox' or 'chrome'. browser_name: chrome formatter: @@ -11,6 +11,7 @@ behat: phpcs: file: + bin: ${joinup.dir}/vendor/bin/phpcs config: ${joinup.dir}/phpcs.xml standard: ${joinup.dir}/phpcs-ruleset.xml.dist global: ${joinup.dir}/vendor/squizlabs/php_codesniffer/CodeSniffer.conf @@ -55,12 +56,6 @@ phpcs: commands: - # Sets-up the tests/behat.yml file. - testing:behat-setup: - - task: process - source: ${joinup.dir}/tests/behat.yml.dist - destination: ${joinup.dir}/tests/behat.yml - # Adds a Git hook that enforces coding standards check on push. testing:phpcs-git-hook: - task: remove @@ -74,4 +69,5 @@ commands: command: php -d memory_limit=-1 ${phpstan.bin} --no-progress analyse src tests/src web/modules/custom web/profiles web/themes testing:check-deprecated-code-contrib: - task: exec - command: php -d memory_limit=-1 ${phpstan.bin} --no-progress analyse web/modules/contrib + # Mute the returning error code as is used only for reporting. + command: php -d memory_limit=-1 ${phpstan.bin} --no-progress analyse web/modules/contrib || true diff --git a/resources/runner/toolkit.yml b/resources/runner/toolkit.yml index 39b3aff32a..2bd9bf0fbf 100644 --- a/resources/runner/toolkit.yml +++ b/resources/runner/toolkit.yml @@ -27,8 +27,6 @@ commands: # Overrides the toolkit:build-dev command. toolkit:build-dev: - - task: run - command: composer:install - task: copy from: ${joinup.site_dir}/sites/default/default.services.yml to: ${joinup.site_dir}/sites/default/services.yml @@ -36,14 +34,17 @@ commands: command: testing:phpcs-setup - task: run command: testing:phpcs-git-hook - - task: run - command: testing:behat-setup + - task: process + source: ${joinup.dir}/behat.yml.dist + destination: ${joinup.dir}/behat.yml - task: run command: joinup:compile-scss - task: mkdir - dir: ${env.DRUPAL_PRIVATE_FILE_SYSTEM} + dir: ${joinup.files_private_dir} - task: mkdir dir: ${env.DRUPAL_FILE_TEMP_PATH} + - task: exec + command: test "$(git tag)" = "" || git describe --tags | tr -d '\n' > ${joinup.dir}/VERSION # Overrides toolkit:install-clean. toolkit:install-clean: @@ -62,77 +63,7 @@ commands: - task: run command: drupal:site-install - task: run - command: virtuoso:import-fixtures - arguments: - - resources/fixtures/actor.rdf - - resources/fixtures/adms-definition.rdf - - resources/fixtures/ADMS-SW-v1.00.rdf - - resources/fixtures/ADMS_SKOS_v1.00.rdf - - resources/fixtures/business-process.rdf - - resources/fixtures/countries-skos.rdf - - resources/fixtures/data-theme-skos.rdf - - resources/fixtures/eif_conceptual_model.rdf - - resources/fixtures/eif_interoperability_layer.rdf - - resources/fixtures/eif_principle.rdf - - resources/fixtures/eif_recommendation.rdf - - resources/fixtures/EIRA_SKOS.rdf - - resources/fixtures/filetypes-skos.rdf - - resources/fixtures/languages-skos.rdf - - resources/fixtures/licence-legal-type.rdf - - resources/fixtures/product_type.rdf - - resources/fixtures/solution_category.rdf - - resources/fixtures/standardization_level.rdf - - resources/fixtures/test_resource_type.rdf - - task: run - command: sparql:query - arguments: - # We get our languages from the Metadata Registry. The Metadata Registry - # maintains two authority tables, one for individual languages and one - # for groups of languages called multilingual. For legacy reasons the - # two tables are published as a merger of the two. The multilingual - # language groups are not useful for us and we need to filter them out - # to avoid having the language lists polluted with entries labeled - # 'Multilingual Code'. - # See http://publications.europa.eu/mdr/resource//documentation/schema/cat.html#element_languages - # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2764 - - DELETE FROM { ?entity ?field ?value. } WHERE { ?entity ?field ?value . FILTER(str(?value) = "Multilingual Code") } - # See ISAICP-3084 - - INSERT INTO { } - # The licences are defined in both the adms-sw and the adms-skos files. - # In adms-sw the version 1.1 is included while the adms-skos has the - # version 1.0. As a bundle can have only one uri mapped, the 1.0 version - # has to be removed. - # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2503 - - DELETE FROM { ?entity ?field ?value. } WHERE { ?entity ?field ?value . ?entity }; - # Remove any non english version of the taxonomy terms since we are only - # supporting english version in the website. If more terms are needed, - # the supported languages should be extended (the "en" below). This - # needs to repeat multiple times as the terms might. - - DELETE { GRAPH ?g { ?entity ?field ?value } } WHERE { GRAPH ?g { ?entity ?field ?value . FILTER (LANG(?value) != "" && LANG(?value) != "en") } }; - # See ISAICP-3216. Add the "Concept" type to all collection elements so - # that they are listed as Parent terms. - - WITH INSERT { ?subject a skos:Concept } WHERE { ?subject a skos:Collection . }; - # Add the link to all "Concept" type elements so that they are all - # considered as children of the EIRA vocabulary regardless of the depth. - - WITH INSERT INTO { ?subject skos:topConceptOf } WHERE { ?subject a skos:Concept .}; - # Create a backwards connection from the children to the parent. - - WITH INSERT { ?member skos:broaderTransitive ?collection } WHERE { ?collection a skos:Collection . ?collection skos:member ?member }; - # Remove deprecated countries from the country list. See ISAICP-3442. - - WITH DELETE { ?entity ?field ?value. } WHERE { ?entity ?field ?value . ?entity ?date . FILTER ( bound(?date) ) }; - # Languages are required to be of type http://purl.org/dc/terms/Location - # but are listed as http://www.w3.org/2004/02/skos/core#Concept which is - # also correct. Add the entry: - # { ?subject a } for each language - # in the graph. - # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-4566 - - WITH INSERT { ?entity } WHERE { ?entity a }; - # As with the EIRA vocabulary, for elements of type skos:Collection, add - # the skos:Concept as a type to the list so that the parent elements are - # properly mapped to a bundle, and add the skos:broader for the - # backwards connection from the child to the parent. - - WITH INSERT { ?subject a skos:Concept } WHERE { ?subject a skos:Collection . }; - - WITH INSERT { ?subject skos:topConceptOf } WHERE { ?subject a skos:Concept . FILTER NOT EXISTS { ?subject skos:topConceptOf } }; - - WITH INSERT { ?member skos:broaderTransitive ?collection } WHERE { ?collection a skos:Collection . ?collection skos:member ?member }; + command: dev:import-sparql-fixtures # TODO: Remove this in ISAICP-5271. Newer versions of Search API module are # storing the site hash into a state variable, rather than a config. # See https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-5271. @@ -166,3 +97,32 @@ commands: - if (node_access_needs_rebuild()) { node_access_rebuild(); } - task: run command: config-readonly:enable + + # Overrides the toolkit:test-phpcs command. + toolkit:test-phpcs: + # Handle a potential case where the repo has been shallow cloned. Typically, + # this happens in GitLab pipelines, where the repos are shallow cloned for + # performance reasons. A shallow clone prevents us to get the Git latest tag + # as no tags are available. But we require this info during the coding + # standards check. + # See \Joinup\CodingStandards\Sniffs\NamingConventions\ValidUpdateNameSniff + - task: exec + command: if $(git rev-parse --is-shallow-repository); then git fetch --unshallow; fi + - task: run + command: testing:phpcs-setup + - task: exec + command: ${phpcs.file.bin} + #- task: run + # command: testing:check-deprecated-code + #- task: run + # command: testing:check-deprecated-code-contrib + + # Lints YAML files using ESLint. + toolkit:lint-yaml: + - task: exec + command: ${joinup.dir}/node_modules/.bin/eslint --ext .yml . + + # Fixes YAML files using ESLint. + toolkit:fix-yaml: + - task: exec + command: ${joinup.dir}/node_modules/.bin/eslint --ext .yml --fix . diff --git a/resources/runner/virtuoso.yml b/resources/runner/virtuoso.yml index d7c594b5e4..0a61c45665 100644 --- a/resources/runner/virtuoso.yml +++ b/resources/runner/virtuoso.yml @@ -12,10 +12,10 @@ isql: bin: /usr/bin/isql-vt sparql: - host: ${env.SPARQL_HOST} - port: ${env.SPARQL_PORT} - user: ${env.SPARQL_USER} - password: ${env.SPARQL_PASSWORD} + host: ${env.DRUPAL_SPARQL_HOSTNAME} + port: ${env.DRUPAL_SPARQL_PORT} + user: ${env.DRUPAL_SPARQL_USER} + password: ${env.DRUPAL_SPARQL_PASSWORD} commands: diff --git a/resources/solr/conf/elevate.xml b/resources/solr/conf/elevate.xml new file mode 100644 index 0000000000..193a0e727a --- /dev/null +++ b/resources/solr/conf/elevate.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/resources/solr/conf/mapping-ISOLatin1Accent.txt b/resources/solr/conf/mapping-ISOLatin1Accent.txt new file mode 100644 index 0000000000..b92d03c550 --- /dev/null +++ b/resources/solr/conf/mapping-ISOLatin1Accent.txt @@ -0,0 +1,14 @@ +# This file contains character mappings for the default fulltext field type. +# The source characters (on the left) will be replaced by the respective target +# characters before any other processing takes place. +# Lines starting with a pound character # are ignored. +# +# For sensible defaults, use the mapping-ISOLatin1Accent.txt file distributed +# with the example application of your Solr version. +# +# Examples: +# "À" => "A" +# "\u00c4" => "A" +# "\u00c4" => "\u0041" +# "æ" => "ae" +# "\n" => " " diff --git a/resources/solr/conf/protwords.txt b/resources/solr/conf/protwords.txt new file mode 100644 index 0000000000..cda8581497 --- /dev/null +++ b/resources/solr/conf/protwords.txt @@ -0,0 +1,7 @@ +#----------------------------------------------------------------------- +# This file blocks words from being operated on by the stemmer and word delimiter. +& +< +> +' +" diff --git a/resources/solr/conf/schema.xml b/resources/solr/conf/schema.xml new file mode 100644 index 0000000000..e4317cbfd0 --- /dev/null +++ b/resources/solr/conf/schema.xml @@ -0,0 +1,766 @@ + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + &extrafields; + + + &extratypes; + + + id + + + + + diff --git a/resources/solr/conf/schema_extra_fields.xml b/resources/solr/conf/schema_extra_fields.xml new file mode 100644 index 0000000000..4cb53eaa68 --- /dev/null +++ b/resources/solr/conf/schema_extra_fields.xml @@ -0,0 +1,13 @@ + +Don't use the config XML templates directly. Use the config generator to get +your individual config files. Use the "Get config.zip" button in the UI or +drush solr-gsc my_solr_server +See INSTALL.md for details. diff --git a/resources/solr/conf/schema_extra_types.xml b/resources/solr/conf/schema_extra_types.xml new file mode 100644 index 0000000000..e5c06aeb7e --- /dev/null +++ b/resources/solr/conf/schema_extra_types.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/solr/conf/solrconfig.xml b/resources/solr/conf/solrconfig.xml new file mode 100644 index 0000000000..054e661771 --- /dev/null +++ b/resources/solr/conf/solrconfig.xml @@ -0,0 +1,1471 @@ + + + + +]> + + + + + + + ${solr.abortOnConfigurationError:true} + + + ${solr.luceneMatchVersion:LUCENE_60} + + + + + + + + + + + + + + + + + + + + ${solr.data.dir:} + + + + + + + + + ${solr.hdfs.home:} + + ${solr.hdfs.confdir:} + + ${solr.hdfs.blockcache.enabled:true} + + ${solr.hdfs.blockcache.global:true} + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4 + + + + + + + ${solr.lock.type:native} + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + ${solr.ulog.dir:} + + + + + ${solr.autoCommit.MaxDocs:10000} + ${solr.autoCommit.MaxTime:120000} + false + + + + + ${solr.autoSoftCommit.MaxDocs:2000} + ${solr.autoSoftCommit.MaxTime:10000} + + + + + + + + + + + + + + + + 1024 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + 20 + + + 200 + + + + + + + + + + + + static firstSearcher warming in solrconfig.xml + + + + + + false + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + lucene + id + explicit + true + + ${solr.selectSearchHandler.timeAllowed:-1} + + + false + + true + false + + 1 + + + spellcheck + elevator + + + + + + + explicit + json + true + text + + + + + + + + + + content + 1 + 1 + 3 + 15 + 20 + false + + ${solr.mlt.timeAllowed:2000} + + + + + + + content + explicit + true + + + + + + text + + + + + + + true + ignored_ + + + true + links + ignored_ + + + + + + + + + + + + + + + explicit + true + + + + + + + ${solr.replication.master:false} + commit + startup + ${solr.replication.confFiles:schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml} + + + ${solr.replication.slave:false} + ${solr.replication.masterUrl:http://localhost:8983/solr}/replication + ${solr.replication.pollInterval:00:00:60} + + + + + + + true + json + true + + + + + + + + &spellcheck; + + + + + spell + + default + wordbreak + on + false + false + 1 + 5 + 5 + true + true + 10 + 5 + + + spellcheck + + + + + &extra; + + + + true + und + 10 + + + suggest + + + + + + + + + text + true + + + tvComponent + + + + + + + + + + true + false + + + terms + + + + + + + false + false + false + true + false + 1 + false + 10 + + + terms + spellcheck + suggest + + + + + + + string + elevate.xml + + + + + + explicit + text + + + elevator + + + + + + + + + + + 100 + + + + + + + + 70 + + 0.5 + + [-\w ,/\n\"']{20,200} + + + + + + + ]]> + ]]> + + + + + + + + + + + + + + + + + + + + + + + + ,, + ,, + ,, + ,, + ,]]> + ]]> + + + + + + 10 + .,!? + + + + + + + WORD + + + en + US + + + + + + + + + + + + + + + + + + + + + + application/json; charset=UTF-8 + + + + + + + + + 5 + + + + + + + + + + + + + + + diff --git a/resources/solr/conf/solrconfig_extra.xml b/resources/solr/conf/solrconfig_extra.xml new file mode 100644 index 0000000000..0d4102664a --- /dev/null +++ b/resources/solr/conf/solrconfig_extra.xml @@ -0,0 +1,12 @@ + + + und + AnalyzingInfixLookupFactory + DocumentDictionaryFactory + twm_suggest + text + sm_context_tags + true + false + + diff --git a/resources/solr/conf/solrconfig_spellcheck.xml b/resources/solr/conf/solrconfig_spellcheck.xml new file mode 100644 index 0000000000..5c9d7ad79e --- /dev/null +++ b/resources/solr/conf/solrconfig_spellcheck.xml @@ -0,0 +1,89 @@ + + + + textSpell + + + + + + + default + spell + solr.DirectSolrSpellChecker + + internal + + 0.5 + + 2 + + 1 + + 5 + + 4 + + 0.01 + + + + + + wordbreak + solr.WordBreakSolrSpellChecker + name + true + true + 10 + + + + + + + + + + + diff --git a/resources/solr/conf/solrcore.properties b/resources/solr/conf/solrcore.properties new file mode 100644 index 0000000000..d7d045b0fd --- /dev/null +++ b/resources/solr/conf/solrcore.properties @@ -0,0 +1,20 @@ +# Defines Solr properties for this specific core. +solr.replication.master=false +solr.replication.slave=false +solr.replication.pollInterval=00:00:60 +solr.replication.masterUrl=http://localhost:8983/solr +solr.replication.confFiles=schema.xml,mapping-ISOLatin1Accent.txt,protwords.txt,stopwords.txt,synonyms.txt,elevate.xml +solr.mlt.timeAllowed=2000 +# You should not set your luceneMatchVersion to anything lower than your Solr +# Version. +solr.luceneMatchVersion=6.0 +solr.selectSearchHandler.timeAllowed=-1 +# autoCommit after 10000 docs +solr.autoCommit.MaxDocs=10000 +# autoCommit after 2 minutes +solr.autoCommit.MaxTime=120000 +# autoSoftCommit after 2000 docs +solr.autoSoftCommit.MaxDocs=2000 +# autoSoftCommit after 10 seconds +solr.autoSoftCommit.MaxTime=10000 +solr.install.dir=../../.. diff --git a/resources/solr/conf/stopwords.txt b/resources/solr/conf/stopwords.txt new file mode 100644 index 0000000000..d7f243e48a --- /dev/null +++ b/resources/solr/conf/stopwords.txt @@ -0,0 +1,4 @@ +# Contains words which shouldn't be indexed for fulltext fields, e.g., because +# they're too common. For documentation of the format, see +# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.StopFilterFactory +# (Lines starting with a pound character # are ignored.) diff --git a/resources/solr/conf/synonyms.txt b/resources/solr/conf/synonyms.txt new file mode 100644 index 0000000000..7d22eea6d6 --- /dev/null +++ b/resources/solr/conf/synonyms.txt @@ -0,0 +1,3 @@ +# Contains synonyms to use for your index. For the format used, see +# http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory +# (Lines starting with a pound character # are ignored.) diff --git a/resources/uat/settings.uat.php b/resources/uat/settings.uat.php deleted file mode 100644 index 3fda6a5557..0000000000 --- a/resources/uat/settings.uat.php +++ /dev/null @@ -1,43 +0,0 @@ -success\< ]]; do sleep 1; done) - /usr/bin/curl -sS "http://localhost:8983/solr/drupal_unpublished/replication?command=restore&name=unpublished&location=/solr/snapshot&wt=xml" - (until [[ "$(/usr/bin/curl -sS ''http://localhost:8983/solr/drupal_unpublished/replication?command=restorestatus'')" =~ \>success\< ]]; do sleep 1; done) + /usr/bin/curl -sS "http://localhost:8983/solr/${SOLR_CORE}/replication?command=restore&name=joinup&location=/solr/snapshot&wt=xml" + (until [[ "$(/usr/bin/curl -sS ''http://localhost:8983/solr/${SOLR_CORE}/replication?command=restorestatus'')" =~ \>success\< ]]; do sleep 1; done) /opt/solr/bin/solr stop fi diff --git a/scripts/rpmbuild/make_joinup_build.sh b/scripts/rpmbuild/make_joinup_build.sh deleted file mode 100755 index 537f87a081..0000000000 --- a/scripts/rpmbuild/make_joinup_build.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -# This script will build an RPM package intended for deploying on production. - -# Define paths. -if [ -z ${COMPOSER_PATH} ]; then - COMPOSER_PATH=/usr/local/bin/composer -fi -SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT=$(realpath ${SCRIPT_PATH}/../..) -BUILD_ROOT=${PROJECT_ROOT}/tmp/rpmbuild - -# Determine a version string that identifies the current version. First check if -# a tag is available for the checked out revision. If that fails, construct a -# version string consisting of the branch name and the ref. -cd ${PROJECT_ROOT} -BUILD_VERSION=$(git describe --exact-match --tags HEAD 2>/dev/null) - -if [ $? -ne 0 ]; then - BUILD_VERSION=$(git symbolic-ref --short HEAD)-$(git rev-parse HEAD) -fi - -# Clean up existing builds. -if [ -d ${BUILD_ROOT} ]; then - chmod -R u+w ${BUILD_ROOT} - rm -rf ${BUILD_ROOT} || exit 1 -fi - -mkdir -p ${BUILD_ROOT} - -# Create a fresh build root containing the scaffolding files. -cp -r ${PROJECT_ROOT}/resources/rpmbuild/* ${BUILD_ROOT} || exit 1 - -SOURCES_DIR=${BUILD_ROOT}/SOURCES -JOINUP_DIR=${SOURCES_DIR}/Joinup-${BUILD_VERSION} - -# Download composer dependencies. -${COMPOSER_PATH} install || exit 1 - -# Build the site. -./vendor/bin/run toolkit:build-dist || exit 1 - -# Move the distribution on its location. -mv dist ${JOINUP_DIR} || exit 1 - -# Replace files and folders with production symlinks. -rm -rf ${JOINUP_DIR}/web/sites/default/settings.php -rm -rf ${JOINUP_DIR}/web/sites/default/files -cp -r ${SOURCES_DIR}/template/* ${JOINUP_DIR}/web || exit 1 -rm -r ${SOURCES_DIR}/template || exit 1 - -# Fix Drush settings. -echo 'options:' > ${JOINUP_DIR}/drush/drush.yml -echo " uri: ${DRUPAL_BASE_URL}" >> ${JOINUP_DIR}/drush/drush.yml - -# Output the version number in a file that will be appended to the HTTP headers. -echo X-build-id: $BUILD_VERSION > ${SOURCES_DIR}/buildinfo.ini - -# Tar up the source files. -tar -czf ${SOURCES_DIR}/Joinup-${BUILD_VERSION}.tar.gz -C ${SOURCES_DIR} Joinup-${BUILD_VERSION}/ || exit 1 -rm -rf ${JOINUP_DIR} || exit 1 - -# Todo: Exiting here, the remainder is for Rudi :) -echo "Build is available in ${BUILD_ROOT}." -exit 0 - -# Copy files to the production build storage of the EC. -# Todo: This should be a separate step so this script can also be used outside -# of the European Commission infrastructure. - -cd ${BUILD_ROOT}/SPECS -rpmbuild -ba joinup.spec --define "_topdir ${BUILD_ROOT}" - -cd ${BUILD_ROOT}/RPMS -cp -R noarch /mnt/shared/distribution/ -rm -rf noarch -cd /mnt/shared/distribution/ -createrepo . --no-database diff --git a/scripts/rpmbuild/make_joinup_build_acc.sh b/scripts/rpmbuild/make_joinup_build_acc.sh deleted file mode 100755 index cbd2c9ebfa..0000000000 --- a/scripts/rpmbuild/make_joinup_build_acc.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# This script will build an RPM package intended for deploying on production. - -# Define paths. -if [ -z ${COMPOSER_PATH} ]; then - COMPOSER_PATH=/usr/local/bin/composer -fi -SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT=$(realpath ${SCRIPT_PATH}/../..) -BUILD_ROOT=${PROJECT_ROOT}/tmp/rpmbuild - -# Determine a version string that identifies the current version. First check if -# a tag is available for the checked out revision. If that fails, construct a -# version string consisting of the branch name and the ref. -cd ${PROJECT_ROOT} - -# Clean up existing builds. -if [ -d ${BUILD_ROOT} ]; then - chmod -R u+w ${BUILD_ROOT} - rm -rf ${BUILD_ROOT} || exit 1 -fi - -mkdir -p ${BUILD_ROOT} - -# Create a fresh build root containing the scaffolding files. -cp -r ${PROJECT_ROOT}/resources/rpmbuild/* ${BUILD_ROOT} || exit 1 - -SOURCES_DIR=${BUILD_ROOT}/SOURCES -JOINUP_DIR=${SOURCES_DIR}/Joinup-${BUILD_VERSION} - -# Download composer dependencies. -${COMPOSER_PATH} install || exit 1 - -# Build the site. -./vendor/bin/run toolkit:build-dist || exit 1 - -# Collect the source files for the package. -mv dist ${JOINUP_DIR} || exit 1 - -# Replace files and folders with production symlinks. -rm -rf ${JOINUP_DIR}/web/sites/default/settings.php -rm -rf ${JOINUP_DIR}/web/sites/default/files -cp -r ${SOURCES_DIR}/template/* ${JOINUP_DIR}/web || exit 1 -rm -r ${SOURCES_DIR}/template || exit 1 - -# Fix Drush settings. -echo 'options:' > ${JOINUP_DIR}/drush/drush.yml -echo " uri: ${DRUPAL_BASE_URL}" >> ${JOINUP_DIR}/drush/drush.yml - -# Output the version number in a file that will be appended to the HTTP headers. -echo X-build-id: $BUILD_VERSION > ${SOURCES_DIR}/buildinfo.ini - -# Tar up the source files. -tar -czf ${SOURCES_DIR}/Joinup-${BUILD_VERSION}.tar.gz -C ${SOURCES_DIR} Joinup-${BUILD_VERSION}/ || exit 1 -rm -rf ${JOINUP_DIR} || exit 1 - -# Todo: Exiting here, the remainder is for Rudi :) -echo "Build is available in ${BUILD_ROOT}." -exit 0 - -# Copy files to the production build storage of the EC. -# Todo: This should be a separate step so this script can also be used outside -# of the European Commission infrastructure. - -cd ${BUILD_ROOT}/SPECS -rpmbuild -ba joinup.spec --define "_topdir ${BUILD_ROOT}" - -cd ${BUILD_ROOT}/RPMS -cp -R noarch /mnt/shared/distribution/ -rm -rf noarch -cd /mnt/shared/distribution/ -createrepo . --no-database diff --git a/scripts/rpmbuild/make_joinup_build_uat.sh b/scripts/rpmbuild/make_joinup_build_uat.sh deleted file mode 100755 index 49ddb18cd8..0000000000 --- a/scripts/rpmbuild/make_joinup_build_uat.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# This script will build an RPM package intended for deploying on UAT. - -# Define paths. -if [ -z ${COMPOSER_PATH} ]; then - COMPOSER_PATH=/usr/local/bin/composer -fi -SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT=$(realpath ${SCRIPT_PATH}/../..) -BUILD_ROOT=${PROJECT_ROOT}/tmp/rpmbuild - -# Determine a version string that identifies the current version. First check if -# a tag is available for the checked out revision. If that fails, construct a -# version string consisting of the branch name and the ref. -cd ${PROJECT_ROOT} - -# Clean up existing builds. -if [ -d ${BUILD_ROOT} ]; then - chmod -R u+w ${BUILD_ROOT} - rm -rf ${BUILD_ROOT} || exit 1 -fi - -mkdir -p ${BUILD_ROOT} - -# Create a fresh build root containing the scaffolding files. -cp -r ${PROJECT_ROOT}/resources/rpmbuild/* ${BUILD_ROOT} || exit 1 - -SOURCES_DIR=${BUILD_ROOT}/SOURCES -JOINUP_DIR=${SOURCES_DIR}/Joinup-${BUILD_VERSION} - -mkdir -p ${JOINUP_DIR} || exit 1 - -# Build the site. -sudo ${COMPOSER_PATH} self-update || exit 1 -COMPOSER_DISCARD_CHANGES=true ${COMPOSER_PATH} install --no-interaction --prefer-dist || exit 1 -./vendor/bin/run joinup:compile-scss || exit 1 - - -# Collect the source files for the package. -cp -r .env.dist composer.* VERSION config/ drush/ resources/ scripts/ src/ vendor/ web/ ${JOINUP_DIR} || exit 1 - -# Replace files and folders with production symlinks. -rm -rf ${JOINUP_DIR}/web/sites/default/settings.php -rm -rf ${JOINUP_DIR}/web/sites/default/files -cp -r ${SOURCES_DIR}/template/* ${JOINUP_DIR}/web || exit 1 -rm -r ${SOURCES_DIR}/template || exit 1 - -# Remove unneeded files. -rm -rf ${JOINUP_DIR}/web/themes/joinup/scss - -# Output the version number in a file that will be appended to the HTTP headers. -echo X-build-id: $BUILD_VERSION > ${SOURCES_DIR}/buildinfo.ini - -# Tar up the source files. -tar -czf ${SOURCES_DIR}/Joinup-${BUILD_VERSION}.tar.gz -C ${SOURCES_DIR} Joinup-${BUILD_VERSION}/ || exit 1 -rm -rf ${JOINUP_DIR} || exit 1 - -echo "Build is available in ${BUILD_ROOT}." -exit 0 diff --git a/scripts/update_production.sh b/scripts/update_production.sh deleted file mode 100755 index 27c284bc9e..0000000000 --- a/scripts/update_production.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# This script will perform updates on the production environment. - -# Define paths. -SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT=$(realpath ${SCRIPT_PATH}/..) - -# Perform the necessary steps for the update -cd ${PROJECT_ROOT} - -# Make sure config is writable when performing updates. This depends on the -# following code being present in web/sites/default/settings.php: -# $settings['config_readonly'] = !file_exists(getcwd() . '/../disable-config-readonly'); -grep -Fqx '$settings['\''config_readonly'\''] = !file_exists(getcwd() . '\''/../disable-config-readonly'\'');' web/sites/default/settings.php || exit 1 - -echo "Disabling config_readonly." -touch disable-config-readonly || exit 1 - -echo "Performing database updates." -./vendor/bin/drush deploy --yes || exit 1 -./vendor/bin/drush search-api:reset-tracker --yes || exit 1 - -echo "Rebuilding node access records." -./vendor/bin/drush php:eval "if(node_access_needs_rebuild()) { node_access_rebuild(); }" || exit 1 - -echo "Enabling config_readonly." -rm disable-config-readonly || exit 1 - -# Check if there are any errors or warnings reported. Ignore the warning about -# the update notifications module not being enabled, the updates are monitored -# by the development team. -test $(./vendor/bin/drush status-report --severity=1 --field=title | grep -v "Update notifications" | wc -l) = "0" || (./vendor/bin/drush status-report --severity=1 | grep -v "Update notifications" && exit 1) - -exit 0; diff --git a/scripts/update_uat.sh b/scripts/update_uat.sh deleted file mode 100755 index c7f6129a8f..0000000000 --- a/scripts/update_uat.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -ex - -# This script will perform updates on the uat environment. - -# Define paths. -SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT=$(realpath ${SCRIPT_PATH}/..) - -# Perform the necessary steps for the update -cd ${PROJECT_ROOT} - -echo "Disabling config_readonly." -touch disable-config-readonly - -# Flush Redis cache if enabled. -test "$(./vendor/bin/drush eval 'print \Drupal\Core\Site\Settings::get("cache")["default"];')" != "cache.backend.redis" || ./vendor/bin/run redis:flush-all -# Truncate cache_* tables. -for table in $(./vendor/bin/drush sql:query "SHOW TABLES LIKE 'cache\_%'"); do ./vendor/bin/drush sql:query "TRUNCATE $table"; done -./vendor/bin/drush deploy -./vendor/bin/drush pm:enable joinup_acceptance,stage_file_proxy --yes - -echo "Rebuilding node access records." -./vendor/bin/drush php:eval "if(node_access_needs_rebuild()) { node_access_rebuild(); }" - -echo "Enabling config_readonly." -rm disable-config-readonly - -echo "Reporting requirements." -./vendor/bin/drush status-report --severity=1 | grep -v "Update notifications" - -echo "Update successfully completed." -exit 0 diff --git a/src/CodingStandards/Sniffs/NamingConventions/ValidUpdateNameSniff.php b/src/CodingStandards/Sniffs/NamingConventions/ValidUpdateNameSniff.php index 281c3600b4..83837de91c 100644 --- a/src/CodingStandards/Sniffs/NamingConventions/ValidUpdateNameSniff.php +++ b/src/CodingStandards/Sniffs/NamingConventions/ValidUpdateNameSniff.php @@ -7,7 +7,7 @@ use Composer\Semver\Comparator; use Drupal\Component\Serialization\Yaml; use Drupal\Sniffs\NamingConventions\ValidFunctionNameSniff; -use GitWrapper\GitWrapper; +use Gitonomy\Git\Repository; use PHP_CodeSniffer\Files\File; /** @@ -145,9 +145,8 @@ protected function processTokenOutsideScope(File $phpcsFile, $stackPtr) { */ protected static function getGitDescribeTag(): string { if (!isset(static::$gitDescribeTag)) { - $wrapper = new GitWrapper(); - $workingCopy = $wrapper->workingCopy(getcwd()); - $tag = trim((string) $workingCopy->run(['describe --tags'])); + $repository = new Repository(getcwd()); + $tag = trim($repository->run('describe', ['--tags'])); // Remove a potential leading 'v'. static::$gitDescribeTag = ltrim($tag, 'v'); } diff --git a/src/Composer/CaptureGitReleaseTag.php b/src/Composer/CaptureGitReleaseTag.php deleted file mode 100644 index 7ce58a6841..0000000000 --- a/src/Composer/CaptureGitReleaseTag.php +++ /dev/null @@ -1,39 +0,0 @@ -workingCopy($directory); - $version = trim((string) $git->run(['describe --tags'])); - - $fs = new Filesystem(); - $fs->dumpFile("$directory/VERSION", $version); - - $event->getIO()->write("$version written to $directory/VERSION."); - } - -} diff --git a/src/Composer/load.environment.php b/src/Composer/load.environment.php index b99ad8f8c9..e39ab60e63 100644 --- a/src/Composer/load.environment.php +++ b/src/Composer/load.environment.php @@ -13,13 +13,18 @@ use Dotenv\Dotenv; // Load the .env.dist file in the project root, and overridden settings in .env -// if it exists. +// and '.env.pipeline', if they exist. $path = dirname(__DIR__, 2); +$candidates = array_filter( + ['.env.dist', '.env', '.env.pipeline'], + function (string $file) use ($path): bool { + return file_exists("{$path}/{$file}"); + } +); // Joinup has been instructed by the devops team to use getenv() to import // environment variables in settings.php, so we need to use the unsafe method. // This means Joinup is not intended to be used in environments that use -// php-fpm. Also this file should not be included on any production environment +// php-fpm. Also, this file should not be included on any production environment // for performance reasons. // @see https://github.com/vlucas/phpdotenv/issues/446 -$dotenv = Dotenv::createUnsafeImmutable($path, ['.env.dist', '.env'], FALSE); -$dotenv->safeLoad(); +Dotenv::createUnsafeImmutable($path, $candidates, FALSE)->safeLoad(); diff --git a/src/TaskRunner/Commands/DrupalSettingsCommands.php b/src/TaskRunner/Commands/DrupalSettingsCommands.php index a5ae25d8f0..3764c624c6 100644 --- a/src/TaskRunner/Commands/DrupalSettingsCommands.php +++ b/src/TaskRunner/Commands/DrupalSettingsCommands.php @@ -148,7 +148,7 @@ protected function getSections(string $preset): array { throw new AbortTasksException("The '{$preset}' preset contains invalid sections: '" . implode("', '", array_keys($invalidSections)) . "'. Check the 'drupal.settings' configuration."); } - return array_intersect_key($allSections, $sections); + return array_merge($sections, array_intersect_key($allSections, $sections)); } } diff --git a/src/TaskRunner/Commands/SolrCommands.php b/src/TaskRunner/Commands/SolrCommands.php index 89d990096c..1eae5d3706 100644 --- a/src/TaskRunner/Commands/SolrCommands.php +++ b/src/TaskRunner/Commands/SolrCommands.php @@ -178,11 +178,8 @@ protected function getOperationStatus(string $core, string $operation, int &$att */ protected function getUrl(string $core, string $operation, bool $checkStatus = FALSE): string { $config = $this->getConfig(); - $envCorePrefix = 'env.SOLR_CORE_' . strtoupper($core); - $coreUrl = $config->get("${envCorePrefix}_URL"); - $coreName = $config->get("${envCorePrefix}_NAME"); $command = static::COMMAND_MAP[$operation][$checkStatus]; - return "{$coreUrl}/{$coreName}/replication?command={$command}&name={$core}&location={$config->get('solr.snapshot_dir')}&wt=json&json.nl=map"; + return "{$config->get("env.SOLR_URL")}/{$config->get("env.SOLR_CORE")}/replication?command={$command}&name={$core}&location={$config->get('solr.snapshot_dir')}&wt=json&json.nl=map"; } /** diff --git a/src/TaskRunner/ConfigProviders/DigitQaPipelineConfigProvider.php b/src/TaskRunner/ConfigProviders/DigitQaPipelineConfigProvider.php new file mode 100644 index 0000000000..5494d81f57 --- /dev/null +++ b/src/TaskRunner/ConfigProviders/DigitQaPipelineConfigProvider.php @@ -0,0 +1,37 @@ +run(); chdir($initialDir); } diff --git a/src/Traits/DigitQaPipelineAwareTrait.php b/src/Traits/DigitQaPipelineAwareTrait.php new file mode 100644 index 0000000000..3c1ad18a5b --- /dev/null +++ b/src/Traits/DigitQaPipelineAwareTrait.php @@ -0,0 +1,23 @@ +The full software development kit for systems based on the x86-64 architecture.

" in the "Description" wysiwyg editor @@ -109,8 +107,6 @@ Feature: Add distribution through the UI And I click "Add distribution" in the plus button menu Then I should see the heading "Add Distribution" And the following fields should be present "Title, Description, Access URL, Licence, Format, Representation technique" - # @todo: The link has to be changed to the legal contact form. - # @see: https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-2789 And I should see the link "contacting us" When I fill in "Title" with "Source tarball" And I enter "

The full source code.

" in the "Description" wysiwyg editor diff --git a/tests/features/asset_distribution/asset_distribution.delete.feature b/tests/features/asset_distribution/asset_distribution.delete.feature index 9cd65d6db8..76c2d46661 100644 --- a/tests/features/asset_distribution/asset_distribution.delete.feature +++ b/tests/features/asset_distribution/asset_distribution.delete.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-a Feature: Asset distribution deleting. In order to manage asset distributions As a solution owner or solution facilitator diff --git a/tests/features/asset_distribution/asset_distribution.edit.feature b/tests/features/asset_distribution/asset_distribution.edit.feature index 944f6f02b5..d64fc35181 100644 --- a/tests/features/asset_distribution/asset_distribution.edit.feature +++ b/tests/features/asset_distribution/asset_distribution.edit.feature @@ -53,9 +53,7 @@ Feature: Asset distribution editing. And I go to the homepage of the "Asset distribution example" asset distribution Then I should not see the link "Edit" in the "Entity actions" region - @email Scenario: Edit a distribution as a solution facilitator. - When all e-mails have been sent When I am logged in as a facilitator of the "Solution A" solution And I go to the homepage of the "Asset distribution example" asset distribution And I click "Edit" diff --git a/tests/features/asset_release/add_asset_release.feature b/tests/features/asset_release/add_asset_release.feature index fdfebe281c..58381f887e 100644 --- a/tests/features/asset_release/add_asset_release.feature +++ b/tests/features/asset_release/add_asset_release.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: "Add release" visibility options. In order to manage releases As a solution facilitator diff --git a/tests/features/asset_release/asset_release.moderation.feature b/tests/features/asset_release/asset_release.moderation.feature index c185408d19..5d2078b56e 100644 --- a/tests/features/asset_release/asset_release.moderation.feature +++ b/tests/features/asset_release/asset_release.moderation.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-a Feature: Asset release moderation In order to manage releases As a user of the website @@ -52,7 +52,7 @@ Feature: Asset release moderation And I should not see the following warning messages: | warning messages | | You are viewing the published version. To view the latest draft version, click here. | - Given all e-mails have been sent + When I click "Edit" in the "Entity actions" region And I should see the workflow buttons "Update, Save as draft" When I fill in "Release notes" with "We go live soon." @@ -75,7 +75,6 @@ Feature: Asset release moderation And I click "Add release" in the plus button menu Then I should see the text "Authored on" - When all e-mails have been sent And I go to the "Release of the dark ship" release And I click "Edit" in the "Entity actions" region Then the current workflow state should be "Validated" @@ -130,7 +129,6 @@ Feature: Asset release moderation # Approve changes as a moderator. When I am logged in as a moderator - And all e-mails have been sent And I go to the "Release of the dark ship" release And I click "Edit" in the "Entity actions" region And I should see the workflow buttons "Update, Publish" @@ -146,8 +144,7 @@ Feature: Asset release moderation | body | Your proposed Release fix, v1 for the solution "Dark Ship" has been validated as per your request. | # Delete a release as a moderator. - When all e-mails have been sent - And I click "Edit" in the "Entity actions" region + When I click "Edit" in the "Entity actions" region And I click "Delete" And I press "Delete" And the following email should have been sent: diff --git a/tests/features/asset_release/asset_release.overview.feature b/tests/features/asset_release/asset_release.overview.feature index f15fb78a0c..9fa05f095d 100644 --- a/tests/features/asset_release/asset_release.overview.feature +++ b/tests/features/asset_release/asset_release.overview.feature @@ -102,8 +102,6 @@ Feature: Asset distribution overview on solution. And I should see the text "Latest release" # Publish the release as a solution facilitator. - # @todo Unpublished releases are no longer visible for facilitators. - # @see https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-5736 When I am logged in as a facilitator of the "Lovely Butterfly" solution And I go to the homepage of the "The Deep Doors" release When I click "Edit" in the "Entity actions" region diff --git a/tests/features/collection/collection.archived.feature b/tests/features/collection/collection.archived.feature index fcda31cee7..12b0c0bfdb 100644 --- a/tests/features/collection/collection.archived.feature +++ b/tests/features/collection/collection.archived.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-e Feature: Creating content and commenting on archived collection In order to not waste time on maintaining legacy collections As a collection owner diff --git a/tests/features/collection/collection.edit.feature b/tests/features/collection/collection.edit.feature index fcf6149567..ef399cd0ee 100644 --- a/tests/features/collection/collection.edit.feature +++ b/tests/features/collection/collection.edit.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Editing collections In order to manage collections As a collection owner or collection facilitator diff --git a/tests/features/collection/collection.event.feature b/tests/features/collection/collection.event.feature index 1725b62e34..28bd59d480 100644 --- a/tests/features/collection/collection.event.feature +++ b/tests/features/collection/collection.event.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: As a user of the website In order to find my way around events I need to be able to view collection events grouped properly. diff --git a/tests/features/collection/collection.member_administration.feature b/tests/features/collection/collection.member_administration.feature index 7b08ccf4b7..874646aaf7 100644 --- a/tests/features/collection/collection.member_administration.feature +++ b/tests/features/collection/collection.member_administration.feature @@ -1,4 +1,4 @@ -@api @group-a @terms +@api @terms @group-a Feature: Collection membership administration In order to build a community As a collection facilitator @@ -36,10 +36,8 @@ Feature: Collection membership administration Then I should see the button "Apply to selected items" in the "Members admin form header" region But I should not see the button "Apply to selected items" in the "Members admin form actions" region - @email Scenario: Request a membership When I am logged in as "Donald Duck" - And all e-mails have been sent And I go to the "Medical diagnosis" collection And I press the "Join this collection" button Then I should see the success message "Your membership to the Medical diagnosis collection is under approval." @@ -54,7 +52,6 @@ Feature: Collection membership administration | subject | Joinup: A user has requested to join your collection | | body | Donald Duck has requested to join your collection "Medical diagnosis" as a member. | - @email Scenario: Approve a membership # Check that a member with pending state does not have access to add new content. Given I am logged in as "Kathie Cumbershot" @@ -69,7 +66,6 @@ Feature: Collection membership administration # Approve a membership. Given I am logged in as "Lisa Cuddy" - And all e-mails have been sent And I am on the members page of "Medical diagnosis" Then the "Action" select should contain the following options: | Approve the pending membership(s) | @@ -105,10 +101,9 @@ Feature: Collection membership administration Then I should see the plus button menu Then I should see the link "Add news" - @javascript @email + @javascript Scenario: Request a membership with subscription and approve it When I am logged in as "Cam Bridge" - And all e-mails have been sent And I go to the "Medical diagnosis" collection And I press the "Join this collection" button Then a modal should open @@ -120,7 +115,6 @@ Feature: Collection membership administration # Approve a membership. Given I am logged in as "Lisa Cuddy" - When all e-mails have been sent And I go to the "Medical diagnosis" collection And I open the group sidebar menu @@ -142,10 +136,8 @@ Feature: Collection membership administration When I click the "My subscriptions" link from the email sent to "Cam Bridge" Then I should see the heading "My subscriptions" - @email Scenario: Reject a membership Given I am logged in as "Lisa Cuddy" - And all e-mails have been sent And I am on the members page of "Medical diagnosis" # Assert that the user does not see the default OG tab. Then I should not see the link "Group" @@ -199,7 +191,6 @@ Feature: Collection membership administration Then I should not see the plus button menu And I should see the button "Join this collection" - @email Scenario: Assign a new role to a member # Check that Dr House can't edit the collection. When I am logged in as "Gregory House" @@ -209,7 +200,6 @@ Feature: Collection membership administration # Dr Cuddy promotes Dr House to facilitator. When I am logged in as "Lisa Cuddy" - And all e-mails have been sent And I go to the "Medical diagnosis" collection Then I click "Members" in the "Left sidebar" # Assert that the user does not see the default OG tab. @@ -360,7 +350,6 @@ Feature: Collection membership administration | Eric Foreman | | Eric Drexler | - @email Scenario: Privileged members should be allowed to invite users to a collection. Given users: | Username | E-mail | First name | Family name | @@ -398,7 +387,6 @@ Feature: Collection membership administration | Christian Dwight | | Jeannette Belanger | When I select "Facilitator" from "Role" - And the mail collector cache is empty And I press "Invite members" Then I should see the success message "2 users have been invited to this group." And the following email should have been sent: diff --git a/tests/features/collection/collection.member_count.feature b/tests/features/collection/collection.member_count.feature index 4100d0a9d0..3ca24bc25a 100644 --- a/tests/features/collection/collection.member_count.feature +++ b/tests/features/collection/collection.member_count.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Collection homepage In order to have the users properly informed As an owner of the website diff --git a/tests/features/collection/collection.member_overview.feature b/tests/features/collection/collection.member_overview.feature index a62d09794f..277eaab523 100644 --- a/tests/features/collection/collection.member_overview.feature +++ b/tests/features/collection/collection.member_overview.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Collection membership overview In order to foster my community and create a sense of belonging As a collection member diff --git a/tests/features/collection/collection.member_overview_filtering.feature b/tests/features/collection/collection.member_overview_filtering.feature index a8331ad960..a115b40515 100644 --- a/tests/features/collection/collection.member_overview_filtering.feature +++ b/tests/features/collection/collection.member_overview_filtering.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Type something to filter the listing the member list In order to quickly find a particular member As a moderator diff --git a/tests/features/collection/collection.moderation.feature b/tests/features/collection/collection.moderation.feature index 93a9c97342..feaeabeb4f 100644 --- a/tests/features/collection/collection.moderation.feature +++ b/tests/features/collection/collection.moderation.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-a Feature: Collection moderation In order to manage collections programmatically As a user of the website diff --git a/tests/features/collection/collection.moderation.integration.feature b/tests/features/collection/collection.moderation.integration.feature index 1fc1c667f0..d5148b170c 100644 --- a/tests/features/collection/collection.moderation.integration.feature +++ b/tests/features/collection/collection.moderation.integration.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-d Feature: As a user of the website I want to be able to perform available transitions according to the state of the entity and the graph they are stored in. diff --git a/tests/features/collection/collection_content.feature b/tests/features/collection/collection_content.feature index 96533539b8..20d04e2674 100644 --- a/tests/features/collection/collection_content.feature +++ b/tests/features/collection/collection_content.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-d Feature: Collection content As a user of the website I want to access the content of a collection diff --git a/tests/features/collection/collection_overview.feature b/tests/features/collection/collection_overview.feature index 37f3af8baa..eb79baec21 100644 --- a/tests/features/collection/collection_overview.feature +++ b/tests/features/collection/collection_overview.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Collections Overview Scenario: Check visibility of "Collections" menu link. diff --git a/tests/features/collection/content_negotiation.feature b/tests/features/collection/content_negotiation.feature index 23aec2ebe2..cc2667853f 100644 --- a/tests/features/collection/content_negotiation.feature +++ b/tests/features/collection/content_negotiation.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Export collection metadata As a user of Joinup I am able to retrieve the content of entities in a machine readable format. diff --git a/tests/features/collection/export_metadata.feature b/tests/features/collection/export_metadata.feature index da1f3a3b3e..0c7eaa7601 100644 --- a/tests/features/collection/export_metadata.feature +++ b/tests/features/collection/export_metadata.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Export collection metadata As a user of Joinup I should be able to download the ADMS properties of the collections. diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature index bb949ff879..a25b961e21 100644 --- a/tests/features/collection/homepage.feature +++ b/tests/features/collection/homepage.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-c Feature: Collection homepage In order find content around a topic As a user of the website diff --git a/tests/features/collection/join-as-anonymous.feature b/tests/features/collection/join-as-anonymous.feature index 395d853344..64a837596d 100644 --- a/tests/features/collection/join-as-anonymous.feature +++ b/tests/features/collection/join-as-anonymous.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: Joining a collection as an anonymous user In order to participate in the activities of a collection As an anonymous user diff --git a/tests/features/collection/join-leave.feature b/tests/features/collection/join-leave.feature index 19a69edb32..972ec6a469 100644 --- a/tests/features/collection/join-leave.feature +++ b/tests/features/collection/join-leave.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: Joining and leaving collections through the web interface In order to participate in the activities of a collection As an authenticated user diff --git a/tests/features/collection/last_update_time.feature b/tests/features/collection/last_update_time.feature index 15dd4fe49b..c51b871a0e 100644 --- a/tests/features/collection/last_update_time.feature +++ b/tests/features/collection/last_update_time.feature @@ -1,4 +1,4 @@ -@api @javascript @terms @clearStaticCache @group-a +@api @javascript @terms @clearStaticCache @group-c Feature: Tests the collection last update time. Scenario: As a user visiting a collection, I want to see the collection last diff --git a/tests/features/collection/newsletter_subscription.feature b/tests/features/collection/newsletter_subscription.feature index 19627104d9..25c2179684 100644 --- a/tests/features/collection/newsletter_subscription.feature +++ b/tests/features/collection/newsletter_subscription.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-c Feature: Subscribing to collection newsletters In order to promote my collection As a collection owner diff --git a/tests/features/collection/notification.collection.feature b/tests/features/collection/notification.collection.feature index 1e12adc5ad..6e9e1a7e01 100644 --- a/tests/features/collection/notification.collection.feature +++ b/tests/features/collection/notification.collection.feature @@ -1,4 +1,4 @@ -@api @terms @email @group-a +@api @terms @group-c Feature: Notification test for the collection transitions. In order to manage my collections As an user that is related to the collection @@ -63,7 +63,6 @@ Feature: Notification test for the collection transitions. | NC to delete by mod | NC member2 | | # Test 'create' operation. - When all e-mails have been sent And I am logged in as "NC user" When I go to the propose collection form When I fill in the following: @@ -88,7 +87,6 @@ Feature: Notification test for the collection transitions. And I delete the "Super Sayan Academy" contact information # Test 'propose' operation (on an existing collection) - When all e-mails have been sent And I am logged in as "NC owner" And I go to the homepage of the "NC to propose" collection And I click "Edit" in the "Entity actions" region @@ -100,7 +98,6 @@ Feature: Notification test for the collection transitions. | If you think this action is not clear or not due, please contact Joinup Support at | # Test 'request archival' operation. - When all e-mails have been sent And I go to the homepage of the "NC to request archival" collection And I click "Edit" in the "Entity actions" region And I press "Request archival" @@ -111,7 +108,7 @@ Feature: Notification test for the collection transitions. | If you think this action is not clear or not due, please contact Joinup Support at | # Test deletion of a collection by the owner. - When all e-mails have been sent + When I mark all emails as read And I go to the homepage of the "NC to delete" collection And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -127,7 +124,6 @@ Feature: Notification test for the collection transitions. | body | The collection "NC to delete", of which you are a member, has been deleted. | # Test 'propose edit' operation. - When all e-mails have been sent And I am logged in as "NC facilitator" And I go to the homepage of the "NC to propose edit" collection And I click "Edit" in the "Entity actions" region @@ -143,7 +139,6 @@ Feature: Notification test for the collection transitions. | To modify your collection, please go to | # Test the 'approve new' operation. - When all e-mails have been sent And I am logged in as "NC moderator" And I go to the homepage of the "NC to validate" collection And I click "Edit" in the "Entity actions" region @@ -154,7 +149,6 @@ Feature: Notification test for the collection transitions. | body | Your proposed collection "NC to validate" has been validated as per your request. | # Test the 'approve proposed' that was proposed through the 'propose edit' operation. - When all e-mails have been sent And I go to the homepage of the "NC to propose edit proposed" collection And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -164,7 +158,6 @@ Feature: Notification test for the collection transitions. | You can verify the edited version of the collection at | # Test the 'reject archival' operation. - When all e-mails have been sent And I go to the homepage of the "NC to reject archival" collection And I click "Edit" in the "Entity actions" region # @todo: This should change into a separate transition. @@ -178,7 +171,6 @@ Feature: Notification test for the collection transitions. | The reason for rejection is: It will not be archived. | # Test the 'archive' operation. - When all e-mails have been sent And I go to the homepage of the "NC to archive" collection And I click "Edit" in the "Entity actions" region And I press "Archive" @@ -208,7 +200,7 @@ Feature: Notification test for the collection transitions. # Test the deletion of a collection by a moderator. This should also inform # the collection owner. - When all e-mails have been sent + When I mark all emails as read And I go to the homepage of the "NC to delete by mod" collection And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/collection/propose.feature b/tests/features/collection/propose.feature index e1dad66491..9065f21b67 100644 --- a/tests/features/collection/propose.feature +++ b/tests/features/collection/propose.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Proposing a collection In order to create a new collection on Joinup As the product owner of a collection of software solutions diff --git a/tests/features/collection/tca.feature b/tests/features/collection/tca.feature index cdc77c048c..f70a4140bd 100644 --- a/tests/features/collection/tca.feature +++ b/tests/features/collection/tca.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Collection TCA agreement In order to ensure activity by facilitators As a site owner diff --git a/tests/features/comments/add_comment.feature b/tests/features/comments/add_comment.feature index ffa4193684..31eb2bd458 100644 --- a/tests/features/comments/add_comment.feature +++ b/tests/features/comments/add_comment.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-e Feature: Add comments As a visitor of the website I can leave a comment on community content. @@ -37,7 +37,6 @@ Feature: Add comments | title | body | | state | author | | | How could this ever happen? Moral panic on its way! | <parent title> | <state> | Salma Coster | Given I am logged in as "Miss tell tales" - And all e-mails have been sent When I go to the content page of the type "<content type>" with the title "<title>" # The honeypot field that needs to be empty on submission. Then the following fields should be present "user_homepage" @@ -84,7 +83,6 @@ Feature: Add comments When I am logged in as "Salma Coster" And I click the comment link from the last email sent to "Salma Coster" - And all e-mails have been sent And I click "Reply" And I should see the "Create comment" wysiwyg editor When I enter "I am replying in user's comment." in the "Create comment" wysiwyg editor @@ -116,7 +114,6 @@ Feature: Add comments | title | body | collection | state | | <title> | How could this ever happen? Moral panic on its way! | Gossip collection | <state> | Given I am logged in as "Miss tell tales" - And all e-mails have been sent When I go to the content page of the type "<content type>" with the title "<title>" # Authenticated users can insert <p> and <br> tags in the comment body. And I fill in "Create comment" with "<p>Mr scandal was doing something<br />weird the other day.<p/>" diff --git a/tests/features/comments/api.feature b/tests/features/comments/api.feature index d9a7d7eabe..465918d97f 100644 --- a/tests/features/comments/api.feature +++ b/tests/features/comments/api.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-e Feature: Creating comments through the API In order to efficiently write tests for the Joinup platform As a backend developer diff --git a/tests/features/comments/delete_comment.feature b/tests/features/comments/delete_comment.feature index e36e883a5d..97080a4485 100644 --- a/tests/features/comments/delete_comment.feature +++ b/tests/features/comments/delete_comment.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-e Feature: Delete comments As a visitor of the website I can leave a comment on community content. diff --git a/tests/features/comments/edit_comment.feature b/tests/features/comments/edit_comment.feature index 3b78a75172..adeb06b4e6 100644 --- a/tests/features/comments/edit_comment.feature +++ b/tests/features/comments/edit_comment.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-e Feature: Edit a comment As a moderator of the site, I should receive notifications when someone edits a comment. @@ -19,7 +19,6 @@ Feature: Edit a comment | This comment should be edited | Let's all use it | Sons of anarchy | Paying with cash | Given I am logged in as "Sons of anarchy" - And all e-mails have been sent When I go to the "Paying with cash" news # Sons' comment is the only comment available. And I click "Edit" in comment #1 diff --git a/tests/features/communities/eif/solutions_page.feature b/tests/features/communities/eif/solutions_page.feature index eee24219dc..765db8246d 100644 --- a/tests/features/communities/eif/solutions_page.feature +++ b/tests/features/communities/eif/solutions_page.feature @@ -153,6 +153,7 @@ Feature: As a user, visiting the EIF Toolbox page, I want to be able to filter And I should see the link "Previous page" And I should see the link "Page 1" And I should see the link "Current page 2" + And I delete the "TikTok" contact information @javascript Scenario: Test the recommendation selector. diff --git a/tests/features/communities/eif/vocabulary.feature b/tests/features/communities/eif/vocabulary.feature index 8685d69985..d704eef14e 100644 --- a/tests/features/communities/eif/vocabulary.feature +++ b/tests/features/communities/eif/vocabulary.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: In order to be able to have the solutions categorized properly through the EIF Toolbox As the collection owner diff --git a/tests/features/community_content/content_sharing.feature b/tests/features/community_content/content_sharing.feature index 9ee77c7fb8..fb5d5bfee9 100644 --- a/tests/features/community_content/content_sharing.feature +++ b/tests/features/community_content/content_sharing.feature @@ -1,4 +1,4 @@ -@api @email @group-b +@api @group-b Feature: Sharing content between collections As a privileged user I want to share content between collections diff --git a/tests/features/community_content/moderation.feature b/tests/features/community_content/moderation.feature index cdaa812f85..982fb126dc 100644 --- a/tests/features/community_content/moderation.feature +++ b/tests/features/community_content/moderation.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: Moderate community content In order to accept or reject content that is proposed for publication or deletion As a facilitator diff --git a/tests/features/community_content/notification.post_moderated.discussion.feature b/tests/features/community_content/notification.post_moderated.discussion.feature index 0c7172fca5..de0798847b 100644 --- a/tests/features/community_content/notification.post_moderated.discussion.feature +++ b/tests/features/community_content/notification.post_moderated.discussion.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the discussion transitions on a post moderated parent. In order to manage my collections As an owner of the collection @@ -29,7 +29,6 @@ Feature: Notification test for the discussion transitions on a post moderated pa | CC notify post delete | CC member | body | CC post collection | validated | # Test 'create' operation. - When all e-mails have been sent And I am logged in as "CC member" And I go to the "CC post collection" collection And I click "Add discussion" in the plus button menu @@ -43,8 +42,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | body | CC Member has published the new discussion - "CC notify create publish" in the collection: "CC post collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify post publish" discussion And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -53,8 +51,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | subject | Joinup: Content has been published | | body | CC Member has published the new discussion - "CC notify post publish" in the collection: "CC post collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post request changes" discussion And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -66,8 +63,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify post request changes" in the collection: "CC post collection", with the following motivation: "Can you do some changes?". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post report" discussion And I click "Edit" in the "Entity actions" region And I press "Report" @@ -79,7 +75,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify post report" in the collection: "CC post collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent + When I mark all emails as read And I am logged in as "CC facilitator" And I go to the "CC notify post approve proposed" discussion And I click "Edit" in the "Entity actions" region @@ -91,7 +87,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | body | the Facilitator, CC Facilitator has approved your request of publication of the discussion - "CC notify post approve proposed" in the collection: "CC post collection". | # Test 'delete' operation. - When all e-mails have been sent + When I mark all emails as read And I am logged in as "CC facilitator" And I go to the "CC notify post delete" discussion And I click "Edit" in the "Entity actions" region @@ -134,7 +130,7 @@ Feature: Notification test for the discussion transitions on a post moderated pa | message | author | parent | | Huge magnetic fields | Monroe Fearchar | How do the jets fire into space? | - When all e-mails have been sent + When I mark all emails as read And I am logged in as a moderator And I go to the homepage of the "Event Horizon Telescope" collection And I click "Edit" in the "Entity actions" region diff --git a/tests/features/community_content/notification.post_moderated.document.feature b/tests/features/community_content/notification.post_moderated.document.feature index 084dd200ef..71ec978ea1 100644 --- a/tests/features/community_content/notification.post_moderated.document.feature +++ b/tests/features/community_content/notification.post_moderated.document.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the document transitions on a post moderated parent. In order to manage my collections As an owner of the collection @@ -29,8 +29,7 @@ Feature: Notification test for the document transitions on a post moderated pare | CC notify post delete | CC member | body | Document | CC collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC collection" collection And I click "Add document" in the plus button menu And I fill in "Title" with "CC notify create publish" @@ -44,8 +43,7 @@ Feature: Notification test for the document transitions on a post moderated pare | body | CC Member has published the new document - "CC notify create publish" in the collection: "CC collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify post publish" document And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -54,8 +52,7 @@ Feature: Notification test for the document transitions on a post moderated pare | subject | Joinup: Content has been published | | body | CC Member has published the new document - "CC notify post publish" in the collection: "CC collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post request changes" document And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -67,8 +64,7 @@ Feature: Notification test for the document transitions on a post moderated pare | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the document - "CC notify post request changes" in the collection: "CC collection", with the following motivation: "Can you do some changes?". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post report" document And I click "Edit" in the "Entity actions" region And I press "Report" @@ -80,8 +76,7 @@ Feature: Notification test for the document transitions on a post moderated pare | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the document - "CC notify post report" in the collection: "CC collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post approve proposed" document And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -91,8 +86,7 @@ Feature: Notification test for the document transitions on a post moderated pare | body | the Facilitator, CC Facilitator has approved your request of publication of the document - "CC notify post approve proposed" in the collection: "CC collection". | # Test 'delete' operation. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post delete" document And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.post_moderated.event.feature b/tests/features/community_content/notification.post_moderated.event.feature index 5872569d0b..dd1ed7a45e 100644 --- a/tests/features/community_content/notification.post_moderated.event.feature +++ b/tests/features/community_content/notification.post_moderated.event.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the event transitions on a post moderated parent. In order to manage my collections As an owner of the collection @@ -29,8 +29,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | CC notify post delete | CC member | body | Lychener Strasse, Berlin | CC post collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC post collection" collection And I click "Add event" in the plus button menu And I fill in "Title" with "CC notify create publish" @@ -44,8 +43,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | body | CC Member has published the new event - "CC notify create publish" in the collection: "CC post collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify post publish" event And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -54,8 +52,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | subject | Joinup: Content has been published | | body | CC Member has published the new event - "CC notify post publish" in the collection: "CC post collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post request changes" event And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -67,8 +64,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify post request changes" in the collection: "CC post collection", with the following motivation: "Can you do some changes?". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post report" event And I click "Edit" in the "Entity actions" region And I press "Report" @@ -80,8 +76,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify post report" in the collection: "CC post collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post approve proposed" event And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -91,8 +86,7 @@ Feature: Notification test for the event transitions on a post moderated parent. | body | the Facilitator, CC Facilitator has approved your request of publication of the event - "CC notify post approve proposed" in the collection: "CC post collection". | # Test 'delete' operation. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify post delete" event And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.post_moderated.news.feature b/tests/features/community_content/notification.post_moderated.news.feature index a6c2d09614..c47a3c898e 100644 --- a/tests/features/community_content/notification.post_moderated.news.feature +++ b/tests/features/community_content/notification.post_moderated.news.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the news transitions on a post moderated parent. In order to manage my collections As an owner of the collection @@ -29,8 +29,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | CCN post delete | CC member | body | CCN post delete | CC post collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC post collection" collection And I click "Add news" in the plus button menu And I fill in "Short title" with "CCN create publish" @@ -44,8 +43,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | body | CC Member has published the new news - "CCN create publish" in the collection: "CC post collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CCN post publish" news And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -54,8 +52,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | subject | Joinup: Content has been published | | body | CC Member has published the new news - "CCN post publish" in the collection: "CC post collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN post request changes" news And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -67,8 +64,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | the Facilitator, CC Facilitator has requested you to modify the news - "CCN post request changes" in the collection: "CC post collection", with the following motivation: "Can you do some changes?". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN post report" news And I click "Edit" in the "Entity actions" region And I press "Report" @@ -80,8 +76,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | the Facilitator, CC Facilitator has requested you to modify the news - "CCN post report" in the collection: "CC post collection", with the following motivation: "Your content is reported". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN post approve proposed" news And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -91,8 +86,7 @@ Feature: Notification test for the news transitions on a post moderated parent. | body | the Facilitator, CC Facilitator has approved your request of publication of the news - "CCN post approve proposed" in the collection: "CC post collection". | # Test 'delete' operation. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN post delete" news And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.pre_moderated.discussion.feature b/tests/features/community_content/notification.pre_moderated.discussion.feature index 8aeca04fc5..6ee3de3cdb 100644 --- a/tests/features/community_content/notification.pre_moderated.discussion.feature +++ b/tests/features/community_content/notification.pre_moderated.discussion.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the discussion transitions on a pre moderated parent. In order to manage my collections As an owner of the collection @@ -36,8 +36,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | CC notify validated to revise | CC member | body | CC pre collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC pre collection" collection And I click "Add discussion" in the plus button menu And I fill in "Title" with "CC notify create propose" @@ -49,8 +48,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new discussion - "CC notify create propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC pre collection" collection And I click "Add discussion" in the plus button menu And I fill in "Title" with "CC notify create publish" @@ -63,8 +61,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | body | CC Facilitator has published the new discussion - "CC notify create publish" in the collection: "CC pre collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify pre propose" discussion And I click "Edit" in the "Entity actions" region And I press "Propose" @@ -73,8 +70,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new discussion - "CC notify pre propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre propose from reported" discussion + When I go to the "CC notify pre propose from reported" discussion And I click "Edit" in the "Entity actions" region And I press "Propose" Then the following email should have been sent: @@ -82,8 +78,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been updated | | body | CC Member has updated the content of the discussion - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre request deletion" discussion + When I go to the "CC notify pre request deletion" discussion And I click "Edit" in the "Entity actions" region And I press "Request deletion" Then I should see the error message "This action requires you to fill in the motivation field" @@ -94,8 +89,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been updated | | body | CC Member has requested to delete the discussion - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". | - When all e-mails have been sent - And I go to the "CC notify validated to revise" discussion + When I go to the "CC notify validated to revise" discussion And I click "Edit" in the "Entity actions" region And I press "Propose changes" Then the following email should have been sent: @@ -103,8 +97,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been proposed | | body | CC Member has submitted an update of the discussion - "CC notify validated to revise" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre publish" discussion And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -113,8 +106,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been published | | body | CC Facilitator has published the new discussion - "CC notify pre publish" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request changes" discussion And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -130,8 +122,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been proposed | | body | CC Facilitator has submitted an update of the discussion - "CC notify pre request changes" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre report" discussion And I click "Edit" in the "Entity actions" region And I press "Report" @@ -143,8 +134,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the discussion - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre approve proposed" discussion And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -153,8 +143,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has approved your request of publication of the discussion - "CC notify pre approve proposed" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre reject deletion" discussion And I click "Edit" in the "Entity actions" region And I press "Reject deletion" @@ -167,8 +156,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | body | the Facilitator, CC Facilitator has not approved your request to delete the discussion - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". | # Test 'delete' operation on an entity in 'deletion_request' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre delete" discussion And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -178,8 +166,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | subject | Joinup: The discussion "CC notify pre delete" was deleted in the space of "CC pre collection" | | body | for your information, the discussion "CC notify pre delete" was deleted from the "CC pre collection" collection. | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request deletion" discussion And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -190,8 +177,7 @@ Feature: Notification test for the discussion transitions on a pre moderated par | body | for your information, the discussion "CC notify pre request deletion" was deleted from the "CC pre collection" collection. | # Test 'delete' operation on an entity in 'validated' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify validated to delete" discussion And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.pre_moderated.document.feature b/tests/features/community_content/notification.pre_moderated.document.feature index ca519bf20b..f16b06a47f 100644 --- a/tests/features/community_content/notification.pre_moderated.document.feature +++ b/tests/features/community_content/notification.pre_moderated.document.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the document transitions on a pre moderated parent. In order to manage my collections As an owner of the collection @@ -36,8 +36,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | CC notify validated to revise | CC member | body | Document | CC pre collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC pre collection" collection And I click "Add document" in the plus button menu And I fill in "Title" with "CC notify create propose" @@ -50,8 +49,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new document - "CC notify create propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC pre collection" collection And I click "Add document" in the plus button menu And I fill in "Title" with "CC notify create publish" @@ -65,8 +63,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | body | CC Facilitator has published the new document - "CC notify create publish" in the collection: "CC pre collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify pre propose" document And I click "Edit" in the "Entity actions" region And I press "Propose" @@ -75,8 +72,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new document - "CC notify pre propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre propose from reported" document + When I go to the "CC notify pre propose from reported" document And I click "Edit" in the "Entity actions" region And I press "Propose" Then the following email should have been sent: @@ -84,8 +80,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been updated | | body | CC Member has updated the content of the document - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre request deletion" document + When I go to the "CC notify pre request deletion" document And I click "Edit" in the "Entity actions" region And I press "Request deletion" Then I should see the error message "This action requires you to fill in the motivation field" @@ -96,8 +91,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been updated | | body | CC Member has requested to delete the document - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". | - When all e-mails have been sent - And I go to the "CC notify validated to revise" document + When I go to the "CC notify validated to revise" document And I click "Edit" in the "Entity actions" region And I press "Propose changes" Then the following email should have been sent: @@ -105,8 +99,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been proposed | | body | CC Member has submitted an update of the document - "CC notify validated to revise" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre publish" document And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -115,8 +108,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been published | | body | CC Facilitator has published the new document - "CC notify pre publish" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request changes" document And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -132,8 +124,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been proposed | | body | CC Facilitator has submitted an update of the document - "CC notify pre request changes" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre report" document And I click "Edit" in the "Entity actions" region And I press "Report" @@ -145,8 +136,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the document - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre approve proposed" document And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -155,8 +145,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has approved your request of publication of the document - "CC notify pre approve proposed" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre reject deletion" document And I click "Edit" in the "Entity actions" region And I press "Reject deletion" @@ -169,8 +158,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | body | the Facilitator, CC Facilitator has not approved your request to delete the document - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". | # Test 'delete' operation on an entity in 'deletion_request' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre delete" document And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -180,8 +168,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | subject | Joinup: Content has been deleted | | body | Facilitator CC Facilitator has approved your request of deletion for the document - "CC notify pre delete" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request deletion" document And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -192,8 +179,7 @@ Feature: Notification test for the document transitions on a pre moderated paren | body | Facilitator CC Facilitator has approved your request of deletion for the document - "CC notify pre request deletion" in the collection: "CC pre collection". | # Test 'delete' operation on an entity in 'validated' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify validated to delete" document And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.pre_moderated.event.feature b/tests/features/community_content/notification.pre_moderated.event.feature index a6732780d4..03d1c0619f 100644 --- a/tests/features/community_content/notification.pre_moderated.event.feature +++ b/tests/features/community_content/notification.pre_moderated.event.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-b Feature: Notification test for the event transitions on a pre moderated parent. In order to manage my collections As an owner of the collection @@ -36,8 +36,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | CC notify validated to revise | CC member | body | Malcolm X Boulevard, New York | CC pre collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC pre collection" collection And I click "Add event" in the plus button menu And I fill in "Title" with "CC notify create propose" @@ -50,8 +49,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new event - "CC notify create propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC pre collection" collection And I click "Add event" in the plus button menu And I fill in "Title" with "CC notify create publish" @@ -65,8 +63,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | body | CC Facilitator has published the new event - "CC notify create publish" in the collection: "CC pre collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC notify pre propose" event And I click "Edit" in the "Entity actions" region And I press "Propose" @@ -75,8 +72,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Member has submitted a new event - "CC notify pre propose" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre propose from reported" event + When I go to the "CC notify pre propose from reported" event And I click "Edit" in the "Entity actions" region And I press "Propose" Then the following email should have been sent: @@ -84,8 +80,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been updated | | body | CC Member has updated the content of the event - "CC notify pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I go to the "CC notify pre request deletion" event + When I go to the "CC notify pre request deletion" event And I click "Edit" in the "Entity actions" region And I press "Request deletion" Then I should see the error message "This action requires you to fill in the motivation field" @@ -96,8 +91,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been updated | | body | CC Member has requested to delete the event - "CC notify pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". | - When all e-mails have been sent - And I go to the "CC notify validated to revise" event + When I go to the "CC notify validated to revise" event And I click "Edit" in the "Entity actions" region And I press "Propose changes" Then the following email should have been sent: @@ -105,8 +99,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Member has submitted an update of the event - "CC notify validated to revise" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre publish" event And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -115,8 +108,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been published | | body | CC Facilitator has published the new event - "CC notify pre publish" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request changes" event And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -132,8 +124,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Facilitator has submitted an update of the event - "CC notify pre request changes" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre report" event And I click "Edit" in the "Entity actions" region And I press "Report" @@ -145,8 +136,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has requested you to modify the event - "CC notify pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre approve proposed" event And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -155,8 +145,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has approved your request of publication of the event - "CC notify pre approve proposed" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre reject deletion" event And I click "Edit" in the "Entity actions" region And I press "Reject deletion" @@ -169,8 +158,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | body | the Facilitator, CC Facilitator has not approved your request to delete the event - "CC notify pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". | # Test 'delete' operation on an entity in 'deletion_request' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre delete" event And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -180,8 +168,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | subject | Joinup: Content has been deleted | | body | Facilitator CC Facilitator has approved your request of deletion for the event - "CC notify pre delete" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify pre request deletion" event And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -192,8 +179,7 @@ Feature: Notification test for the event transitions on a pre moderated parent. | body | Facilitator CC Facilitator has approved your request of deletion for the event - "CC notify pre request deletion" in the collection: "CC pre collection". | # Test 'delete' operation on an entity in 'validated' state. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC notify validated to delete" event And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/notification.pre_moderated.news.feature b/tests/features/community_content/notification.pre_moderated.news.feature index d9b956819d..4a164da11a 100644 --- a/tests/features/community_content/notification.pre_moderated.news.feature +++ b/tests/features/community_content/notification.pre_moderated.news.feature @@ -1,4 +1,4 @@ -@api @email @terms @group-b +@api @terms @group-g Feature: Notification test for the news transitions on a pre moderated parent. In order to manage my collections As an owner of the collection @@ -36,8 +36,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CCN validated to revise | CC member | body | CCN pre revise | CC pre collection | validated | # Test 'create' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CC pre collection" collection And I click "Add news" in the plus button menu And I fill in "Short title" with "CCN create propose" @@ -59,7 +58,6 @@ Feature: Notification test for the news transitions on a pre moderated parent. And I go to the "CCN create propose" news And I click "Edit" in the "Entity actions" region And I press "Save new draft" - When all e-mails have been sent And I click "Edit" in the "Entity actions" region And I press "Propose" Then the following email should have been sent: @@ -71,8 +69,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CC Member has submitted an update of the news - "CCN create propose" for publication in the collection: "CC pre collection". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CC pre collection" collection And I click "Add news" in the plus button menu And I fill in "Short title" with "CCN create publish" @@ -86,8 +83,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | body | CC Facilitator has published the new news - "CCN create publish" in the collection: "CC pre collection".You can access the new content at the following link: http | # Test 'update' operation. - When all e-mails have been sent - And I am logged in as "CC member" + When I am logged in as "CC member" And I go to the "CCN pre propose" news And I click "Edit" in the "Entity actions" region And I press "Propose" @@ -96,8 +92,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CC Member has submitted a new news - "CCN pre propose" for publication in the collection: "CC pre collection". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I go to the "CCN pre propose from reported" news + When I go to the "CCN pre propose from reported" news And I click "Edit" in the "Entity actions" region And I press "Propose" Then the email sent to "CC owner" with subject "Joinup: Content has been updated" contains the following lines of text: @@ -105,8 +100,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CC Member has updated the content of the news - "CCN pre propose from reported" as advised and requests again its publication in the collection: "CC pre collection". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I go to the "CCN pre request deletion" news + When I go to the "CCN pre request deletion" news And I click "Edit" in the "Entity actions" region And I press "Request deletion" Then I should see the error message "This action requires you to fill in the motivation field" @@ -117,8 +111,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CC Member has requested to delete the news - "CCN pre request deletion" in the collection: "CC pre collection", with the following motivation: "I just want to delete it.". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I go to the "CCN validated to revise" news + When I go to the "CCN validated to revise" news And I click "Edit" in the "Entity actions" region And I press "Propose changes" Then the following email should have been sent: @@ -126,8 +119,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Member has submitted an update of the news - "CCN validated to revise" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre publish" news And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -136,8 +128,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | subject | Joinup: Content has been published | | body | CC Facilitator has published the new news - "CCN pre publish" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre request changes" news And I click "Edit" in the "Entity actions" region And I press "Request changes" @@ -153,8 +144,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | subject | Joinup: Content has been proposed | | body | CC Facilitator has submitted an update of the news - "CCN pre request changes" for publication in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre report" news And I click "Edit" in the "Entity actions" region And I press "Report" @@ -166,8 +156,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | the Facilitator, CC Facilitator has requested you to modify the news - "CCN pre report" in the collection: "CC pre collection", with the following motivation: "Your content is reported". | | If you think this action is not clear or not due, please contact Joinup Support at | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre approve proposed" news And I click "Edit" in the "Entity actions" region And I press "Publish" @@ -176,8 +165,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | subject | Joinup: Content has been updated | | body | the Facilitator, CC Facilitator has approved your request of publication of the news - "CCN pre approve proposed" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre reject deletion" news And I click "Edit" in the "Entity actions" region And I press "Reject deletion" @@ -190,8 +178,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | body | the Facilitator, CC Facilitator has not approved your request to delete the news - "CCN pre reject deletion" in the collection: "CC pre collection", with the following motivation: "I still like it". | # Test 'delete' operation. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre delete" news And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -201,8 +188,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | subject | Joinup: Content has been deleted | | body | Facilitator CC Facilitator has approved your request of deletion for the news - "CCN pre delete" in the collection: "CC pre collection". | - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN pre request deletion" news And I click "Edit" in the "Entity actions" region And I click "Delete" @@ -213,8 +199,7 @@ Feature: Notification test for the news transitions on a pre moderated parent. | body | Facilitator CC Facilitator has approved your request of deletion for the news - "CCN pre request deletion" in the collection: "CC pre collection". | # Test 'delete' operation for a validated entity. - When all e-mails have been sent - And I am logged in as "CC facilitator" + When I am logged in as "CC facilitator" And I go to the "CCN validated to delete" news And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/community_content/revisions.feature b/tests/features/community_content/revisions.feature index d7c7298623..9aba815d98 100644 --- a/tests/features/community_content/revisions.feature +++ b/tests/features/community_content/revisions.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: In order to see how content evolved over time As a content author or facilitator diff --git a/tests/features/contact_form/prefill.feature b/tests/features/contact_form/prefill.feature index 608d7bb614..e0218ba3d1 100644 --- a/tests/features/contact_form/prefill.feature +++ b/tests/features/contact_form/prefill.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: Prefill contact form fields In order to simplify the gathering of feedback from the users As a moderator @@ -17,8 +17,8 @@ Feature: Prefill contact form fields # Create a page with a link that points to the contact form with the "subject" parameter containing some text. When I fill in the following: - | Title | Change management | - | Body | <p>Follow this <a href="/contact?subject=CAMSS%20Change%20Request">link</a></p> | + | Title | Change management | + | Body | <p>Follow this <a href="../../contact?subject=CAMSS%20Change%20Request">link</a></p> | And I press "Save" Then I should see the heading "Change management" diff --git a/tests/features/contact_form/report.feature b/tests/features/contact_form/report.feature index 429ce42d71..e949ea1fab 100644 --- a/tests/features/contact_form/report.feature +++ b/tests/features/contact_form/report.feature @@ -4,7 +4,6 @@ Feature: Submit the contact form As a moderator, group administrator or content owner I need to receive email when the content is reported - @email Scenario: Receive email when content is reported Given users: | Username | Roles | E-mail | First name | Family name | diff --git a/tests/features/contact_form/submit_contact_form.feature b/tests/features/contact_form/submit_contact_form.feature index 26bcfad700..224771f697 100644 --- a/tests/features/contact_form/submit_contact_form.feature +++ b/tests/features/contact_form/submit_contact_form.feature @@ -1,10 +1,10 @@ -@api @group-b +@api @group-f Feature: Submit the contact form In order to gather feedback from the users As a moderator I want to collect wishes and grievances through a contact form - @email @uploadFiles:logo.png + @uploadFiles:logo.png Scenario: Submit a message as an anonymous user Given users: | Username | Roles | diff --git a/tests/features/contact_information/access.feature b/tests/features/contact_information/access.feature index 744113009f..1f9bacbc4c 100644 --- a/tests/features/contact_information/access.feature +++ b/tests/features/contact_information/access.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: Contact information access In order to see contextualized information As a visitor diff --git a/tests/features/contact_information/add_contact_information.feature b/tests/features/contact_information/add_contact_information.feature index 0561b13355..9b343c7b7e 100644 --- a/tests/features/contact_information/add_contact_information.feature +++ b/tests/features/contact_information/add_contact_information.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: Creation of contact information In order to add contact information As a facilitator diff --git a/tests/features/contact_information/api.feature b/tests/features/contact_information/api.feature index f6eff11399..ebc752566b 100644 --- a/tests/features/contact_information/api.feature +++ b/tests/features/contact_information/api.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: Contact information API In order to manage contact information programmatically As a backend developer diff --git a/tests/features/contact_information/contact_information.moderation.feature b/tests/features/contact_information/contact_information.moderation.feature index dd96070430..8bd7d26c87 100644 --- a/tests/features/contact_information/contact_information.moderation.feature +++ b/tests/features/contact_information/contact_information.moderation.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-f Feature: Contact Information moderation In order to manage contact information As a facilitator or moderator diff --git a/tests/features/content_overview.feature b/tests/features/content_overview.feature index 8aba9e2bf1..594b2c57f3 100644 --- a/tests/features/content_overview.feature +++ b/tests/features/content_overview.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-d Feature: Content Overview @terms diff --git a/tests/features/custom_page/add_custom_page.feature b/tests/features/custom_page/add_custom_page.feature index 5448ea5a55..1ada318df9 100644 --- a/tests/features/custom_page/add_custom_page.feature +++ b/tests/features/custom_page/add_custom_page.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: "Add custom page" visibility options. In order to manage custom pages As a group facilitator diff --git a/tests/features/custom_page/api.feature b/tests/features/custom_page/api.feature index 1f413d1bf8..14e073caea 100644 --- a/tests/features/custom_page/api.feature +++ b/tests/features/custom_page/api.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: Custom page API In order to manage custom pages programmatically As a backend developer diff --git a/tests/features/custom_page/community_content.view_mode.feature b/tests/features/custom_page/community_content.view_mode.feature index 170ec58e55..f49ddf37b4 100644 --- a/tests/features/custom_page/community_content.view_mode.feature +++ b/tests/features/custom_page/community_content.view_mode.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: In order to have better presentation of my content as a user of the website diff --git a/tests/features/custom_page/community_content_listing.feature b/tests/features/custom_page/community_content_listing.feature index 52646171cb..72088e3ab0 100644 --- a/tests/features/custom_page/community_content_listing.feature +++ b/tests/features/custom_page/community_content_listing.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: In order to make it easy to browse to specific content As a moderator diff --git a/tests/features/custom_page/custom_page.delete.feature b/tests/features/custom_page/custom_page.delete.feature index 31cda93ece..77bc16a49f 100644 --- a/tests/features/custom_page/custom_page.delete.feature +++ b/tests/features/custom_page/custom_page.delete.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: "Custom page" deleteing. In order to manage custom pages As a moderator or group facilitator diff --git a/tests/features/custom_page/custom_page.edit.feature b/tests/features/custom_page/custom_page.edit.feature index 3e6669c9d2..6fabe0fa30 100644 --- a/tests/features/custom_page/custom_page.edit.feature +++ b/tests/features/custom_page/custom_page.edit.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: "Custom page" editing. In order to manage custom pages As a moderator or group facilitator diff --git a/tests/features/custom_page/custom_page.view.feature b/tests/features/custom_page/custom_page.view.feature index f77517954f..1f83ca3db2 100644 --- a/tests/features/custom_page/custom_page.view.feature +++ b/tests/features/custom_page/custom_page.view.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: As a privileged user I want to create custom pages inside unpublished collections or solutions diff --git a/tests/features/custom_page/navigation_menu.feature b/tests/features/custom_page/navigation_menu.feature index a2a7158d20..310ff04670 100644 --- a/tests/features/custom_page/navigation_menu.feature +++ b/tests/features/custom_page/navigation_menu.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-a Feature: Navigation menu for custom pages In order to determine the order and visibility of custom pages in the navigation menu As a facilitator diff --git a/tests/features/custom_page/search.feature b/tests/features/custom_page/search.feature index b913a7a7e9..d648342b28 100644 --- a/tests/features/custom_page/search.feature +++ b/tests/features/custom_page/search.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Custom pages enhance search results for their collections/solutions In order to increase the chances of my group to be found As a facilitator diff --git a/tests/features/dashboard.feature b/tests/features/dashboard.feature index ba878987a8..c2eb7c6ec7 100644 --- a/tests/features/dashboard.feature +++ b/tests/features/dashboard.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-d Feature: Dashboard In order to see an overview of my related information at a glance As an authenticated user diff --git a/tests/features/error.feature b/tests/features/error.feature index 646981c54e..a32902ca14 100644 --- a/tests/features/error.feature +++ b/tests/features/error.feature @@ -1,4 +1,4 @@ -@api @errorPage @group-a +@wip @api @errorPage @group-c Feature: On errors I want to see a friendly page and be able to report an incident number/code. diff --git a/tests/features/eulogin/eulogin.feature b/tests/features/eulogin/eulogin.feature index 6928f69f88..0fe97159f4 100644 --- a/tests/features/eulogin/eulogin.feature +++ b/tests/features/eulogin/eulogin.feature @@ -1,4 +1,4 @@ -@api @casMockServer @group-b +@api @casMockServer @group-a Feature: Log in through EU Login In order to access all website of the European Commission with the same credentials As a user with an existing EU Login account @@ -207,7 +207,6 @@ Feature: Log in through EU Login When I go to "/user/password" Then I should get an access denied error - @email Scenario: An existing local user wants to link their EU Login account but forgot their Drupal password. Given CAS users: | Username | E-mail | Password | First name | Last name | diff --git a/tests/features/featured_entities.feature b/tests/features/featured_entities.feature index fa5001388d..6ab044d843 100644 --- a/tests/features/featured_entities.feature +++ b/tests/features/featured_entities.feature @@ -1,4 +1,4 @@ -@api @email @javascript @group-a +@api @javascript @group-c Feature: Featuring content site-wide As a moderator of Joinup I want to feature content in the website diff --git a/tests/features/file_url/widget-ui.feature b/tests/features/file_url/widget-ui.feature index 85ebaf389d..ec51d8cca4 100644 --- a/tests/features/file_url/widget-ui.feature +++ b/tests/features/file_url/widget-ui.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: User interface for the File URL field In order to be able to upload files or refer to external files As an authenticated user diff --git a/tests/features/glossary/glossary.feature b/tests/features/glossary/glossary.feature index 25d90855e9..15f8d92dc7 100644 --- a/tests/features/glossary/glossary.feature +++ b/tests/features/glossary/glossary.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-g Feature: As a moderator or group facilitator I want to be able to add, edit and delete glossary terms. As a user I want to be able to see glossary terms as links to their definition page. @@ -149,10 +149,10 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and Scenario: Glossary terms should be shown as links in collection content Given collection: - | title | Collection With Glossary | - | state | validated | - | description | Colors of Paradise. Abbreviated as CLR. <a href="/contact"><strong>Colors of Dream</strong></a> | - | abstract | The Alphabet is back and it's s/ashy. | + | title | Collection With Glossary | + | state | validated | + | description | Colors of Paradise. Abbreviated as CLR. <a href="../../contact"><strong>Colors of Dream</strong></a> | + | abstract | The Alphabet is back and it's s/ashy. | And solution: | title | Under The Bridge | | description | No Colors | @@ -306,8 +306,8 @@ Feature: As a moderator or group facilitator I want to be able to add, edit and And I should see the link "Battle" And I should see the link "Evermore" And I should see the link "battle again" - And the response should contain "<a href=\"/collection/collection-glossary/glossary/term/battle\" class=\"glossary-term\" title=\"def\">Battle</a>" - And the response should contain "<a href=\"/collection/collection-glossary/glossary/term/battle-again\" class=\"glossary-term\" title=\"Not to be confused with a battle of sheep\">battle again</a>" + And the response should contain "/collection/collection-glossary/glossary/term/battle\" class=\"glossary-term\" title=\"def\">Battle</a>" + And the response should contain "/collection/collection-glossary/glossary/term/battle-again\" class=\"glossary-term\" title=\"Not to be confused with a battle of sheep\">battle again</a>" But I should not see the link "batTle" And I should not see the link "BATTLE" And I should not see the link "everMore" diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature index 89866e4575..b3589eb593 100644 --- a/tests/features/homepage.feature +++ b/tests/features/homepage.feature @@ -160,13 +160,12 @@ Feature: Homepage Given the Joinup version is set to "<version>" When I am on the homepage Then I should see the link "<version>" in the Footer region - When I click "<version>" - Then the url should match "<url>" + And the "<version>" link should point to "<url>" Examples: - | version | url | - | v1.57.0 | /ec-europa/joinup-dev/releases/tag/v1.57.0 | - | v1.57.0-177-g0123456abcdef | /ec-europa/joinup-dev/commit/0123456abcdef | + | version | url | + | v1.57.0 | https://git.fpfis.eu/digit/digit-joinup-reference/-/tags/v1.57.0 | + | v1.57.0-177-g0123456abcdef | https://git.fpfis.eu/digit/digit-joinup-dev/-/commit/0123456abcdef | Scenario: Search box is shown in the main content Given collection: diff --git a/tests/features/isa2_analytics/site_search.feature b/tests/features/isa2_analytics/site_search.feature index 1b6cdde69e..b0a838ebd9 100644 --- a/tests/features/isa2_analytics/site_search.feature +++ b/tests/features/isa2_analytics/site_search.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: Site search As an analytics engineer I want search statistics grouped by the keyword diff --git a/tests/features/isa2_analytics/site_sections.feature b/tests/features/isa2_analytics/site_sections.feature index d81652905c..575e2abeea 100644 --- a/tests/features/isa2_analytics/site_sections.feature +++ b/tests/features/isa2_analytics/site_sections.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms Feature: Site sections As an analytics engineer I want visitor statistics to be grouped in sections diff --git a/tests/features/joinup_collection/membership.feature b/tests/features/joinup_collection/membership.feature index 0c1f851899..e24ab5129c 100644 --- a/tests/features/joinup_collection/membership.feature +++ b/tests/features/joinup_collection/membership.feature @@ -1,4 +1,4 @@ -@api @joinup_collection @group-b +@api @joinup_collection Feature: Tests membership to Joinup collection. Background: diff --git a/tests/features/joinup_core/contextual_links.feature b/tests/features/joinup_core/contextual_links.feature index 03d99d3fae..6e37141a49 100644 --- a/tests/features/joinup_core/contextual_links.feature +++ b/tests/features/joinup_core/contextual_links.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: As a moderator of the website in order to better manage all content diff --git a/tests/features/joinup_core/input_filter.feature b/tests/features/joinup_core/input_filter.feature index 5b90ed595e..f8f3d3217f 100644 --- a/tests/features/joinup_core/input_filter.feature +++ b/tests/features/joinup_core/input_filter.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: Input filter In order to maintain security As a user diff --git a/tests/features/joinup_core/manage_content.feature b/tests/features/joinup_core/manage_content.feature index fa08679ed3..1dec69abfa 100644 --- a/tests/features/joinup_core/manage_content.feature +++ b/tests/features/joinup_core/manage_content.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: As a moderator In order to better organize the content diff --git a/tests/features/joinup_core/owner_deletion.feature b/tests/features/joinup_core/owner_deletion.feature index efbc36c9af..c0d294f7b6 100644 --- a/tests/features/joinup_core/owner_deletion.feature +++ b/tests/features/joinup_core/owner_deletion.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Deletion of collection and solution owners As a site owner In order to avoid my groups becoming orphaned diff --git a/tests/features/joinup_core/page_access.feature b/tests/features/joinup_core/page_access.feature index 42e94ab23f..b892a06ba8 100644 --- a/tests/features/joinup_core/page_access.feature +++ b/tests/features/joinup_core/page_access.feature @@ -1,4 +1,4 @@ -@group-b +@group-d Feature: As an owner of a website When I visit non existing pages diff --git a/tests/features/joinup_core/page_destination.feature b/tests/features/joinup_core/page_destination.feature index 68fdbe3149..e0a79c27e6 100644 --- a/tests/features/joinup_core/page_destination.feature +++ b/tests/features/joinup_core/page_destination.feature @@ -1,4 +1,4 @@ -@api @javascript @casMockServer @group-b +@api @casMockServer @group-c Feature: As a user of the website When I try to login @@ -32,7 +32,7 @@ Feature: And the relative url should be "/search?keys=how%20to%20redirect" Scenario: Only the destination parameter should be carried over if one exists outside the user pages. - When I am on "/search?keys=how+to+redirect&destination=/contact" + When I am on "/search?keys=how+to+redirect&destination=contact" And I click "Sign in" in the "Navigation bar" And I fill in "E-mail address" with "mr.redirect@example.com" And I fill in "Password" with "Mr Redirect" diff --git a/tests/features/joinup_core/pathauto.feature b/tests/features/joinup_core/pathauto.feature index bd67935489..9faaadac62 100644 --- a/tests/features/joinup_core/pathauto.feature +++ b/tests/features/joinup_core/pathauto.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-c Feature: As an owner of a website In order to provide the visitors with user friendly urls diff --git a/tests/features/joinup_core/persistent_uris.feature b/tests/features/joinup_core/persistent_uris.feature index 8384eca5c4..b1d94c594f 100644 --- a/tests/features/joinup_core/persistent_uris.feature +++ b/tests/features/joinup_core/persistent_uris.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-c Feature: As an owner of a website In order to guarantee data persistence diff --git a/tests/features/joinup_core/plusbutton.feature b/tests/features/joinup_core/plusbutton.feature index bd210e45b1..162ad06eaf 100644 --- a/tests/features/joinup_core/plusbutton.feature +++ b/tests/features/joinup_core/plusbutton.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: Plus button In order be able to create content As a user of the website diff --git a/tests/features/joinup_core/reporting.feature b/tests/features/joinup_core/reporting.feature index 30a2366278..8ffde7a62e 100644 --- a/tests/features/joinup_core/reporting.feature +++ b/tests/features/joinup_core/reporting.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: As a site moderator/administrator When I'm logged in diff --git a/tests/features/joinup_core/social_share.feature b/tests/features/joinup_core/social_share.feature index d55f3f4e24..a3f588de13 100644 --- a/tests/features/joinup_core/social_share.feature +++ b/tests/features/joinup_core/social_share.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: Sharing content on social networks As a user of the platform I want to share content in my social networks @@ -39,8 +39,7 @@ Feature: Sharing content on social networks | Important solution | Social networks | validated | When I am logged in as a user with the "authenticated" role - And I am on the homepage - And I click "More solutions" + And I go to "/solutions" And I click the contextual link "Share" in the "Important solution" tile And I should see the link "Facebook" diff --git a/tests/features/joinup_core/transfer_group_ownership.feature b/tests/features/joinup_core/transfer_group_ownership.feature index eb6e92d211..f8f1dd3b23 100644 --- a/tests/features/joinup_core/transfer_group_ownership.feature +++ b/tests/features/joinup_core/transfer_group_ownership.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-e Feature: As a group (collection or solution) owner or site moderator In order to manage my group I should be able to transfer the group ownership. @@ -31,7 +31,6 @@ Feature: As a group (collection or solution) owner or site moderator | Learn German in 1 Month | shy | facilitator | | Learn German in 1 Month | frozen | owner | - @email Scenario Outline: Administrators, moderators and owners can transfer the group ownership. Given I am logged in as "<user>" And I am on the members page of "<title>" diff --git a/tests/features/joinup_core/unpublished_entities.feature b/tests/features/joinup_core/unpublished_entities.feature index de1b2db82d..adb124845c 100644 --- a/tests/features/joinup_core/unpublished_entities.feature +++ b/tests/features/joinup_core/unpublished_entities.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-d Feature: Unpublished content of the website In order to manage unpublished entities As a user of the website diff --git a/tests/features/joinup_discussion/add_discussion.collection.feature b/tests/features/joinup_discussion/add_discussion.collection.feature index 185541465b..ae20ad63d6 100644 --- a/tests/features/joinup_discussion/add_discussion.collection.feature +++ b/tests/features/joinup_discussion/add_discussion.collection.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Discussions added to collections In order to manage discussions As a collection member diff --git a/tests/features/joinup_discussion/add_discussion.solution.feature b/tests/features/joinup_discussion/add_discussion.solution.feature index 05c6bd032b..95b20a265f 100644 --- a/tests/features/joinup_discussion/add_discussion.solution.feature +++ b/tests/features/joinup_discussion/add_discussion.solution.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Add discussion" visibility options. In order to manage discussions As a solution member diff --git a/tests/features/joinup_discussion/api.feature b/tests/features/joinup_discussion/api.feature index 6a6cc4b758..bd5a64b290 100644 --- a/tests/features/joinup_discussion/api.feature +++ b/tests/features/joinup_discussion/api.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Discussion API In order to manage discussion entities programmatically As a backend developer diff --git a/tests/features/joinup_discussion/discussion.edit.feature b/tests/features/joinup_discussion/discussion.edit.feature index a6943bb182..dbd5fe5247 100644 --- a/tests/features/joinup_discussion/discussion.edit.feature +++ b/tests/features/joinup_discussion/discussion.edit.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-c Feature: "Discussion page" editing. In order to manage discussions As an owner of the discussion diff --git a/tests/features/joinup_discussion/discussion.invite.feature b/tests/features/joinup_discussion/discussion.invite.feature index 03130173b2..0855ce9df5 100644 --- a/tests/features/joinup_discussion/discussion.invite.feature +++ b/tests/features/joinup_discussion/discussion.invite.feature @@ -1,10 +1,10 @@ -@api @group-b +@api @group-c Feature: Invite members to subscribe to discussions In order to promote discussion of topics As a discussion author or moderator I need to be able to invite users to discussions - @email @javascript + @javascript Scenario: Invite members to a discussion Given users: | Username | E-mail | First name | Family name | @@ -163,7 +163,7 @@ Feature: Invite members to subscribe to discussions | Glory Ruskin | # Invite some users. - Given the mail collector cache is empty + Given I mark all emails as read And I press "Invite to discussion" Then I should see the success message "2 user(s) have been invited to this discussion." And the following email should have been sent: @@ -177,7 +177,6 @@ Feature: Invite members to subscribe to discussions And 2 e-mails should have been sent # Try if it is possible to resend an invitation. - Given the mail collector cache is empty When I fill in "E-mail" with "gloruskin.hr@example.com" And I hit "enter" in the keyboard on the field "E-mail" And I wait for AJAX to finish @@ -208,7 +207,7 @@ Feature: Invite members to subscribe to discussions # Try to invite the user again. This should not send an invitation since the # user is already subscribed. - Given the mail collector cache is empty + Given I mark all emails as read And I am logged in as "Lynwood Crawford" When I go to the "Concerned about dissolved gases?" discussion And I click "Invite" diff --git a/tests/features/joinup_discussion/discussion.moderation.feature b/tests/features/joinup_discussion/discussion.moderation.feature index 7c3c107487..a7d21f945a 100644 --- a/tests/features/joinup_discussion/discussion.moderation.feature +++ b/tests/features/joinup_discussion/discussion.moderation.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-c Feature: Discussion moderation In order to manage discussions As a user of the website diff --git a/tests/features/joinup_discussion/discussion.subscribe.feature b/tests/features/joinup_discussion/discussion.subscribe.feature index 5e3d6d9b6a..ede4ccdf27 100644 --- a/tests/features/joinup_discussion/discussion.subscribe.feature +++ b/tests/features/joinup_discussion/discussion.subscribe.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: Following discussions As a member of Joinup I want to follow interesting discussions @@ -55,7 +55,6 @@ Feature: Following discussions And I should see the link "Follow" And the "Rare butter" discussion should have 0 subscribers - @email Scenario: Receive E-mail notifications when actions are taken in discussions. Given users: | Username | E-mail | First name | Family name | Notification frequency | @@ -97,7 +96,7 @@ Feature: Following discussions # No E-mail notification is sent when the discussion is updated but no # relevant fields are changed. - And the mail collector cache is empty + And I mark all emails as read And I am logged in as "Dr. Hans Zarkov" And I go to the edit form of the "Rare Butter" discussion And I press "Update" @@ -126,24 +125,12 @@ Feature: Following discussions # If the discussion is moved from 'validated' to any other state, no # notification will be sent, regardless if a relevant field is changed. - Given the mail collector cache is empty + Given I mark all emails as read And I am logged in as a moderator When I go to the edit form of the "Rare Butter" discussion And I fill in "Content" with "Is this change triggering notifications?" And I fill in "Motivation" with "Reporting this content..." And I press "Report" - Then the following email should not have been sent: - | recipient_mail | dale@example.com | - | subject | Joinup: The discussion "Rare Butter" was updated in the space of "Dairy products" | - | body | The discussion "Rare Butter" was updated in the "Dairy products" collection. | - And the following email should not have been sent: - | recipient_mail | flash@example.com | - | mail_subject | Joinup: The discussion "Rare Butter" was updated in the space of "Dairy products" | - | mail_body | The discussion "Rare Butter" was updated in the "Dairy products" collection. | - And the following email should not have been sent: - | recipient_mail | ming@example.com | - | mail_subject | Joinup: The discussion "Rare Butter" was updated in the space of "Dairy products" | - | mail_body | The discussion "Rare Butter" was updated in the "Dairy products" collection. | # The notification that a moderator requests a modification should still be # sent to the content author. But the following email should have been sent: @@ -152,7 +139,6 @@ Feature: Following discussions | body | the Moderator, has requested you to modify the discussion - "Rare Butter" | And 1 e-mail should have been sent - Given the mail collector cache is empty When I go to the "Rare Butter" discussion And I click "Delete" in the "Entity actions" region And I press "Delete" diff --git a/tests/features/joinup_discussion/homepage.feature b/tests/features/joinup_discussion/homepage.feature index a93e00aa70..3b0e422b70 100644 --- a/tests/features/joinup_discussion/homepage.feature +++ b/tests/features/joinup_discussion/homepage.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Discussion homepage As a user of the website I want to be able to view the discussion information diff --git a/tests/features/joinup_document/add_document.collection.feature b/tests/features/joinup_document/add_document.collection.feature index c15e8ca4cc..f3f1b02bbe 100644 --- a/tests/features/joinup_document/add_document.collection.feature +++ b/tests/features/joinup_document/add_document.collection.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Add document" visibility options. In order to manage documents As a collection member diff --git a/tests/features/joinup_document/add_document.solution.feature b/tests/features/joinup_document/add_document.solution.feature index d8a4d16e14..8333ed97f7 100644 --- a/tests/features/joinup_document/add_document.solution.feature +++ b/tests/features/joinup_document/add_document.solution.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Add document" visibility options. In order to manage documents As a solution member diff --git a/tests/features/joinup_document/api.feature b/tests/features/joinup_document/api.feature index d398ce4141..8a310311c1 100644 --- a/tests/features/joinup_document/api.feature +++ b/tests/features/joinup_document/api.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Document API In order to manage document entities programmatically As a backend developer diff --git a/tests/features/joinup_document/document.edit.feature b/tests/features/joinup_document/document.edit.feature index db3c868d94..cea66bbba1 100644 --- a/tests/features/joinup_document/document.edit.feature +++ b/tests/features/joinup_document/document.edit.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Document page" editing. In order to manage documents As an owner of the document diff --git a/tests/features/joinup_document/document.moderation.feature b/tests/features/joinup_document/document.moderation.feature index e7e00d2cb4..c0fad7bca1 100644 --- a/tests/features/joinup_document/document.moderation.feature +++ b/tests/features/joinup_document/document.moderation.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-d Feature: Document moderation In order to manage documents As a user of the website diff --git a/tests/features/joinup_document/document.overview.feature b/tests/features/joinup_document/document.overview.feature index 58c1d07e7d..eed4be2605 100644 --- a/tests/features/joinup_document/document.overview.feature +++ b/tests/features/joinup_document/document.overview.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Document" overview. In order to use documents As a user of the website diff --git a/tests/features/joinup_event/add_event.collection.feature b/tests/features/joinup_event/add_event.collection.feature index 336ba95f4f..d571ddf547 100644 --- a/tests/features/joinup_event/add_event.collection.feature +++ b/tests/features/joinup_event/add_event.collection.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Add event" visibility options. In order to manage events As a collection member diff --git a/tests/features/joinup_event/add_event.solution.feature b/tests/features/joinup_event/add_event.solution.feature index 8c16c775f5..a34ec14c80 100644 --- a/tests/features/joinup_event/add_event.solution.feature +++ b/tests/features/joinup_event/add_event.solution.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Add event" visibility options. In order to manage events As a solution member diff --git a/tests/features/joinup_event/api.feature b/tests/features/joinup_event/api.feature index 425f3770a2..5defa87e5b 100644 --- a/tests/features/joinup_event/api.feature +++ b/tests/features/joinup_event/api.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Event API In order to manage custom pages programmatically As a backend developer diff --git a/tests/features/joinup_event/event.edit.feature b/tests/features/joinup_event/event.edit.feature index 20ea4c3821..50b19b0844 100644 --- a/tests/features/joinup_event/event.edit.feature +++ b/tests/features/joinup_event/event.edit.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: "Event page" editing. In order to manage events As an owner of the event diff --git a/tests/features/joinup_event/event.moderation.feature b/tests/features/joinup_event/event.moderation.feature index 32f132514e..b8859973d0 100644 --- a/tests/features/joinup_event/event.moderation.feature +++ b/tests/features/joinup_event/event.moderation.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-d Feature: Event moderation In order to manage events As a user of the website diff --git a/tests/features/joinup_federation/import.feature b/tests/features/joinup_federation/import.feature index 8c0d99a4dd..2de48c36cf 100644 --- a/tests/features/joinup_federation/import.feature +++ b/tests/features/joinup_federation/import.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: As a site moderator I am able to import RDF files. Background: diff --git a/tests/features/joinup_group/group_reports.feature b/tests/features/joinup_group/group_reports.feature index a47530128e..ef2e2cc472 100644 --- a/tests/features/joinup_group/group_reports.feature +++ b/tests/features/joinup_group/group_reports.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: In order to understand how my group is being used As a facilitator diff --git a/tests/features/joinup_group/member_permissions_table.feature b/tests/features/joinup_group/member_permissions_table.feature index ffedc2dc6a..81197e1cfb 100644 --- a/tests/features/joinup_group/member_permissions_table.feature +++ b/tests/features/joinup_group/member_permissions_table.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-d Feature: Group member permissions table In order to get an overview of which actions I can take in a group As a member of a collection or solution diff --git a/tests/features/joinup_group/revoke_privileges.feature b/tests/features/joinup_group/revoke_privileges.feature index b53d567346..2eae31e2e5 100644 --- a/tests/features/joinup_group/revoke_privileges.feature +++ b/tests/features/joinup_group/revoke_privileges.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: Revoke privileges from former and blocked members In order to ensure content in my group is not vandalized by former members As a facilitator diff --git a/tests/features/joinup_group/short_id.feature b/tests/features/joinup_group/short_id.feature index 9f6bbafb24..bedce12a43 100644 --- a/tests/features/joinup_group/short_id.feature +++ b/tests/features/joinup_group/short_id.feature @@ -1,4 +1,4 @@ -@api @terms @group-a +@api @terms @group-c Feature: As an owner of a group In order to make the URL of my group easier to read diff --git a/tests/features/joinup_news/news_moderation.feature b/tests/features/joinup_news/news_moderation.feature index af71a41b72..ba8261c548 100644 --- a/tests/features/joinup_news/news_moderation.feature +++ b/tests/features/joinup_news/news_moderation.feature @@ -1,4 +1,4 @@ -@api +@api @group-g # This features tests the workflow transitions. # # The steps @Then I go to the "news" content :title edit screen diff --git a/tests/features/joinup_notification/asset_release.notification.feature b/tests/features/joinup_notification/asset_release.notification.feature index 0b9b2457a9..cb6500adb6 100644 --- a/tests/features/joinup_notification/asset_release.notification.feature +++ b/tests/features/joinup_notification/asset_release.notification.feature @@ -1,4 +1,4 @@ -@api @email @wip +@api @wip Feature: Asset release notification system In order to manage releases As a user of the website @@ -27,8 +27,7 @@ Feature: Asset release notification system | My awesome solution abc | Copernicus | owner | Scenario: Publish a release as a facilitator. - When all e-mails have been sent - And I am logged in as "Copernicus" + When I am logged in as "Copernicus" And I go to the homepage of the "My awesome solution abc" solution And I click "Add release" And I fill in the following: @@ -44,7 +43,7 @@ Feature: Asset release notification system | body | Dear Copernicus, Your release "1" for the "My awesome solution abc" solution was uploaded succesfully. Kind regards, The Joinup Support Team. | # Update an existing release. - When all e-mails have been sent + When I mark all emails as read And I go to the homepage of the "My awesome release abc" release And I click "Edit" in the "Entity actions" region And I fill in "Release number" with "v2" diff --git a/tests/features/joinup_notification/content.notification.feature b/tests/features/joinup_notification/content.notification.feature index 95bca0fa1a..84b98ae340 100644 --- a/tests/features/joinup_notification/content.notification.feature +++ b/tests/features/joinup_notification/content.notification.feature @@ -1,4 +1,4 @@ -@api @email @wip +@api @wip Feature: Content notification system As a user of the website In order to be up to date with the changes on my content @@ -30,7 +30,6 @@ Feature: Content notification system And event content: | title | short title | body | state | solution | start date | end date | | Smoke signals pre-conference party | Smoke signals party | A party thrown before the conference. | proposed | Smoke signals code standard | 2017-03-31T16:43:13 | 2017-03-31T16:43:13 | - And all e-mails have been sent Scenario: Send emails on content update. When I am logged in as "Jerrard Verity" @@ -45,7 +44,7 @@ Feature: Content notification system | subject | Joinup: user Jerrard Verity updated a News of your collection | | body | Devyn Queshire, Jerrard Verity updated the News "Communication tools" in your Communication tools collection. | - Given all the e-mails have been sent + Given I mark all emails as read When I go to the "Smoke signals pre-conference party" event And I click "Edit" And I fill in "Location" with "Somewhere with a clean sky" @@ -70,7 +69,7 @@ Feature: Content notification system | body | Dear Devyn Queshire, your news "Infrared long-range communications" was successfully deleted. Kinds regards, The Joinup Support Team. | When I am logged in as "Jerrard Verity" - And all the e-mails have been sent + And I mark all emails as read When I go to the "Smoke signals pre-conference party" event And I click "Delete" And I press "Delete" diff --git a/tests/features/joinup_notification/solution.notification.feature b/tests/features/joinup_notification/solution.notification.feature index 3c280d45b2..1592b7f53f 100644 --- a/tests/features/joinup_notification/solution.notification.feature +++ b/tests/features/joinup_notification/solution.notification.feature @@ -1,4 +1,4 @@ -@api @email @wip +@api @wip Feature: Solution notification system In order to manage solutions As a user of the website diff --git a/tests/features/joinup_search/group_search.feature b/tests/features/joinup_search/group_search.feature index 3e15d81704..0bd2e9275d 100644 --- a/tests/features/joinup_search/group_search.feature +++ b/tests/features/joinup_search/group_search.feature @@ -221,6 +221,10 @@ Feature: Search inside groups Then the option with text "Chalet construction (2)" from select facet form "collection/solution" is selected And the page should show the tiles "Ground plan, Natural materials" And I should see the following facet summary "Chalet construction" + # Workaround to scroll an element towards the center of the screen to avoid a false out of bounds move exception. + # @todo: Remove this as part of ISAICP-6800. + # @see: https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6800 + When I scroll the "Chalet construction" chip into view When I should remove the following facet summary "Chalet construction" Then the page should not contain any facet summary And the page should show the tiles "Ground plan, Pre-alpha, Natural materials, Presenting DrillMaster X88" @@ -233,8 +237,8 @@ Feature: Search inside groups When I open the search bar by clicking on the search icon Then the page should not contain any chips - When I select "Inclined foundations" from the "collection/solution" select facet form - And I click Search in facets form + When I select "Inclined foundations" from "Collection/Solution" + And I press "Search" Then the option with text "Inclined foundations (6)" from select facet form "collection/solution" is selected And I should see 6 tiles @@ -243,8 +247,8 @@ Feature: Search inside groups # The filter facets summary shouldn't remain active when doing another search. When I enter "ground" in the search bar and press enter - Then I select "Inclined foundations" from the "collection/solution" select facet form - And I click Search in facets form + Then I select "Inclined foundations" from "Collection/Solution" + And I press "Search" And I should see 2 tiles When I open the search bar by clicking on the search icon And I should see the following facet summary "Inclined foundations" diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature index 036dfd04c3..5b9243b45c 100644 --- a/tests/features/joinup_search/search.feature +++ b/tests/features/joinup_search/search.feature @@ -1,4 +1,4 @@ -@api @terms @group-b +@api @terms @group-d Feature: Global search As a user of the site I can find content through the global search. @@ -53,7 +53,7 @@ Feature: Global search # Since the topics are indented by a whitespace, and the whitespaces are trimmed in the step above, we are testing # the full response in order to ensure that the results are indented properly. The   character below is the # printable space character. - # @todo and WARNING. The following character is supported by the old 3.4 selenium server. Change this in the + # @todo and WARNING. The following   character is supported by the old 3.4 selenium server. Change this in the # new infrastructure with the   encoded character. And the response should contain "<option value=\"http://joinup.eu/ontology/topic/category#info\">Info</option>" And the response should contain "<option value=\"http://joinup.eu/ontology/topic#statistics-and-analysis\">- Statistics and Analysis</option>" @@ -69,8 +69,9 @@ Feature: Global search # Joinup there were two search fields, but this was confusing users. And there should be exactly 1 "search field" on the page - When I select "Social and Political" from the "topic" select facet form - And I click Search in facets form + When I select "Social and Political" from "Topics" + Then I scroll button "Search" into view + And I press "Search" Then the option with text "Social and Political" from select facet form "topic" is selected And the "topic" select facet form should contain the following options: | Any topic | @@ -86,8 +87,9 @@ Feature: Global search And I should see the "Dummy news 4" tile # Test the topic facet. The space prefixing "Demography" is due to the hierarchy. - When I select " Demography" from the "topic" select facet form - And I click Search in facets form + When I select "- Demography" from "Topics" + Then I scroll button "Search" into view + And I press "Search" Then the option with text "- Demography" from select facet form "topic" is selected # The selected option moves to the last position by default. And the "topic" select facet form should contain the following options: @@ -109,8 +111,9 @@ Feature: Global search And I should not see the "Foam" tile # Test the spatial coverage facet. - When I select "Belgium" from the "spatial coverage" select facet form - And I click Search in facets form + When I select "Belgium" from "Geographic coverage" + Then I scroll button "Search" into view + And I press "Search" Then the option with text "Belgium (1)" from select facet form "spatial coverage" is selected And the "spatial coverage" select facet form should contain the following options: | Any location | @@ -128,16 +131,18 @@ Feature: Global search # Select link in the 'type' facet. Given I am on the search page - When I select "News (5)" from the "Content types" select facet form - And I click Search in facets form + When I select "News (5)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" Then the option with text "News (5)" from select facet form "Content types" is selected And the "Content types" select facet form should contain the following options: | Collection (1) | | News (5) | | Solutions (2) | - When I select "Solutions (2)" option in the "Content types" select facet form - And I click Search in facets form + When I additionally select "Solutions (2)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" And I should see the following facet summary "News, Solutions" And the "Content types" select facet form should contain the following options: | Collection (1) | @@ -192,8 +197,10 @@ Feature: Global search | Any location | | Greece (1) | | Luxembourg (2) | - When I select "Luxembourg" from the "spatial coverage" select facet form - And I click Search in facets form + + When I select "Luxembourg" from "Geographic coverage" + Then I scroll button "Search" into view + And I press "Search" Then the option with text "Luxembourg (2)" from select facet form "spatial coverage" is selected And I should see the text "Search Results (2)" # The countries are still sorted alphabetically even though the Luxembourg value is selected and has more results. @@ -315,15 +322,14 @@ Feature: Global search Then the page should show the tiles "Solution alpha, Release Alpha" # Users should be found by first name, family name and organisation. - # @todo Enable when this ticket is implemented ISAICP-6575. - # When I enter "Jenessa" in the search bar and press enter - # Then the page should show the tiles "Jenessa Carlyle" - # When I enter "freeman" in the search bar and press enter - # Then the page should show the tiles "Ulysses Freeman" - # When I enter "clyffco" in the search bar and press enter - # Then the page should show the tiles "Jenessa Carlyle" - # When I enter "Omero+snc" in the search bar and press enter - # Then the page should show the tiles "Ulysses Freeman" + When I enter "Jenessa" in the search bar and press enter + Then the page should show the tiles "Jenessa Carlyle" + When I enter "freeman" in the search bar and press enter + Then the page should show the tiles "Ulysses Freeman" + When I enter "clyffco" in the search bar and press enter + Then the page should show the tiles "Jenessa Carlyle" + When I enter "Omero+snc" in the search bar and press enter + Then the page should show the tiles "Ulysses Freeman" Scenario: Advanced search # An advanced search link is shown in the header, except on the search page. @@ -372,8 +378,7 @@ Feature: Global search | Chickens are small birds | | Bird spotting | | Best place to find an exotic bird | - # @todo Enable when this ticket is implemented ISAICP-6575. - # | Bird Birdman | + | Bird Birdman | @clearStaticCache Scenario: Solutions and/or releases are found by their distribution keyword. @@ -595,20 +600,19 @@ Feature: Global search | Absolutely nonesense | And I should be on "/search?keys=Relativity&sort_by=relevance" - # @todo Enable when this ticket is implemented ISAICP-6575. - # When I select "Creation Date" from "Sort by" - # And I should see the following tiles in the correct order: - # | Absolutely nonesense | - # | Relativity news: Relativity theory | - # | Relativity is the word | - # And I should be on "/search?keys=Relativity&sort_by=creation-date" - # - # When I select "Last Updated Date" from "Sort by" - # And I should see the following tiles in the correct order: - # | Relativity is the word | - # | Relativity news: Relativity theory | - # | Absolutely nonesense | - # And I should be on "/search?keys=Relativity&sort_by=last-updated-date" + When I select "Creation Date" from "Sort by" + And I should see the following tiles in the correct order: + | Absolutely nonesense | + | Relativity news: Relativity theory | + | Relativity is the word | + And I should be on "/search?keys=Relativity&sort_by=creation-date" + + When I select "Last Updated Date" from "Sort by" + And I should see the following tiles in the correct order: + | Relativity is the word | + | Relativity news: Relativity theory | + | Absolutely nonesense | + And I should be on "/search?keys=Relativity&sort_by=last-updated-date" @javascript Scenario: Anonymous user can find facets summary @@ -633,21 +637,123 @@ Feature: Global search Given I am logged in as a user with the "authenticated" role When I visit the search page - And I select "Solutions (2)" from the "Content types" select facet form - And I select "News (5)" option in the "Content types" select facet form - And I click Search in facets form + And I enter "funn" in the search bar + And I wait for AJAX to finish + Then I should see the following search suggestions: + | funni | + | funny | + + When I enter "bott" in the search bar + And I wait for AJAX to finish + Then I should see the following search suggestions: + | body | + + And I select "Solutions (2)" from "Content types" + And I additionally select "News (5)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" And I should see the following facet summary "News, Solutions" + # Workaround to scroll an element towards the center of the screen to avoid a false out of bounds move exception. + # @todo: Remove this as part of ISAICP-6800. + # @see: https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6800 + Then I scroll link "Clear filters" into view Then I click "Clear filters" - And I select "News (5)" from the "Content types" select facet form - And I click Search in facets form + And I select "News (5)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" And I should see the following facet summary "News" # Check if facet summary was remove correctly. - Then I click "Clear filters" - And I select "News (5)" from the "Content types" select facet form - And I select "Collection (1)" option in the "Content types" select facet form - And I click Search in facets form + # Workaround to scroll an element towards the center of the screen to avoid a false out of bounds move exception. + # @todo: Remove this as part of ISAICP-6800. + # @see: https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-6800 + Then I scroll link "Clear filters" into view + And I click "Clear filters" + And I select "News (5)" from "Content types" + And I additionally select "Collection (1)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" + And I should see the following facet summary "Collection, News" + When I scroll the "News" chip into view + And I should remove the following facet summary "News" + Then the page should show only the tiles "Radio cooking collection" + + @javascript + Scenario: Anonymous user can find facets summary + Given the following collection: + | title | Radio cooking collection | + | logo | logo.png | + | moderation | no | + | topic | Demography | + | spatial coverage | Belgium | + | state | validated | + And the following solutions: + | title | collection | description | topic | spatial coverage | state | + | Spheres | Radio cooking collection | Spherification is the culinary process of shaping a liquid into spheres | Demography | European Union | validated | + | Movistar | Radio cooking collection | "The use of foam in cuisine has been used in many forms in the history of cooking:whipped cream, meringue, and mousse are all foams" | | | validated | + And news content: + | title | body | collection | topic | spatial coverage | state | + | El Cabo da Roca | The best in town | Radio cooking collection | Statistics and Analysis | Luxembourg | validated | + | Funny news 1 | Dummy body | Radio cooking collection | E-inclusion | Luxembourg | validated | + | Funny news 2 | Dummy body | Radio cooking collection | E-inclusion | Luxembourg | validated | + | Funny news 3 | Dummy body | Radio cooking collection | E-inclusion | Luxembourg | validated | + | Funny news 4 | Dummy body | Radio cooking collection | E-inclusion | Luxembourg | validated | + + Given I am logged in as a user with the "authenticated" role + When I visit the search page + Then I select "Solutions (2)" from "Content types" + And I additionally select "News (5)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" + And I should see the following facet summary "News, Solutions" + + Then I scroll link "Clear filters" into view + And I click "Clear filters" + And I select "News (5)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" + And I should see the following facet summary "News" + + # Check if facet summary was remove correctly. + Then I scroll link "Clear filters" into view + And I click "Clear filters" + Then I select "News (5)" from "Content types" + And I additionally select "Collection (1)" from "Content types" + Then I scroll button "Search" into view + And I press "Search" And I should see the following facet summary "Collection, News" - Then I should remove the following facet summary "News" + Then I scroll the "News" chip into view + And I should remove the following facet summary "News" And the page should show only the tiles "Radio cooking collection" + + @terms @javascript + Scenario: Show first three search results as featured + Given collection: + | title | Mice in space | + | state | validated | + And document content: + | title | collection | topic | state | logo | body | + | Microgravity | Mice in space | HR, Statistics and Analysis, E-justice | validated | alan.jpg | Conventional studies investigating the effects of reduced gravity on muscle mass and function have used a ground control group that is not directly comparable to the space experimental group. | + And event content: + | title | collection | topic | state | logo | body | + | Stay at the ISS | Mice in space | EU and European Policies | validated | charles.jpg | Two groups of mice (six per group) were housed aboard the International Space Station for 35 days. One group was subjected to artificial gravity (1 g) and the other to microgravity. | + And news content: + | title | body | collection | topic | spatial coverage | state | logo | + | Muscle atrophy | Researchers from the University of Tsukuba | Mice in space | Finance in EU | Luxembourg | validated | blaise.jpg | + | El Cabo da Roca | The best in town | Mice in space | Statistics and Analysis | Luxembourg | validated | charles.jpg | + | Funny news 1 | Dummy body | Mice in space | HR | Luxembourg | validated | ada.png | + | Funny news 2 | Dummy body | Mice in space | E-inclusion | Luxembourg | validated | alan.jpg | + | Funny news 3 | Dummy body | Mice in space | E-inclusion | Luxembourg | validated | charles.jpg | + | Funny news 4 | Dummy body | Mice in space | HR | Luxembourg | validated | ada.png | + | Funny news 5 | Dummy body | Mice in space | HR | Luxembourg | validated | ada.png | + | Dummy news 1 | Dummy body | Mice in space | Statistics and Analysis | Luxembourg | validated | charles.jpg | + | Dummy news 2 | Dummy body | Mice in space | E-inclusion | Luxembourg | validated | alan.jpg | + | Dummy news 3 | Dummy body | Mice in space | Statistics and Analysis | Luxembourg | validated | ada.png | + | Dummy news 4 | Dummy body | Mice in space | E-inclusion | Luxembourg | validated | charles.jpg | + + When I visit the search page + Then I should see the 3 tiles with image + + Then I go to "/search?sort_by=relevance&page=1" + And I should see the 0 tiles with image diff --git a/tests/features/joinup_seo/discussion.feature b/tests/features/joinup_seo/discussion.feature index 5c3f6319db..6a05cda1d0 100644 --- a/tests/features/joinup_seo/discussion.feature +++ b/tests/features/joinup_seo/discussion.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: SEO for discussion forum posts. As an owner of the website in order for my discussions to be better visible on the web diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index 0e2b6ffb89..5e74c2f5b1 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: SEO for document content. As an owner of the website in order for my documents to be better visible on the web diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 5c02200c83..2e2927e43e 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: SEO for news articles. As an owner of the website in order for my news to be better visible on the web diff --git a/tests/features/joinup_subscription/collection.content.subscription.feature b/tests/features/joinup_subscription/collection.content.subscription.feature index 046233e34f..bc653249d2 100644 --- a/tests/features/joinup_subscription/collection.content.subscription.feature +++ b/tests/features/joinup_subscription/collection.content.subscription.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: Subscribing to community content in collections As a member of a collection I want to receive a periodic digest listing newly published content @@ -31,9 +31,7 @@ Feature: Subscribing to community content in collections | Cities of Bulgaria | bisera | discussion, event, news | | Cities of Bulgaria | kalin | discussion, document, news, solution | And all message digests have been delivered - And the mail collector cache is empty - @email Scenario: Receive a digest of content that is published in my collections Given discussion content: | title | body | collection | state | author | @@ -147,7 +145,7 @@ Feature: Subscribing to community content in collections And the content subscription digest sent to kalin should have the subject "Joinup: Monthly digest message" # Clean out the message queue for the next test. - And the mail collector cache is empty + And I mark all emails as read # Check that if community content is published a second time it is not # included in the next digest. diff --git a/tests/features/joinup_subscription/community.content.subscriptions.feature b/tests/features/joinup_subscription/community.content.subscriptions.feature index 55e350d8b0..c691ab4b36 100644 --- a/tests/features/joinup_subscription/community.content.subscriptions.feature +++ b/tests/features/joinup_subscription/community.content.subscriptions.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Subscribing to community content in collections and solutions As an avid fan of Joinup I want to receive a periodic digest listing newly published content @@ -32,9 +32,7 @@ Feature: Subscribing to community content in collections and solutions | Bolometric appearance | jpluminet | discussion, document, event, news | And all message digests have been delivered - And the mail collector cache is empty - @email Scenario: Receive a digest of community content that is published Given discussion content: | title | body | collection | solution | state | author | diff --git a/tests/features/joinup_subscription/my_subscriptions.feature b/tests/features/joinup_subscription/my_subscriptions.feature index 583acdf156..c71fdeef37 100644 --- a/tests/features/joinup_subscription/my_subscriptions.feature +++ b/tests/features/joinup_subscription/my_subscriptions.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: My subscriptions As a user I must be able to manage my subscriptions and related settings. diff --git a/tests/features/joinup_subscription/solution.content.subscription.feature b/tests/features/joinup_subscription/solution.content.subscription.feature index 44cc66e579..17828b29b0 100644 --- a/tests/features/joinup_subscription/solution.content.subscription.feature +++ b/tests/features/joinup_subscription/solution.content.subscription.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-c Feature: Subscribing to community content in solutions As a member of a solution I want to receive a periodic digest listing newly published content @@ -34,9 +34,7 @@ Feature: Subscribing to community content in solutions | Cities of Bulgaria | bisera | discussion, event, news | | Cities of Bulgaria | kalin | discussion, document, news | And all message digests have been delivered - And the mail collector cache is empty - @email Scenario: Receive a digest of content that is published in my solutions Given discussion content: | title | body | solution | state | author | @@ -160,7 +158,7 @@ Feature: Subscribing to community content in solutions And the content subscription digest sent to kalin should have the subject "Joinup: Monthly digest message" # Clean out the message queue for the next test. - And the mail collector cache is empty + And I mark all emails as read # Check that if community content is published a second time it is not # included in the next digest. diff --git a/tests/features/joinup_subscription/solution.subscriptions.feature b/tests/features/joinup_subscription/solution.subscriptions.feature index 768184d4f1..9b346dc4bf 100644 --- a/tests/features/joinup_subscription/solution.subscriptions.feature +++ b/tests/features/joinup_subscription/solution.subscriptions.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Subscribing to a solution In order to promote my solution As a solution owner diff --git a/tests/features/joinup_subscription/subscribers_report.feature b/tests/features/joinup_subscription/subscribers_report.feature index 64f4635964..02f771a203 100644 --- a/tests/features/joinup_subscription/subscribers_report.feature +++ b/tests/features/joinup_subscription/subscribers_report.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-g Feature: Subscribers report In order to get a view on how many members are subscribed to our content As a facilitator diff --git a/tests/features/local_actions.feature b/tests/features/local_actions.feature index f7edfb6ddb..3f91dedcbd 100644 --- a/tests/features/local_actions.feature +++ b/tests/features/local_actions.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: As an owner of the website In order for users to easier navigate in the website diff --git a/tests/features/machine_translation.feature b/tests/features/machine_translation.feature index 5158483bc9..1e69b11f9f 100644 --- a/tests/features/machine_translation.feature +++ b/tests/features/machine_translation.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-g Feature: Machine translation As a citizen of the European Union I am likely not to have English as my native language diff --git a/tests/features/moderator/image_library_widget.feature b/tests/features/moderator/image_library_widget.feature index baf8f55b6e..f454103416 100644 --- a/tests/features/moderator/image_library_widget.feature +++ b/tests/features/moderator/image_library_widget.feature @@ -1,4 +1,4 @@ -@api @group-a @uploadFiles:logo.png +@api @group-g @uploadFiles:logo.png Feature: As a moderator I want to be able to maintain sets of images to be reused as logo or banner images for collections, solutions, events and news. diff --git a/tests/features/moderator/message_overview.feature b/tests/features/moderator/message_overview.feature index de00928fe0..92fb2c5956 100644 --- a/tests/features/moderator/message_overview.feature +++ b/tests/features/moderator/message_overview.feature @@ -1,12 +1,9 @@ -# The test is marked as @wip as there is a failure in our current CI that needs to be debugged. -# @see: https://citnet.tech.ec.europa.eu/CITnet/jira/browse/ISAICP-5665 -@api @wip +@api Feature: Solutions message overview As a moderator of the site In order to be able to manage incoming requests I need to be able to list messages that are sent throughout the website. - @messageCleanup Scenario: Only privileged users can access the report. When I am logged in as a user with the "authenticated" role And I go to "/admin/content/messages" @@ -18,7 +15,6 @@ Feature: Solutions message overview And I click "Messages overview" Then the response status code should be 200 - @messageCleanup Scenario: Contact form messages are available in the message overview. And I am not logged in When I am on the homepage @@ -50,7 +46,7 @@ Feature: Solutions message overview | Ran out of gas | | Do you have 1 euro to buy a cheese pie? | - @messageCleanup @terms + @terms Scenario: Workflow messages are available in the message overview. Given owner: | name | type | @@ -64,6 +60,10 @@ Feature: Solutions message overview When I select "HR" from "Topic" And I press "Add existing" at the "Owner" field And I fill in "Owner" with "Organisation example" + And I fill in the following: + | E-mail | invisible.man@example.com | + | Name | Invisible Man | + And I press "Create contact information" And I press "Propose" And I should see the heading "Message overview proposal" diff --git a/tests/features/moderator/site_alerts.feature b/tests/features/moderator/site_alerts.feature index 2db80318a0..0a6e2a87b2 100644 --- a/tests/features/moderator/site_alerts.feature +++ b/tests/features/moderator/site_alerts.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Site alerts In order to announce scheduled downtime As a moderator diff --git a/tests/features/outdated_content.feature b/tests/features/outdated_content.feature index 5f35fb7cb4..6aba4091a1 100644 --- a/tests/features/outdated_content.feature +++ b/tests/features/outdated_content.feature @@ -21,10 +21,10 @@ Feature: | title | collection | document publication date | state | | Very old document | Outdated content | 1985-03-04 | validated | And event content: - | title | collection | publication date | created | state | - | Recent published event | Outdated content | -3 months | -3 months | validated | - | Outdated published event | Outdated content | -1 year -1 hour -1 second | -1 year -1 hour -1 second | validated | - | Not published event | Outdated content | | -31 years | draft | + | title | collection | publication date | created | state | + | Recent published event | Outdated content | -3 months | -3 months | validated | + | Outdated published event | Outdated content | -1 year -1 second | -1 year -1 second | validated | + | Not published event | Outdated content | | -31 years | draft | And news content: | title | collection | publication date | created | state | | Recent published news | Outdated content | -7 months | -7 months | validated | diff --git a/tests/features/owner/api.feature b/tests/features/owner/api.feature index a063a5d400..6c425f06f5 100644 --- a/tests/features/owner/api.feature +++ b/tests/features/owner/api.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: Owner API In order to manage owners programmatically As a backend developer diff --git a/tests/features/owner/collection_with_owner.feature b/tests/features/owner/collection_with_owner.feature index 4e222e3281..3405e6b340 100644 --- a/tests/features/owner/collection_with_owner.feature +++ b/tests/features/owner/collection_with_owner.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: Creation of owners through UI In order to manage owners As a user diff --git a/tests/features/owner/owner.moderation.feature b/tests/features/owner/owner.moderation.feature index 90066ddf1a..fa2bb1bd3e 100644 --- a/tests/features/owner/owner.moderation.feature +++ b/tests/features/owner/owner.moderation.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-f Feature: Owner moderation In order to manage owners As a user of the website diff --git a/tests/features/owner/validation.feature b/tests/features/owner/validation.feature index a027831158..74393164de 100644 --- a/tests/features/owner/validation.feature +++ b/tests/features/owner/validation.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: Validation of owners created through UI In order to ensure that my data is complete As a collection owner diff --git a/tests/features/paragraphs/custom_page.paragraphs.feature b/tests/features/paragraphs/custom_page.paragraphs.feature index f150f6dbf6..858064a49f 100644 --- a/tests/features/paragraphs/custom_page.paragraphs.feature +++ b/tests/features/paragraphs/custom_page.paragraphs.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: As a site builder of the site In order to be able to better control the structure of my content diff --git a/tests/features/pin_in_collection.feature b/tests/features/pin_in_collection.feature index c9cfe85d22..c53747b764 100644 --- a/tests/features/pin_in_collection.feature +++ b/tests/features/pin_in_collection.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-f Feature: Pinning entities inside collections As a facilitator of a collection I want to pin entities at the top of the collection homepage diff --git a/tests/features/pin_in_solution.feature b/tests/features/pin_in_solution.feature index 808dd40762..80f846bd11 100644 --- a/tests/features/pin_in_solution.feature +++ b/tests/features/pin_in_solution.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-f Feature: Pinning content entities inside solutions As a facilitator of a solution I want to pin content at the top of the solution homepage diff --git a/tests/features/pipeline_log/report.feature b/tests/features/pipeline_log/report.feature index a6e382033e..af49d1aeb0 100644 --- a/tests/features/pipeline_log/report.feature +++ b/tests/features/pipeline_log/report.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-g Feature: In order to help moderators manage effectively imported content As the owner of the website I need to show status messages if a pipeline has not run for too long. diff --git a/tests/features/rdf_entity_provenance/federated_entities.feature b/tests/features/rdf_entity_provenance/federated_entities.feature index 7da3488416..2f77797f51 100644 --- a/tests/features/rdf_entity_provenance/federated_entities.feature +++ b/tests/features/rdf_entity_provenance/federated_entities.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: In order to avoid users changing federated values As a site owner I want federated entities to have the schema values disabled. diff --git a/tests/features/rdf_graph/rdf_graph.feature b/tests/features/rdf_graph/rdf_graph.feature index 8e16038988..4cf666ee29 100644 --- a/tests/features/rdf_graph/rdf_graph.feature +++ b/tests/features/rdf_graph/rdf_graph.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-g Feature: As a user with 'RDF graph manager' role I want to be able to upload RDF files in custom graphs and make them available as triples on Joinup RDF endpoint. diff --git a/tests/features/report.feature b/tests/features/report.feature index 858f3309da..138cc36bbd 100644 --- a/tests/features/report.feature +++ b/tests/features/report.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-g Feature: Report inappropriate content In order to outsource the discovery of inappropriate content on the site As a moderator @@ -18,6 +18,19 @@ Feature: Report inappropriate content And the "Category" field should contain "report" And the "Page URL" field should contain the link to the "<title>" page + # Submit the form to check if 'destination' has been correctly set. + And I fill in the following: + | First name | John | + | Last name | Doe | + | Organisation | | + | E-mail address | doe@example.rg | + | Subject | Invalid content | + | Message | Spam | + # We need to wait 5 seconds for the spam protection time limit to pass. + And I wait for the spam protection time limit to pass + When I press "Submit" + Then I should see the heading "<title>" + Examples: | type | title | body | | discussion | Git is not a deployment tool | Use tarballs to deploy. | diff --git a/tests/features/security/antibot.feature b/tests/features/security/antibot.feature index d2a4f8937f..7e00e73df3 100644 --- a/tests/features/security/antibot.feature +++ b/tests/features/security/antibot.feature @@ -1,4 +1,4 @@ -@api @javascript @antibot +@api @javascript @antibot @group-f Feature: As a visitor or logged-in user, when I want to post content, the form should be protected by Antibot. diff --git a/tests/features/site_menus.feature b/tests/features/site_menus.feature index 9117cc366b..60a8fff11f 100644 --- a/tests/features/site_menus.feature +++ b/tests/features/site_menus.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-f Feature: Site menus In order to navigate through the sections of the site As a user diff --git a/tests/features/solution/about.feature b/tests/features/solution/about.feature index 07dd95d7ab..a9a3770cee 100644 --- a/tests/features/solution/about.feature +++ b/tests/features/solution/about.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: About this solution In order to expose basic information about my solutions As a solution owner or solution facilitator diff --git a/tests/features/solution/add_solution.feature b/tests/features/solution/add_solution.feature index 9ceea19be0..1ceda91410 100644 --- a/tests/features/solution/add_solution.feature +++ b/tests/features/solution/add_solution.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: "Add solution" visibility options. In order to manage solutions As a moderator @@ -52,7 +52,7 @@ Feature: "Add solution" visibility options. And I go to the homepage of the "Collection solution test" collection Then I should not see the link "Add solution" - @terms @email @uploadFiles:logo.png,banner.jpg + @terms @uploadFiles:logo.png,banner.jpg Scenario: Add solution as a collection facilitator. Given the following collection: | title | Belgian barista's | @@ -69,8 +69,7 @@ Feature: "Add solution" visibility options. | collection | user | roles | | Belgian barista's | Wendell Silva | owner, facilitator | - When all e-mails have been sent - And I am logged in as "Wendell Silva" + When I am logged in as "Wendell Silva" And I go to the homepage of the "Belgian barista's" collection And I click "Add solution" And I check "I have read and accept the legal notice and I commit to manage my solution on a regular basis." @@ -122,9 +121,8 @@ Feature: "Add solution" visibility options. But I should see a logo on the header And I should see a banner on the header And I should see the heading "Espresso is the solution" - When all e-mails have been sent - And I am logged in as "Ruth Lee" - When I go to the edit form of the "Espresso is the solution" solution + When I am logged in as "Ruth Lee" + And I go to the edit form of the "Espresso is the solution" solution And I press "Publish" # The name of the solution should exist in the block of the relative content in a collection. Then I should see the heading "Espresso is the solution" diff --git a/tests/features/solution/api.feature b/tests/features/solution/api.feature index 7085eec68b..1b5d8944c7 100644 --- a/tests/features/solution/api.feature +++ b/tests/features/solution/api.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: Solution API In order to manage solutions programmatically As a backend developer diff --git a/tests/features/solution/author_role.feature b/tests/features/solution/author_role.feature index a9ff3fe225..38a7d59ca1 100644 --- a/tests/features/solution/author_role.feature +++ b/tests/features/solution/author_role.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-d Feature: In order to better manage my group members As a group owner diff --git a/tests/features/solution/downloads_counter.feature b/tests/features/solution/downloads_counter.feature index a71c48ccd1..237bae065c 100644 --- a/tests/features/solution/downloads_counter.feature +++ b/tests/features/solution/downloads_counter.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: Check downloads counter's value at different places. diff --git a/tests/features/solution/homepage.feature b/tests/features/solution/homepage.feature index 0f36fb957d..da6d465b88 100644 --- a/tests/features/solution/homepage.feature +++ b/tests/features/solution/homepage.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: Solution homepage In order get an idea of what a solution is about As a user of the website diff --git a/tests/features/solution/homepage_related_content.feature b/tests/features/solution/homepage_related_content.feature index 5d09c281ed..ef3f2d3eb3 100644 --- a/tests/features/solution/homepage_related_content.feature +++ b/tests/features/solution/homepage_related_content.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-g Feature: Solution homepage In order find content around a topic As a user of the website diff --git a/tests/features/solution/id_with_spaces.feature b/tests/features/solution/id_with_spaces.feature index af0fdecd7a..c6f8eb063b 100644 --- a/tests/features/solution/id_with_spaces.feature +++ b/tests/features/solution/id_with_spaces.feature @@ -1,4 +1,4 @@ -@api +@api @group-d Feature: Solution API In order to be able to use solutions with spaces in their uris As a backend developer diff --git a/tests/features/solution/manage_solutions.feature b/tests/features/solution/manage_solutions.feature index 720c6c3320..cf4a5cc603 100644 --- a/tests/features/solution/manage_solutions.feature +++ b/tests/features/solution/manage_solutions.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-f Feature: As a moderator I want to be able to move solutions to other collection. Scenario: Moderators can move a solution to a different collection. diff --git a/tests/features/solution/related_solution.feature b/tests/features/solution/related_solution.feature index 243a4721b8..36260824c7 100644 --- a/tests/features/solution/related_solution.feature +++ b/tests/features/solution/related_solution.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-g Feature: Related solution As a solution facilitator, I need to be able to relate my solution to other solutions and present the related solutions to the users. diff --git a/tests/features/solution/solution.edit.feature b/tests/features/solution/solution.edit.feature index 80c3cca49b..8f2b29e22c 100644 --- a/tests/features/solution/solution.edit.feature +++ b/tests/features/solution/solution.edit.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: Solution editing. In order to manage solutions As a solution owner or solution facilitator diff --git a/tests/features/solution/solution.member_administration.feature b/tests/features/solution/solution.member_administration.feature index 2a8a587b9e..34276a7acc 100644 --- a/tests/features/solution/solution.member_administration.feature +++ b/tests/features/solution/solution.member_administration.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-g Feature: Solution membership administration In order to manage a solution As a solution facilitator @@ -60,7 +60,6 @@ Feature: Solution membership administration When I click "Add members" Then I should see the heading "Add members" - @email Scenario: Assign and remove new role to a member When I am logged in as "Guadalupe Norman" And I go to the members page of "The Missing Sons" @@ -86,7 +85,6 @@ Feature: Solution membership administration | subject | Your role has been changed to member | | body | Guadalupe Norman has changed your role in solution "The Missing Sons" to member. | - @email Scenario: Privileged members should be allowed to invite users to a solution. Given users: | Username | E-mail | First name | Family name | @@ -117,7 +115,6 @@ Feature: Solution membership administration Then the page should show the following chips in the Content region: | Christian Dwight | When I select "Facilitator" from "Role" - And the mail collector cache is empty And I press "Invite members" Then I should see the success message "1 user has been invited to this group." And the following email should have been sent: diff --git a/tests/features/solution/solution.member_overview_filtering.feature b/tests/features/solution/solution.member_overview_filtering.feature index 945db5a111..f8de332f96 100644 --- a/tests/features/solution/solution.member_overview_filtering.feature +++ b/tests/features/solution/solution.member_overview_filtering.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: Type something to filter the listing the member list In order to quickly find a particular member As a moderator diff --git a/tests/features/solution/solution.notifications.feature b/tests/features/solution/solution.notifications.feature index d3a9481f6a..7c92279e59 100644 --- a/tests/features/solution/solution.notifications.feature +++ b/tests/features/solution/solution.notifications.feature @@ -1,6 +1,6 @@ # Tests notifications for solutions. This file does not include template 1. # Template 1 is tested in the add_solution.feature already. -@api @terms @email +@api @terms @group-f Feature: Solution notifications In order to manage solutions As a user of the website @@ -35,7 +35,6 @@ Feature: Solution notifications When I am logged in as "Pat Harper" # Template 7. The moderation team proposes changes. - And all e-mails have been sent And I go to the homepage of the "Solution notification to propose changes" solution And I click "Edit" in the "Entity actions" region And I press "Propose" @@ -49,8 +48,7 @@ Feature: Solution notifications | If you think this action is not clear or not due, please contact Joinup Support at | # Template 13. The moderation team blacklists a solution. - When all e-mails have been sent - And I go to the homepage of the "Solution notification to blacklist" solution + When I go to the homepage of the "Solution notification to blacklist" solution And I click "Edit" in the "Entity actions" region And I press "Blacklist" Then the following email should have been sent: @@ -59,8 +57,7 @@ Feature: Solution notifications | body | the moderator has blacklisted your interoperability solution - Solution notification to blacklist, you can contact the moderation team to resolve the issue. | # Template 14. The moderation team restores a solution from blacklisted. - When all e-mails have been sent - And I go to the homepage of the "Solution notification to publish from blacklisted" solution + When I go to the homepage of the "Solution notification to publish from blacklisted" solution And I click "Edit" in the "Entity actions" region And I press "Publish" Then the following email should have been sent: @@ -69,8 +66,7 @@ Feature: Solution notifications | body | the moderator has published back your interoperability solution - Solution notification to publish from blacklisted that was blacklisted. | # Template 15. The moderation team requests changes. - When all e-mails have been sent - And I go to the homepage of the "Solution notification to request changes" solution + When I go to the homepage of the "Solution notification to request changes" solution And I click "Edit" in the "Entity actions" region And I press "Request changes" # Motivation required. @@ -88,8 +84,7 @@ Feature: Solution notifications | If you think this action is not clear or not due, please contact Joinup Support at | # Template 18. The moderation team deletes a solution without prior request. - When all e-mails have been sent - And I go to the homepage of the "Solution notification to delete by moderator team" solution + When I go to the homepage of the "Solution notification to delete by moderator team" solution And I click "Edit" in the "Entity actions" region And I click "Delete" And I press "Delete" @@ -101,8 +96,7 @@ Feature: Solution notifications When I am logged in as "Ramiro Myers" # Template 18. The owner proposes changes. - When all e-mails have been sent - And I go to the homepage of the "Solution notification to propose from request changes" solution + When I go to the homepage of the "Solution notification to propose from request changes" solution And I click "Edit" in the "Entity actions" region And I press "Propose" Then the email sent to "Pat Harper" with subject "Joinup: An update of a solution has been proposed" contains the following lines of text: @@ -112,7 +106,7 @@ Feature: Solution notifications # The owner deletes their own solution. No email should be sent to the owner # since we do not send notifications to the actor. - When all e-mails have been sent + When I mark all emails as read And I go to the homepage of the "Solution notification to delete by owner" solution And I click "Edit" in the "Entity actions" region And I click "Delete" diff --git a/tests/features/solution/solution_moderation.feature b/tests/features/solution/solution_moderation.feature index 0f35457f4a..3b1b15341f 100644 --- a/tests/features/solution/solution_moderation.feature +++ b/tests/features/solution/solution_moderation.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: Solution moderation In order to manage solutions programmatically As a user of the website diff --git a/tests/features/solution/solution_moderation_integration.feature b/tests/features/solution/solution_moderation_integration.feature index e8480af976..dc9de71569 100644 --- a/tests/features/solution/solution_moderation_integration.feature +++ b/tests/features/solution/solution_moderation_integration.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: As a user of the website I want to be able to perform available transitions according to the state of the entity and the graph they are stored in. diff --git a/tests/features/solution/solution_overview.feature b/tests/features/solution/solution_overview.feature index 4a81394787..948de142dc 100644 --- a/tests/features/solution/solution_overview.feature +++ b/tests/features/solution/solution_overview.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: Solutions Overview As a new visitor of the Joinup website To get an idea of the various solutions that are available diff --git a/tests/features/solution/solution_pager_regression.feature b/tests/features/solution/solution_pager_regression.feature index c8de29e025..762c9ec403 100644 --- a/tests/features/solution/solution_pager_regression.feature +++ b/tests/features/solution/solution_pager_regression.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-f Feature: Test for a 'facets' regression on the solution overview page. # @see ISAICP-4188 Scenario: Test that no pager is shown on the solution page when not needed. diff --git a/tests/features/solution/solution_sharing.feature b/tests/features/solution/solution_sharing.feature index 4ec0995ced..55b2ef17f6 100644 --- a/tests/features/solution/solution_sharing.feature +++ b/tests/features/solution/solution_sharing.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: As a privileged user I want to share solutions to my collections So that useful information has more visibility diff --git a/tests/features/solution/tca.feature b/tests/features/solution/tca.feature index 0b97b699ba..dceb74ddd7 100644 --- a/tests/features/solution/tca.feature +++ b/tests/features/solution/tca.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-f Feature: Solution TCA agreement In order to ensure activity by facilitators As a site owner and/or a collection owner diff --git a/tests/features/solution/trr.feature b/tests/features/solution/trr.feature index eaca658263..d3fdcd9ec5 100644 --- a/tests/features/solution/trr.feature +++ b/tests/features/solution/trr.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: Creating a test (solution) in the TRR collection. In order to create tests As a collection facilitator diff --git a/tests/features/support/support_menu.feature b/tests/features/support/support_menu.feature index 8e0c29004e..01245813eb 100644 --- a/tests/features/support/support_menu.feature +++ b/tests/features/support/support_menu.feature @@ -1,4 +1,4 @@ -@api +@api @group-f Feature: - As a moderator, in order to maintain the support dropdown, I am able to administer the 'support' menu. diff --git a/tests/features/support/whats_new.feature b/tests/features/support/whats_new.feature index f4f8016b5d..62a2c69762 100644 --- a/tests/features/support/whats_new.feature +++ b/tests/features/support/whats_new.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: As a moderator of the website In order to draw the attention of the users for the changes in Joinup diff --git a/tests/features/taxonomy/eira.deprecated.feature b/tests/features/taxonomy/eira.deprecated.feature index 404a80ee34..864413c9df 100644 --- a/tests/features/taxonomy/eira.deprecated.feature +++ b/tests/features/taxonomy/eira.deprecated.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: As a user of the website When I go to the overview page of an EIRA term diff --git a/tests/features/taxonomy/eira.description_format.feature b/tests/features/taxonomy/eira.description_format.feature index f1e4db8a2d..a4a67b9b28 100644 --- a/tests/features/taxonomy/eira.description_format.feature +++ b/tests/features/taxonomy/eira.description_format.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: In order to better read the eira descriptions As a user of the website diff --git a/tests/features/taxonomy/eira.related_terms.feature b/tests/features/taxonomy/eira.related_terms.feature index 408aa6d13c..fab4a41879 100644 --- a/tests/features/taxonomy/eira.related_terms.feature +++ b/tests/features/taxonomy/eira.related_terms.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: As a user of the website When I go to the overview page of an EIRA term diff --git a/tests/features/tours.feature b/tests/features/tours.feature index a00ee89599..15d17984d5 100644 --- a/tests/features/tours.feature +++ b/tests/features/tours.feature @@ -1,4 +1,4 @@ -@api @group-a +@api @group-f Feature: Tours In order to understand complex concepts and user interfaces As a new user of the website diff --git a/tests/features/user/api.feature b/tests/features/user/api.feature index e18ab0978f..19174d0c0e 100644 --- a/tests/features/user/api.feature +++ b/tests/features/user/api.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: User API In order to manage users programmatic As a backend developer diff --git a/tests/features/user/block.feature b/tests/features/user/block.feature index fbfd80ccb4..23f625333d 100644 --- a/tests/features/user/block.feature +++ b/tests/features/user/block.feature @@ -1,4 +1,4 @@ -@api @email +@api @group-e Feature: Block users As a moderator I must be able to block users. @@ -15,7 +15,6 @@ Feature: Block users And I press the "Filter" button # Block the user - And all e-mails have been sent Then I check "Liam Lego" And I select "Block the selected user(s)" from "Action" And I press the "Apply to selected items" button @@ -26,8 +25,7 @@ Feature: Block users | body | Your Joinup account was recently blocked by our moderators. For more information about blocked accounts, please visit our | # Unblock the user - When all e-mails have been sent - Then I check "Liam Lego" + When I check "Liam Lego" Then I select "Unblock the selected user(s)" from "Action" And I press the "Apply to selected items" button Then I should see the success message "Unblock the selected user(s) was applied to 1 item." diff --git a/tests/features/user/cancel.feature b/tests/features/user/cancel.feature index b8af3b7a44..1fd1a1528a 100644 --- a/tests/features/user/cancel.feature +++ b/tests/features/user/cancel.feature @@ -1,4 +1,4 @@ -@api @email @group-a +@api @group-f Feature: In order to efficiently manage users As a moderator of the website @@ -9,7 +9,6 @@ Feature: Given users: | Username | Roles | E-mail | First name | Family name | | alicia__1997 | | AliciaPotter@example.com | Alicia | Potter | - And all e-mails have been sent Scenario: A moderator cancels a user account. Given I am logged in as a moderator diff --git a/tests/features/user/cancel_group_owner.feature b/tests/features/user/cancel_group_owner.feature index 58453cbac1..a97b67a738 100644 --- a/tests/features/user/cancel_group_owner.feature +++ b/tests/features/user/cancel_group_owner.feature @@ -1,4 +1,4 @@ -@api @group-b +@api @group-f Feature: Accounts of group owners cannot be cancelled. diff --git a/tests/features/user/cookie_consent.feature b/tests/features/user/cookie_consent.feature index ede8e0c98a..72e8c6ef85 100644 --- a/tests/features/user/cookie_consent.feature +++ b/tests/features/user/cookie_consent.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: Cookie consent In order to be compliant with the ePrivacy directive As a product owner @@ -7,11 +7,13 @@ Feature: Cookie consent @javascript Scenario: Accept or refuse cookies Given I am an anonymous user + And I am on homepage Then I should see the text "This site uses cookies to offer you a better browsing experience. Find out more on how we use cookies and how you can change your settings." in the "Cookie consent banner" And I should see the link "I accept cookies" in the "Cookie consent banner" And I should see the link "I refuse cookies" in the "Cookie consent banner" Given I am logged in as a user with the "authenticated" role + And I am on homepage Then I should see the text "This site uses cookies to offer you a better browsing experience. Find out more on how we use cookies and how you can change your settings." in the "Cookie consent banner" And I should see the link "I accept cookies" in the "Cookie consent banner" And I should see the link "I refuse cookies" in the "Cookie consent banner" diff --git a/tests/features/user/password.feature b/tests/features/user/password.feature index c774745e2b..d654c2c9cb 100644 --- a/tests/features/user/password.feature +++ b/tests/features/user/password.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: Password management As a registered user of the website I want to be able to manage and restore my password diff --git a/tests/features/user/profile.feature b/tests/features/user/profile.feature index cb5a2a505b..be8deb15ed 100644 --- a/tests/features/user/profile.feature +++ b/tests/features/user/profile.feature @@ -1,4 +1,4 @@ -@api +@api @group-e Feature: User profile A user must be able to change his own profile. A moderator must be able to edit any user account. @@ -66,7 +66,7 @@ Feature: User profile When I go to the public profile of "Leonardo Da Vinci" Then I should see the text "Country of origin: Italy" in the "Header" region - @terms @email + @terms Scenario: A moderator can navigate to any user's profile and edit it. Given users: | Username | E-mail | Roles | @@ -260,7 +260,6 @@ Feature: User profile Then I should not see the link "Subscription settings" And I should not see the link "Persistent Logins" - @email Scenario: A user, changing its E-mail should receive a notification on his old E-mail address and a verification link on its new address. diff --git a/tests/features/user/register.feature b/tests/features/user/register.feature index ee49824522..2f99f156dc 100644 --- a/tests/features/user/register.feature +++ b/tests/features/user/register.feature @@ -1,14 +1,12 @@ -@api +@api @group-e Feature: User registration As a user I must be able to register to the site and complete my user profile and receive appropriate notifications. - @email Scenario: A moderator can register a user Given users: | Username | Roles | | Mr. Moderator | Moderator | - And all e-mails have been sent And I am logged in as "Mr. Moderator" When I am on the homepage Then I click "People" diff --git a/tests/features/user/roles.feature b/tests/features/user/roles.feature index 99cd7a84ff..29f0e392f6 100644 --- a/tests/features/user/roles.feature +++ b/tests/features/user/roles.feature @@ -1,4 +1,4 @@ -@api @email +@api @group-e Feature: User role management As a moderator I must be able to assign roles to users. @@ -8,7 +8,6 @@ Feature: User role management | Rick Rolls | Moderator | rick.roles@example.com | | Nibby Noob | | nicky.noob@example.com | | Ursus | | | - And all e-mails have been sent Scenario: Verify options available to the moderator. Given I am logged in as "Rick Rolls" @@ -37,7 +36,7 @@ Feature: User role management | body | A moderator has edited your user profile on Joinup. Please check your profile to verify the changes done. | Given I am on the homepage - When all e-mails have been sent + When I mark all emails as read And I click "People" When I click "Edit" in the "Ursus" row diff --git a/tests/features/user/search.feature b/tests/features/user/search.feature index 827c728b6e..96e020cb14 100644 --- a/tests/features/user/search.feature +++ b/tests/features/user/search.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: User management As a moderator I must be able to search users. diff --git a/tests/features/video/api.feature b/tests/features/video/api.feature index 1f4e6a8bf2..daf039c2d6 100644 --- a/tests/features/video/api.feature +++ b/tests/features/video/api.feature @@ -1,4 +1,4 @@ -@api +@api @group-g Feature: Video API In order to manage videos programmatically As a backend developer diff --git a/tests/features/video/embed.feature b/tests/features/video/embed.feature index 7099dad3f4..497823bf89 100644 --- a/tests/features/video/embed.feature +++ b/tests/features/video/embed.feature @@ -1,4 +1,4 @@ -@api @terms +@api @terms @group-g Feature: Embed of videos into the page. In order to show videos regarding my content As a user of the website diff --git a/tests/src/Context/DigitQaPipelineContext.php b/tests/src/Context/DigitQaPipelineContext.php new file mode 100644 index 0000000000..1c25e8b4d3 --- /dev/null +++ b/tests/src/Context/DigitQaPipelineContext.php @@ -0,0 +1,69 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\joinup\Context; + +use Behat\MinkExtension\Context\RawMinkContext; +use Behat\Testwork\Hook\Scope\AfterSuiteScope; +use Behat\Testwork\Hook\Scope\BeforeSuiteScope; +use Joinup\Traits\DigitQaPipelineAwareTrait; +use Symfony\Component\Filesystem\Filesystem; + +/** + * Context to run within DIGIT QA GitLab pipeline. + */ +class DigitQaPipelineContext extends RawMinkContext { + + use DigitQaPipelineAwareTrait; + + /** + * Initializes the environment before running the tests. + * + * @param \Behat\Testwork\Hook\Scope\BeforeSuiteScope $event + * The before suite scope event. + * + * @BeforeSuite + */ + public static function init(BeforeSuiteScope $event): void { + if (static::isDigitQaPipeline()) { + $fileSystem = new Filesystem(); + $artifactsPath = static::getArtifactsPath($event->getSuite()->getName()); + if (!$fileSystem->exists($artifactsPath)) { + $fileSystem->mkdir($artifactsPath); + } + $fileSystem->chgrp($artifactsPath, getenv('DAEMON_GROUP'), TRUE); + $fileSystem->chmod($artifactsPath, 0775); + } + } + + /** + * Saves the relevant logs as artifacts in case of failure. + * + * @param \Behat\Testwork\Hook\Scope\AfterSuiteScope $event + * The after suite scope event. + * + * @AfterSuite + */ + public static function saveLogsAsArtifacts(AfterSuiteScope $event): void { + if (static::isDigitQaPipeline() && !$event->getTestResult()->isPassed()) { + $projectPath = rtrim(getenv('CI_PROJECT_DIR'), DIRECTORY_SEPARATOR); + $artifactsPath = static::getArtifactsPath($event->getSuite()->getName()); + exec("{$projectPath}/vendor/bin/drush sql:dump --tables-list=watchdog --gzip --result-file={$artifactsPath}/watchdog.sql --root={$projectPath}"); + } + } + + /** + * Returns the suite artifacts path. + * + * @param string $suiteName + * The suite name. + * + * @return string + * The suite artifacts path. + */ + protected static function getArtifactsPath(string $suiteName): string { + return rtrim(getenv('ARTIFACTS_DIR'), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $suiteName; + } + +} diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/src/Context/FeatureContext.php similarity index 98% rename from tests/features/bootstrap/FeatureContext.php rename to tests/src/Context/FeatureContext.php index 318e8be58c..900254e307 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/src/Context/FeatureContext.php @@ -1,12 +1,9 @@ <?php -/** - * @file - * Contains step definitions for the Joinup project. - */ - declare(strict_types = 1); +namespace Drupal\joinup\Context; + use Behat\Behat\Context\SnippetAcceptingContext; use Behat\Behat\Hook\Scope\AfterScenarioScope; use Behat\Behat\Hook\Scope\AfterStepScope; @@ -85,6 +82,20 @@ class FeatureContext extends RawDrupalContext implements SnippetAcceptingContext */ protected $entities = []; + /** + * The mail system storage settings. + * + * @var \Drupal\Core\Config\StorableConfigBase + */ + protected static $mailConfig; + + /** + * Holds the default settings for the mail server so a revert is possible. + * + * @var array + */ + protected static $savedMailDefaults; + /** * Checks that a 200 OK response occurred. * @@ -475,14 +486,14 @@ public function assertFieldOptionSelected(string $option, string $select): void * Text value of the option to find. * @param string $select * CSS selector of the select field. - * @param \Behat\Mink\Element\TraversableElement $region + * @param \Behat\Mink\Element\TraversableElement|null $region * (optional) The region to search in. Defaults to the whole page. * * @throws \Exception * Thrown when the select is not found in the page or the selected option is * not the expected one. */ - protected function assertFieldOptionSelectedInRegion(string $option, string $select, TraversableElement $region = NULL): void { + protected function assertFieldOptionSelectedInRegion(string $option, string $select, ?TraversableElement $region = NULL): void { if (empty($region)) { $region = $this->getSession()->getPage(); } @@ -518,7 +529,10 @@ protected function assertFieldOptionSelectedInRegion(string $option, string $sel */ public function assertFieldRadioSelected(string $radio, string $field): void { // Find the grouping fieldset that contains the radios field. - $fieldset = $this->getSession()->getPage()->find('named', ['fieldset', $field]); + $fieldset = $this->getSession()->getPage()->find('named', [ + 'fieldset', + $field, + ]); if (!$field) { throw new \Exception("The field '$field' was not found in the page."); @@ -724,7 +738,7 @@ public function assertContextualLinkInPagePresent(string $text): void { $links = $this->findContextualLinkPaths($region); if (!isset($links[$text])) { - throw new \Exception(sprintf('Contextual link %s expected but not found in the region %s', $text, $region)); + throw new \Exception(sprintf('Contextual link %s expected but not found in page.', $text)); } } @@ -1393,7 +1407,6 @@ public function checkMaterialCheckbox(string $text): void { $this->checkMaterialCheckboxHelper($this->getSession()->getPage(), $text); } - /** * Unchecks a material checkbox in a row that contains a certain text. * @@ -1420,8 +1433,10 @@ public function checkMaterialCheckboxInTableRow(string $text): void { * @param string|null $text * (optional) The checkbox label, if any. Defaults to false. * - * @throws \Behat\Mink\Exception\ElementNotFoundException When the checkbox cannot be found in $context. - * @throws \Exception When the checkbox is already checked. + * @throws \Behat\Mink\Exception\ElementNotFoundException + * When the checkbox cannot be found in $context. + * @throws \Exception + * When the checkbox is already checked. */ protected function checkMaterialCheckboxHelper(TraversableElement $element, ?string $text = NULL): void { $checkbox = $text ? $element->findField($text) : $element->find('css', 'input[type="checkbox"]'); @@ -1465,7 +1480,7 @@ public function uncheckMaterialCheckboxInTableRow(string $text): void { * @throws \Exception * When the checkbox is already unchecked. */ - protected function uncheckMaterialCheckboxHelper(TraversableElement $element, ?string $text = NULL): void { + protected function uncheckMaterialCheckboxHelper(TraversableElement $element, ?string $text = NULL): void { $checkbox = $text ? $element->findField($text) : $element->find('css', 'input[type="checkbox"]'); if (!$checkbox) { throw new ElementNotFoundException($this->getSession(), 'checkbox', NULL, $text); @@ -1602,12 +1617,12 @@ public function waitForBatchProcess(): void { * trouble with the static caching being preserved across step requests, * because clearing the static cache too often might affect performance. * - * @see \Drupal\Core\Cache\DatabaseCacheTagsChecksum - * @see https://github.com/jhedstrom/drupalextension/issues/133 - * * @param \Behat\Behat\Hook\Scope\AfterStepScope $event * The after step scope event. * + * @see \Drupal\Core\Cache\DatabaseCacheTagsChecksum + * @see https://github.com/jhedstrom/drupalextension/issues/133 + * * @AfterStep */ public function clearCacheTagsStaticCache(AfterStepScope $event): void { @@ -1688,7 +1703,10 @@ public function fillAutoCompleteField(string $field, string $value): void { throw new \RuntimeException("Only Selenium is currently supported for typing in autocomplete fields."); } - $xpath = $this->getSession()->getSelectorsHandler()->selectorToXpath('named', ['field', $field]); + $xpath = $this->getSession()->getSelectorsHandler()->selectorToXpath('named', [ + 'field', + $field, + ]); try { $element = $driver->getWebDriverSession()->element('xpath', $xpath); } @@ -1766,7 +1784,7 @@ public function afterErrorPageTesting(): void { * * @Given the site error reporting verbosity is( set to) :error_level */ - public function setSiteErrorLevel(string $error_level = NULL): void { + public function setSiteErrorLevel(?string $error_level = NULL): void { static $original_error_level; $config = \Drupal::configFactory()->getEditable('system.logging'); @@ -1912,17 +1930,6 @@ public function assertFormIsProtectedByAntibot(): void { } } - /** - * Cleans up the existing list of entities before the scenario starts. - * - * @BeforeScenario @messageCleanup&&@api - */ - public function cleanupMessageEntities(): void { - $message_storage = \Drupal::entityTypeManager()->getStorage('message'); - $mids = $message_storage->getQuery()->execute(); - $message_storage->delete($message_storage->loadMultiple($mids)); - } - /** * Creates a backup of the Joinup `VERSION` file. * @@ -2002,11 +2009,13 @@ public function assertDownloadedFileContainsStrings(string $link_label, TableNod } // Get the path part from the URL. - $path = trim(parse_url($url, PHP_URL_PATH), '/'); + $path = rtrim(parse_url($url, PHP_URL_PATH), '/'); + // Remove the base path. + $path = substr($path, strlen(base_path())); // Drupal private file. if (strpos($path, 'system/files') === 0) { - $path = Settings::get('file_private_path') . '/' . substr($path, 12); + $path = Settings::get('file_private_path') . substr($path, 12); } // Webserver accessible file. else { @@ -2190,6 +2199,15 @@ public function clearFiles(AfterScenarioScope $event): void { } } + /** + * Cleans the mail collector before the scenario starts. + * + * @BeforeScenario @api + */ + public function cleanUpEmailCollector(): void { + \Drupal::state()->delete('system.test_mail_collector'); + } + /** * Switch to Behat specific Drupal settings during the test suite. * diff --git a/tests/src/Context/HomepageContext.php b/tests/src/Context/HomepageContext.php index 589645c3fb..aeb6ef67fe 100644 --- a/tests/src/Context/HomepageContext.php +++ b/tests/src/Context/HomepageContext.php @@ -53,16 +53,16 @@ public function assertExplore(TableNode $table) { $entity = self::getEntityByLabel('rdf_entity', $expected_data['title']); // In Joinup, "Read more" links of collections and solutions lead to the // 'About' page. - $read_more_url = $entity->toUrl('about-page'); + $read_more_url = $this->getEntityUri($entity, 'about-page'); } else { $entity = self::getNodeByTitle($expected_data['title']); - $read_more_url = $entity->toUrl('canonical'); + $read_more_url = $this->getEntityUri($entity, 'canonical'); } // Check that title links to the canonical page of the // news, event, solution and collection. - $xpath = '//h2/a[@href = "' . $entity->toUrl()->toString() . '" and contains(., "' . $expected_data['title'] . '")]'; + $xpath = '//h2/a[@href = "' . $this->getEntityUri($entity) . '" and contains(., "' . $expected_data['title'] . '")]'; Assert::assertNotEmpty($actual_data->find('xpath', $xpath), sprintf('%s "%s" does not have the correct title which links to the canonical page.', $type, $expected_data['title'])); // Check the body/description text. @@ -79,7 +79,7 @@ public function assertExplore(TableNode $table) { // Check that a "Read more" link is present which leads to the canonical // page of the news, event, solution and collection. - $xpath = '//a[@href = "' . $read_more_url->toString() . '" and contains(@class, "read-more")]'; + $xpath = '//a[@href = "' . $read_more_url . '" and contains(@class, "read-more")]'; Assert::assertNotEmpty($actual_data->find('xpath', $xpath), sprintf('%s "%s" does not have a "Read more" link which leads to the canonical page.', $type, $expected_data['title'])); } } diff --git a/tests/src/Context/JoinupCommunityContentContext.php b/tests/src/Context/JoinupCommunityContentContext.php index a35ce84281..63745425d7 100644 --- a/tests/src/Context/JoinupCommunityContentContext.php +++ b/tests/src/Context/JoinupCommunityContentContext.php @@ -485,7 +485,7 @@ public function assertInTheSpotlight(TableNode $table) { // Check that title links to the canonical page of the article. $node = self::getNodeByTitle($actual_title); - $xpath = '//h2/a[@href = "' . $node->toUrl()->toString() . '"]'; + $xpath = '//h2/a[@href = "' . $this->getEntityUri($node) . '"]'; Assert::assertNotEmpty($actual_data->find('xpath', $xpath), sprintf('Article "%s" does not link to the canonical page.', $actual_title)); // Check that the correct number of topics are present. @@ -507,7 +507,7 @@ public function assertInTheSpotlight(TableNode $table) { // Check that each topic links to their canonical page. $topic_entity = self::getEntityByLabel('taxonomy_term', $actual_topic_title, 'topic'); - $xpath = '/a[@href = "' . $topic_entity->toUrl()->toString() . '"]'; + $xpath = '/a[@href = "' . $this->getEntityUri($topic_entity) . '"]'; Assert::assertNotEmpty($topic_element->find('xpath', $xpath), sprintf('Topic "%s" for article "%s" does not link to the canonical topic page.', $actual_topic_title, $actual_title)); } } diff --git a/tests/src/Context/JoinupContext.php b/tests/src/Context/JoinupContext.php index adb11e906f..5ace99f881 100644 --- a/tests/src/Context/JoinupContext.php +++ b/tests/src/Context/JoinupContext.php @@ -319,7 +319,9 @@ public function submitRegistrationForm(TableNode $table, $location) { */ public function checkSelectContainsOptions($select, $options) { $field = $this->findSelect($select); - $available_options = $this->getSelectOptions($field); + $available_options = array_map(function (array $option): string { + return $option['text']; + }, $this->getSelectOptions($field)); $options = $this->explodeCommaSeparatedStepArgument($options); if (array_intersect($options, $available_options) !== $options) { @@ -342,7 +344,9 @@ public function checkSelectContainsOptions($select, $options) { */ public function checkSelectDoesNotContainOptions($select, $options) { $field = $this->findSelect($select); - $available_options = $this->getSelectOptions($field); + $available_options = array_map(function (array $option): string { + return $option['text']; + }, $this->getSelectOptions($field)); $options = $this->explodeCommaSeparatedStepArgument($options); $intersection = array_intersect($available_options, $options); @@ -383,7 +387,9 @@ public function assertSelectOptionsAsList($select, TableNode $table) { */ public function assertSelectOptions($select, $options) { $field = $this->findSelect($select); - $available_options = $this->getSelectOptions($field); + $available_options = array_map(function (array $option): string { + return $option['text']; + }, $this->getSelectOptions($field)); sort($available_options); $options = $this->explodeCommaSeparatedStepArgument($options); @@ -406,7 +412,9 @@ public function assertSelectOptions($select, $options) { */ public function assertSelectOptionNotAvailable($select, $options) { $field = $this->findSelect($select); - $available_options = $this->getSelectOptions($field); + $available_options = array_map(function (array $option): string { + return $option['text']; + }, $this->getSelectOptions($field)); $options = $this->explodeCommaSeparatedStepArgument($options); Assert::assertEmpty(array_intersect($available_options, $options), "The '{$select}' select options include at least one of the given values."); @@ -709,7 +717,13 @@ public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope) { // This will allow dynamic tests as well. `strtotime` will also be able to // receive entries like "1 day ago" or "+1 month". if (!is_numeric($node->published_at)) { + // The strtotime() PHP function is using the default timezone when doing + // the conversion. But we want to stick to UTC in order to avoid + // timezone and DST issue. + $timezone = date_default_timezone_get(); + date_default_timezone_set('UTC'); $node->published_at = strtotime($node->published_at); + date_default_timezone_set($timezone); } } @@ -1133,7 +1147,7 @@ public function assertContentOgMembership($parent, $parent_bundle, $content_bund * @Then I (should )see the :heading tile */ public function assertTilePresent($heading) { - $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile .listing__title, article.tile h2'); + $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile .listing__title, .card .card-title, article.tile h2'); foreach ($results as $result) { /** @var \Behat\Mink\Element\Element $result */ if ($result->getText() === $heading) { @@ -1156,7 +1170,7 @@ public function assertTilePresent($heading) { * @Then I (should )see :number tile(s) */ public function assertTileCount($number) { - $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile .listing__title, article.tile h2'); + $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile .listing__title, .card .card-title, article.tile h2'); $nr_found = count($results); if ($nr_found != $number) { throw new \Exception("Found $nr_found tiles, expected $number"); @@ -1177,7 +1191,7 @@ public function assertTileCount($number) { public function assertTileNotPresent($heading) { // We target the heading with "h2" instead of ".listing__title" because both // unstyled and styled tiles use h2 as element for their titles. - $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile h2, article.tile h2'); + $results = $this->getSession()->getPage()->findAll('css', '.listing__item--tile h2, .card h5, article.tile h2'); foreach ($results as $result) { /** @var \Behat\Mink\Element\Element $result */ if ($result->getText() === $heading) { @@ -1958,7 +1972,10 @@ public function assertLinkContainsEntityUrl(string $link, string $title, string throw new \Exception("Link '{$link}' was not found in the page."); } - $entity_url = $entity->toUrl()->setAbsolute()->toString(); + // @todo Drop the base_url trick as soon as ISAICP-6648 is fixed. + $entity_url = $entity->toUrl('canonical', [ + 'base_url' => $GLOBALS['base_url'], + ])->setAbsolute()->toString(); $href = $link_element->getAttribute('href'); Assert::assertContains(urlencode($entity_url), $href); @@ -2927,4 +2944,82 @@ public function assertLinkIsInActiveTrail(string $link_label): void { } } + /** + * Shows the button in the middle of the screen. + * + * In the latest version of Selenium in docker, moving to a button element + * might throw this exception while the button is visible. + * This might be due to attempting to find the button too fast. + * + * @param string $type + * Type of element link/button. + * @param string $label + * The label of the radio button. + * + * @throws \Exception + * Thrown when an expected scroll in to view failed. + * + * @Given I scroll :type :label into view + */ + public function scrollButtonIntoView(string $type, string $label): void { + $page = $this->getSession()->getPage(); + $button = $page->find('named', [$type, str_replace('\\"', '"', $label)]); + $id = $button->getAttribute('id'); + $function = <<<JS + ( + function(){ + setTimeout(() => { + let elem = document.getElementById("$id"); + elem.scrollIntoView({ behavior: 'instant', block: 'center' }); + }, 300); + } + )() + JS; + try { + $this->getSession()->executeScript($function); + sleep(1); + } + catch (\Exception $e) { + throw new \Exception("Scroll element into view failed"); + } + } + + /** + * Shows the button in the middle of the screen. + * + * In the latest version of Selenium in docker, moving to a button element + * might throw this exception while the button is visible. + * This might be due to attempting to find the button too fast. + * + * @param string $label + * The label of the radio button. + * + * @throws \Exception + * Thrown when an expected scroll in to view failed. + * + * @Given I scroll the :label chip into view + */ + public function scrollChipIntoView(string $label): void { + $css = "div.block-facets-summary-blocksearch-facets-summary li.facet-summary-item--facet a:contains('{$label}')"; + $element = $this->getSession()->getPage()->find('css', $css); + $xpath = $element->getXpath(); + $function = <<<JS + ( + function(){ + setTimeout(() => { + let elem = document.evaluate("$xpath", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + elem.scrollIntoView({ behavior: 'instant', block: 'center' }); + }, 300); + } + )() + JS; + try { + $this->getSession()->executeScript($function); + sleep(1); + } + catch (\Exception $e) { + throw new \Exception("Scroll element into view failed"); + } + } + } diff --git a/tests/src/Context/JoinupNewsContext.php b/tests/src/Context/JoinupNewsContext.php index 0adb3c2f1b..a5e70e81a3 100644 --- a/tests/src/Context/JoinupNewsContext.php +++ b/tests/src/Context/JoinupNewsContext.php @@ -65,7 +65,7 @@ public function assertLatestNews(TableNode $table) { // Check that title links to the canonical page of the news article. $news_node = self::getNodeByTitle($actual_title, 'news'); - $xpath = '//h2/a[@href = "' . $news_node->toUrl()->toString() . '"]'; + $xpath = '//h2/a[@href = "' . $this->getEntityUri($news_node) . '"]'; Assert::assertNotEmpty($actual_data->find('xpath', $xpath), sprintf('Article "%s" does not link to the canonical news page.', $actual_title)); // Check the date. @@ -92,7 +92,7 @@ public function assertLatestNews(TableNode $table) { // Check that each topic links to their canonical page. $topic_entity = self::getEntityByLabel('taxonomy_term', $actual_topic_title, 'topic'); - $xpath = '/a[@href = "' . $topic_entity->toUrl()->toString() . '"]'; + $xpath = '/a[@href = "' . $this->getEntityUri($topic_entity) . '"]'; Assert::assertNotEmpty($topic_element->find('xpath', $xpath), sprintf('Topic "%s" for article "%s" does not link to the canonical topic page.', $actual_topic_title, $actual_title)); } } diff --git a/tests/src/Context/JoinupNotificationContext.php b/tests/src/Context/JoinupNotificationContext.php index de11b875e7..5a76498d69 100644 --- a/tests/src/Context/JoinupNotificationContext.php +++ b/tests/src/Context/JoinupNotificationContext.php @@ -10,7 +10,6 @@ use Drupal\DrupalExtension\TagTrait; use Drupal\joinup\Traits\ConfigReadOnlyTrait; use Drupal\joinup\Traits\MailCollectorTrait; -use Drupal\joinup\Traits\MailConfigTrait; use Drupal\joinup\Traits\UserTrait; use Drupal\joinup\Traits\UtilityTrait; use Drupal\message\Entity\MessageTemplate; @@ -23,25 +22,10 @@ class JoinupNotificationContext extends RawDrupalContext { use ConfigReadOnlyTrait; use MailCollectorTrait; - use MailConfigTrait; use TagTrait; use UserTrait; use UtilityTrait; - /** - * The mail system storage settings. - * - * @var \Drupal\Core\Config\StorableConfigBase - */ - protected $mailConfig; - - /** - * Holds the default settings for the mail server so a revert is possible. - * - * @var array - */ - protected $savedMailDefaults; - /** * Asserts that an email has been sent. * @@ -74,8 +58,6 @@ class JoinupNotificationContext extends RawDrupalContext { * @Then the following email should have been sent: */ public function assertEmailSent(TableNode $table) { - $this->assertEmailTagPresent(); - /** @var string $template */ /** @var string $recipient */ /** @var string $recipient_mail */ @@ -209,8 +191,6 @@ public function assertEmailSent(TableNode $table) { * @Then the following email should not have been sent: */ public function assertEmailNotSent(TableNode $table) { - $this->assertEmailTagPresent(); - try { // Reusing ::assertEmailSent(). $this->assertEmailSent($table); @@ -240,8 +220,6 @@ public function assertEmailNotSent(TableNode $table) { * @Then the email sent to :user with subject :subject contains the( following lines of) text: */ public function assertEmailSentAndContainsText(string $user, string $subject, TableNode $table) { - $this->assertEmailTagPresent(); - $lines_of_text = $table->getColumnsHash(); $user = user_load_by_name($user); $recipient = $user->getEmail(); @@ -283,7 +261,6 @@ public function assertEmailSentAndContainsText(string $user, string $subject, Ta * @Then the email sent to :user with subject :subject should not contain the( following lines of) text: */ public function assertEmailSentNotContainsText(string $user, string $subject, TableNode $table) { - $this->assertEmailTagPresent(); $lines_of_text = $table->getColumnsHash(); $user = user_load_by_name($user); $recipient = $user->getEmail(); @@ -308,12 +285,9 @@ public function assertEmailSentNotContainsText(string $user, string $subject, Ta * Use this if you don't want to match on emails that have been sent earlier * in the scenario. * - * @Given the mail collector cache is empty - * @Given all (the )e-mails have been sent + * @Given I mark all emails as read */ public function clearMailCollectorCache() { - $this->assertEmailTagPresent(); - \Drupal::state()->set('system.test_mail_collector', []); \Drupal::state()->resetCache(); } @@ -330,8 +304,6 @@ public function clearMailCollectorCache() { * @Then :count e-mail(s) should have been sent */ public function assertNumberOfEmailSent($count) { - $this->assertEmailTagPresent(); - $mails = $this->getMails(); if (count($mails) != $count) { throw new \Exception("Invalid number of e-mail sent. Expected $count, sent " . count($mails)); @@ -351,8 +323,6 @@ public function assertNumberOfEmailSent($count) { * @Given I click the mail change link from the email sent to :mail */ public function clickMailChangeLinkFromMail(string $mail): void { - $this->assertEmailTagPresent(); - $pattern = '#https?://[^/].*/user/mail-change/[^/].*/[^/].*/[^/].*/.*#'; $no_mail_message = "No mail change verification E-mail has been sent to $mail."; $no_match_message = "The mail change verification E-mail doesn't contain a valid verification link."; @@ -428,8 +398,6 @@ public function clickCommentLinkInEmail($user) { * @When I click the link for the :filename attachment in the contact form email sent to :mail */ public function clickAttachmentInContactFormConfirmationMail(string $filename, string $mail): void { - $this->assertEmailTagPresent(); - // In case multiple files with the same name were uploaded, the File module // will append a number to the file. Account for this. $extension = pathinfo($filename, PATHINFO_EXTENSION); @@ -468,8 +436,6 @@ public function clickAttachmentInContactFormConfirmationMail(string $filename, s * find any matches. */ protected function assertMailLinkMatchingPattern(string $pattern, string $mail, string $no_mail_message, string $no_match_message, ?string $template = NULL): void { - $this->assertEmailTagPresent(); - $found = FALSE; foreach ($this->getMails() as $mail_sent) { // Optionally filter by mail template. @@ -498,42 +464,4 @@ protected function assertMailLinkMatchingPattern(string $pattern, string $mail, throw new \Exception($no_mail_message); } - /** - * Swaps the mailing system settings with a test one. - * - * @BeforeScenario @email&&@api - */ - public function beforeEmailScenario(): void { - if (!$this->isTestMailCollectorUsed()) { - // Check if the mail system configuration has been overridden in - // settings.php or settings.override.php. - $this->checkMailConfigOverride(); - - self::bypassReadOnlyConfig(); - $this->mailConfig = \Drupal::configFactory()->getEditable('mailsystem.settings'); - $this->savedMailDefaults = $this->mailConfig->get('defaults.sender'); - $this->mailConfig->set('defaults.sender', 'test_mail_collector')->save(); - self::restoreReadOnlyConfig(); - } - // Reset the mail collector by wiping any leftovers from a previous test. - \Drupal::state()->delete('system.test_mail_collector'); - } - - /** - * Restores the mailing system settings with the default one. - * - * @AfterScenario @email&&@api - */ - public function afterEmailScenario(): void { - // Temporarily bypass read only config so that we can restore the original - // mail handler. - if (!empty($this->savedMailDefaults)) { - self::bypassReadOnlyConfig(); - - $this->mailConfig->set('defaults.sender', $this->savedMailDefaults)->save(); - - self::restoreReadOnlyConfig(); - } - } - } diff --git a/tests/src/Context/JoinupSearchContext.php b/tests/src/Context/JoinupSearchContext.php index ba20b9113c..7f3ab6ce99 100644 --- a/tests/src/Context/JoinupSearchContext.php +++ b/tests/src/Context/JoinupSearchContext.php @@ -255,60 +255,6 @@ public function iClickAnInlineFacetItemLink(string $link, string $facet): void { $this->findFacetByAlias($facet)->clickLink($link); } - /** - * Clicks a facet item in an inline facet. - * - * @param string $select - * The option to select. - * @param string $facet - * The facet alias. - * - * @throws \Exception - * Thrown when the facet or the link inside the facet is not found. - * - * @When I select :option from the :facet select facet - */ - public function iSelectAnOptionFromFacet(string $select, string $facet): void { - $facet = $this->findFacetByAlias($facet, NULL, 'select'); - $facet->selectOption($select); - } - - /** - * Clicks a facet item in an inline facet form. - * - * @param string $select - * The option to select. - * @param string $facet - * The facet alias. - * - * @throws \Exception - * Thrown when the facet or the link inside the facet is not found. - * - * @When I select :option from the :facet select facet form - */ - public function iSelectAnOptionFromFacetForm(string $select, string $facet): void { - $facet = $this->findFacetByAlias($facet, NULL, 'select', TRUE); - $facet->selectOption($select); - } - - /** - * Clicks in more facet items in an inline facet form. - * - * @param string $select - * The option to select. - * @param string $facet - * The facet alias. - * - * @throws \Exception - * Thrown when the facet or the link inside the facet is not found. - * - * @When I select :option option in the :facet select facet form - */ - public function iSelectOtherOptionFromFacetForm(string $select, string $facet): void { - $facet = $this->findFacetByAlias($facet, NULL, 'select', TRUE); - $facet->selectOption($select, TRUE); - } - /** * Asserts a selected option in the . * @@ -401,6 +347,15 @@ public function assertSelectFacetOptionsAsList($select, TableNode $table) { /** * Asserts the list of available options in a facet select box. * + * @codingStandardsIgnoreStart + * Table format: + * | Option 1 | 0 | + * | Option 2 | 1 | + * @codingStandardsIgnoreEnd + * + * The first column in the table is required and lists the options that should + * be available. The second, optional, column lists the expected indentation. + * * @param string $select * The name of the field element. * @param \Behat\Gherkin\Node\TableNode $table @@ -500,8 +455,55 @@ public function checkCheckboxFacetForm(string $option, string $facet_type): void */ public function iClickActionsInFacetsForm(string $name) { $region = $this->getSession()->getPage(); - $element = $region->find('xpath', "//input[@value='{$name}']"); - $element->click(); + $xpath = '//div[contains(concat(" ", normalize-space(@class), " "), " block-facets-form ")]//div[@data-drupal-selector="edit-actions"]'; + $actions = $region->find('xpath', $xpath); + + $element = $actions->find('css', "input[value|='{$name}']"); + $element->submit(); + } + + /** + * Asserts the autocomplete items from search. + * + * This function asserts also the order of the items. + * + * @param \Behat\Gherkin\Node\TableNode $table + * A list of items to be present. + * + * @throws \Exception + * Thrown when the suggestions are not present in the page. + * + * @Then I should see the (following )search suggestion(s): + */ + public function iShouldSeeTheSuggestions(TableNode $table): void { + $session = $this->getSession(); + $xpath = '//ul[contains(concat(" ", normalize-space(@class), " "), "search-api-autocomplete-search")]//li'; + $session->getPage()->waitFor(5, function () use ($session, $xpath, $table): bool { + $element = $this->getSearchBarElement(); + $session->getDriver()->keyDown($element->getXpath(), '', NULL); + $allResults = $session->getPage()->findAll('xpath', $xpath); + $found = array_map(function ($item) { + /** @var \Behat\Mink\Element\NodeElement $item */ + return $item->getText(); + }, $allResults); + + return $table->getColumn(0) === $found; + }); + } + + /** + * Check number of search results as featured. + * + * @param int $number + * Number of tiles with image. + * + * @Given I should see the :number tiles with image + */ + public function numberOfTilesWithImage(int $number) { + $session = $this->getSession()->getPage(); + $elements = $session->findAll('css', '.card > img'); + + Assert::assertSame(count($elements), $number); } /** @@ -804,15 +806,14 @@ public function assertFacetSummary(string $labels): void { * @When I should remove the following facet summary :label */ public function removeFacetSummary(string $label): void { - - $xpath = '//div[contains(concat(" ", normalize-space(@class), " "), " block-facets-summary-blocksearch-facets-summary ")]//span[text()="' . $label . '"]'; - $element = $this->getSession()->getPage()->find('xpath', $xpath); + $css = "div.block-facets-summary-blocksearch-facets-summary li.facet-summary-item--facet a:contains('{$label}')"; + $element = $this->getSession()->getPage()->find('css', $css); if (empty($element)) { throw new \Exception("The $label facet summary item was not found in the page."); } - - $element->click(); + $remove = $element->find('css', '.js-facet-deactivate'); + $remove->click(); } /** diff --git a/tests/src/Context/JoinupSeoContext.php b/tests/src/Context/JoinupSeoContext.php index 79130ccb17..5d244d6263 100644 --- a/tests/src/Context/JoinupSeoContext.php +++ b/tests/src/Context/JoinupSeoContext.php @@ -239,7 +239,7 @@ protected function escapeStringWithVariables(string $string): string { // The URL structure is very important in the SEO metatags as a wrong URL // or an internal path could cause search engines to be misled. Thus, // the full URL must be always asserted. - $base_url = \Drupal::request()->getSchemeAndHttpHost(); + $base_url = $this->getMinkParameter('base_url'); $string = preg_quote($string, '#'); $replacements = [ diff --git a/tests/src/Context/JoinupSubscriptionContext.php b/tests/src/Context/JoinupSubscriptionContext.php index 3ceac0be29..6db0990071 100644 --- a/tests/src/Context/JoinupSubscriptionContext.php +++ b/tests/src/Context/JoinupSubscriptionContext.php @@ -605,8 +605,6 @@ protected function getGroupSubscriptionCardByHeading(string $heading): NodeEleme * @Then the group content subscription digest sent to :username contains the following sections: */ public function assertGroupContentSubscriptionEmailSections(string $username, TableNode $table): void { - $this->assertEmailTagPresent(); - // Remove the table header from the array. $expected_sections = $table->getColumn(0); array_shift($expected_sections); @@ -657,8 +655,6 @@ public function assertGroupContentSubscriptionEmailSections(string $username, Ta * @Then the content subscription digest sent to :username should have the subject :subject */ public function assertGroupContentSubscriptionEmailSubject(string $username, string $subject): void { - $this->assertEmailTagPresent(); - $user = user_load_by_name($username); $email_address = $user->getEmail(); $emails = $this->getGroupSubscriptionEmailsByEmail($email_address); diff --git a/tests/src/Context/JoinupUserContext.php b/tests/src/Context/JoinupUserContext.php index 6405991330..f0e5663928 100644 --- a/tests/src/Context/JoinupUserContext.php +++ b/tests/src/Context/JoinupUserContext.php @@ -6,11 +6,13 @@ use Behat\Gherkin\Node\TableNode; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Core\Url; use Drupal\DrupalExtension\Context\RawDrupalContext; use Drupal\DrupalExtension\Hook\Scope\BeforeUserCreateScope; use Drupal\joinup\Traits\MailCollectorTrait; use Drupal\joinup\Traits\UserTrait; use Drupal\joinup\Traits\UtilityTrait; +use Drupal\user\UserInterface; use PHPUnit\Framework\Assert; use PHPUnit\Framework\ExpectationFailedException; @@ -56,7 +58,7 @@ public function visitOneTimeLogIn(string $user): void { throw new \Exception("User {$user->getAccountName()} was not found."); } - $this->visitPath(user_pass_reset_url($user) . '/login'); + $this->visitPath($this->getOneTimeLoginUrl($user) . '/login'); } /** @@ -116,9 +118,8 @@ public function assertImagePresent(string $filename): void { // files are uploaded, for example when a test is run more than once. // We only check up to the filename and not the extension as the xpath // itself is long enough to ensure the extension part. - $parts = pathinfo($filename); - $host = \Drupal::request()->getSchemeAndHttpHost(); - $filename = $parts['filename']; + $host = $this->getMinkParameter('base_url'); + $filename = trim($filename, DIRECTORY_SEPARATOR); $xpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' featured__logo ') and contains(@style, 'background-image: url({$host}/sites/default/files/{$filename}')]"; $this->assertSession()->elementExists('xpath', $xpath); } @@ -225,4 +226,34 @@ public function userNotExists(string $name): void { } } + /** + * Generates a unique URL for a user to log in and reset their password. + * + * @param \Drupal\user\UserInterface $account + * An object containing the user account. + * + * @return string + * A unique URL that provides a one-time log in for the user. + */ + protected function getOneTimeLoginUrl(UserInterface $account): string { + $timestamp = time(); + return Url::fromRoute('user.reset', [ + 'uid' => $account->id(), + 'timestamp' => $timestamp, + 'hash' => user_pass_rehash($account, $timestamp), + ], + [ + 'absolute' => TRUE, + 'language' => \Drupal::languageManager()->getLanguage($account->getPreferredLangcode()), + // The base URL is derived by the Symfony request handler from + // the global variables set by the web server, i.e. REQUEST_URI + // or similar. Since Behat tests are run from the command line + // this request context is not available and we need to set the + // base URL manually. + // @todo Remove this workaround once this is fixed in core. + // @see https://www.drupal.org/project/drupal/issues/2548095 + 'base_url' => $GLOBALS['base_url'], + ])->toString(); + } + } diff --git a/tests/src/Context/ModerationContext.php b/tests/src/Context/ModerationContext.php index 00c0183724..7ab1ef965f 100644 --- a/tests/src/Context/ModerationContext.php +++ b/tests/src/Context/ModerationContext.php @@ -26,7 +26,9 @@ class ModerationContext extends RawDrupalContext { */ public function assertModerationPreviewContainsText($title, $text) { $node = $this->getEntityByLabel('node', $title); - $xpath = '//h2/a[@href = "' . $node->toUrl()->toString() . '"]/ancestor::article'; + $xpath = '//h2/a[@href = "' . $node->toUrl('canonical', [ + 'base_url' => rtrim($GLOBALS['base_path'], '/'), + ])->toString() . '"]/ancestor::article'; $this->assertSession()->elementTextContains('xpath', $xpath, $text); } @@ -42,7 +44,9 @@ public function assertModerationPreviewContainsText($title, $text) { */ public function clickLinkInModerationPreview($link_text, $title) { $node = $this->getEntityByLabel('node', $title); - $xpath = '//h2/a[@href = "' . $node->toUrl()->toString() . '"]/ancestor::article//a[text() = "' . $link_text . '"]'; + $xpath = '//h2/a[@href = "' . $node->toUrl('canonical', [ + 'base_url' => rtrim($GLOBALS['base_path'], '/'), + ])->toString() . '"]/ancestor::article//a[text() = "' . $link_text . '"]'; $this->assertSession()->elementExists('xpath', $xpath)->click(); } diff --git a/tests/src/Context/ScreenshotContext.php b/tests/src/Context/ScreenshotContext.php index f074c974ea..f882dd0165 100644 --- a/tests/src/Context/ScreenshotContext.php +++ b/tests/src/Context/ScreenshotContext.php @@ -84,8 +84,8 @@ public function __construct(?string $localDir = NULL, ?string $s3Dir = NULL, ?st * @Then I take a screenshot :name */ public function takeScreenshot(?string $name = NULL): void { - $message = "Screenshot created in @file_name"; - $this->createScreenshot($name, $message); + $message = "Screenshot: @file_name"; + $this->createScreenshots($name, $message); } /** @@ -94,9 +94,9 @@ public function takeScreenshot(?string $name = NULL): void { * @Then I take a screenshot */ public function takeScreenshotUnnamed(): void { - $file_name = 'behat-screenshot-' . user_password(); - $message = "Screenshot created in @file_name"; - $this->createScreenshot($file_name, $message); + $file_name = 'screenshot-' . user_password(); + $message = "Screenshot: @file_name"; + $this->createScreenshots($file_name, $message); } /** @@ -121,16 +121,9 @@ public function screenshotForPhpNotices(AfterStepScope $event): void { $context->assertNotWarningMessage('Notice:'); } catch (ExpectationException $e) { - // Use the step test in the filename. - $step = $event->getStep(); - $file_name = str_replace(' ', '_', $step->getKeyword() . '_' . $step->getText()); - $file_name = preg_replace('![^0-9A-Za-z_.-]!', '', $file_name); - $file_name = substr($file_name, 0, 30); - $file_name = 'behat-notice__' . $file_name; - - $message = "PHP notice detected, screenshot taken: @file_name"; - $this->createScreenshot($file_name, $message); - // We don't throw $e any more because we don't fail on the notice. + $message = "{$this->getStepLine($event)} screenshot: @file_name"; + $this->createScreenshots($this->buildScreenshotFileName('php-notice', $event), $message, $event->getSuite()->getName()); + // We don't throw $e anymore because we don't fail on the notice. } } } @@ -149,17 +142,10 @@ public function screenshotForPhpNotices(AfterStepScope $event): void { * @AfterStep */ public function takeScreenshotAfterFailedStep(AfterStepScope $event): void { - if ($event->getTestResult()->isPassed()) { - // Not a failed step. - return; + if (!$event->getTestResult()->isPassed()) { + $message = "{$this->getStepLine($event)} screenshot: @file_name"; + $this->createScreenshots($this->buildScreenshotFileName('failed', $event), $message, $event->getSuite()->getName()); } - $step = $event->getStep(); - $file_name = str_replace(' ', '_', $step->getKeyword() . '_' . $step->getText()); - $file_name = preg_replace('![^0-9A-Za-z_.-]!', '', $file_name); - $file_name = substr($file_name, 0, 30); - $file_name = 'behat-failed__' . $file_name; - $message = "Screenshot for failed step created in @file_name"; - $this->createScreenshot($file_name, $message); } /** @@ -168,18 +154,14 @@ public function takeScreenshotAfterFailedStep(AfterStepScope $event): void { * @param string $file_name * The filename of the screenshot (complete). * @param string $message - * The message to be printed. '@file_name' will be replaced with $file_name. + * The message to be printed. + * @param string|null $suite_name + * (optional) Suite name. Passed only from hook callers. */ - public function createScreenshot(string $file_name, string $message): void { + protected function createScreenshots(string $file_name, string $message, ?string $suite_name = NULL): void { try { - if ($this->getSession()->getDriver() instanceof Selenium2Driver) { - $file_name .= '.png'; - $screenshot = $this->getSession()->getDriver()->getScreenshot(); - } - else { - $file_name .= '.html'; - $screenshot = $this->getSession()->getPage()->getContent(); - } + $screenshot = $this->getSession()->getPage()->getContent(); + $this->storeScreenshot($screenshot, "{$file_name}.html", $message, $suite_name); } catch (DriverException $e) { // A DriverException might occur if no page has been loaded yet so no @@ -188,19 +170,41 @@ public function createScreenshot(string $file_name, string $message): void { return; } - // Save the screenshot locally. - $path = $this->save($screenshot, $file_name); + // For Selenium tests, create an additional .png screenshot. + if ($this->getSession()->getDriver() instanceof Selenium2Driver) { + try { + $screenshot = $this->getSession()->getDriver()->getScreenshot(); + $this->storeScreenshot($screenshot, "{$file_name}.png", $message, $suite_name); + } + catch (DriverException $e) { + // If the .html screenshot was successful, do nothing. + } + } + + // Depending on the output formatter used, Behat will suppress any output + // generated during the test. Flush the output buffers so out message will + // show up in the test logs. + ob_flush(); + } + /** + * Stores the screenshot locally and, optionally, in S3. + * + * @param string $screenshot + * The screenshot content. + * @param string $file_name + * The filename of the screenshot (complete). + * @param string $message + * The message to be printed. + * @param string|null $suite_name + * (optional) Suite name. Passed only from hook callers. + */ + protected function storeScreenshot(string $screenshot, string $file_name, string $message, ?string $suite_name = NULL): void { + // Save the screenshot locally. + $path = $this->save($screenshot, $file_name, $suite_name); // Upload the screenshot to Amazon S3. $this->upload($screenshot, $file_name); - - if ($message) { - print strtr($message, ['@file_name' => $path ?: $file_name]); - // Depending on the output formatter used, Behat will suppress any output - // generated during the test. Flush the output buffers so out message will - // show up in the test logs. - ob_flush(); - } + print strtr($message, ['@file_name' => $path ?: $file_name]); } /** @@ -210,6 +214,8 @@ public function createScreenshot(string $file_name, string $message): void { * The screenshot data. * @param string $file_name * The file name. + * @param string|null $suite_name + * (optional) If passed, will be used to build the screenshot file path. * * @return string|null * The saved screenshot path. @@ -217,7 +223,7 @@ public function createScreenshot(string $file_name, string $message): void { * @throws \Exception * Thrown if the destination folder doesn't exist and couldn't be created. */ - protected function save(string $screenshot, string $file_name): ?string { + protected function save(string $screenshot, string $file_name, ?string $suite_name = NULL): ?string { // Don't attempt to save the screenshot if no folder name has been // configured. if (empty($this->localDir)) { @@ -225,13 +231,17 @@ protected function save(string $screenshot, string $file_name): ?string { } // Ensure the directory exists. - $dir = rtrim($this->localDir, '/'); + $dir = rtrim($this->localDir, DIRECTORY_SEPARATOR); + if ($suite_name) { + $dir .= DIRECTORY_SEPARATOR . $suite_name; + } + if (!is_dir($dir)) { if (!mkdir($dir, 0755, TRUE)) { throw new \Exception("The '$dir' folder does not exist and could not be created."); } } - $path = $this->localDir . DIRECTORY_SEPARATOR . $file_name; + $path = $dir . DIRECTORY_SEPARATOR . $file_name; file_put_contents($path, $screenshot); return $path; @@ -280,4 +290,34 @@ protected function getS3Client(): S3ClientInterface { ]); } + /** + * Builds a filename from the feature path and failed step line. + * + * @param string $type + * The type of event (failure, PHP notice, etc). + * @param \Behat\Behat\Hook\Scope\AfterStepScope $event + * The after step event. + * + * @return string + * The screenshot filename. + */ + protected function buildScreenshotFileName(string $type, AfterStepScope $event): string { + $step_line = str_replace('/', '--', ltrim(substr($event->getFeature()->getFile(), strlen($event->getEnvironment()->getSuite()->getSetting('paths')[0])), '/')); + return "{$type}--{$step_line}--{$event->getStep()->getLine()}"; + } + + /** + * Returns a concatenation of the feature file name and the failed step line. + * + * @param \Behat\Behat\Hook\Scope\AfterStepScope $event + * The after step event. + * + * @return string + * A concatenation of the feature file name and the failed step line. + */ + protected function getStepLine(AfterStepScope $event): string { + // Remove the common path for readability reasons. + return ltrim(substr($event->getFeature()->getFile(), strlen($event->getEnvironment()->getSuite()->getSetting('paths')[0])), '/') . ":{$event->getStep()->getLine()}"; + } + } diff --git a/tests/src/Context/SolutionContext.php b/tests/src/Context/SolutionContext.php index d5da167644..9be31be689 100644 --- a/tests/src/Context/SolutionContext.php +++ b/tests/src/Context/SolutionContext.php @@ -877,7 +877,7 @@ public function assertHighlightedSolution(string $label): void { Assert::assertEquals($solution->label(), $actual_title, sprintf('Expected the highlighted solution to have the title "%s" but instead found "%s".', $solution->label(), $actual_title)); // Check that title links to the canonical page of the solution. - $xpath = '//h2/a[@href = "' . $solution->toUrl()->toString() . '"]'; + $xpath = '//h2/a[@href = "' . $this->getEntityUri($solution) . '"]'; Assert::assertNotEmpty($block_element->find('xpath', $xpath), sprintf('Solution "%s" does not link to the canonical page.', $actual_title)); // Retrieve the topics from the solution, limiting the result to maximum 2 @@ -897,7 +897,7 @@ public function assertHighlightedSolution(string $label): void { Assert::assertEquals($topic->label(), $actual_topic_title, sprintf('Expected topic #%d to be "%s" in the "Highlighted solution" section but instead found "%s".', $j + 1, $topic->label(), $actual_topic_title)); // Check that each topic links to their canonical page. - $xpath = '/a[@href = "' . $topic->toUrl()->toString() . '"]'; + $xpath = '/a[@href = "' . $this->getEntityUri($topic) . '"]'; Assert::assertNotEmpty($topic_element->find('xpath', $xpath), sprintf('Topic "%s" in the "Highlighted solution" section does not link to the canonical topic page.', $actual_topic_title)); } diff --git a/tests/src/ContextualLinksHelper.php b/tests/src/ContextualLinksHelper.php index 50a0bec96e..02aec68dbc 100644 --- a/tests/src/ContextualLinksHelper.php +++ b/tests/src/ContextualLinksHelper.php @@ -114,7 +114,7 @@ protected function generateContextualLinks(TraversableElement $element): array { } // @see Drupal.behaviors.contextual.attach(), contextual.js - $client->request('POST', '/contextual/render', [ + $client->request('POST', base_path() . 'contextual/render', [ 'ids' => $ids, 'tokens' => $tokens, ]); @@ -170,7 +170,7 @@ protected function findContextualLinkElements(TraversableElement $element): arra $this->openContextualLinksMenu($element); $link_list = $element->find('css', '.contextual ul.contextual-links'); - return $link_list->findAll('xpath', '//a'); + return $link_list->findAll('css', 'a'); } /** @@ -241,26 +241,28 @@ protected function openContextualLinksMenu(TraversableElement $element): void { * * @param \Behat\Mink\Element\TraversableElement $element * The element that contains the contextual link menu. - * @param string $link + * @param string $link_title * The link title. */ - public function clickContextualLink(TraversableElement $element, string $link): void { + public function clickContextualLink(TraversableElement $element, string $link_title): void { $links = $this->findContextualLinkPaths($element); - if (!isset($links[$link])) { - throw new \RuntimeException("Contextual link '$link' not found."); + if (!isset($links[$link_title])) { + throw new \RuntimeException("Contextual link '$link_title' not found."); } // If we are not in a real browser, visit the link path instead of actually // opening the contextual menu and clicking the link. if ($this->browserSupportsJavaScript()) { $this->openContextualLinksMenu($element); - $link_element = $this->findContextualLinkElement($element, $link); - $link_element->focus(); + $link_element = $this->findContextualLinkElement($element, $link_title); $link_element->click(); } else { - $this->getSession()->visit($this->locatePath($links[$link])); + $link = $links[$link_title]; + // Remove the base path. + $link = substr($link, strlen(base_path()) - 1); + $this->getSession()->visit($this->locatePath($link)); } } diff --git a/tests/src/Traits/EntityTrait.php b/tests/src/Traits/EntityTrait.php index e9ec610d45..a764bf9e60 100644 --- a/tests/src/Traits/EntityTrait.php +++ b/tests/src/Traits/EntityTrait.php @@ -232,4 +232,32 @@ public function visitEntityForm(string $action, string $title, string $bundle): $this->visitPath($path); } + /** + * Returns the URI of the given entity, prefixed with the base path. + * + * Since Behat tests are run from the CLI the base path (which is normally + * provided as an environment variable by the webserver) is not available on + * the Symfony router object which is used by Drupal to construct the URI. + * This returns the URI prefixed with the base path which is set as a global + * variable in Drupal by the Behat Drupal Extension. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity for which to return the URI. + * @param string $rel + * The link relationship type, for example: canonical or edit-form. + * @param array $options + * See \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for + * the available options. + * + * @return string + * The URI. + * + * @throws \Drupal\Core\Entity\EntityMalformedException + * When the entity doesn't have an ID yet. + */ + protected function getEntityUri(EntityInterface $entity, string $rel = 'canonical', array $options = []): string { + $base_path = rtrim(base_path(), '/'); + return $base_path . $entity->toUrl($rel, $options)->toString(); + } + } diff --git a/tests/src/Traits/MailCollectorTrait.php b/tests/src/Traits/MailCollectorTrait.php index 459cac5a42..43924adbaa 100644 --- a/tests/src/Traits/MailCollectorTrait.php +++ b/tests/src/Traits/MailCollectorTrait.php @@ -6,7 +6,6 @@ use Drupal\Component\Render\MarkupInterface; use Drupal\user\UserInterface; -use PHPUnit\Framework\Assert; /** * Contains utility methods. @@ -93,8 +92,6 @@ protected function getUserMails(UserInterface $user): array { * Thrown if no emails are found or no user exists with the given data. */ protected function getEmailsBySubjectAndMail(string $subject, string $recipient_mail, bool $strict = TRUE): array { - $this->assertEmailTagPresent(); - $mails = $this->getMails(); if (empty($mails)) { throw new \Exception('No mail was sent.'); @@ -120,18 +117,6 @@ protected function getEmailsBySubjectAndMail(string $subject, string $recipient_ return $emails_found; } - /** - * Checks if the current scenario or feature has the @email tag. - * - * Call this in steps that use the test mail collector so that the developer - * is alerted if this tag is not present. - */ - protected function assertEmailTagPresent(): void { - \assert(method_exists($this, 'getTags'), __METHOD__ . ' depends on TagTrait. Please include it in your class.'); - $tags = $this->getTags(); - Assert::assertTrue(in_array('email', $tags), '@email tag is missing, it should be added to the scenario or feature'); - } - /** * Returns all collected emails. * diff --git a/tests/src/Traits/MailConfigTrait.php b/tests/src/Traits/MailConfigTrait.php deleted file mode 100644 index df593b8f5b..0000000000 --- a/tests/src/Traits/MailConfigTrait.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -declare(strict_types = 1); - -namespace Drupal\joinup\Traits; - -/** - * Reusable code for inspecting and preparing mail collector configuration. - */ -trait MailConfigTrait { - - /** - * A list of overridable mail configurations. - * - * @var string[] - */ - protected static $mailOverridableConfigurations = [ - 'system.mail' => 'interface.default', - 'mailsystem.settings' => 'defaults.sender', - ]; - - /** - * Checks if configs are overridden in settings.php, settings.override.php. - * - * @throws \Exception - * When mail configurations were overridden. - */ - protected function checkMailConfigOverride(): void { - $config_factory = \Drupal::configFactory(); - foreach (static::$mailOverridableConfigurations as $config_name => $config_path) { - if ($config_factory->get($config_name)->hasOverrides($config_path)) { - throw new \Exception("Cannot inspect emails since '{$config_name}:{$config_path}' is overridden in settings.php or settings.override.php."); - } - } - } - - /** - * Checks if the test mail collector is currently used. - * - * @return bool - * TRUE if the testing mail collector is used. - */ - protected function isTestMailCollectorUsed(): bool { - $config_factory = \Drupal::configFactory(); - $is_test_mail_collector_used = TRUE; - foreach (static::$mailOverridableConfigurations as $config_name => $config_path) { - if ($config_factory->get($config_name)->get($config_path) !== 'test_mail_collector') { - $is_test_mail_collector_used = FALSE; - break; - } - } - return $is_test_mail_collector_used; - } - -} diff --git a/tests/src/Traits/TraversingTrait.php b/tests/src/Traits/TraversingTrait.php index 8ec24f302e..5e462e48c0 100644 --- a/tests/src/Traits/TraversingTrait.php +++ b/tests/src/Traits/TraversingTrait.php @@ -115,18 +115,23 @@ protected function assertSelectedOption(NodeElement $element, string $expected): * identical. */ protected function assertSelectAvailableOptions(NodeElement $element, TableNode $table): void { - $available_options = $this->getSelectOptions($element); - $rows = $table->getColumn(0); - // Ignore duplicated whitespace. $strip_multiple_spaces = function (string $option): string { - $option = preg_replace("/\s{2,}/", " ", $option); - return $option; + return preg_replace("/\s{2,}/", " ", $option); }; - $available_options = array_map($strip_multiple_spaces, $available_options); - $rows = array_map($strip_multiple_spaces, $rows); - Assert::assertEquals($rows, $available_options); + $actual_options = $this->getSelectOptions($element); + $expected_options = $table->getTable(); + + foreach ($expected_options as $expected_option) { + $actual_option = array_shift($actual_options); + + Assert::assertEquals($strip_multiple_spaces($expected_option[0]), $strip_multiple_spaces($actual_option['text'])); + + if (isset($expected_option[1])) { + Assert::assertEquals($expected_option[1], $actual_option['indentation']); + } + } } /** @@ -136,13 +141,19 @@ protected function assertSelectAvailableOptions(NodeElement $element, TableNode * The select element. * * @return array - * The options text keyed by option value. + * The options as a structured array keyed by option value, with the + * following elements: + * - text: The option text. + * - indentation: The indentation level. */ protected function getSelectOptions(NodeElement $select): array { $options = []; foreach ($select->findAll('xpath', '//option') as $element) { /** @var \Behat\Mink\Element\NodeElement $element */ - $options[] = trim($element->getText()); + $options[] = [ + 'text' => trim($element->getText()), + 'indentation' => substr_count($element->getHtml(), ' '), + ]; } return $options; @@ -237,10 +248,10 @@ protected function getTiles($region = NULL): array { $result = []; // @todo The `.listing__item--tile` selector is part of the original Joinup // theme and can be removed once we have fully migrated to the new theme. - foreach ($regionObj->findAll('css', '.listing__item--tile, article.tile') as $element) { + foreach ($regionObj->findAll('css', '.listing__item--tile, .card, article.tile') as $element) { // @todo The `.listing__title` selector is part of the original Joinup // theme and can be removed once we migrated to the new theme. - $title_element = $element->find('css', ' .listing__title, h2 a'); + $title_element = $element->find('css', ' .listing__title, .card-title, h2 a'); // Some tiles don't have a title, like the one to create a new collection // in the collections page. if ($title_element) { @@ -294,7 +305,7 @@ protected function getListingByHeading(string $type, string $heading): NodeEleme // @todo This can be removed once we are fully migrated to the new theme. $xpath = '//*[@class and contains(concat(" ", normalize-space(@class), " "), " ' . $type . ' ")]'; // That have a heading with the specified text. - $xpath .= '[.//*[@class and contains(concat(" ", normalize-space(@class), " "), " listing__title ")][normalize-space()="' . $heading . '"]]'; + $xpath .= '[.//*[@class and contains(concat(" ", normalize-space(@class), " "), " listing__title ") or contains(concat(" ", normalize-space(@class), " "), " card-title ")][normalize-space()="' . $heading . '"]]'; $item = $this->getSession()->getPage()->find('xpath', $xpath); diff --git a/web/.eslintrc.json b/web/.eslintrc.json index d4bbc92052..35ad9123de 100644 --- a/web/.eslintrc.json +++ b/web/.eslintrc.json @@ -1,3 +1,59 @@ { - "extends": "./core/.eslintrc.json" + // This is copied from Drupal 9.3 which is the version in which YAML linting + // was introduced. Once we are on Drupal 9.3, allow this file to be scaffolded + // again by drupal-scaffold. It is currently excluded from scaffolding in + // `composer.json`. + "extends": [ + "airbnb", + "plugin:prettier/recommended", + "plugin:yml/recommended" + ], + "root": true, + "env": { + "browser": true, + "es6": true, + "node": true + }, + "globals": { + "Drupal": true, + "drupalSettings": true, + "drupalTranslations": true, + "jQuery": true, + "_": true, + "Cookies": true, + "Backbone": true, + "Modernizr": true, + "Popper": true, + "Shepherd": true, + "Sortable": true, + "once": true, + "CKEDITOR": true, + "tabbable": true + }, + "settings": { + "react": { + "version": "latest" + } + }, + "rules": { + "prettier/prettier": "error", + "consistent-return": ["off"], + "no-underscore-dangle": ["off"], + "max-nested-callbacks": ["warn", 3], + "import/no-mutable-exports": ["warn"], + "no-plusplus": ["warn", { + "allowForLoopAfterthoughts": true + }], + "no-param-reassign": ["off"], + "no-prototype-builtins": ["off"], + "valid-jsdoc": ["warn", { + "prefer": { + "returns": "return", + "property": "prop" + }, + "requireReturn": false + }], + "no-unused-vars": ["warn"], + "operator-linebreak": ["error", "after", { "overrides": { "?": "ignore", ":": "ignore" } }] + } } diff --git a/web/modules/custom/collection/js/subscribe-dialog.js b/web/modules/custom/collection/js/subscribe-dialog.js index 49f207d87e..1a1aa52fda 100644 --- a/web/modules/custom/collection/js/subscribe-dialog.js +++ b/web/modules/custom/collection/js/subscribe-dialog.js @@ -16,7 +16,7 @@ const sparql_encoded_id = drupalSettings.joinGroupData.sparqlEncodedId; if (!!sparql_encoded_id) { Drupal.ajax({ - url: '/ajax/collection/' + sparql_encoded_id + '/subscribe/auth', + url: drupalSettings.path.baseUrl + 'ajax/collection/' + sparql_encoded_id + '/subscribe/auth', }).execute(); } } diff --git a/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php b/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php index 1df745bcf8..e73fd97559 100644 --- a/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php +++ b/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php @@ -290,8 +290,13 @@ protected function buildOverviewTreeForm($tree, $delta) { '#default_value' => $link->getParent(), ]; + $pathinfo = $link->getUrlObject()->toString(); + // @todo Remove this workaround once this is fixed in core. + // @see https://www.drupal.org/project/drupal/issues/2548095 + $pathinfo = substr($pathinfo, strlen(base_path()) - 1); + // Disable nesting of links that are not pointing to nodes. - $route_info = $this->urlMatcher->match($link->getUrlObject()->toString()); + $route_info = $this->urlMatcher->match($pathinfo); if ($route_info['_route'] !== 'entity.node.canonical') { // Force parent value to be empty. This will disable any value // submission for this form element, thus disallowing any parent to diff --git a/web/modules/custom/joinup_core/joinup_core.info.yml b/web/modules/custom/joinup_core/joinup_core.info.yml index 8ffca197e8..64f9e5e3ca 100644 --- a/web/modules/custom/joinup_core/joinup_core.info.yml +++ b/web/modules/custom/joinup_core/joinup_core.info.yml @@ -11,6 +11,7 @@ dependencies: - 'matomo_reporting_api:matomo_reporting_api' - 'message:message' - 'message_notify:message_notify' + - 'monolog:monolog' - 'og:og' - 'rdf_entity:rdf_draft' - 'rdf_entity:rdf_entity' diff --git a/web/modules/custom/joinup_core/joinup_core.install b/web/modules/custom/joinup_core/joinup_core.install index d3df5382e4..9de525c909 100644 --- a/web/modules/custom/joinup_core/joinup_core.install +++ b/web/modules/custom/joinup_core/joinup_core.install @@ -112,3 +112,13 @@ function joinup_core_update_0107500(): void { ->condition('name', 'password_policy.password_policy.generic_policy') ->execute(); } + +/** + * Anticipate 'search_api.server.solr_unpublished' deletion. + */ +function joinup_core_update_0107501(): void { + \Drupal::database()->delete('config') + ->condition('collection', '') + ->condition('name', 'search_api.server.solr_unpublished') + ->execute(); +} diff --git a/web/modules/custom/joinup_core/joinup_core.monolog.services.yml b/web/modules/custom/joinup_core/joinup_core.monolog.services.yml new file mode 100644 index 0000000000..9b451fbe0c --- /dev/null +++ b/web/modules/custom/joinup_core/joinup_core.monolog.services.yml @@ -0,0 +1,28 @@ +parameters: + + monolog.channel_handlers: + default: ['default_handler'] + php: ['php_handler'] + + monolog.processors: + - message_placeholder + - current_user + - request_uri + - ip + - referer + - error_page_error_uuid + +services: + + monolog.handler.default_handler: + class: Monolog\Handler\RotatingFileHandler + # The parameter is set in \Drupal\joinup_core\JoinupCoreServiceProvider + arguments: ['%joinup_core.monolog.paths.default_handler%', 10, '100'] + + monolog.handler.php_handler: + class: Monolog\Handler\RotatingFileHandler + # The parameter is set in \Drupal\joinup_core\JoinupCoreServiceProvider + arguments: ['%joinup_core.monolog.paths.php_handler%', 10, '400'] + + monolog.processor.error_page_error_uuid: + class: Drupal\joinup_core\Logger\Processor\ErrorPageErrorUuidProcessor diff --git a/web/modules/custom/joinup_core/src/JoinupCoreServiceProvider.php b/web/modules/custom/joinup_core/src/JoinupCoreServiceProvider.php new file mode 100644 index 0000000000..d1431b0aef --- /dev/null +++ b/web/modules/custom/joinup_core/src/JoinupCoreServiceProvider.php @@ -0,0 +1,32 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\joinup_core; + +use Drupal\Core\DependencyInjection\ContainerBuilder; +use Drupal\Core\DependencyInjection\ServiceModifierInterface; + +/** + * Sets the monolog handler paths from DRUPAL_MONOLOG_PATHS env var. + */ +class JoinupCoreServiceProvider implements ServiceModifierInterface { + + /** + * {@inheritdoc} + */ + public function alter(ContainerBuilder $container): void { + if (!empty($_SERVER['DRUPAL_MONOLOG_PATHS'])) { + foreach (explode(';', $_SERVER['DRUPAL_MONOLOG_PATHS']) as $item) { + $item = str_replace(' ', '', $item); + if (strpos($item, ':') !== FALSE) { + [$handler, $path] = explode(':', $item); + if ($handler) { + $container->setParameter("joinup_core.monolog.paths.{$handler}", $path); + } + } + } + } + } + +} diff --git a/web/modules/custom/joinup_core/src/JoinupVersion.php b/web/modules/custom/joinup_core/src/JoinupVersion.php index da1950e1bc..0a738983f8 100644 --- a/web/modules/custom/joinup_core/src/JoinupVersion.php +++ b/web/modules/custom/joinup_core/src/JoinupVersion.php @@ -9,11 +9,18 @@ /** * A service that retrieves the current Joinup version. * - * The version is saved during composer install in a `VERSION` file in the root - * folder of the project. + * The version is saved during building the codebase in a `VERSION` file, in the + * root folder of the project. */ class JoinupVersion implements JoinupVersionInterface { + /** + * Pseudo version used when a real version cannot be determined. + * + * @var string + */ + const UNTAGGED = 'untagged.version'; + /** * The current Joinup version. * @@ -27,7 +34,7 @@ class JoinupVersion implements JoinupVersionInterface { public function getVersion(): string { if (empty($this->version)) { $path = JoinupVersionInterface::PATH; - $this->version = file_exists($path) ? $this->version = trim(file_get_contents($path)) : 'untagged.version'; + $this->version = file_exists($path) ? trim(file_get_contents($path)) : static::UNTAGGED; // Sanitize the version string. This is perhaps overkill since if a hacker // can access the version file we are in big trouble anyway. In any case @@ -48,18 +55,17 @@ public function getUrl(): Url { // If a development version is checked out, return a link to the currently // checked out commit. if (preg_match('/^.+-\d+-g([a-f0-9]+)$/', $version, $matches) === 1) { - return Url::fromUri('https://github.com/ec-europa/joinup-dev/commit/' . $matches[1]); + return Url::fromUri('https://git.fpfis.eu/digit/digit-joinup-dev/-/commit/' . $matches[1]); } // If the current version could not be determined, return a link to the // releases page on Github. - if ($version === 'n/a') { - return Url::fromUri('https://github.com/ec-europa/joinup-dev/releases'); + if ($version === static::UNTAGGED) { + return Url::fromUri('https://git.fpfis.eu/digit/digit-joinup-reference/-/tags'); } - // If a tag is checked out, return a link to the release that matches the - // tag. - return Url::fromUri('https://github.com/ec-europa/joinup-dev/releases/tag/' . $version); + // If a tag is checked out, return a link to the matching release. + return Url::fromUri('https://git.fpfis.eu/digit/digit-joinup-reference/-/tags/' . $version); } } diff --git a/web/modules/custom/joinup_core/src/Logger/Processor/ErrorPageErrorUuidProcessor.php b/web/modules/custom/joinup_core/src/Logger/Processor/ErrorPageErrorUuidProcessor.php new file mode 100644 index 0000000000..9143952fbe --- /dev/null +++ b/web/modules/custom/joinup_core/src/Logger/Processor/ErrorPageErrorUuidProcessor.php @@ -0,0 +1,22 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\joinup_core\Logger\Processor; + +/** + * Logs the error universal unique ID. + */ +class ErrorPageErrorUuidProcessor { + + /** + * {@inheritdoc} + */ + public function __invoke(array $record): array { + if (!empty($record['context']['@uuid'])) { + $record['extra']['uuid'] = $record['context']['@uuid']; + } + return $record; + } + +} diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/OutdatedContentFieldItemList.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/OutdatedContentFieldItemList.php index 3653aa2b4e..a3210995f4 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/OutdatedContentFieldItemList.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/OutdatedContentFieldItemList.php @@ -37,8 +37,7 @@ protected function computeValue(): void { // If $publication_time is NULL, then the entity has never been published, // thus it cannot be outdated. if (!empty($publication_time)) { - $utc = new \DateTimeZone('UTC'); - $published_at = new \DateTime("@$publication_time", $utc); + $published_at = new \DateTime("@$publication_time"); $outdated_date = $published_at->add(new \DateInterval("P{$threshold}Y"))->getTimestamp(); } diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/ReportLinkItem.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/ReportLinkItem.php index 16d1b95dae..d211f80461 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/ReportLinkItem.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/ReportLinkItem.php @@ -76,15 +76,17 @@ public function set($property_name, $value, $notify = TRUE) { protected function computeValue() { $entity = $this->getEntity(); if (!$entity->isNew()) { - $url = $this->getEntity()->toUrl()->toString(); + $system_path = $this->getEntity()->toUrl()->getInternalPath(); + $path = \Drupal::service('path_alias.manager')->getAliasByPath("/$system_path"); $value = [ 'uri' => 'internal:/contact', 'title' => $this->t('Report abusive content'), 'options' => [ 'query' => [ 'category' => 'report', - 'uri' => $url, - 'destination' => $url, + 'uri' => $path, + // Remove the leading slash. + 'destination' => substr($path, 1), ], ], ]; diff --git a/web/modules/custom/joinup_core/src/Plugin/Mail/NullMailer.php b/web/modules/custom/joinup_core/src/Plugin/Mail/NullMailer.php new file mode 100644 index 0000000000..5cc94a1264 --- /dev/null +++ b/web/modules/custom/joinup_core/src/Plugin/Mail/NullMailer.php @@ -0,0 +1,34 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\joinup_core\Plugin\Mail; + +use Drupal\Core\Mail\MailInterface; + +/** + * Defines a NULL mailer backend. + * + * @Mail( + * id = "null", + * label = @Translation("Null mailer"), + * description = @Translation("Inhibits the mail delivery.") + * ) + */ +class NullMailer implements MailInterface { + + /** + * {@inheritdoc} + */ + public function format(array $message): array { + return $message; + } + + /** + * {@inheritdoc} + */ + public function mail(array $message): bool { + return TRUE; + } + +} diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php index b3b02a598a..abf5cdc508 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php @@ -21,20 +21,6 @@ class ConfigTest extends JoinupExistingSiteTestBase { */ protected $disableSpamProtection = FALSE; - /** - * {@inheritdoc} - */ - protected function setUp(): void { - parent::setUp(); - - // Mail configuration has been changed during tests run in order to prevent - // sending emails outside and catch messages for test assertion purpose. As - // this setup creates a difference between the active and the sync store, we - // restore the active store mail configuration for the purpose of this test. - // @see \Drupal\Tests\joinup_test\ExistingSite\JoinupExistingSiteTestBase::setUp() - $this->restoreMailSettings(); - } - /** * Tests that the active and sync stores are the same. */ @@ -46,13 +32,4 @@ public function testConfig(): void { $this->assertEmpty($diff, 'Differences between active and sync stores for: ' . implode(', ', $diff)); } - /** - * {@inheritdoc} - */ - public function tearDown(): void { - // Re-enable mail collection. - $this->startMailCollection(); - parent::tearDown(); - } - } diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/OutdatedContentTest.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/OutdatedContentTest.php index 6e265a8791..98b1be53d0 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/OutdatedContentTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/OutdatedContentTest.php @@ -20,7 +20,7 @@ class OutdatedContentTest extends JoinupExistingSiteTestBase { /** * The current time. * - * @var int + * @var \DateTimeInterface */ protected $now; @@ -35,7 +35,7 @@ public function testOutdatedContent(): void { ->set('node.news', 10) ->save(); - $this->now = time(); + $this->now = new \DateTime('now', new \DateTimeZone('UTC')); /** @var \Drupal\collection\Entity\CollectionInterface $collection */ $collection = $this->createRdfEntity([ @@ -46,25 +46,34 @@ public function testOutdatedContent(): void { $discussion = $this->createNode([ 'type' => 'discussion', 'og_audience' => $collection, - 'published_at' => strtotime('-3 years -1 minute', $this->now), + 'published_at' => (clone $this->now) + ->sub(new \DateInterval('P3YT1M')) + ->getTimestamp(), ]); /** @var \Drupal\joinup_document\Entity\DocumentInterface $document */ $document = $this->createNode([ 'type' => 'document', 'og_audience' => $collection, - 'published_at' => strtotime('-3 years +1 minute', $this->now), + 'published_at' => (clone $this->now) + ->sub(new \DateInterval('P3Y')) + ->add(new \DateInterval('PT1M')) + ->getTimestamp(), ]); /** @var \Drupal\joinup_event\Entity\EventInterface $event */ $event = $this->createNode([ 'type' => 'event', 'og_audience' => $collection, - 'published_at' => strtotime('-40 years', $this->now), + 'published_at' => (clone $this->now) + ->sub(new \DateInterval('P40Y')) + ->getTimestamp(), ]); /** @var \Drupal\joinup_news\Entity\NewsInterface $news */ $news = $this->createNode([ 'type' => 'news', 'og_audience' => $collection, - 'published_at' => strtotime('-5 years', $this->now), + 'published_at' => (clone $this->now) + ->sub(new \DateInterval('P5Y')) + ->getTimestamp(), ]); // The discussion is outdated. @@ -94,9 +103,8 @@ public function tearDown(): void { * The entity. */ protected function assertIsOutdated(OutdatedContentInterface $entity): void { - $outdated_time = $entity->getOutdatedTime(); - $this->assertNotNull($outdated_time); - $this->assertGreaterThan($outdated_time, $this->now); + $this->assertNotNull($entity->getOutdatedTime()); + $this->assertGreaterThan($this->getOutdatedTime($entity), $this->now); } /** @@ -106,8 +114,28 @@ protected function assertIsOutdated(OutdatedContentInterface $entity): void { * The entity. */ protected function assertIsNotOutdated(OutdatedContentInterface $entity): void { - $outdated_time = $entity->getOutdatedTime(); - $this->assertTrue(!$outdated_time || ($this->now < $outdated_time)); + if (!$entity->getOutdatedTime()) { + // It never gets outdated. + $this->assertTrue(TRUE); + return; + } + $this->assertGreaterThan($this->now, $this->getOutdatedTime($entity)); + } + + /** + * Returns the entity outdated date/time. + * + * @param \Drupal\joinup_core\Entity\OutdatedContentInterface $entity + * The entity. + * + * @return \DateTime|null + * The entity outdated date/time or NULL if it doesn't get outdated. + */ + protected function getOutdatedTime(OutdatedContentInterface $entity): ?\DateTime { + if ($entity->getOutdatedTime()) { + return (new \DateTime("@{$entity->getOutdatedTime()}"))->setTimezone($this->now->getTimezone()); + } + return NULL; } } diff --git a/web/modules/custom/joinup_eulogin/src/Plugin/Menu/EuLoginMenuLink.php b/web/modules/custom/joinup_eulogin/src/Plugin/Menu/EuLoginMenuLink.php index 5bbe3205f1..d69646cf80 100644 --- a/web/modules/custom/joinup_eulogin/src/Plugin/Menu/EuLoginMenuLink.php +++ b/web/modules/custom/joinup_eulogin/src/Plugin/Menu/EuLoginMenuLink.php @@ -126,7 +126,7 @@ public function getOptions() { } // If we are on the homepage, set the 'returnto' path to '/' alias. elseif ($this->pathMatcher->isFrontPage()) { - $return_to = '/'; + $return_to = base_path(); } // Return to the current page URL. else { diff --git a/web/modules/custom/joinup_eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/joinup_eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index f9e626d305..9bc2fd0f04 100644 --- a/web/modules/custom/joinup_eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/joinup_eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -4,6 +4,7 @@ namespace Drupal\Tests\joinup_eulogin\ExistingSite; +use Drupal\Core\Test\AssertMailTrait; use Drupal\Tests\cas\Traits\CasTestTrait; use Drupal\Tests\joinup_test\ExistingSite\JoinupExistingSiteTestBase; use Drupal\user\Entity\User; @@ -16,6 +17,7 @@ */ class JoinupEuLoginTest extends JoinupExistingSiteTestBase { + use AssertMailTrait; use CasTestTrait; use LoginTrait; @@ -227,7 +229,7 @@ protected function assertLimitedAccess($url): void { $assert->pageTextContains('Your account access is limited.'); $assert->pageTextContains('Starting from 02/03/2020, signing in to Joinup is handled by EU Login, the European Commission Authentication Service. After you sign-in using EU Login, you will be able to synchronise your existing Joinup account to restore your access.'); $assert->linkExists('EU Login'); - $assert->linkByHrefExists('/user/logout?destination=/caslogin'); + $assert->linkByHrefExists('/user/logout?destination=' . base_path() . 'caslogin'); } /** diff --git a/web/modules/custom/joinup_front_page/src/Plugin/Block/ExploreBlock.php b/web/modules/custom/joinup_front_page/src/Plugin/Block/ExploreBlock.php index fe829754d4..5fff8c5d9e 100644 --- a/web/modules/custom/joinup_front_page/src/Plugin/Block/ExploreBlock.php +++ b/web/modules/custom/joinup_front_page/src/Plugin/Block/ExploreBlock.php @@ -8,6 +8,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Drupal\Core\Url; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -90,30 +91,35 @@ public static function create(ContainerInterface $container, array $configuratio * {@inheritdoc} */ public function build(): array { + $get_url = function (string $type): string { + return Url::fromRoute('view.search.page_1', [], [ + 'query' => ['f' => ['type:' . $type]], + ])->toString(); + }; $data = [ 'solutions' => [ 'label' => $this->t('Solutions'), 'plural_type' => $this->t('solutions'), 'data' => $this->getRdfEntities('solution'), - 'url' => '/search?keys=&f[0]=type%3Asolution', + 'url' => $get_url('solution'), ], 'collections' => [ 'label' => $this->t('Collections'), 'plural_type' => $this->t('collections'), 'data' => $this->getRdfEntities('collection'), - 'url' => '/search?keys=&f[0]=type%3Acollection', + 'url' => $get_url('collection'), ], 'news' => [ 'label' => $this->t('News'), 'plural_type' => $this->t('news'), 'data' => $this->getContent('news'), - 'url' => '/search?keys=&f[0]=type%3Anews', + 'url' => $get_url('news'), ], 'events' => [ 'label' => $this->t('Events'), 'plural_type' => $this->t('events'), 'data' => $this->getContent('event'), - 'url' => '/search?keys=&f[0]=type%3Aevent', + 'url' => $get_url('event'), ], ]; diff --git a/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php b/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php index 4d20b6514c..e99da31a6e 100644 --- a/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php +++ b/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php @@ -79,7 +79,9 @@ public static function getSubscribedEvents(): array { public function alterRedirection(FilterResponseEvent $event): void { $response = $event->getResponse(); if ($response->isRedirect() && $response instanceof RedirectResponse) { - $path = trim(parse_url($response->getTargetUrl(), PHP_URL_PATH), '/'); + $path = rtrim(parse_url($response->getTargetUrl(), PHP_URL_PATH), '/'); + $path = substr($path, strlen(base_path())); + /** @var \Symfony\Component\HttpFoundation\RedirectResponse $response */ $url = Url::fromUri("internal:/$path"); if ($url->isRouted() && ($url->getRouteName() === 'joinup_group.transfer_group_ownership_confirm')) { diff --git a/web/modules/custom/joinup_search/config/schema/joinup_search.schema.yml b/web/modules/custom/joinup_search/config/schema/joinup_search.schema.yml index c5f76303b5..47a7520b0b 100644 --- a/web/modules/custom/joinup_search/config/schema/joinup_search.schema.yml +++ b/web/modules/custom/joinup_search/config/schema/joinup_search.schema.yml @@ -28,7 +28,6 @@ plugin.plugin_configuration.search_api_processor.joinup_entity_status: inverse: type: boolean label: 'Inverse' - roles: search_api_field.plugin.filter.node_entity_autocomplete: type: joinup_search_filter_plugin_entity_autocomplete diff --git a/web/modules/custom/joinup_search/joinup_search.install b/web/modules/custom/joinup_search/joinup_search.install index 5110fd3482..4a1b3ebab9 100644 --- a/web/modules/custom/joinup_search/joinup_search.install +++ b/web/modules/custom/joinup_search/joinup_search.install @@ -22,43 +22,40 @@ function joinup_search_requirements(string $phase): array { $http_client = \Drupal::httpClient(); $site_hash = Utility::getSiteHash(); - foreach (['published', 'unpublished'] as $index_id) { - $endpoint = \Drupal::config("search_api.server.solr_{$index_id}") - ->get('backend_config.connector_config'); - $uri = (string) (new Uri()) - ->withScheme($endpoint['scheme']) - ->withHost($endpoint['host']) - ->withPort($endpoint['port']) - ->withPath(rtrim($endpoint['path'], '/') . "/{$endpoint['core']}/select") - ->withQuery(http_build_query([ - 'fq' => "-hash:{$site_hash}", - 'q' => '*:*', - 'wt' => 'json', - ])); - - try { - $response = $http_client->get($uri); - } - catch (\Throwable $exception) { - // Ignore error, it's already covered by search_api_solr module. - // @see search_api_solr_requirements() - continue; - } + $endpoint = \Drupal::config('search_api.server.joinup')->get('backend_config.connector_config'); + $uri = (string) (new Uri()) + ->withScheme($endpoint['scheme']) + ->withHost($endpoint['host']) + ->withPort($endpoint['port']) + ->withPath(rtrim($endpoint['path'], '/') . "/{$endpoint['core']}/select") + ->withQuery(http_build_query([ + 'fq' => "-hash:{$site_hash}", + 'q' => '*:*', + 'wt' => 'json', + ])); + + try { + $response = $http_client->get($uri); + } + catch (\Throwable $exception) { + // Ignore error, it's already covered by search_api_solr module. + // @see search_api_solr_requirements() + return []; + } - $num_found = Json::decode($response->getBody()->getContents())['response']['numFound']; - if ($num_found) { - $requirements["solr_data:{$index_id}"] = [ - 'severity' => REQUIREMENT_ERROR, - 'title' => t('Solr index: %index', ['%index' => $index_id]), - 'value' => t('Found @count entries with invalid site hash', [ - '@count' => $num_found, - ]), - 'description' => t('The valid site hash is %hash. Retrieve the invalid entries with this <a href=":uri">query</a>.', [ - '%hash' => $site_hash, - ':uri' => $uri, - ]), - ]; - } + $num_found = Json::decode($response->getBody()->getContents())['response']['numFound']; + if ($num_found) { + $requirements['solr_data'] = [ + 'severity' => REQUIREMENT_ERROR, + 'title' => t('Solr core: %core', ['%core' => 'joinup']), + 'value' => t('Found @count entries with invalid site hash', [ + '@count' => $num_found, + ]), + 'description' => t('The valid site hash is %hash. Retrieve the invalid entries with this <a href=":uri">query</a>.', [ + '%hash' => $site_hash, + ':uri' => $uri, + ]), + ]; } return $requirements; diff --git a/web/modules/custom/joinup_search/joinup_search.module b/web/modules/custom/joinup_search/joinup_search.module index 60991a190e..8c8309a42a 100644 --- a/web/modules/custom/joinup_search/joinup_search.module +++ b/web/modules/custom/joinup_search/joinup_search.module @@ -14,6 +14,7 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Template\Attribute; +use Drupal\joinup_search\Plugin\views\row\JoinupSearchApiRow; use Drupal\search_api\IndexInterface; use Drupal\search_api\Query\ConditionGroupInterface; use Drupal\search_api\Query\QueryInterface; @@ -401,3 +402,10 @@ function joinup_search_theme_suggestions_joinup_search_global_search(array $vari return []; } + +/** + * Implements hook_views_plugins_row_alter(). + */ +function joinup_search_views_plugins_row_alter(array &$plugins): void { + $plugins['search_api']['class'] = JoinupSearchApiRow::class; +} diff --git a/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php b/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php new file mode 100644 index 0000000000..e52a96d79e --- /dev/null +++ b/web/modules/custom/joinup_search/src/Plugin/views/row/JoinupSearchApiRow.php @@ -0,0 +1,45 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\joinup_search\Plugin\views\row; + +use Drupal\search_api\Plugin\views\row\SearchApiRow; +use Drupal\search_api\SearchApiException; + +/** + * Provides a row plugin for displaying a result as a search result item. + * + * @ViewsRow( + * id = "joinup_search_api", + * title = @Translation("Rendered entity"), + * help = @Translation("Displays entity of the matching search API item"), + * ) + * + * @see joinup_search_views_plugins_row_alter() + */ +class JoinupSearchApiRow extends SearchApiRow { + + /** + * {@inheritdoc} + */ + public function render($row) { + $parent = parent::render($row); + + if ($this->view->id() == 'search') { + $datasource_id = $row->search_api_datasource; + if ($row->index <= 2 && $this->view->getCurrentPage() <= 0) { + $view_mode = 'search_result_featured'; + try { + return $this->index->getDatasource($datasource_id)->viewItem($row->_object, $view_mode); + } + catch (SearchApiException $e) { + $this->logException($e); + return ''; + } + } + } + return $parent; + } + +} diff --git a/web/modules/custom/joinup_test/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_test/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index d9410f7483..f00953c07a 100644 --- a/web/modules/custom/joinup_test/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_test/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -5,9 +5,7 @@ namespace Drupal\Tests\joinup_test\ExistingSite; use Drupal\joinup\Traits\AntibotTrait; -use Drupal\joinup\Traits\MailConfigTrait; use weitzman\DrupalTestTraits\ExistingSiteBase; -use weitzman\DrupalTestTraits\Mail\MailCollectionTrait; /** * Base class for Joinup ExistingSite tests. @@ -15,11 +13,6 @@ abstract class JoinupExistingSiteTestBase extends ExistingSiteBase { use AntibotTrait; - use MailCollectionTrait { - startMailCollection as traitStartMailCollection; - restoreMailSettings as traitRestoreMailSettings; - } - use MailConfigTrait; /** * The list of Honeypot forms. @@ -48,9 +41,6 @@ abstract class JoinupExistingSiteTestBase extends ExistingSiteBase { protected function setUp(): void { parent::setUp(); - // Use the testing mail collector during tests. - $this->startMailCollection(); - // A user whose account in not yet linked with an EU Login account has // limited access to the website features. They can login only by using the // one-time-login mechanism, but one-time-login is meant only to allow @@ -89,9 +79,6 @@ public function tearDown(): void { // Re-enable limited access functionality. $this->state->delete('joinup_eulogin.disable_limited_access'); - // Restore the mail settings. - $this->restoreMailSettings(); - /** @var \Drupal\Component\Plugin\PluginManagerInterface $delete_orphans_manager */ $delete_orphans_manager = $this->container->get('plugin.manager.og.delete_orphans'); /** @var \Drupal\og\OgDeleteOrphansInterface $delete_orphans_plugin */ @@ -107,31 +94,6 @@ public function tearDown(): void { $delete_orphans_plugin->process(); } - /** - * Overrides the trait method by bypassing config read-only. - * - * @throws \Exception - * If mail config is overwritten in settings.php or settings.override.php. - */ - protected function startMailCollection(): void { - // Check if the mail system configuration has been overridden in - // settings.php or settings.override.php. - $this->checkMailConfigOverride(); - - static::bypassReadOnlyConfig(); - $this->traitStartMailCollection(); - static::restoreReadOnlyConfig(); - } - - /** - * Overrides the trait method by bypassing config read-only. - */ - protected function restoreMailSettings(): void { - static::bypassReadOnlyConfig(); - $this->traitRestoreMailSettings(); - static::restoreReadOnlyConfig(); - } - /** * Disables Honeypot settings during the test run. */ diff --git a/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php b/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php index 7da476391b..17874dc391 100644 --- a/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php +++ b/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php @@ -175,23 +175,24 @@ protected function getValidMatches($text) { $document = Html::load($text); foreach ($document->getElementsByTagName('iframe') as $iframe) { /** @var \DOMElement $iframe */ - $src = $iframe->getAttribute('src'); - $options = UrlHelper::parse($src); - $options['query'] = UrlHelper::filterQueryParameters($options['query'], [ - 'autoplay', - 'autoPlay', - 'autostart', - ]); - $url = $this->getAbsoluteUrl($options); - $matches[$document->saveHTML($iframe)] = [ - 'video_url' => $url, - 'settings' => [ - 'width' => $iframe->getAttribute('width'), - 'height' => $iframe->getAttribute('height'), - 'autoplay' => $plugin_settings['autoplay'], - 'responsive' => $plugin_settings['responsive'], - ], - ]; + if ($src = $iframe->getAttribute('src')) { + $parts = UrlHelper::parse($src); + $parts['query'] = UrlHelper::filterQueryParameters($parts['query'], [ + 'autoplay', + 'autoPlay', + 'autostart', + ]); + $url = $this->getUrl($parts); + $matches[$document->saveHTML($iframe)] = [ + 'video_url' => $url, + 'settings' => [ + 'width' => $iframe->getAttribute('width'), + 'height' => $iframe->getAttribute('height'), + 'autoplay' => $plugin_settings['autoplay'], + 'responsive' => $plugin_settings['responsive'], + ], + ]; + } } return $matches; @@ -218,24 +219,25 @@ protected function getProvider($url) { } /** - * Attempts to create the absolute url. + * Attempts to create a URL. * - * @param array $options - * An array of options including the path. + * @param array $parts + * An array of URL parts. * * @return string|null - * The string representation of the url or null if no url is found. + * The string representation of the URL or NULL if no URL is found. */ - protected function getAbsoluteUrl(array $options) { + protected function getUrl(array $parts): ?string { try { - $url = Url::fromUri($options['path'], $options)->toString(); + $url = Url::fromUri($parts['path'], $parts)->toString(); } - catch (\Exception $e) { + catch (\Exception $exception) { try { - $url = ltrim($options['path'], '/'); - $url = Url::fromUri('internal:/' . $url, $options)->setAbsolute(TRUE)->toString(); + $path = ltrim($parts['path'], '/'); + $parts['base_url'] = $GLOBALS['base_url']; + $url = Url::fromUri('internal:/' . $path, $parts)->toString(); } - catch (\Exception $e) { + catch (\Exception $exception) { return NULL; } } diff --git a/web/modules/custom/joinup_video/src/Plugin/video_embed_field/Provider/InternalPath.php b/web/modules/custom/joinup_video/src/Plugin/video_embed_field/Provider/InternalPath.php index bc8392136f..f48def11e3 100644 --- a/web/modules/custom/joinup_video/src/Plugin/video_embed_field/Provider/InternalPath.php +++ b/web/modules/custom/joinup_video/src/Plugin/video_embed_field/Provider/InternalPath.php @@ -4,9 +4,9 @@ namespace Drupal\joinup_video\Plugin\video_embed_field\Provider; +use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Url; use Drupal\video_embed_field\ProviderPluginBase; -use GuzzleHttp\ClientInterface; /** * An iframe pointing to site itself. @@ -18,37 +18,6 @@ */ class InternalPath extends ProviderPluginBase { - /** - * The base url of the input. - * - * @var string - */ - protected $baseUrl; - - /** - * Static cache for resolved short URLs. - * - * @var string[] - */ - protected static $resolvedUrl = []; - - /** - * Create a plugin with the given input. - * - * @param string $configuration - * The configuration of the plugin. - * @param string $plugin_id - * The plugin id. - * @param array $plugin_definition - * The plugin definition. - * @param \GuzzleHttp\ClientInterface $http_client - * An HTTP client. - */ - public function __construct($configuration, $plugin_id, array $plugin_definition, ClientInterface $http_client) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $http_client); - $this->baseUrl = $this->getUrlFromInput($configuration['input']); - } - /** * {@inheritdoc} */ @@ -56,7 +25,10 @@ public function renderEmbedCode($width, $height, $autoplay) { $iframe = [ '#type' => 'video_embed_iframe', '#provider' => 'internal_path', - '#url' => Url::fromUserInput('/' . ltrim($this->getVideoId(), '/'))->setAbsolute(TRUE)->toString(), + '#url' => Url::fromUri('internal:/' . $this->getVideoId()) + ->setOption('base_url', $GLOBALS['base_url']) + ->setAbsolute() + ->toString(), ]; return $iframe; @@ -64,60 +36,22 @@ public function renderEmbedCode($width, $height, $autoplay) { /** * {@inheritdoc} - * - * The internal provider needs the url to match the base url to be applicable. */ public static function isApplicable($input) { - $applicable = parent::isApplicable($input); - $url = static::getUrlFromInput($input); - return $applicable && !empty($url) && $url === \Drupal::request()->getHost(); - } - - /** - * Parses the input and returns a list of matches. - * - * @param string $input - * The input url. - * - * @return array - * An array of matches related to the url. The two specific values returned - * are id and base_url. - */ - public static function getDataFromInput($input) { - preg_match('#^(?:(?:https?:)?//)(?<base_url>[^/]+)/(index\.php\?q=)?(?<id>[^&\?]+)#i', $input, $matches); - return $matches; + return !UrlHelper::isExternal($input) || UrlHelper::externalIsLocal($input, $GLOBALS['base_url']); } /** * {@inheritdoc} */ - public static function getIdFromInput($input) { - $matches = static::getDataFromInput($input); - return isset($matches['id']) ? $matches['id'] : FALSE; - } - - /** - * Return the base_url from the input. - * - * @param string $input - * The input url. - * - * @return mixed - * The base url. - */ - public static function getUrlFromInput($input) { - $matches = static::getDataFromInput($input); - return isset($matches['base_url']) ? $matches['base_url'] : FALSE; - } - - /** - * Returns the base url. - * - * @return string - * The base url. - */ - public function getBaseUrl() { - return $this->baseUrl; + public static function getIdFromInput($input): string { + if (strpos($input, $GLOBALS['base_url']) === 0) { + $input = substr($input, strlen($GLOBALS['base_url'])); + } + elseif (strpos($input, base_path()) === 0) { + $input = substr($input, strlen(base_path()) - 1); + } + return ltrim($input, '/'); } /** diff --git a/web/modules/custom/whats_new/src/WhatsNewHelper.php b/web/modules/custom/whats_new/src/WhatsNewHelper.php index 1a4891fc89..6dcfd00704 100644 --- a/web/modules/custom/whats_new/src/WhatsNewHelper.php +++ b/web/modules/custom/whats_new/src/WhatsNewHelper.php @@ -8,6 +8,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountProxyInterface; +use Drupal\path_alias\AliasManagerInterface; use Drupal\user\UserDataInterface; /** @@ -43,6 +44,13 @@ class WhatsNewHelper implements WhatsNewHelperInterface { */ protected $invalidator; + /** + * The path alias manager service. + * + * @var \Drupal\path_alias\AliasManagerInterface + */ + protected $aliasManager; + /** * Constructs a WhatsNewHelper object. * @@ -54,12 +62,15 @@ class WhatsNewHelper implements WhatsNewHelperInterface { * The user data service. * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $invalidator * The cache tag invalidator service. + * @param \Drupal\path_alias\AliasManagerInterface $alias_manager + * The path alias manager service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, AccountProxyInterface $current_user, UserDataInterface $user_data, CacheTagsInvalidatorInterface $invalidator) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, AccountProxyInterface $current_user, UserDataInterface $user_data, CacheTagsInvalidatorInterface $invalidator, AliasManagerInterface $alias_manager) { $this->entityTypeManager = $entity_type_manager; $this->currentUser = $current_user; $this->userData = $user_data; $this->invalidator = $invalidator; + $this->aliasManager = $alias_manager; } /** @@ -84,11 +95,12 @@ public function getFlagEnabledMenuLinks(?EntityInterface $entity = NULL): array ->condition('live_link', 1); if ($entity) { + $system_path = '/' . $entity->toUrl()->getInternalPath(); $entity_uris = [ // Support both the alias and the internal URL. The alias can occur if // the user copies it from the URL and the internal URL can occur if the // user selects the entity from the autocomplete field. - 'internal:' . $entity->toUrl()->toString(), + "internal:{$this->aliasManager->getAliasByPath($system_path)}", "entity:node/{$entity->id()}", ]; diff --git a/web/modules/custom/whats_new/whats_new.services.yml b/web/modules/custom/whats_new/whats_new.services.yml index b70bd49c44..1e8f1d9870 100644 --- a/web/modules/custom/whats_new/whats_new.services.yml +++ b/web/modules/custom/whats_new/whats_new.services.yml @@ -1,4 +1,4 @@ services: whats_new.helper: class: Drupal\whats_new\WhatsNewHelper - arguments: ['@entity_type.manager', '@current_user', '@user.data', '@cache_tags.invalidator'] + arguments: ['@entity_type.manager', '@current_user', '@user.data', '@cache_tags.invalidator', '@path_alias.manager'] diff --git a/web/themes/joinup/scss/layouts/sections/_section--footer.scss b/web/themes/joinup/scss/layouts/sections/_section--footer.scss index 853e73a685..238a10e3b5 100644 --- a/web/themes/joinup/scss/layouts/sections/_section--footer.scss +++ b/web/themes/joinup/scss/layouts/sections/_section--footer.scss @@ -10,13 +10,13 @@ @include hidden-print; .footer__first { - background-color: rgb(20, 59, 118); + background-color: $color-blue-default; } .footer__second { padding-top: 10px; padding-bottom: 5px; - background-color: rgb(20, 59, 118); + background-color: $color-blue-default; } .footer__site-name { @@ -24,7 +24,7 @@ margin-bottom: 10px; img { - height: 40px; + height: 30px; width: auto; } } diff --git a/web/themes/joinup/templates/parts/footer.html.twig b/web/themes/joinup/templates/parts/footer.html.twig index 61b1e807d2..4fb54118be 100644 --- a/web/themes/joinup/templates/parts/footer.html.twig +++ b/web/themes/joinup/templates/parts/footer.html.twig @@ -1,56 +1,12 @@ -<footer role="contentinfo" class="page__footer bg-primary"> - <div class="container text-light"> - <div class="row py-4 py-lg-5"> - <!--Joinup logo--> - <div class="col-md-12 col-lg-3 column-logo"> - <p class="joinup-logo"><a href="/" class="joinup-logo-white mb-3"><span class="visually-hidden">{{ 'Joinup'|t }}</span></a></p> - <p class="joinup-version"><a href="{{ version_url }}">{{ version }}</a></p> - </div> - - {{ page.footer }} - - <!--European Commission menu--> - <div class="col-md-3 col-lg-3 ec-menu"> - <h3>{{ 'European Commission'|t }}</h3> - <ul class="list-unstyled"> - <li><a href="https://ec.europa.eu/info/about-commissions-new-web-presence_en">{{ 'About the Commission\'s new web presence'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/resources-partners_en">{{ 'Resources for partners'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/cookies_en">{{ 'Cookies'|t }}</a></li> - <li><a href="{{ base_path }}joinup/legal-notice">{{ 'Legal notice'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/contact_en">{{ 'Contact'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/europa-analytics_en">{{ 'Europa Analytics' }}</a></li> - </ul> - </div> - - <!--Social menu--> - <div class="col-md-3 col-lg-2 social-media"> - <h3>{{ 'Follow us'|t }}</h3> - <ul class="list-unstyled mb-2"> - <li> - <a href="https://ec.europa.eu/newsroom/joinup/newsletter-specific-archive-issue.cfm?newsletter_service_id=877&lang=default">{{ 'Joinup Newsletter'|t }}</a> - </li> - </ul> - <ul class="list-inline social-networks"> - <li class="list-inline-item"> - <a href="https://twitter.com/joinup_eu" class="twitter"><span class="visually-hidden">{{ 'Twitter'|t }}</span></a> - </li> - <li class="list-inline-item"> - <a href="https://www.linkedin.com/groups/2600644/" class="linkedin"><span class="visually-hidden">{{ 'LinkedIn'|t }}</span></a> - </li> - </ul> - </div> - </div> - </div> -</footer> <footer class="section section--footer"> <div class="footer__first"> <div class="main-container"> <div class="row"> <div class="mdl-grid mdl-grid--center"> - <div class="mdl-cell mdl-cell--12-col"> + <div class="mdl-cell mdl-cell--8-col"> <div class="row"> <div class="mdl-grid"> - <div class="mdl-cell mdl-cell--3-col"> + <div class="mdl-cell mdl-cell--4-col"> <h3 class="footer__site-name"> <a href="{{ base_path }}" title="{{ 'Home'|t }}"> <img src="{{ base_path ~ directory }}/images/logo.svg" alt="{{ 'Home'|t }}"> @@ -58,19 +14,37 @@ </h3> <p class="footer__version"><a href="{{ version_url }}">{{ version }}</a></p> </div> - {{ page.footer }} - <div class="mdl-cell mdl-cell--3-col"> - <h3>{{ 'European Commission'|t }}</h3> - <ul class="list-unstyled"> - <li><a href="https://ec.europa.eu/info/about-commissions-new-web-presence_en">{{ 'About the Commission\'s new web presence'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/resources-partners_en">{{ 'Resources for partners'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/cookies_en">{{ 'Cookies'|t }}</a></li> - <li><a href="{{ base_path }}joinup/legal-notice">{{ 'Legal notice'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/contact_en">{{ 'Contact'|t }}</a></li> - <li><a href="https://ec.europa.eu/info/europa-analytics_en">{{ 'Europa Analytics' }}</a></li> - </ul> + <div class="mdl-cell mdl-cell--4-col"> + + <div class="social-media"> + + <h3 class="social-media__label">{{ 'Follow us'|t }}:</h3> + + + <ul class="social-media__menu"> + <li class="social-media__item"> + <a href="https://www.linkedin.com/groups/2600644/" class="social-media__link" target="_blank"> + <span class="icon icon--linkedin"></span> + <span class="text">{{ 'LinkedIn'|t }}</span> + </a> + </li> + <li class="social-media__item"> + <a href="http://twitter.com/Joinup_eu" class="social-media__link" target="_blank"> + <span class="icon icon--twitter"></span> + <span class="text">{{ 'Twitter'|t }}</span> + </a> + </li> + <li class="social-media__item"> + <a href="https://ec.europa.eu/newsroom/joinup/newsletter-archives/view/service/877" class="social-media__link" target="_blank"> + <span class="icon icon--footer-newsletter"></span> + <span class="text">{{ 'Joinup Newsletter'|t }}</span> + </a> + </li> + </ul> + + </div> </div> - <div class="mdl-cell mdl-cell--3-col"> + <div class="mdl-cell mdl-cell--4-col"> {{ page.footer }} </div> </div> @@ -80,4 +54,34 @@ </div> </div> </div> + <div class="footer__second"> + <div class="main-container"> + <div class="row"> + <div class="mdl-grid mdl-grid--center"> + <div class="mdl-cell mdl-cell--8-col"> + <ul class="ec-menu"> + <li class="ec-menu__item"> + <a href="http://ec.europa.eu/info/about-commissions-new-web-presence_en" class="ec-menu__link" target="_blank">{{ 'About the Commission\'s new web presence'|t }}</a> + </li> + <li class="ec-menu__item"> + <a href="http://ec.europa.eu/info/resources-partners_en" class="ec-menu__link" target="_blank">{{ 'Resources for partners'|t }}</a> + </li> + <li class="ec-menu__item"> + <a href="http://ec.europa.eu/info/cookies_en" class="ec-menu__link" target="_blank">{{ 'Cookies'|t }}</a> + </li> + <li class="ec-menu__item"> + <a href="{{ base_path }}joinup/legal-notice" class="ec-menu__link" target="_blank">{{ 'Legal notice'|t }}</a> + </li> + <li class="ec-menu__item"> + <a href="http://ec.europa.eu/info/contact_en" class="ec-menu__link" target="_blank">{{ 'Contact'|t }}</a> + </li> + <li class="ec-menu__item"> + <a href="http://ec.europa.eu/info/europa-analytics_en" class="ec-menu__link" target="_blank">{{ 'Europa Analytics' }}</a> + </li> + </ul> + </div> + </div> + </div> + </div> + </div> </footer> diff --git a/web/themes/ventuno/package.json b/web/themes/ventuno/package.json index d8602dc253..6b9ea4d6fb 100755 --- a/web/themes/ventuno/package.json +++ b/web/themes/ventuno/package.json @@ -14,10 +14,10 @@ "postinstall": "npm run build" }, "devDependencies": { - "@openeuropa/bcl-bootstrap": "0.8.0", - "@openeuropa/bcl-builder": "0.8.0", - "@openeuropa/bcl-theme-default": "0.8.0", - "@openeuropa/bcl-theme-joinup": "0.8.0", + "@openeuropa/bcl-bootstrap": "0.10.0", + "@openeuropa/bcl-builder": "0.10.0", + "@openeuropa/bcl-theme-default": "0.10.0", + "@openeuropa/bcl-theme-joinup": "0.10.0", "cross-env": "7.0.3", "del-cli": "^4.0.1", "glob": "7.1.7", diff --git a/web/themes/ventuno/src/fonts/joinup-icons/config.json b/web/themes/ventuno/src/fonts/joinup-icons/config.json index 9db3b43c14..36d22f7952 100644 --- a/web/themes/ventuno/src/fonts/joinup-icons/config.json +++ b/web/themes/ventuno/src/fonts/joinup-icons/config.json @@ -95,6 +95,62 @@ "css": "attention", "code": 59408, "src": "fontawesome" + }, + { + "uid": "e6cde6fa411efc000a5e8ab95488f5db", + "css": "first", + "code": 59400, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M671.7 861.7C661.9 861.7 652.2 858 644.7 850.6L330.6 536.4C315.7 521.5 315.7 497.4 330.6 482.6L644.7 168.5C659.6 153.6 683.7 153.6 698.6 168.5 713.4 183.3 713.4 207.4 698.6 222.3L411.4 509.5 698.6 796.7C713.4 811.6 713.4 835.7 698.6 850.6 691.1 858 681.4 861.7 671.7 861.7ZM214.9 821.4V197.5C214.9 175.3 193.1 157.3 166.1 157.3S117.2 175.3 117.2 197.5V821.4C117.2 843.7 139.1 861.7 166.1 861.7S214.9 843.7 214.9 821.4Z", + "width": 827 + }, + "search": [ + "first" + ] + }, + { + "uid": "bc050611da89ad199ada1a2f5075ae19", + "css": "last", + "code": 59401, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M155.3 157.3C165 157.3 174.7 161 182.2 168.4L496.3 482.6C511.2 497.4 511.2 521.5 496.3 536.4L182.2 850.5C167.3 865.4 143.2 865.4 128.3 850.5 113.5 835.7 113.5 811.6 128.3 796.7L415.6 509.5 128.3 222.3C113.5 207.4 113.5 183.3 128.3 168.4 135.8 161 145.5 157.3 155.3 157.3ZM612 197.5V821.4C612 843.7 633.9 861.7 660.9 861.7S709.7 843.7 709.7 821.4V197.5C709.7 175.3 687.9 157.3 660.9 157.3S612 175.3 612 197.5Z", + "width": 827 + }, + "search": [ + "last" + ] + }, + { + "uid": "0d0d3a3797e2d9bca78f3c95c47286bc", + "css": "next", + "code": 59409, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M255.9 157.3C265.6 157.3 275.4 161 282.8 168.4L596.9 482.6C611.8 497.4 611.8 521.5 596.9 536.4L282.8 850.5C267.9 865.4 243.9 865.4 229 850.5 214.1 835.7 214.1 811.6 229 796.7L516.2 509.5 229 222.3C214.1 207.4 214.1 183.3 229 168.4 236.4 161 246.1 157.3 255.9 157.3Z", + "width": 827 + }, + "search": [ + "next" + ] + }, + { + "uid": "dba990e552795e1c5ad2a588897f9ba6", + "css": "prev", + "code": 59410, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M570.1 861.7C560.3 861.7 550.6 857.9 543.1 850.5L229 536.4C214.2 521.5 214.2 497.4 229 482.5L543.1 168.4C558 153.5 582.1 153.5 597 168.4 611.9 183.3 611.9 207.4 597 222.2L309.8 509.5 597 796.6C611.9 811.5 611.9 835.6 597 850.5 589.5 857.9 579.8 861.7 570.1 861.7Z", + "width": 827 + }, + "search": [ + "prev" + ] } ] } \ No newline at end of file diff --git a/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff b/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff index 5aec4a98cb..db8747f00d 100644 Binary files a/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff and b/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff differ diff --git a/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff2 b/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff2 index dd40b0376d..80a4e57708 100644 Binary files a/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff2 and b/web/themes/ventuno/src/fonts/joinup-icons/joinup-icons.woff2 differ diff --git a/web/themes/ventuno/src/scss/components/_pagination.scss b/web/themes/ventuno/src/scss/components/_pagination.scss new file mode 100644 index 0000000000..713a194aeb --- /dev/null +++ b/web/themes/ventuno/src/scss/components/_pagination.scss @@ -0,0 +1,38 @@ +// Pagination +.pagination { + .page-item { + height: 3rem; + } + .page-link { + padding: 0.375rem 0.55rem; + } + .pager__item--first, + .pager__item--previous, + .pager__item--last, + .pager__item--next { + a { + color: $link-color; + width: 1.2rem; + height: 2rem; + @include icon-only(); + } + } + + .pager__item--first a { + @include font-icon-before("\E808", inherit, inherit, inherit, -1px 0 0 0); + } + .pager__item--previous { + padding-right: 10px; + a { + @include font-icon-before("\E812", inherit, inherit, inherit, -1px 8px 0 0); + } + } + + .pager__item--last a { + @include font-icon-before("\E809", inherit, inherit, inherit, -1px 0 0 0); + } + .pager__item--next a { + @include font-icon-before("\E811", inherit, inherit, inherit, -1px 0 0 0); + } + +} diff --git a/web/themes/ventuno/src/scss/main.scss b/web/themes/ventuno/src/scss/main.scss index 27d44f21ad..1c1987177c 100644 --- a/web/themes/ventuno/src/scss/main.scss +++ b/web/themes/ventuno/src/scss/main.scss @@ -11,3 +11,4 @@ // Components @import "components/navbar"; @import "components/footer"; +@import "components/pagination"; diff --git a/web/themes/ventuno/templates/content/node--search-result-featured.html.twig b/web/themes/ventuno/templates/content/node--search-result-featured.html.twig new file mode 100644 index 0000000000..45d74ab831 --- /dev/null +++ b/web/themes/ventuno/templates/content/node--search-result-featured.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% block content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: url, + }, + ], + 'content': label + }, + 'content': content, + 'image': image, + }) }} +{% endblock %} diff --git a/web/themes/ventuno/templates/content/node--search-result.html.twig b/web/themes/ventuno/templates/content/node--search-result.html.twig new file mode 100644 index 0000000000..9c243fab12 --- /dev/null +++ b/web/themes/ventuno/templates/content/node--search-result.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% block content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: url, + }, + ], + 'content': label + }, + 'content': content, + }) }} +{% endblock %} diff --git a/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result-featured.html.twig b/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result-featured.html.twig new file mode 100644 index 0000000000..2caf201c4e --- /dev/null +++ b/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result-featured.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override to display a rdf entities. + */ +#} +{% block content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: url, + }, + ], + 'content': label + }, + 'content': content, + 'image': image, + }) }} +{% endblock %} diff --git a/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result.html.twig b/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result.html.twig new file mode 100644 index 0000000000..bf53e9e01f --- /dev/null +++ b/web/themes/ventuno/templates/rdf-entity/rdf-entity--search-result.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override to display a rdf entities. + */ +#} +{% block content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: url, + }, + ], + 'content': label + }, + 'content': content, + }) }} +{% endblock %} diff --git a/web/themes/ventuno/templates/user/user--search-result-featured.html.twig b/web/themes/ventuno/templates/user/user--search-result-featured.html.twig new file mode 100644 index 0000000000..e6af97445e --- /dev/null +++ b/web/themes/ventuno/templates/user/user--search-result-featured.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Theme override to display a user search result featured. + */ +#} +{% if content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: path('entity.user.canonical', {'user': user.id}), + }, + ], + 'content': full_name + }, + 'content': content|without('field_user_photo'), + 'image': content.field_user_photo, + }) }} +{% endif %} diff --git a/web/themes/ventuno/templates/user/user--search-result.html.twig b/web/themes/ventuno/templates/user/user--search-result.html.twig new file mode 100644 index 0000000000..4e4a205912 --- /dev/null +++ b/web/themes/ventuno/templates/user/user--search-result.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override to display a user search result. + */ +#} +{% if content %} + {{ pattern('card', { + 'variants': 'horizontal', + 'title': { + attributes: [ + { + name: "href", + value: path('entity.user.canonical', {'user': user.id}), + }, + ], + 'content': full_name + }, + 'content': content, + }) }} +{% endif %} diff --git a/web/themes/ventuno/ventuno.theme b/web/themes/ventuno/ventuno.theme index 7a34b90e46..1e2578fd7f 100644 --- a/web/themes/ventuno/ventuno.theme +++ b/web/themes/ventuno/ventuno.theme @@ -226,3 +226,40 @@ function ventuno_smart_trim(string $string, int $length, bool $ellipsis = TRUE): $truncate = new TruncateHTML(); return $truncate->truncateChars($string, $length, $ellipsis ? '…' : ''); } + +/** + * Implements hook_theme_suggestions_alter(). + */ +function ventuno_theme_suggestions_alter(array &$suggestions, array $variables, $hook) { + // Add suggestion based on view mode for user entity. + if ($hook == 'user' && !empty($variables['elements']['#view_mode'])) { + $original_theme_hook = $variables['theme_hook_original']; + $view_mode = $variables['elements']['#view_mode']; + $suggestions[] = $original_theme_hook . '__' . str_replace('-', '_', $view_mode); + } +} + +/** + * Implements hook_preprocess_user(). + */ +function ventuno_preprocess_user(&$variables) { + $variables['full_name'] = $variables['user']->getDisplayName(); +} + +/** + * Implements hook_preprocess_HOOK(). + */ +function ventuno_preprocess_rdf_entity__search_result_featured(&$variables) { + /** @var \Drupal\rdf_entity\RdfInterface $entity */ + $entity = $variables['rdf_entity']; + $variables['image'] = $entity instanceof LogoInterface ? $entity->getLogoAsRenderArray() : NULL; +} + +/** + * Implements hook_preprocess_HOOK(). + */ +function ventuno_preprocess_node__search_result_featured(&$variables) { + /** @var \Drupal\node\NodeInterface $node */ + $node = $variables['node']; + $variables['image'] = $node instanceof LogoInterface ? $node->getLogoAsRenderArray() : NULL; +}