From 5cd60fc5879cd205baf1add293e80e8039c2309d Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 15 Apr 2019 20:39:20 +0300 Subject: [PATCH 001/957] Test deprecations. --- composer.json | 6 +- composer.lock | 1102 ++++++++++++++++++++++++++++++++++++++++++------- phpstan.neon | 12 + 3 files changed, 970 insertions(+), 150 deletions(-) create mode 100644 phpstan.neon diff --git a/composer.json b/composer.json index d03bbdcce6..a8f7b7bb78 100644 --- a/composer.json +++ b/composer.json @@ -82,6 +82,8 @@ "webmozart/path-util": "~2.3" }, "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", "behat/behat": "~3.4", "behat/gherkin": "^4.5.1", "behat/mink": "~1.7", @@ -98,14 +100,14 @@ "drupal/renderviz": "^1.0", "drupal/restui": "^1.16", "drupal/stage_file_proxy": "dev-1.x#6d9fd4bf3b13e92a0051b8e0d625889a6d74f66f", - "ext-dom": "*", - "ext-libxml": "*", "jcalderonzumba/gastonjs": "^1.1@dev", "jcalderonzumba/mink-phantomjs-driver": "^0.3.1", "lovers-of-behat/table-extension": "^1.2.0", + "mglaman/phpstan-drupal": "^0.11.4", "mikey179/vfsstream": "~1.2", "pear/http_request2": "~2.3", "pfrenssen/phpcs-pre-push": "1.1", + "phpstan/phpstan-deprecation-rules": "^0.11.0", "phpunit/phpunit": "~6.0", "symfony/css-selector": "~2.8" }, diff --git a/composer.lock b/composer.lock index 8c1aea1c74..d08e157861 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": "41218901e5897a4d6b985bafd959e112", + "content-hash": "2a3a276fb9584788fadda454ae90d512", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -2431,7 +2431,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -2579,14 +2579,6 @@ "GPL-2.0-or-later" ], "authors": [ - { - "name": "bircher", - "homepage": "https://www.drupal.org/user/1344166" - }, - { - "name": "gnuget", - "homepage": "https://www.drupal.org/user/992990" - }, { "name": "mlncn", "homepage": "https://www.drupal.org/user/64383" @@ -2699,8 +2691,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha6+2-dev", - "datestamp": "1513615684", + "version": "8.x-1.0-alpha7", + "datestamp": "1521314235", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" @@ -3756,7 +3748,7 @@ }, "drupal": { "version": "8.x-4.0-alpha3", - "datestamp": "1521598685", + "datestamp": "1521598850", "security-coverage": { "status": "not-covered", "message": "Alpha releases are not covered by Drupal security advisories." @@ -4589,7 +4581,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -4912,7 +4904,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5173,7 +5165,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5254,7 +5246,8 @@ } }, "patches_applied": { - "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://patch-diff.githubusercontent.com/raw/ec-europa/rdf_entity/pull/12.diff" + "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://patch-diff.githubusercontent.com/raw/ec-europa/rdf_entity/pull/12.diff", + "Allow access to the instantiated client object @see https://github.com/ec-europa/rdf_entity/pull/87": "https://patch-diff.githubusercontent.com/raw/ec-europa/rdf_entity/pull/87.diff" } }, "autoload": { @@ -5618,7 +5611,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5830,7 +5823,7 @@ }, "drupal": { "version": "8.x-1.0-beta3", - "datestamp": "1542122580", + "datestamp": "1477868939", "security-coverage": { "status": "not-covered", "message": "Beta releases are not covered by Drupal security advisories." @@ -6116,7 +6109,7 @@ }, "drupal": { "version": "8.x-1.x", - "datestamp": "1493246342", + "datestamp": "1510132373", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -6184,7 +6177,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -7150,7 +7143,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-10-31T20:10:45+00:00" + "time": "2018-05-01T01:48:25+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -10342,7 +10335,7 @@ }, { "name": "Gert de Pagter", - "email": "backendtea@gmail.com" + "email": "BackEndTea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", @@ -12218,7 +12211,7 @@ "version": "1.26.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/admin_toolbar.git", + "url": "https://git.drupal.org/project/admin_toolbar", "reference": "8.x-1.26" }, "dist": { @@ -12336,7 +12329,7 @@ "version": "1.2.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/config_devel.git", + "url": "https://git.drupal.org/project/config_devel", "reference": "8.x-1.2" }, "dist": { @@ -12407,7 +12400,7 @@ "version": "1.0.0-beta2", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/config_inspector.git", + "url": "https://git.drupal.org/project/config_inspector", "reference": "8.x-1.0-beta2" }, "dist": { @@ -12468,7 +12461,7 @@ "version": "1.0.0-alpha7", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/default_content.git", + "url": "https://git.drupal.org/project/default_content", "reference": "8.x-1.0-alpha7" }, "dist": { @@ -12526,10 +12519,6 @@ { "name": "larowlan", "homepage": "https://www.drupal.org/user/395439" - }, - { - "name": "matslats", - "homepage": "https://www.drupal.org/user/140053" } ], "description": "Imports default content when a module is enabled", @@ -12615,7 +12604,8 @@ "source": "http://cgit.drupalcode.org/devel", "issues": "http://drupal.org/project/devel", "irc": "irc://irc.freenode.org/drupal-contribute" - } + }, + "time": "2019-04-08T05:35:51+00:00" }, { "name": "drupal/drupal-driver", @@ -12813,14 +12803,15 @@ "support": { "source": "https://cgit.drupalcode.org/filecache", "issues": "https://drupal.org/project/issues/filecache" - } + }, + "time": "2018-12-03T07:38:12+00:00" }, { "name": "drupal/renderviz", "version": "1.0.0-alpha1", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/renderviz.git", + "url": "https://git.drupal.org/project/renderviz", "reference": "8.x-1.0-alpha1" }, "dist": { @@ -12882,7 +12873,7 @@ "version": "1.16.0", "source": { "type": "git", - "url": "https://git.drupalcode.org/project/restui.git", + "url": "https://git.drupal.org/project/restui", "reference": "8.x-1.16" }, "dist": { @@ -13235,6 +13226,57 @@ ], "time": "2016-12-01T10:57:30+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "1.2", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.2.0", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A wrapper for ocramius/package-versions to get pretty versions strings", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "time": "2018-06-13T13:22:40+00:00" + }, { "name": "lovers-of-behat/table-extension", "version": "1.2.0", @@ -13281,6 +13323,81 @@ "description": "Behat extension to inspect HTML tables", "time": "2018-10-08T08:43:00+00:00" }, + { + "name": "mglaman/phpstan-drupal", + "version": "0.11.4", + "source": { + "type": "git", + "url": "https://github.com/mglaman/phpstan-drupal.git", + "reference": "bf4a26fe856a61fe2cbfc191aada702ef0cecac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/bf4a26fe856a61fe2cbfc191aada702ef0cecac3", + "reference": "bf4a26fe856a61fe2cbfc191aada702ef0cecac3", + "shasum": "" + }, + "require": { + "php": "^7.1", + "phpstan/phpstan": "^0.11", + "symfony/yaml": "~3.4.5|^4.2", + "webflo/drupal-finder": "^1.1" + }, + "conflict": { + "nette/di": ">=3.0" + }, + "require-dev": { + "composer/installers": "^1.6", + "drupal/core": "^8.6", + "phpstan/phpstan-deprecation-rules": "^0.11.0", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.5", + "squizlabs/php_codesniffer": "^3.3" + }, + "suggest": { + "phpstan/phpstan-deprecation-rules": "For catching deprecations, especially in Drupal core." + }, + "type": "library", + "extra": { + "installer-paths": { + "tests/fixtures/drupal/core": [ + "type:drupal-core" + ], + "tests/fixtures/drupal/libraries/{$name}": [ + "type:drupal-library" + ], + "tests/fixtures/drupal/modules/contrib/{$name}": [ + "type:drupal-module" + ], + "tests/fixtures/drupal/profiles/contrib/{$name}": [ + "type:drupal-profile" + ], + "tests/fixtures/drupal/themes/contrib/{$name}": [ + "type:drupal-theme" + ] + }, + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Glaman", + "email": "nmd.matt@gmail.com" + } + ], + "description": "Drupal extension and rules for PHPStan", + "time": "2019-04-08T14:26:27+00:00" + }, { "name": "mikey179/vfsStream", "version": "v1.6.6", @@ -13376,162 +13493,179 @@ "time": "2018-06-11T23:09:50+00:00" }, { - "name": "pear/http_request2", - "version": "v2.3.0", + "name": "nette/bootstrap", + "version": "v2.4.6", "source": { "type": "git", - "url": "https://github.com/pear/HTTP_Request2.git", - "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4" + "url": "https://github.com/nette/bootstrap.git", + "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/HTTP_Request2/zipball/3599cf0fe455a4e281da464f6510bfc5c2ce54c4", - "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4", + "url": "https://api.github.com/repos/nette/bootstrap/zipball/268816e3f1bb7426c3a4ceec2bd38a036b532543", + "reference": "268816e3f1bb7426c3a4ceec2bd38a036b532543", "shasum": "" }, "require": { - "pear/net_url2": "^2.2.0", - "pear/pear_exception": "^1.0.0", - "php": ">=5.2.0" + "nette/di": "~2.4.7", + "nette/utils": "~2.4", + "php": ">=5.6.0" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "latte/latte": "~2.2", + "nette/application": "~2.3", + "nette/caching": "~2.3", + "nette/database": "~2.3", + "nette/forms": "~2.3", + "nette/http": "~2.4.0", + "nette/mail": "~2.3", + "nette/robot-loader": "^2.4.2 || ^3.0", + "nette/safe-stream": "~2.2", + "nette/security": "~2.3", + "nette/tester": "~2.0", + "tracy/tracy": "^2.4.1" }, "suggest": { - "ext-fileinfo": "Adds support for looking up mime-types using finfo.", - "ext-zlib": "Allows handling gzip compressed responses.", - "lib-curl": "Allows using cURL as a request backend.", - "lib-openssl": "Allows handling SSL requests when not using cURL." + "nette/robot-loader": "to use Configurator::createRobotLoader()", + "tracy/tracy": "to use Configurator::enableTracy()" }, "type": "library", "extra": { "branch-alias": { - "dev-trunk": "2.2-dev" + "dev-master": "2.4-dev" } }, "autoload": { - "psr-0": { - "HTTP_Request2": "" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "./" - ], "license": [ - "BSD-3-Clause" + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" ], "authors": [ { - "name": "Alexey Borzov", - "email": "avb@php.net" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Provides an easy way to perform HTTP requests.", - "homepage": "http://pear.php.net/package/HTTP_Request2", + "description": "? Nette Bootstrap: the simple way to configure and bootstrap your Nette application.", + "homepage": "https://nette.org", "keywords": [ - "PEAR", - "curl", - "http", - "request" + "bootstrapping", + "configurator", + "nette" ], - "time": "2016-02-13T20:20:39+00:00" + "time": "2018-05-17T12:52:20+00:00" }, { - "name": "pear/net_url2", - "version": "v2.2.2", + "name": "nette/di", + "version": "v2.4.15", "source": { "type": "git", - "url": "https://github.com/pear/Net_URL2.git", - "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d" + "url": "https://github.com/nette/di.git", + "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Net_URL2/zipball/07fd055820dbf466ee3990abe96d0e40a8791f9d", - "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d", + "url": "https://api.github.com/repos/nette/di/zipball/d0561b8f77e8ef2ed6d83328860e16c81a5a8649", + "reference": "d0561b8f77e8ef2ed6d83328860e16c81a5a8649", "shasum": "" }, "require": { - "php": ">=5.1.4" + "ext-tokenizer": "*", + "nette/neon": "^2.3.3 || ~3.0.0", + "nette/php-generator": "^2.6.1 || ^3.0.0", + "nette/utils": "^2.5.0 || ~3.0.0", + "php": ">=5.6.0" + }, + "conflict": { + "nette/bootstrap": "<2.4", + "nette/nette": "<2.2" }, "require-dev": { - "phpunit/phpunit": ">=3.3.0" + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "2.4-dev" } }, "autoload": { "classmap": [ - "Net/URL2.php" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "./" - ], "license": [ - "BSD-3-Clause" + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" ], "authors": [ { - "name": "David Coallier", - "email": "davidc@php.net" - }, - { - "name": "Tom Klingenberg", - "email": "tkli@php.net" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Christian Schmidt", - "email": "chmidt@php.net" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.", - "homepage": "https://github.com/pear/Net_URL2", + "description": "? Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.", + "homepage": "https://nette.org", "keywords": [ - "PEAR", - "net", - "networking", - "rfc3986", - "uri", - "url" + "compiled", + "di", + "dic", + "factory", + "ioc", + "nette", + "static" ], - "time": "2017-08-25T06:16:11+00:00" - }, - { - "name": "pfrenssen/phpcs-pre-push", - "version": "1.1", - "source": { - "type": "git", - "url": "https://gist.github.com/1ec87c25930861654cc94251da69f14b.git", - "reference": "master" - }, - "type": "git-hook" + "time": "2019-01-30T13:26:05+00:00" }, { - "name": "phar-io/manifest", - "version": "1.0.1", + "name": "nette/finder", + "version": "v2.5.0", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "url": "https://github.com/nette/finder.git", + "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/nette/finder/zipball/6be1b83ea68ac558aff189d640abe242e0306fe2", + "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" + "nette/utils": "^2.4 || ~3.0.0", + "php": ">=7.1" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -13541,46 +13675,59 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "name": "Nette Community", + "homepage": "https://nette.org/contributors" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "description": "? Nette Finder: find files and directories with an intuitive API.", + "homepage": "https://nette.org", + "keywords": [ + "filesystem", + "glob", + "iterator", + "nette" + ], + "time": "2019-02-28T18:13:25+00:00" }, { - "name": "phar-io/version", - "version": "1.0.1", + "name": "nette/neon", + "version": "v3.0.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "url": "https://github.com/nette/neon.git", + "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/nette/neon/zipball/cbff32059cbdd8720deccf9e9eace6ee516f02eb", + "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "ext-iconv": "*", + "ext-json": "*", + "php": ">=7.0" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -13588,21 +13735,515 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" + "name": "David Grudl", + "homepage": "https://davidgrudl.com" }, { - "name": "Sebastian Bergmann", + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette NEON: encodes and decodes NEON file format.", + "homepage": "http://ne-on.org", + "keywords": [ + "export", + "import", + "neon", + "nette", + "yaml" + ], + "time": "2019-02-05T21:30:40+00:00" + }, + { + "name": "nette/php-generator", + "version": "v3.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "acff8b136fad84b860a626d133e791f95781f9f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/php-generator/zipball/acff8b136fad84b860a626d133e791f95781f9f5", + "reference": "acff8b136fad84b860a626d133e791f95781f9f5", + "shasum": "" + }, + "require": { + "nette/utils": "^2.4.2 || ~3.0.0", + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "time": "2019-03-15T03:41:13+00:00" + }, + { + "name": "nette/robot-loader", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/nette/robot-loader.git", + "reference": "3e8d75d6d976e191bdf46752ca40a286671219d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/robot-loader/zipball/3e8d75d6d976e191bdf46752ca40a286671219d2", + "reference": "3e8d75d6d976e191bdf46752ca40a286671219d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "nette/finder": "^2.3 || ^3.0", + "nette/utils": "^2.4 || ^3.0", + "php": ">=5.6.0" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "nette/tester": "^2.0", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", + "homepage": "https://nette.org", + "keywords": [ + "autoload", + "class", + "interface", + "nette", + "trait" + ], + "time": "2019-03-01T20:23:02+00:00" + }, + { + "name": "nette/utils", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/17b9f76f2abd0c943adfb556e56f2165460b15ce", + "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "nette/tester": "~2.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize() and toAscii()", + "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ], + "files": [ + "src/loader.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0", + "GPL-3.0" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "? Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "time": "2018-09-18T10:22:16+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/a4d4b60d0e60da2487bd21a2c6ac089f85570dbb", + "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0", + "php": "^7.1.0" + }, + "require-dev": { + "composer/composer": "^1.6.3", + "doctrine/coding-standard": "^5.0.1", + "ext-zip": "*", + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.0.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "time": "2019-02-21T12:16:21+00:00" + }, + { + "name": "pear/http_request2", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/pear/HTTP_Request2.git", + "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/HTTP_Request2/zipball/3599cf0fe455a4e281da464f6510bfc5c2ce54c4", + "reference": "3599cf0fe455a4e281da464f6510bfc5c2ce54c4", + "shasum": "" + }, + "require": { + "pear/net_url2": "^2.2.0", + "pear/pear_exception": "^1.0.0", + "php": ">=5.2.0" + }, + "suggest": { + "ext-fileinfo": "Adds support for looking up mime-types using finfo.", + "ext-zlib": "Allows handling gzip compressed responses.", + "lib-curl": "Allows using cURL as a request backend.", + "lib-openssl": "Allows handling SSL requests when not using cURL." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-trunk": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "HTTP_Request2": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Alexey Borzov", + "email": "avb@php.net" + } + ], + "description": "Provides an easy way to perform HTTP requests.", + "homepage": "http://pear.php.net/package/HTTP_Request2", + "keywords": [ + "PEAR", + "curl", + "http", + "request" + ], + "time": "2016-02-13T20:20:39+00:00" + }, + { + "name": "pear/net_url2", + "version": "v2.2.2", + "source": { + "type": "git", + "url": "https://github.com/pear/Net_URL2.git", + "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Net_URL2/zipball/07fd055820dbf466ee3990abe96d0e40a8791f9d", + "reference": "07fd055820dbf466ee3990abe96d0e40a8791f9d", + "shasum": "" + }, + "require": { + "php": ">=5.1.4" + }, + "require-dev": { + "phpunit/phpunit": ">=3.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "Net/URL2.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "David Coallier", + "email": "davidc@php.net" + }, + { + "name": "Tom Klingenberg", + "email": "tkli@php.net" + }, + { + "name": "Christian Schmidt", + "email": "chmidt@php.net" + } + ], + "description": "Class for parsing and handling URL. Provides parsing of URLs into their constituent parts (scheme, host, path etc.), URL generation, and resolving of relative URLs.", + "homepage": "https://github.com/pear/Net_URL2", + "keywords": [ + "PEAR", + "net", + "networking", + "rfc3986", + "uri", + "url" + ], + "time": "2017-08-25T06:16:11+00:00" + }, + { + "name": "pfrenssen/phpcs-pre-push", + "version": "1.1", + "source": { + "type": "git", + "url": "https://gist.github.com/1ec87c25930861654cc94251da69f14b.git", + "reference": "master" + }, + "type": "git-hook" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } @@ -13825,6 +14466,171 @@ ], "time": "2018-08-05T17:53:17+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "0.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "2cc49f47c69b023eaf05b48e6529389893b13d74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/2cc49f47c69b023eaf05b48e6529389893b13d74", + "reference": "2cc49f47c69b023eaf05b48e6529389893b13d74", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "require-dev": { + "consistence/coding-standard": "^2.0.0", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "phing/phing": "^2.16.0", + "phpstan/phpstan": "^0.10", + "phpunit/phpunit": "^6.3", + "slevomat/coding-standard": "^3.3.0", + "symfony/process": "^3.4 || ^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.3-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "time": "2019-01-14T12:26:23+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.11.5", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "24ce5a566a798b81343138ed5d41d6877554cf9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/24ce5a566a798b81343138ed5d41d6877554cf9a", + "reference": "24ce5a566a798b81343138ed5d41d6877554cf9a", + "shasum": "" + }, + "require": { + "composer/xdebug-handler": "^1.3.0", + "jean85/pretty-package-versions": "^1.0.3", + "nette/bootstrap": "^2.4 || ^3.0", + "nette/di": "^2.4.7 || ^3.0", + "nette/robot-loader": "^3.0.1", + "nette/utils": "^2.4.5 || ^3.0", + "nikic/php-parser": "^4.0.2", + "php": "~7.1", + "phpstan/phpdoc-parser": "^0.3", + "symfony/console": "~3.2 || ~4.0", + "symfony/finder": "~3.2 || ~4.0" + }, + "conflict": { + "symfony/console": "3.4.16 || 4.1.5" + }, + "require-dev": { + "brianium/paratest": "^2.0", + "consistence/coding-standard": "^3.5", + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", + "ext-intl": "*", + "ext-mysqli": "*", + "ext-soap": "*", + "ext-zip": "*", + "jakub-onderka/php-parallel-lint": "^1.0", + "localheinz/composer-normalize": "^1.1.0", + "phing/phing": "^2.16.0", + "phpstan/phpstan-deprecation-rules": "^0.11", + "phpstan/phpstan-php-parser": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0", + "slevomat/coding-standard": "^4.7.2", + "squizlabs/php_codesniffer": "^3.3.2" + }, + "bin": [ + "bin/phpstan" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.11-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": [ + "src/", + "build/PHPStan" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "time": "2019-03-25T16:40:09+00:00" + }, + { + "name": "phpstan/phpstan-deprecation-rules", + "version": "0.11", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", + "reference": "449fee6223220b337760abca4444801ddcc8b38d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/449fee6223220b337760abca4444801ddcc8b38d", + "reference": "449fee6223220b337760abca4444801ddcc8b38d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.0", + "php": "~7.1", + "phpstan/phpstan": "^0.11" + }, + "require-dev": { + "consistence/coding-standard": "^3.0.1", + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", + "jakub-onderka/php-parallel-lint": "^1.0", + "phing/phing": "^2.16.0", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.0", + "slevomat/coding-standard": "^4.5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.11-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", + "time": "2018-12-05T18:04:16+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "5.3.2", diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000000..021caa830a --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,12 @@ +parameters: + customRulesetUsed: true + reportUnmatchedIgnoredErrors: false + # Ignore phpstan-drupal extension's rules. + ignoreErrors: + - '#\Drupal calls should be avoided in classes, use dependency injection instead#' + - '#Plugin definitions cannot be altered.#' + - '#Missing cache backend declaration for performance.#' + - '#Plugin manager has cache backend specified but does not declare cache tags.#' +includes: + - vendor/mglaman/phpstan-drupal/extension.neon + - vendor/phpstan/phpstan-deprecation-rules/rules.neon From 7821e12e084a52946c65affd477d67a664251ae4 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 15 Apr 2019 21:12:36 +0300 Subject: [PATCH 002/957] Add a Phing target. --- build.project.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.project.xml b/build.project.xml index adaadcd322..c548f8c55d 100644 --- a/build.project.xml +++ b/build.project.xml @@ -546,4 +546,8 @@ description="Install the website and set up the development environment." depends="setup-virtuoso-permissions, purge-solr-backend, purge-virtuoso-backend, clean-redis-settings, disable-webtools-geocoding-cache, install, ensure-search-api-solr-site-hash, setup-redis, import-rdf-fixtures, setup-dev, configure-apache-solr-drupal, configure-matomo-drupal, create-demo-users, enable-webtools-geocoding-cache, setup-mocked-newsroom-newsletter-subscriber, set-custom-error-handlers" /> + + + + From bff60ba66281781be4393ae1f423a7128540592e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 15 Apr 2019 21:32:39 +0300 Subject: [PATCH 003/957] Add more options. --- build.project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.project.xml b/build.project.xml index c548f8c55d..10f01a1565 100644 --- a/build.project.xml +++ b/build.project.xml @@ -547,7 +547,7 @@ depends="setup-virtuoso-permissions, purge-solr-backend, purge-virtuoso-backend, clean-redis-settings, disable-webtools-geocoding-cache, install, ensure-search-api-solr-site-hash, setup-redis, import-rdf-fixtures, setup-dev, configure-apache-solr-drupal, configure-matomo-drupal, create-demo-users, enable-webtools-geocoding-cache, setup-mocked-newsroom-newsletter-subscriber, set-custom-error-handlers" /> - + From 513b4e0832cfe20a3e5cf56d1fc0d4ca35e6c819 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 15 Apr 2019 22:01:40 +0300 Subject: [PATCH 004/957] Rename the Phing target. --- build.project.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.project.xml b/build.project.xml index 10f01a1565..a994729d9b 100644 --- a/build.project.xml +++ b/build.project.xml @@ -546,8 +546,8 @@ description="Install the website and set up the development environment." depends="setup-virtuoso-permissions, purge-solr-backend, purge-virtuoso-backend, clean-redis-settings, disable-webtools-geocoding-cache, install, ensure-search-api-solr-site-hash, setup-redis, import-rdf-fixtures, setup-dev, configure-apache-solr-drupal, configure-matomo-drupal, create-demo-users, enable-webtools-geocoding-cache, setup-mocked-newsroom-newsletter-subscriber, set-custom-error-handlers" /> - - + + From a3812cd0740a756a2f639af41858d53b1860e761 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 15 Apr 2019 23:00:14 +0300 Subject: [PATCH 005/957] Fix all class autoloading issues. --- composer.json | 30 ++++++++++++++++++- .../tests/src/Kernel/CustomTokensTest.php | 2 ++ .../Condition/RequestRouteConditionTest.php | 2 +- .../Plugin/migrate/destination/Mapping.php | 3 +- .../Plugin/migrate/destination/Prepare.php | 3 +- .../OgCommentEventSubscriber.php | 2 +- .../src/Kernel/UniqueAssociatedWithTest.php | 3 +- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index a8f7b7bb78..3a40425eb0 100644 --- a/composer.json +++ b/composer.json @@ -132,7 +132,35 @@ "scripts/composer/ScriptHandler.php", "scripts/composer/RemoveWrongPatchedObjects.php", "web/modules/custom/joinup_sparql/driver/joinup_sparql/Connection.php", - "web/modules/custom/error_page/src/ErrorPageErrorHandler.php" + "web/modules/custom/adms_validator/adms_validator.behat.inc", + "web/modules/custom/asset_distribution/asset_distribution.behat.inc", + "web/modules/custom/asset_release/asset_release.behat.inc", + "web/modules/custom/collection/collection.behat.inc", + "web/modules/custom/contact_form/contact_form.behat.inc", + "web/modules/custom/contact_information/contact_information.behat.inc", + "web/modules/custom/custom_page/custom_page.behat.inc", + "web/modules/custom/error_page/src/ErrorPageErrorHandler.php", + "web/modules/custom/joinup_communities/tallinn/tallinn.behat.inc", + "web/modules/custom/joinup_community_content/joinup_community_content.behat.inc", + "web/modules/custom/joinup_core/joinup_core.behat.inc", + "web/modules/custom/joinup_discussion/joinup_discussion.behat.inc", + "web/modules/custom/joinup_document/joinup_document.behat.inc", + "web/modules/custom/joinup_event/joinup_event.behat.inc", + "web/modules/custom/joinup_invite/joinup_invite.behat.inc", + "web/modules/custom/joinup_licence/joinup_licence.behat.inc", + "web/modules/custom/joinup_news/joinup_news.behat.inc", + "web/modules/custom/joinup_newsletter/joinup_newsletter.behat.inc", + "web/modules/custom/joinup_notification/joinup_notification.behat.inc", + "web/modules/custom/joinup_search/joinup_search.behat.inc", + "web/modules/custom/joinup_subscription/joinup_subscription.behat.inc", + "web/modules/custom/joinup_user/joinup_user.behat.inc", + "web/modules/custom/moderation/moderation.behat.inc", + "web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc", + "web/modules/custom/owner/owner.behat.inc", + "web/modules/custom/pipeline/pipeline.behat.inc", + "web/modules/custom/rdf_entity_provenance/rdf_entity_provenance.behat.inc", + "web/modules/custom/solution/solution.behat.inc", + "web/profiles/joinup/joinup.behat.inc" ] }, "scripts": { diff --git a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php index c955c0401a..87e41987f8 100644 --- a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php +++ b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php @@ -1,5 +1,7 @@ Date: Thu, 29 Aug 2019 23:03:56 +0300 Subject: [PATCH 006/957] ISAICP-5403: Include simple_sitemap in the project. --- composer.json | 1 + composer.lock | 93 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 588ed4abde..4d9c5e9cc3 100644 --- a/composer.json +++ b/composer.json @@ -56,6 +56,7 @@ "drupal/redis": "^1.1", "drupal/search_api": "^1.11", "drupal/search_api_solr": "2.2", + "drupal/simple_sitemap": "^3.3", "drupal/simplenews": "^1.0-beta1", "drupal/smart_trim": "^1.0", "drupal/social_media_links": "^2.5", diff --git a/composer.lock b/composer.lock index f60ba22b7a..0686149bb0 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": "41d391c44c820316abd06b61f634686e", + "content-hash": "6334c1aba6e0f53aa9633f5999922469", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -2438,7 +2438,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -2633,14 +2633,6 @@ "GPL-2.0-or-later" ], "authors": [ - { - "name": "bircher", - "homepage": "https://www.drupal.org/user/1344166" - }, - { - "name": "gnuget", - "homepage": "https://www.drupal.org/user/992990" - }, { "name": "mlncn", "homepage": "https://www.drupal.org/user/64383" @@ -2753,8 +2745,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha6+2-dev", - "datestamp": "1513615684", + "version": "8.x-1.0-alpha7", + "datestamp": "1521314235", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" @@ -3690,7 +3682,7 @@ }, "drupal": { "version": "8.x-1.3", - "datestamp": "1551291083", + "datestamp": "1556645881", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -3884,7 +3876,7 @@ }, "drupal": { "version": "8.x-4.0-alpha3", - "datestamp": "1521598685", + "datestamp": "1521598850", "security-coverage": { "status": "not-covered", "message": "Alpha releases are not covered by Drupal security advisories." @@ -4733,7 +4725,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5448,7 +5440,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5854,6 +5846,67 @@ "irc": "irc://irc.freenode.org/drupal-search-api" } }, + { + "name": "drupal/simple_sitemap", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/simple_sitemap.git", + "reference": "8.x-3.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/simple_sitemap-8.x-3.3.zip", + "reference": "8.x-3.3", + "shasum": "690605c75cc75bc088d0506505c71d78f7d46c8c" + }, + "require": { + "drupal/core": "~8.0", + "ext-xmlwriter": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev" + }, + "drupal": { + "version": "8.x-3.3", + "datestamp": "1563488885", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + }, + "drush": { + "services": { + "drush.services.yml": "^9" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Pawel Ginalski (gbyte.co)", + "homepage": "https://www.drupal.org/u/gbyte.co", + "email": "contact@gbyte.co", + "role": "Maintainer" + }, + { + "name": "gbyte.co", + "homepage": "https://www.drupal.org/user/2381352" + } + ], + "description": "Creates a standard conform hreflang XML sitemap of the site content and provides a framework for developing other sitemap types.", + "homepage": "https://drupal.org/project/simple_sitemap", + "support": { + "source": "https://cgit.drupalcode.org/simple_sitemap", + "issues": "https://drupal.org/project/issues/simple_sitemap", + "irc": "irc://irc.freenode.org/drupal-contribute" + } + }, { "name": "drupal/simplenews", "version": "1.0.0-beta1", @@ -6139,7 +6192,7 @@ }, "drupal": { "version": "8.x-1.0-beta3", - "datestamp": "1542122580", + "datestamp": "1477868939", "security-coverage": { "status": "not-covered", "message": "Beta releases are not covered by Drupal security advisories." @@ -6493,7 +6546,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -6657,7 +6710,7 @@ "description": "Plugin to export views data into various file formats.", "homepage": "https://www.drupal.org/project/views_data_export", "support": { - "source": "http://cgit.drupalcode.org/views_data_export" + "source": "https://git.drupalcode.org/project/views_data_export" } }, { @@ -9985,7 +10038,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-22T22:25:24+00:00" + "time": "2019-04-02T18:33:21+00:00" }, { "name": "stack/builder", From 2d2199063ef5a3e1b3216d419b7e6c4facdf3a74 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 29 Aug 2019 23:24:55 +0300 Subject: [PATCH 007/957] ISAICP-5403: Create a separate module to hold all information related to seo. --- web/modules/custom/joinup_core/joinup_core.info.yml | 1 + .../custom/joinup_core/joinup_core.post_update.php | 7 +++++++ web/modules/custom/joinup_seo/joinup_seo.info.yml | 8 ++++++++ 3 files changed, 16 insertions(+) create mode 100644 web/modules/custom/joinup_seo/joinup_seo.info.yml diff --git a/web/modules/custom/joinup_core/joinup_core.info.yml b/web/modules/custom/joinup_core/joinup_core.info.yml index 733d5ea664..9df1e48587 100644 --- a/web/modules/custom/joinup_core/joinup_core.info.yml +++ b/web/modules/custom/joinup_core/joinup_core.info.yml @@ -14,6 +14,7 @@ dependencies: - ds:ds - facets:facets - joinup:oe_newsroom_newsletter + - joinup:joinup_seo - matomo_reporting_api:matomo_reporting_api - menu_admin_per_menu:menu_admin_per_menu - message:message diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 76d5e08e7f..1c74548b6a 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -718,3 +718,10 @@ function joinup_core_post_update_0_fix_publication_dates() { ->expression('published_at', PUBLICATION_DATE_DEFAULT) ->execute(); } + +/** + * Enable the joinup_seo module. + */ +function joinup_core_post_update_install_joinup_seo() { + \Drupal::service('module_installer')->install(['joinup_seo']); +} diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml new file mode 100644 index 0000000000..ea49263dee --- /dev/null +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -0,0 +1,8 @@ +name: Joinup SEO +type: module +description: Contains specific functionality that helps visibility of the platform in search engines. +core: 8.x +package: Joinup + +dependencies: + - simple_sitemap:simple_sitemap From 3178bb72b6f4a54696243ca9dd3d0c4abcb67798 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 29 Aug 2019 23:25:47 +0300 Subject: [PATCH 008/957] ISAICP-5403: Fix the demo module not being installable anymore. Version is the name actually. --- .../legal_notice/legal_notice.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/web/modules/custom/demo_content/content/entity_legal_document_version/legal_notice/legal_notice.json b/web/modules/custom/demo_content/content/entity_legal_document_version/legal_notice/legal_notice.json index 61d017b190..9fb646c703 100644 --- a/web/modules/custom/demo_content/content/entity_legal_document_version/legal_notice/legal_notice.json +++ b/web/modules/custom/demo_content/content/entity_legal_document_version/legal_notice/legal_notice.json @@ -73,10 +73,5 @@ "summary": "", "lang": "en" } - ], - "version": [ - { - "value": "1.1" - } ] -} \ No newline at end of file +} From 0472197124f7e22e592301addf83ee013c27304a Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 30 Aug 2019 02:00:32 +0300 Subject: [PATCH 009/957] ISAICP-5403: Include configuration files for all entities that we are going to include in the sitemap. --- ...imple_sitemap.bundle_settings.default.node.custom_page.yml | 4 ++++ ...simple_sitemap.bundle_settings.default.node.discussion.yml | 4 ++++ .../simple_sitemap.bundle_settings.default.node.document.yml | 4 ++++ .../simple_sitemap.bundle_settings.default.node.event.yml | 4 ++++ .../simple_sitemap.bundle_settings.default.node.news.yml | 4 ++++ ...temap.bundle_settings.default.rdf_entity.asset_release.yml | 4 ++++ ..._sitemap.bundle_settings.default.rdf_entity.collection.yml | 4 ++++ ...le_sitemap.bundle_settings.default.rdf_entity.solution.yml | 4 ++++ 8 files changed, 32 insertions(+) create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.custom_page.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.discussion.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.document.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.event.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.news.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.custom_page.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.custom_page.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.custom_page.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.discussion.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.discussion.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.discussion.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.document.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.document.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.document.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.event.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.event.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.event.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.news.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.news.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.node.news.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml new file mode 100644 index 0000000000..6b348b41d3 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml @@ -0,0 +1,4 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false From 4351e4c50c1f584061aee4ad259dd4eeae4ebc6d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 30 Aug 2019 02:00:53 +0300 Subject: [PATCH 010/957] ISAICP-5403: Include a test for the sitemap. --- tests/features/joinup_seo/sitemap.feature | 87 +++++++++++++++++++++ web/profiles/joinup/joinup.behat.inc | 95 +++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 tests/features/joinup_seo/sitemap.feature diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature new file mode 100644 index 0000000000..ddcc336ecb --- /dev/null +++ b/tests/features/joinup_seo/sitemap.feature @@ -0,0 +1,87 @@ +@api +Feature: + As the owner of the site + In order to promote content to the search engines properly + I need to have the proper sitemaps available. + + Scenario: Basic sitemap link availability. + Given the following owner: + | name | type | + | Sitemap owner | Company | + And the following contact: + | name | Sitemap secreteriat | + | email | sitemap.secreteriat@example.com | + And the following collections: + | title | state | + | Sitemap collection draft | draft | + | Sitemap collection validated | validated | + And the following solutions: + | title | description | owner | contact information | collection | state | + | Sitemap solution draft | Sitemap keywords everywhere | Sitemap owner | Sitemap secreteriat | Sitemap collection validated | draft | + | Sitemap solution validated | Sitemap keywords everywhere | Sitemap owner | Sitemap secreteriat | Sitemap collection validated | validated | + And the following releases: + | title | release number | release notes | is version of | owner | contact information | state | + | Sitemap release 1 | 1 | New release | Sitemap solution validated | Sitemap owner | Sitemap secreteriat | validated | + | Sitemap release 2 | 2 | Newer release | Sitemap solution validated | Sitemap owner | Sitemap secreteriat | draft | + And the following distributions: + | title | description | parent | access url | + | Sitemap distribution | Some kind of download | Sitemap release 1 | test.zip | + And the following licences: + | title | description | + | Sitemap licence | Not allowed | + And "custom_page" content: + | title | collection | body | logo | + | Sitemap custom page of draft | Sitemap collection draft | N/A | logo.png | + | Sitemap custom page of validated | Sitemap collection validated | N/A | logo.png | + And news content: + | title | headline | body | solution | state | + | Sitemap news draft | Sitemap news | Sitemap news body | Sitemap solution validated | draft | + | Sitemap news validated | Sitemap news | Sitemap news body | Sitemap solution validated | validated | + | Sitemap news validated but parent is not | Sitemap news | Sitemap news body | Sitemap solution draft | validated | + And event content: + | title | short title | body | agenda | location | organisation | scope | solution | state | + | Sitemap event draft | Sitemap event draft | It will include fireworks | Event agenda. | Some place | European Commission | International | Sitemap solution validated | draft | + | Sitemap event validated | Sitemap event validated | It will include fireworks | Event agenda. | Some place | European Commission | International | Sitemap solution validated | validated | + | Sitemap event validated but parent is not | Sitemap event validated | It will include fireworks | Event agenda. | Some place | European Commission | International | Sitemap solution draft | validated | + And document content: + | title | document type | short title | body | solution | state | + | Sitemap document draft | Document | Sitemap document draft | Read more... | Sitemap solution validated | draft | + | Sitemap document validated | Document | Sitemap document validated | Read more... | Sitemap solution validated | validated | + | Sitemap document validated but parent is not | Document | Sitemap document validated | Read more... | Sitemap solution draft | validated | + And discussion content: + | title | body | solution | state | + | Sitemap discussion draft | Wanna discuss this??? | Sitemap solution validated | draft | + | Sitemap discussion validated | Wanna discuss this??? | Sitemap solution validated | validated | + | Sitemap discussion validated but parent is not | Wanna discuss this??? | Sitemap solution draft | validated | + + Given I run cron + And I visit "/sitemap.xml" + Then I should see the absolute urls of the following RDF entities: + | Sitemap collection validated | + | Sitemap solution validated | + | Sitemap release 1 | + And I should see the absolute urls of the following content entities: + | Sitemap custom page of validated | + | Sitemap discussion validated | + | Sitemap document validated | + | Sitemap event validated | + | Sitemap news validated | + + But I should not see the absolute urls of the following RDF entities: + | Sitemap collection draft | + | Sitemap solution draft | + | Sitemap release 2 | + | Sitemap distribution | + | Sitemap licence | + | Sitemap owner | + | Sitemap secreteriat | + And I should not see the absolute urls of the following content entities: + | Sitemap custom page of draft | + | Sitemap discussion draft | + | Sitemap discussion validated but parent is not | + | Sitemap document draft | + | Sitemap document validated but parent is not | + | Sitemap event draft | + | Sitemap event validated but parent is not | + | Sitemap news draft | + | Sitemap news validated but parent is not | diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 4bf7af8492..52fd809dec 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -2672,4 +2672,99 @@ JS; Assert::assertNotEmpty($element); } + /** + * Asserts that the content absolute urls exist as links. + * + * @param \Behat\Gherkin\Node\TableNode $titles + * The titles of the nodes. + * + * @throws \Exception + * Thrown if any link does not exist in the page. + * + * @Given I should see the absolute urls of the following content entities: + */ + public function assertContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void { + foreach ($titles->getRows() as $title) { + $this->assertEntityUrlInSitemap('node', $title[0]); + } + } + + /** + * Asserts that the rdf entity absolute urls exist as links. + * + * @param \Behat\Gherkin\Node\TableNode $titles + * The titles of the rdf entities. + * + * @throws \Exception + * Thrown if any link does not exist in the page. + * + * @Given I should see the absolute urls of the following RDF entities: + */ + public function assertRdfEntityAbsoluteUrlsAsLinkInPage(TableNode $titles): void { + foreach ($titles->getRows() as $title) { + $this->assertEntityUrlInSitemap('rdf_entity', $title[0]); + } + } + + /** + * Asserts that the content absolute urls do not exist as links. + * + * @param \Behat\Gherkin\Node\TableNode $titles + * The titles of the nodes. + * + * @throws \Exception + * Thrown if at least a link exists in the page. + * + * @Given I should not see the absolute urls of the following content entities: + */ + public function assertEmptyContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void { + foreach ($titles->getRows() as $title) { + $this->assertEntityUrlInSitemap('node', $title[0], FALSE); + } + } + + /** + * Asserts that the absolute url of an rdf entity exists as a link. + * + * @param \Behat\Gherkin\Node\TableNode $titles + * The titles of the rdf entities. + * + * @throws \Exception + * Thrown if the link does not exist in the page. + * + * @Given I should not see the absolute urls of the following RDF entities: + */ + public function assertEmptyRdfEntityAbsoluteUrlsAsLinkInPage(TableNode $titles): void { + foreach ($titles->getRows() as $title) { + $this->assertEntityUrlInSitemap('rdf_entity', $title[0], FALSE); + } + } + + /** + * Asserts a url in the sitemap response. + * + * @param string $entity_type_id + * The entity type id. + * @param string $entity_id + * The entity id. + * @param bool $exists + * (optional) Whether to assert that a link exists or not exists. Defaults + * to true. + * + * @throws \Exception + * Thrown if the link assertion is not the expected one. + */ + protected function assertEntityUrlInSitemap(string $entity_type_id, string $entity_id, $exists = TRUE): void { + $entity = $this->getEntityByLabel($entity_type_id, $entity_id); + $link_text = $entity->toUrl('canonical', ['absolute' => TRUE])->toString(); + $expected = '' . $link_text . ''; + $response = $this->getSession()->getPage()->getContent(); + if ($exists) { + Assert::assertContains($expected, $response); + } + else { + Assert::assertNotContains($expected, $response); + } + } + } From 78301c0fd745a86c3df5e6998f0d6c2b83f1e176 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 30 Aug 2019 02:21:09 +0300 Subject: [PATCH 011/957] ISAICP-5403: Include the settings for the simple sitemap module. --- .../config/install/simple_sitemap.settings.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml new file mode 100644 index 0000000000..6c6c93bbcb --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml @@ -0,0 +1,14 @@ +max_links: 2000 +cron_generate: true +cron_generate_interval: 0 +generate_duration: 20000 +remove_duplicates: true +skip_untranslated: true +xsl: false +base_url: '' +default_variant: default +custom_links_include_images: false +excluded_languages: { } +enabled_entity_types: + - node + - rdf_entity From 1352146bffa69b635b6d67160abc48529d1b84ea Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 30 Aug 2019 11:56:27 +0300 Subject: [PATCH 012/957] ISAICP-5403: Settings overrides that are initially provided by their respective modules should reside on the profile. --- .../joinup}/config/install/simple_sitemap.settings.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename web/{modules/custom/joinup_seo => profiles/joinup}/config/install/simple_sitemap.settings.yml (100%) diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml b/web/profiles/joinup/config/install/simple_sitemap.settings.yml similarity index 100% rename from web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml rename to web/profiles/joinup/config/install/simple_sitemap.settings.yml From 7ac7b77bfa8a487755cff688363bcc8e3760bc15 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 2 Sep 2019 20:21:24 +0300 Subject: [PATCH 013/957] ISAICP-5403: Fix the installation issue. The settings have to be moved to the profile. --- web/profiles/joinup/joinup.info.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/profiles/joinup/joinup.info.yml b/web/profiles/joinup/joinup.info.yml index 3550026ee1..86792ce4fd 100644 --- a/web/profiles/joinup/joinup.info.yml +++ b/web/profiles/joinup/joinup.info.yml @@ -248,6 +248,7 @@ config_devel: - pathauto.pattern.rdf_entities_releases - r4032login.settings - rest.resource.entity.rdf_entity + - simple_sitemap:simple_sitemap - sparql_entity_storage.graph.default - subpathauto.settings - swiftmailer.message From 0cb84c2e5866fea2f5b58e34e071779be50ef37d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 2 Sep 2019 23:18:27 +0300 Subject: [PATCH 014/957] ISAICP-5403: Include a patch to fix the empty id case in simple_sitemap. --- composer.json | 3 +++ composer.lock | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 4a764d070e..c69a0a2f35 100644 --- a/composer.json +++ b/composer.json @@ -246,6 +246,9 @@ "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch" }, + "drupal/simple_sitemap": { + "Error with new entities with IDs. @see https://www.drupal.org/project/simple_sitemap/issues/3066138": "https://www.drupal.org/files/issues/2019-09-02/3066138_D8_11.patch" + }, "drupal/smart_trim": { "Additional options checkbox do not appear to save @see https://www.drupal.org/project/smart_trim/issues/2941492": "https://www.drupal.org/files/issues/2018-05-04/2941492-4.patch" }, diff --git a/composer.lock b/composer.lock index de9ca3d069..79269963fc 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": "a47a9e0253f3fb75fdcfd3459f30089f", + "content-hash": "3f2f0f34ec821cb4aecc4425f0356526", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -5784,6 +5784,9 @@ "services": { "drush.services.yml": "^9" } + }, + "patches_applied": { + "Error with new entities with IDs. @see https://www.drupal.org/project/simple_sitemap/issues/3066138": "https://www.drupal.org/files/issues/2019-09-02/3066138_D8_11.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -7436,7 +7439,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-10-31T20:10:45+00:00" + "time": "2018-05-01T01:48:25+00:00" }, { "name": "jakub-onderka/php-console-color", From a6ee8afceaef348d23281c2c4dcf233a57dff84c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Sep 2019 17:29:52 +0300 Subject: [PATCH 015/957] ISAICP-5403: QA remarks. --- .../custom/joinup_core/joinup_core.info.yml | 1 - web/profiles/joinup/joinup.behat.inc | 14 +++++++------- web/profiles/joinup/joinup.info.yml | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.info.yml b/web/modules/custom/joinup_core/joinup_core.info.yml index 8a1b5f21f8..7708a2e3dd 100644 --- a/web/modules/custom/joinup_core/joinup_core.info.yml +++ b/web/modules/custom/joinup_core/joinup_core.info.yml @@ -14,7 +14,6 @@ dependencies: - ds:ds - facets:facets - joinup:oe_newsroom_newsletter - - joinup:joinup_seo - matomo_reporting_api:matomo_reporting_api - menu_admin_per_menu:menu_admin_per_menu - message:message diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 52fd809dec..fe9be2ca03 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -2717,7 +2717,7 @@ JS; * * @Given I should not see the absolute urls of the following content entities: */ - public function assertEmptyContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void { + public function assertNotContentAbsoluteUrlsAsLinkInPage(TableNode $titles): void { foreach ($titles->getRows() as $title) { $this->assertEntityUrlInSitemap('node', $title[0], FALSE); } @@ -2745,18 +2745,18 @@ JS; * * @param string $entity_type_id * The entity type id. - * @param string $entity_id - * The entity id. + * @param string $entity_label + * The entity label. * @param bool $exists * (optional) Whether to assert that a link exists or not exists. Defaults - * to true. + * to TRUE. * * @throws \Exception * Thrown if the link assertion is not the expected one. */ - protected function assertEntityUrlInSitemap(string $entity_type_id, string $entity_id, $exists = TRUE): void { - $entity = $this->getEntityByLabel($entity_type_id, $entity_id); - $link_text = $entity->toUrl('canonical', ['absolute' => TRUE])->toString(); + protected function assertEntityUrlInSitemap(string $entity_type_id, string $entity_label, bool $exists = TRUE): void { + $entity = $this->getEntityByLabel($entity_type_id, $entity_label); + $link_text = $entity->toUrl()->setAbsolute()->toString(); $expected = '' . $link_text . ''; $response = $this->getSession()->getPage()->getContent(); if ($exists) { diff --git a/web/profiles/joinup/joinup.info.yml b/web/profiles/joinup/joinup.info.yml index 86792ce4fd..968607b254 100644 --- a/web/profiles/joinup/joinup.info.yml +++ b/web/profiles/joinup/joinup.info.yml @@ -57,6 +57,7 @@ dependencies: - joinup:joinup_privacy - joinup:joinup_rss - joinup:joinup_search + - joinup:joinup_seo - joinup:joinup_sparql - joinup:joinup_subscription - joinup:joinup_user @@ -248,7 +249,6 @@ config_devel: - pathauto.pattern.rdf_entities_releases - r4032login.settings - rest.resource.entity.rdf_entity - - simple_sitemap:simple_sitemap - sparql_entity_storage.graph.default - subpathauto.settings - swiftmailer.message From 8ddc4649577f8cff12872b7f26ffb09536122113 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Sep 2019 15:58:42 +0300 Subject: [PATCH 016/957] ISAICP-5403: Use configuration management to enable the modules. --- config/sync/core.extension.yml | 2 ++ web/modules/custom/joinup_core/joinup_core.post_update.php | 7 ------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index bf0fabbf9b..70b0b39abd 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -68,6 +68,7 @@ module: joinup_privacy: 0 joinup_rss: 0 joinup_search: 0 + joinup_seo: 0 joinup_sparql: 0 joinup_subscription: 0 joinup_user: 0 @@ -120,6 +121,7 @@ module: search_api_solr: 0 semic: 0 serialization: 0 + simple_sitemap: 0 simplenews: 0 smart_trim: 0 social_media_links: 0 diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index aafb2345f9..113344d50c 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -794,10 +794,3 @@ function joinup_core_post_update_refix_publication_dates() { throw new Exception('Database error', 0, $e); } } - -/** - * Enable the joinup_seo module. - */ -function joinup_core_post_update_install_joinup_seo() { - \Drupal::service('module_installer')->install(['joinup_seo']); -} From 78d37f8c65393b9fd7e4378924872f61cf842757 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Sep 2019 16:15:56 +0300 Subject: [PATCH 017/957] ISAICP-5403: Export configuration. --- ...temap.bundle_settings.default.node.custom_page.yml | 6 ++++++ ...itemap.bundle_settings.default.node.discussion.yml | 6 ++++++ ..._sitemap.bundle_settings.default.node.document.yml | 6 ++++++ ...ple_sitemap.bundle_settings.default.node.event.yml | 6 ++++++ ...mple_sitemap.bundle_settings.default.node.news.yml | 6 ++++++ ...ndle_settings.default.rdf_entity.asset_release.yml | 6 ++++++ ....bundle_settings.default.rdf_entity.collection.yml | 6 ++++++ ...ap.bundle_settings.default.rdf_entity.solution.yml | 6 ++++++ config/sync/simple_sitemap.custom_links.default.yml | 7 +++++++ .../sync}/simple_sitemap.settings.yml | 2 ++ .../sync/simple_sitemap.variants.default_hreflang.yml | 6 ++++++ web/modules/custom/joinup_seo/joinup_seo.info.yml | 11 +++++++++++ 12 files changed, 74 insertions(+) create mode 100644 config/sync/simple_sitemap.bundle_settings.default.node.custom_page.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.node.discussion.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.node.document.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.node.event.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.node.news.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml create mode 100644 config/sync/simple_sitemap.custom_links.default.yml rename {web/profiles/joinup/config/install => config/sync}/simple_sitemap.settings.yml (79%) create mode 100644 config/sync/simple_sitemap.variants.default_hreflang.yml diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.custom_page.yml b/config/sync/simple_sitemap.bundle_settings.default.node.custom_page.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.node.custom_page.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.discussion.yml b/config/sync/simple_sitemap.bundle_settings.default.node.discussion.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.node.discussion.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.document.yml b/config/sync/simple_sitemap.bundle_settings.default.node.document.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.node.document.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.event.yml b/config/sync/simple_sitemap.bundle_settings.default.node.event.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.node.event.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.asset_release.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.collection.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml new file mode 100644 index 0000000000..6da10af2c4 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.default.rdf_entity.solution.yml @@ -0,0 +1,6 @@ +index: true +priority: '0.5' +changefreq: weekly +include_images: false +_core: + default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.custom_links.default.yml b/config/sync/simple_sitemap.custom_links.default.yml new file mode 100644 index 0000000000..1df507fb1a --- /dev/null +++ b/config/sync/simple_sitemap.custom_links.default.yml @@ -0,0 +1,7 @@ +links: + - + path: / + priority: '1.0' + changefreq: daily +_core: + default_config_hash: 25hWeYa4sasuJtHqKKcEN_nYiuEC1lMPYHsn5dawJEw diff --git a/web/profiles/joinup/config/install/simple_sitemap.settings.yml b/config/sync/simple_sitemap.settings.yml similarity index 79% rename from web/profiles/joinup/config/install/simple_sitemap.settings.yml rename to config/sync/simple_sitemap.settings.yml index 6c6c93bbcb..c117ea7f2c 100644 --- a/web/profiles/joinup/config/install/simple_sitemap.settings.yml +++ b/config/sync/simple_sitemap.settings.yml @@ -12,3 +12,5 @@ excluded_languages: { } enabled_entity_types: - node - rdf_entity +_core: + default_config_hash: 52CWcEcMD0WxvDTjONwtNpMR2DILJ9UUPn30tGa23co diff --git a/config/sync/simple_sitemap.variants.default_hreflang.yml b/config/sync/simple_sitemap.variants.default_hreflang.yml new file mode 100644 index 0000000000..edb2d0ee47 --- /dev/null +++ b/config/sync/simple_sitemap.variants.default_hreflang.yml @@ -0,0 +1,6 @@ +variants: + default: + label: Default + weight: 0 +_core: + default_config_hash: nQAXscP-SDpsmqHlQ6u0iBvcuJPrAikb09c3cP2_n0k diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index ea49263dee..4ac46a6039 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -6,3 +6,14 @@ package: Joinup dependencies: - simple_sitemap:simple_sitemap + +config_devel: + install: + - simple_sitemap.bundle_settings.default.node.custom_page + - simple_sitemap.bundle_settings.default.node.discussion + - simple_sitemap.bundle_settings.default.node.document + - simple_sitemap.bundle_settings.default.node.event + - simple_sitemap.bundle_settings.default.node.news + - simple_sitemap.bundle_settings.default.rdf_entity.asset_release + - simple_sitemap.bundle_settings.default.rdf_entity.collection + - simple_sitemap.bundle_settings.default.rdf_entity.solution From a5f927ef61caa1e4eea68afc8f8eea73dce2a441 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 8 Jan 2020 16:43:25 +0200 Subject: [PATCH 018/957] ISAICP-5406: Install and enable the metatag and the schema_metatag modules. --- composer.json | 3 +- composer.lock | 149 ++++++++++++++++++++++++++++++--- config/sync/core.extension.yml | 2 + 3 files changed, 143 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index b2dd130438..6981da223a 100644 --- a/composer.json +++ b/composer.json @@ -55,6 +55,7 @@ "drupal/rdf_entity": "^1.0-alpha18", "drupal/redirect": "^1.4", "drupal/redis": "^1.2", + "drupal/schema_metatag": "^1.4", "drupal/search_api": "1.13", "drupal/search_api_solr": "2.2", "drupal/simple_sitemap": "^3.4", @@ -79,8 +80,8 @@ "jacklmoore/autosize": "dev-master", "masterminds/html5": "^2.7", "ml/json-ld": "^1.1", - "openeuropa/webtools-geocoding-provider": "~0.1", "openeuropa/oe_webtools": "~1.0", + "openeuropa/webtools-geocoding-provider": "~0.1", "pear/console_table": "~1.3", "phing/phing": "^2.16", "predis/predis": "~1.1", diff --git a/composer.lock b/composer.lock index 91e63fb408..0893751059 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": "243c8479f0142683fb413dd9234a0b58", + "content-hash": "3710b36057c99618903ba5b0ea6036cb", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -2471,7 +2471,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -5098,6 +5098,74 @@ "issues": "https://www.drupal.org/project/issues/meta_entity" } }, + { + "name": "drupal/metatag", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/metatag.git", + "reference": "8.x-1.11" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/metatag-8.x-1.11.zip", + "reference": "8.x-1.11", + "shasum": "9acb04a741d80b4ab468d118a242271169d11f00" + }, + "require": { + "drupal/core": "*", + "drupal/token": "^1.0" + }, + "require-dev": { + "drupal/devel": "^2.0", + "drupal/metatag_dc": "*", + "drupal/metatag_open_graph": "*", + "drupal/page_manager": "^4.0", + "drupal/redirect": "^1.0", + "drupal/restui": "^1.0", + "drupal/schema_metatag": "^1.0", + "drupal/schema_web_page": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.11", + "datestamp": "1576870683", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "See contributors", + "homepage": "https://www.drupal.org/node/640498/committers", + "role": "Developer" + }, + { + "name": "Dave Reid", + "homepage": "https://www.drupal.org/user/53892" + } + ], + "description": "Manage meta tags for all entities.", + "homepage": "https://www.drupal.org/project/metatag", + "keywords": [ + "Drupal", + "seo" + ], + "support": { + "source": "http://cgit.drupalcode.org/metatag", + "issues": "http://drupal.org/project/issues/metatag" + } + }, { "name": "drupal/og", "version": "1.0.0-alpha4", @@ -5880,6 +5948,63 @@ "source": "https://git.drupalcode.org/project/redis" } }, + { + "name": "drupal/schema_metatag", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/schema_metatag.git", + "reference": "8.x-1.4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/schema_metatag-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "5d0a677608e30a7c8ffb43d98759b19cf5be17f6" + }, + "require": { + "drupal/core": "~8.0", + "drupal/metatag": "*" + }, + "require-dev": { + "drupal/metatag_views": "*", + "drupal/schema_article": "*", + "drupal/schema_organization": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.4", + "datestamp": "1563033785", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "KarenS", + "homepage": "https://www.drupal.org/user/45874" + } + ], + "description": "Metatag implementation of Schema.org structured data (JSON-LD)", + "homepage": "https://www.drupal.org/project/schema_metatag", + "keywords": [ + "Drupal" + ], + "support": { + "source": "http://cgit.drupalcode.org/schema_metatag", + "issues": "https://www.drupal.org/project/issues/schema_metatag" + } + }, { "name": "drupal/search_api", "version": "1.13.0", @@ -6734,7 +6859,7 @@ }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0+" + "GPL-2.0-or-later" ], "authors": [ { @@ -6895,7 +7020,7 @@ "description": "Plugin to export views data into various file formats.", "homepage": "https://www.drupal.org/project/views_data_export", "support": { - "source": "http://cgit.drupalcode.org/views_data_export" + "source": "https://git.drupalcode.org/project/views_data_export" } }, { @@ -7702,7 +7827,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-10-31T20:10:45+00:00" + "time": "2018-05-01T01:48:25+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -11971,6 +12096,7 @@ "psr", "psr-7" ], + "abandoned": "laminas/laminas-diactoros", "time": "2019-08-06T17:53:53+00:00" }, { @@ -12016,6 +12142,7 @@ "escaper", "zf" ], + "abandoned": "laminas/laminas-escaper", "time": "2019-09-05T20:03:20+00:00" }, { @@ -12079,6 +12206,7 @@ "feed", "zf" ], + "abandoned": "laminas/laminas-feed", "time": "2019-03-05T20:08:49+00:00" }, { @@ -12125,6 +12253,7 @@ "stdlib", "zf" ], + "abandoned": "laminas/laminas-stdlib", "time": "2018-08-28T21:34:05+00:00" } ], @@ -12902,6 +13031,9 @@ "status": "covered", "message": "Covered by Drupal's security advisory policy" } + }, + "patches_applied": { + "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -13158,10 +13290,6 @@ "name": "See contributors", "homepage": "https://www.drupal.org/node/3236/committers" }, - { - "name": "pcambra", - "homepage": "https://www.drupal.org/user/122101" - }, { "name": "salvis", "homepage": "https://www.drupal.org/user/82964" @@ -15819,7 +15947,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=7.1.0" + "php": ">=7.1.0", + "ext-json": "*" }, "platform-dev": { "ext-dom": "*", diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 95bf9ddfb8..18a63c8242 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -90,6 +90,7 @@ module: message: 0 message_notify: 0 meta_entity: 0 + metatag: 0 moderation: 0 nio: 0 node: 0 @@ -123,6 +124,7 @@ module: redirect: 0 redis: 0 rest: 0 + schema_metatag: 0 search_api: 0 search_api_arbitrary_facet: 0 search_api_db: 0 From dd38aafb630e1d1758835b84cf1cc0f1c594930c Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 8 Jan 2020 16:45:21 +0200 Subject: [PATCH 019/957] ISAICP-5406: Export the default metatags after the installation of the modules. --- config/sync/metatag.metatag_defaults.403.yml | 11 +++++++++++ config/sync/metatag.metatag_defaults.404.yml | 11 +++++++++++ config/sync/metatag.metatag_defaults.front.yml | 11 +++++++++++ config/sync/metatag.metatag_defaults.global.yml | 11 +++++++++++ config/sync/metatag.metatag_defaults.node.yml | 12 ++++++++++++ .../sync/metatag.metatag_defaults.taxonomy_term.yml | 12 ++++++++++++ config/sync/metatag.metatag_defaults.user.yml | 12 ++++++++++++ 7 files changed, 80 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.403.yml create mode 100644 config/sync/metatag.metatag_defaults.404.yml create mode 100644 config/sync/metatag.metatag_defaults.front.yml create mode 100644 config/sync/metatag.metatag_defaults.global.yml create mode 100644 config/sync/metatag.metatag_defaults.node.yml create mode 100644 config/sync/metatag.metatag_defaults.taxonomy_term.yml create mode 100644 config/sync/metatag.metatag_defaults.user.yml diff --git a/config/sync/metatag.metatag_defaults.403.yml b/config/sync/metatag.metatag_defaults.403.yml new file mode 100644 index 0000000000..798f9ca779 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.403.yml @@ -0,0 +1,11 @@ +uuid: c58ffc5a-0c2c-4f96-8713-bb3154b8da18 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: Da5YWhJdKLxaJ9gDRI1u5oCbm5WBxiiDgA4M1QrOEPQ +id: '403' +label: '403 access denied' +tags: + canonical_url: '[site:url]' + shortlink: '[site:url]' diff --git a/config/sync/metatag.metatag_defaults.404.yml b/config/sync/metatag.metatag_defaults.404.yml new file mode 100644 index 0000000000..3e02fcf8d0 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.404.yml @@ -0,0 +1,11 @@ +uuid: 7c57d404-4819-4fc9-83f2-63d4281adf65 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: puBstSLDz8mbaWU357zaqQDBGMGsJzG0j-TQNQkjg20 +id: '404' +label: '404 page not found' +tags: + canonical_url: '[site:url]' + shortlink: '[site:url]' diff --git a/config/sync/metatag.metatag_defaults.front.yml b/config/sync/metatag.metatag_defaults.front.yml new file mode 100644 index 0000000000..e70ba2b25d --- /dev/null +++ b/config/sync/metatag.metatag_defaults.front.yml @@ -0,0 +1,11 @@ +uuid: de62a4de-e764-4a20-95a0-4bec36b17394 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: 1noCXlegCr5HFehQRF1ViXy1jhU1jZ_sNN99a8Sj5jo +id: front +label: 'Front page' +tags: + canonical_url: '[site:url]' + shortlink: '[site:url]' diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml new file mode 100644 index 0000000000..5ed764926d --- /dev/null +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -0,0 +1,11 @@ +uuid: 62e0a9fc-d4d8-4ce9-9e1d-5fe8a83e0bbb +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: sL588ui1E_8-2c_UupwyYxcqX2OVyMFp3HTLbbFqvPc +id: global +label: Global +tags: + canonical_url: '[current-page:url]' + title: '[current-page:title] | [site:name]' diff --git a/config/sync/metatag.metatag_defaults.node.yml b/config/sync/metatag.metatag_defaults.node.yml new file mode 100644 index 0000000000..8f328ff716 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node.yml @@ -0,0 +1,12 @@ +uuid: 330ae400-6bc2-438b-8740-ad1dcc36784e +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: rpwvgyEURXLz_JjgMCrkS1rUv-0k3L79BpO-ReN7fDI +id: node +label: Content +tags: + title: '[node:title] | [site:name]' + description: '[node:summary]' + canonical_url: '[node:url]' diff --git a/config/sync/metatag.metatag_defaults.taxonomy_term.yml b/config/sync/metatag.metatag_defaults.taxonomy_term.yml new file mode 100644 index 0000000000..ae5f4caf7b --- /dev/null +++ b/config/sync/metatag.metatag_defaults.taxonomy_term.yml @@ -0,0 +1,12 @@ +uuid: 3c3f30cd-5f23-4755-8aab-0dfee869609b +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: 92bXZdyYJ5xqukdfmGRr_CYcwm1vfuS8b8aJ7X_G7E0 +id: taxonomy_term +label: 'Taxonomy term' +tags: + canonical_url: '[term:url]' + description: '[term:description]' + title: '[term:name] | [site:name]' diff --git a/config/sync/metatag.metatag_defaults.user.yml b/config/sync/metatag.metatag_defaults.user.yml new file mode 100644 index 0000000000..8281caca78 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.user.yml @@ -0,0 +1,12 @@ +uuid: 3aed6970-6e52-4b55-903e-83a673094960 +langcode: en +status: true +dependencies: { } +_core: + default_config_hash: MvQPTbQx0Vxwy0ordSHyixdZmLCMpvMdLD69dlwkrKc +id: user +label: User +tags: + canonical_url: '[user:url]' + description: '[site:name]' + title: '[user:display-name] | [site:name]' From 7af5e5d2f495f782b4a621b0463c5294d5b40f12 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 13 Jan 2020 17:07:32 +0200 Subject: [PATCH 020/957] ISAICP-5406: First approach to the news article tags. --- config/sync/core.extension.yml | 1 + .../metatag.metatag_defaults.node__news.yml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.node__news.yml diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 18a63c8242..bd654e117b 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -124,6 +124,7 @@ module: redirect: 0 redis: 0 rest: 0 + schema_article: 0 schema_metatag: 0 search_api: 0 search_api_arbitrary_facet: 0 diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml new file mode 100644 index 0000000000..7220973ba3 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -0,0 +1,18 @@ +uuid: 00762435-258d-4e52-bd0f-09e5ca2771f5 +langcode: en +status: true +dependencies: { } +id: node__news +label: 'Content: News' +tags: + schema_article_author: 'a:3:{s:5:"@type";s:6:"Person";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_type: NewsArticle + schema_article_main_entity_of_page: '[current-page:url]' + schema_article_name: '[node:title]' + schema_article_about: '[node:field_keywords]' + schema_article_date_published: '[node:published]' + schema_article_headline: '[node:field_news_headline]' + schema_article_date_modified: '[node:changed]' + schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' + schema_article_description: '[node:body]' + schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:26:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' From 8e10930aa955acd2989964faac6863ac53742ca6 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 11:16:05 +0200 Subject: [PATCH 021/957] ISAICP-5406: Provide a test for the news seo. --- tests/features/joinup_seo/news.feature | 42 +++++ .../custom/joinup_seo/joinup_seo.behat.inc | 171 ++++++++++++++++++ 2 files changed, 213 insertions(+) create mode 100644 tests/features/joinup_seo/news.feature create mode 100644 web/modules/custom/joinup_seo/joinup_seo.behat.inc diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature new file mode 100644 index 0000000000..64eb0884af --- /dev/null +++ b/tests/features/joinup_seo/news.feature @@ -0,0 +1,42 @@ +@api +Feature: As an owner of the website + in order for my news to be better visible on the web + I need proper metatag to be encapsulated in the html code. + + Scenario: Basic metatags are attached as json schema on the page. + Given collections: + | title | state | + | Joinup SEO news collection | validated | + And users: + | Username | E-mail | First name | Family name | + | Joinup SEO author | joinup.seo@example.com | Kurk | Smith | + And "news" content: + | title | headline | body | state | author | collection | + | Joinup SEO news | Headline of Joinup SEO news | Body of Joinup SEO news | validated | Joinup SEO author | Joinup SEO news collection | + + When I visit the "Joinup SEO news" news + Then the metatag json should be attached in the page + And 1 metatag graph of type "NewsArticle" should exist in the page + And the metatag graph of the item with "name" "Joinup SEO news" should have the following properties: + | property | value | + | @type | NewsArticle | + | headline | Headline of Joinup SEO news | + | description | Body of Joinup SEO news | + # $base_url$ will be replaced with the base url of the website. + | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | + And the metatag graph of the item with "name" "Joinup SEO news" should have the following "author" properties: + | property | value | + | @type | Person | + | name | Kurk Smith | + And the metatag graph of the item with "name" "Joinup SEO news" should have the following "publisher" properties: + | property | value | + | @type | Organization | + | name | Joinup | + | url | $base_url$/ | + + When I click "Keep up to date" + Then I should see the "Joinup SEO news" tile + # No metatags are defined for the keep up to date page. + # No metatags JSON in general means also that the entity metatags of the news item + # is also not attached when the tile is present. + And the metatag json should not be attached in the page diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc new file mode 100644 index 0000000000..6263070f48 --- /dev/null +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -0,0 +1,171 @@ +getMetatagsAsJson(); + Assert::assertNotEmpty($json, 'Entity metadata are found in the table.'); + // Assert that the context of the metatag is 'schema.org' to ensure that the + // correct metatag is loaded and exists. + Assert::assertArrayHasKey('@context', $json, '@context key not found in the metatag array.'); + Assert::assertEquals($json['@context'], 'https://schema.org', 'The @context property value is not set to the appropriate url.'); + } + + /** + * Asserts that the schema.org metatags are attached in page. + * + * @Given the metatag json should not be attached in the page + */ + public function assertMetatagsNotInPage(): void { + $json = $this->getMetatagsAsJson(); + Assert::assertEmpty($json, 'Entity metadata are not attached in the page.'); + } + + /** + * Assert the amount of entity graphs of a certain type. + * + * @param string $count + * The number of graphs of the given type. + * @param string $type + * The type of graph which is the schema class. + * + * @Given :count metatag graph of type :type should exist in the page + */ + public function assertNumberOfEntityGraphsExist(string $count, string $type): void { + $json = $this->getMetatagsAsJson(); + $found = 0; + foreach ($json['@graph'] as $graph) { + $graph = (array) $graph; + if ($graph['@type'] === $type) { + $found++; + } + } + Assert::assertEquals((int) $count, $found, "{$count} graphs of type {$type} were expected. {$found} were found."); + } + + /** + * Asserts a list of properties in the graph identified by a property. + * + * @param string $property + * The property of which to identify the graph by. + * @param string $value + * The value of the property of which to identify the graph by. + * @param \Behat\Gherkin\Node\TableNode $table + * A table of properties for the given graph. + * @param string $sub_property + * A sub property to look into. + * + * @throws \Exception + * Thrown if the graph is not found in the page or the requested sub + * property does not exist. + * + * @Given the metatag graph of the item with :property :value should have the following properties: + * @Given the metatag graph of the item with :property :value should have the following :sub_property properties: + */ + public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = ''): void { + $graph = $this->getGraphFromMetatags($property, $value); + if (empty($graph)) { + throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}'."); + } + if (!empty($sub_property) && !isset($graph[$sub_property])) { + throw new \Exception("The graph with property '{$property}' of value '{$value}' does not have a sub property '{$sub_property}'."); + } + + // The url structure is very important in the SEO metatags as a wrong url + // or an internal path could cause search engines to be missleaded. Thus, + // the full url must be always asserted. + $base_url = \Drupal::request()->getSchemeAndHttpHost(); + + if (!empty($sub_property)) { + $graph = (array) $graph[$sub_property]; + } + + $not_exists = []; + $wrong_value = []; + foreach ($table->getColumnsHash() as $row) { + if (!isset($graph[$row['property']])) { + $not_exists[] = $row['property']; + } + + $row['value'] = str_replace('$base_url$', $base_url, $row['value']); + if ($graph[$row['property']] !== $row['value']) { + $wrong_value[$row['property']] = [ + 'expected' => $row['value'], + 'found' => $graph[$row['property']], + ]; + } + } + + if (!empty($not_exists) || !empty($wrong_value)) { + $error_messages = []; + foreach ($not_exists as $property) { + $error_messages[] = "The property '{$property}' was not found in the graph."; + } + foreach ($wrong_value as $property => $data) { + $error_messages[] = "The property '{$property}' had an expected value '{$data['expected']}' but '{$data['found']}' was found."; + } + + throw new Exception(implode('\n', $error_messages)); + } + } + + /** + * Retrieves the entity metatags as a JSON array from the page. + * + * @return array|null + * The SEO metatags as an array or null if not found. + */ + protected function getMetatagsAsJson(): ?array { + $page = $this->getSession()->getPage(); + if ($script = $page->find('xpath', '//script[@type="application/ld+json"]')) { + $json = $script->getText(); + return (array) json_decode($json); + } + + return NULL; + } + + /** + * Searches the metatag array for the first graph that matches the criteria. + * + * @param string $property + * The property of which to identify the graph by. + * @param string $value + * The value of the property of which to identify the graph by. + * + * @return array|null + * The first graph that matches the criteria as an array or null if no match + * is found. + */ + protected function getGraphFromMetatags(string $property, string $value): ?array { + $json = $this->getMetatagsAsJson(); + foreach ($json['@graph'] as $graph) { + if (isset($graph->$property) && $graph->$property === $value) { + return (array) $graph; + } + } + + return NULL; + } + +} From f377194b36b206a55bd3370a197426ac69395848 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 12:10:27 +0200 Subject: [PATCH 022/957] ISAICP-5406: Properly set the title on an altered route. --- web/modules/custom/joinup_core/joinup_core.module | 1 - .../custom/joinup_user/src/Routing/RouteSubscriber.php | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 56a7f94784..472cba6b97 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -680,7 +680,6 @@ function joinup_core_search_api_index_items_alter(IndexInterface $index, array & */ function joinup_core_form_user_login_form_alter(&$form, FormStateInterface $form_state, $form_id) { $form['actions']['submit']['#value'] = t('Sign in'); - $form['#title'] = t('Sign in'); } /** diff --git a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php index 5e9aa5f2f5..b7497019c8 100644 --- a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php +++ b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php @@ -19,6 +19,12 @@ protected function alterRoutes(RouteCollection $collection) { '_title_callback' => 'joinup_user_canonical_title', ]); } + + if ($route = $collection->get('user.login')) { + $route->addDefaults([ + '_title' => 'Sign in', + ]); + } } } From df7e7005c20e49ca00f963f6a8266d07aa42873d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 12:37:35 +0200 Subject: [PATCH 023/957] ISAICP-5406: Handle the publication and modification dates of the entity. --- tests/features/joinup_seo/news.feature | 6 ++++-- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 2 +- web/profiles/joinup/joinup.behat.inc | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 64eb0884af..6cddd8ddbc 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -11,8 +11,8 @@ Feature: As an owner of the website | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Kurk | Smith | And "news" content: - | title | headline | body | state | author | collection | - | Joinup SEO news | Headline of Joinup SEO news | Body of Joinup SEO news | validated | Joinup SEO author | Joinup SEO news collection | + | title | headline | body | created | publication date | changed | state | author | collection | + | Joinup SEO news | Headline of Joinup SEO news | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | When I visit the "Joinup SEO news" news Then the metatag json should be attached in the page @@ -22,6 +22,8 @@ Feature: As an owner of the website | @type | NewsArticle | | headline | Headline of Joinup SEO news | | description | Body of Joinup SEO news | + | datePublished | Wed, 25/12/2019 - 13:00 | + | dateModified | Wed, 01/01/2020 - 13:00 | # $base_url$ will be replaced with the base url of the website. | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "author" properties: diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 6263070f48..ca042b4ebc 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -125,7 +125,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte $error_messages[] = "The property '{$property}' had an expected value '{$data['expected']}' but '{$data['found']}' was found."; } - throw new Exception(implode('\n', $error_messages)); + throw new Exception(implode("\n", $error_messages)); } } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 2514d93ddb..f95d240da3 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -640,6 +640,10 @@ class JoinupSubContext extends DrupalSubContextBase { ]); } + if (property_exists($node, 'published_at') && !is_numeric($node->published_at)) { + $node->published_at = strtotime($node->published_at); + } + // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -701,6 +705,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'keywords' => 'field_keywords', 'spatial coverage' => 'field_news_spatial_coverage', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'shared' => [ 'collection' => OgGroupAudienceHelperInterface::DEFAULT_FIELD, From ddf815c636861a0745952cffab41be544370fed8 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 12:59:24 +0200 Subject: [PATCH 024/957] ISAICP-5406: Handle the news logo on the metadata json array. --- tests/features/joinup_seo/news.feature | 13 +++++++++++-- web/profiles/joinup/joinup.behat.inc | 11 ++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 6cddd8ddbc..25abe48970 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -11,8 +11,8 @@ Feature: As an owner of the website | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Kurk | Smith | And "news" content: - | title | headline | body | created | publication date | changed | state | author | collection | - | Joinup SEO news | Headline of Joinup SEO news | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | + | title | headline | logo | body | created | publication date | changed | state | author | collection | + | Joinup SEO news | Headline of Joinup SEO news | logo.png | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | When I visit the "Joinup SEO news" news Then the metatag json should be attached in the page @@ -26,6 +26,15 @@ Feature: As an owner of the website | dateModified | Wed, 01/01/2020 - 13:00 | # $base_url$ will be replaced with the base url of the website. | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | + And the metatag graph of the item with "name" "Joinup SEO news" should have the following "image" properties: + | property | value | + | @type | ImageObject | + | representativeOfPage | True | + # The test files are assigned a random name so it is very hard to assert the real url. However, when the file is + # found and added to the page, the dimensions are added as well. Asserting the dimensions also asserts the url in + # a way. + | width | 377 | + | height | 139 | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "author" properties: | property | value | | @type | Person | diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index f95d240da3..e817d7fea7 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -591,7 +591,7 @@ class JoinupSubContext extends DrupalSubContextBase { * * @BeforeNodeCreate */ - public static function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope) { + public function massageFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope) { $node = $scope->getEntity(); // Replace field label aliases with the actual field names. @@ -644,6 +644,14 @@ class JoinupSubContext extends DrupalSubContextBase { $node->published_at = strtotime($node->published_at); } + $image_fields = ['field_news_logo']; + foreach ($image_fields as $image_field) { + if (!empty($node->$image_field)) { + $file = $this->createFile($node->$image_field); + $node->$image_field = $file->getFileUri(); + } + } + // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -705,6 +713,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'keywords' => 'field_keywords', 'spatial coverage' => 'field_news_spatial_coverage', 'state' => 'field_state', + 'logo' => 'field_news_logo', 'publication date' => 'published_at', ], 'shared' => [ From 112c0a17911613441e7b7400452f85ae380b8da3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 16:24:47 +0200 Subject: [PATCH 025/957] ISAICP-5406: Update the front page metatags. --- config/sync/metatag.metatag_defaults.front.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/sync/metatag.metatag_defaults.front.yml b/config/sync/metatag.metatag_defaults.front.yml index e70ba2b25d..04b1c20097 100644 --- a/config/sync/metatag.metatag_defaults.front.yml +++ b/config/sync/metatag.metatag_defaults.front.yml @@ -7,5 +7,8 @@ _core: id: front label: 'Front page' tags: - canonical_url: '[site:url]' + abstract: 'It offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' + description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' + title: '[site:name]' shortlink: '[site:url]' + canonical_url: '[site:url]' From 13722f1b46fa632e50df9b56f8f36289a3373ed4 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 16:26:18 +0200 Subject: [PATCH 026/957] ISAICP-5406: Update the title tag assertion to better represent all cases. --- tests/features/bootstrap/FeatureContext.php | 19 ++++++++++++------- tests/features/user/profile.feature | 4 ++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index 7f864a1a27..a9d922c84f 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -932,7 +932,9 @@ public function assertRegionNotPresent($region) { } /** - * Asserts that the page title tag contains text. + * Asserts that the page title tag equals to some text. + * + * The assertion strips off the possible suffix "| Joinup". * * @param string $text * The text to search for. @@ -940,20 +942,23 @@ public function assertRegionNotPresent($region) { * @throws \Exception * Thrown when the title tag is not found or the text doesn't match. * - * @Then the HTML title tag should contain the text :text + * @Then the HTML title of the page should be :text */ - public function assertPageTitleTagContainsText($text) { + public function assertPageTitleTagContainsText(string $text) { $session = $this->getSession(); $page_title = $session->getPage()->find('xpath', '//head/title'); if (!$page_title) { throw new \Exception(sprintf('Page title tag not found on the page "%s".', $session->getCurrentUrl())); } - list($title, $site_name) = explode(' | ', $page_title->getText()); + $page_title = $page_title->getText(); + if (strpos($page_title, '|') !== FALSE) { + list($page_title, $site_name) = explode(' | ', $page_title->getText()); + } - $title = trim($title); - if ($title !== $text) { - throw new \Exception(sprintf('Expected page title is "%s", but "%s" found.', $text, $title)); + $page_title = trim($page_title); + if ($page_title !== $text) { + throw new \Exception(sprintf('Expected page title is "%s", but "%s" found.', $text, $page_title)); } } diff --git a/tests/features/user/profile.feature b/tests/features/user/profile.feature index 737eaee946..60ae2859b1 100644 --- a/tests/features/user/profile.feature +++ b/tests/features/user/profile.feature @@ -189,7 +189,7 @@ Feature: User profile # the full name as header title and in the page title tag. When I go to the public profile of cgarnett67 Then I should see the heading "Callista Garnett" in the "Header" region - And the HTML title tag should contain the text "Callista Garnett" + And the HTML title of the page should be "Callista Garnett" # The title should not be duplicated. And I should not see the "Page title" region And I should not see the heading "cgarnett67" @@ -197,7 +197,7 @@ Feature: User profile # The full name fall backs to the user name when the fields are not filled. When I go to the public profile of delwin999 Then I should see the heading delwin999 in the "Header" region - And the HTML title tag should contain the text delwin999 + And the HTML title of the page should be delwin999 And I should not see the "Page title" region Scenario: The user profile page is updated when the user joins or leaves a collection From 5fde6854f398ad21f973e1d3da43e05a73c1aadb Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 16:27:23 +0200 Subject: [PATCH 027/957] ISAICP-5406: Provide a test for the front page tags. --- .../joinup_seo/basic_metatags.feature | 17 ++++++++++++++ .../custom/joinup_seo/joinup_seo.behat.inc | 22 ++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/features/joinup_seo/basic_metatags.feature diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature new file mode 100644 index 0000000000..05432e63a1 --- /dev/null +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -0,0 +1,17 @@ +@api +Feature: + As the owner of the website + In order for my site to be more appealing to the search engines + I need to have basic metatags attached to the page. + + Scenario Outline: Front page metatags. + Given I am + When I am on the homepage + Then the "description" metatag should be set to "Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme." + And the "abstract" metatag should be set to "It offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions." + And the HTML title of the page should be "Joinup" + + Examples: + | user type | + | an anonymous user | + | logged in as a user with the "authenticated" role | diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index ca042b4ebc..d8100152c2 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -17,12 +17,32 @@ use PHPUnit\Framework\Assert; */ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { + /** + * Assert a meta tag value in the page. + * + * @param string $meta_name + * The meta tag name. + * @param string $meta_value + * The meta tag value. + * + * @throws \Exception + * Thrown when an tag is not found or the value is not correct. + * + * @Given the :meta_name metatag should be set to :meta_value + */ + public function assertMetatagInPage(string $meta_name, string $meta_value): void { + $xpath = "//head/meta[@name=\"{$meta_name}\" and @content=\"{$meta_value}\"]"; + if (empty($this->getSession()->getPage()->find('xpath', $xpath))) { + throw new Exception("The meta property '{$meta_name}' was either not found or the value is not set to '{$meta_value}'"); + } + } + /** * Asserts that the schema.org metatags are attached in page. * * @Given the metatag json should be attached in the page */ - public function assertMetatagsInPage(): void { + public function assertJsonMetatagsInPage(): void { $json = $this->getMetatagsAsJson(); Assert::assertNotEmpty($json, 'Entity metadata are found in the table.'); // Assert that the context of the metatag is 'schema.org' to ensure that the From 7a0806f98ded4d8aca29375a3cc43cd31332ca65 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 16:46:02 +0200 Subject: [PATCH 028/957] ISAICP-5406: According to pieter, 'you touched it, you fixed it'. --- tests/features/bootstrap/FeatureContext.php | 170 ++++++++++++++------ 1 file changed, 118 insertions(+), 52 deletions(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index a9d922c84f..dca31e3bd3 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -55,7 +55,7 @@ class FeatureContext extends RawDrupalContext implements SnippetAcceptingContext * * @Then I should get a valid web page */ - public function assertSuccessfulResponse() { + public function assertSuccessfulResponse(): void { $this->assertSession()->statusCodeEquals(200); } @@ -64,7 +64,7 @@ public function assertSuccessfulResponse() { * * @Then I should get an access denied error */ - public function assertAccessDenied() { + public function assertAccessDenied(): void { $this->assertSession()->statusCodeEquals(403); } @@ -79,7 +79,7 @@ public function assertAccessDenied() { * * @Then (the following )field(s) should be present :fields */ - public function assertFieldsPresent($fields) { + public function assertFieldsPresent(string $fields): void { $fields = $this->explodeCommaSeparatedStepArgument($fields); $page = $this->getSession()->getPage(); $not_found = []; @@ -110,7 +110,7 @@ public function assertFieldsPresent($fields) { * * @Then (the following )field(s) should not be present :fields */ - public function assertFieldsNotPresent($fields) { + public function assertFieldsNotPresent(string $fields): void { $fields = $this->explodeCommaSeparatedStepArgument($fields); $page = $this->getSession()->getPage(); foreach ($fields as $field) { @@ -132,7 +132,7 @@ public function assertFieldsNotPresent($fields) { * * @Then (the following )field(s) should be visible :fields */ - public function assertFieldsVisible($fields) { + public function assertFieldsVisible(string $fields): void { $fields = $this->explodeCommaSeparatedStepArgument($fields); $page = $this->getSession()->getPage(); $not_found = []; @@ -174,7 +174,7 @@ public function assertFieldsVisible($fields) { * * @Then (the following )field(s) should not be visible :fields */ - public function assertFieldsNotVisible($fields) { + public function assertFieldsNotVisible(string $fields): void { $fields = $this->explodeCommaSeparatedStepArgument($fields); $page = $this->getSession()->getPage(); $not_found = []; @@ -216,7 +216,7 @@ public function assertFieldsNotVisible($fields) { * @Then (the following )field widgets should be present :fieldsets * @Then (the following )fieldsets should be present :fieldsets */ - public function assertFieldsetsPresent($fieldsets) { + public function assertFieldsetsPresent(string $fieldsets): void { $fieldsets = $this->explodeCommaSeparatedStepArgument($fieldsets); $page = $this->getSession()->getPage(); $not_found = []; @@ -243,7 +243,7 @@ public function assertFieldsetsPresent($fieldsets) { * @Then (the following )field widgets should be visible :fieldsets * @Then (the following )fieldsets should be visible :fieldsets */ - public function assertFieldsetsVisible($fieldsets) { + public function assertFieldsetsVisible(string $fieldsets): void { $fieldsets = $this->explodeCommaSeparatedStepArgument($fieldsets); $page = $this->getSession()->getPage(); $not_found = []; @@ -279,7 +279,7 @@ public function assertFieldsetsVisible($fieldsets) { * @Then (the following )field widgets should not be visible :fieldsets * @Then (the following )fieldsets should not be visible :fieldsets */ - public function assertFieldsetsNotVisible($fieldsets) { + public function assertFieldsetsNotVisible(string $fieldsets): void { $fieldsets = $this->explodeCommaSeparatedStepArgument($fieldsets); $page = $this->getSession()->getPage(); $not_found = []; @@ -306,27 +306,38 @@ public function assertFieldsetsNotVisible($fieldsets) { /** * Checks that a given image is present in the page. * + * @param string $filename + * The file name. + * * @Then I (should )see the image :filename */ - public function assertImagePresent($filename) { + public function assertImagePresent(string $filename): void { Assert::assertTrue($this->findImageInRegion($filename)); } /** * Checks that a given image is not present in the page. * + * @param string $filename + * The filename. + * * @Then I should not see the image :filename */ - public function assertImageNotPresent($filename) { + public function assertImageNotPresent(string $filename): void { Assert::assertFalse($this->findImageInRegion($filename)); } /** * Checks that a given image is present in a given tile. * + * @param string $filename + * The filename. + * @param string $tile + * The tile title. + * * @Then I (should )see the image ":filename" in the :tile tile */ - public function assertImagePresentInRegion($filename, $tile) { + public function assertImagePresentInRegion(string $filename, string $tile): void { $tile = $this->getTileByHeading($tile); Assert::assertTrue($this->findImageInRegion($filename, $tile)); } @@ -334,9 +345,14 @@ public function assertImagePresentInRegion($filename, $tile) { /** * Checks that a given image is not present in a given tile. * + * @param string $filename + * The filename. + * @param string $tile + * The tile title. + * * @Then I should not see the image :filename in the :tile tile */ - public function assertImageNotPresentInRegion($filename, $tile) { + public function assertImageNotPresentInRegion(string $filename, string $tile): void { $tile = $this->getTileByHeading($tile); Assert::assertFalse($this->findImageInRegion($filename, $tile)); } @@ -346,7 +362,7 @@ public function assertImageNotPresentInRegion($filename, $tile) { * * @Given I maximize the browser window */ - public function maximizeBrowserWindow() { + public function maximizeBrowserWindow(): void { $this->getSession()->getDriver()->maximizeWindow(); } @@ -362,7 +378,7 @@ public function maximizeBrowserWindow() { * * @Then the option :option should be selected */ - public function assertOptionSelected($text) { + public function assertOptionSelected(string $text): void { $option = $this->getSession()->getPage()->find('xpath', '//option[text()="' . $text . '"]'); if (!$option) { @@ -386,7 +402,7 @@ public function assertOptionSelected($text) { * * @Then the option :option should not be selected */ - public function assertOptionNotSelected($text) { + public function assertOptionNotSelected(string $text): void { $option = $this->getSession()->getPage()->find('xpath', '//option[text()="' . $text . '"]'); if (!$option) { @@ -410,7 +426,7 @@ public function assertOptionNotSelected($text) { * * @Then the option with text :option from select :select is selected */ - public function assertFieldOptionSelected($option, $select) { + public function assertFieldOptionSelected(string $option, string $select): void { $element = $this->findSelect($select); if (!$element) { throw new \Exception(sprintf('The select "%s" was not found in the page %s', $select, $this->getSession()->getCurrentUrl())); @@ -440,7 +456,7 @@ public function assertFieldOptionSelected($option, $select) { * * @Then the radio button :radio from field :field should be selected */ - public function assertFieldRadioSelected($radio, $field) { + 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]); @@ -465,9 +481,12 @@ public function assertFieldRadioSelected($radio, $field) { /** * Asserts that the radio button option should be selected. * + * @param string $radio + * The radio button title. + * * @Then the :radio radio button should not be selected */ - public function assertRadioButtonNotChecked($radio) { + public function assertRadioButtonNotChecked(string $radio): void { $session = $this->getSession(); $page = $session->getPage(); $radio = $page->find('named', ['radio', $radio]); @@ -488,7 +507,7 @@ public function assertRadioButtonNotChecked($radio) { * * @Then the option with text :option from select :select is not selected */ - public function assertFieldOptionNotSelected($option, $select) { + public function assertFieldOptionNotSelected(string $option, string $select): void { $selectField = $this->getSession()->getPage()->find('css', $select); if ($selectField === NULL) { throw new \Exception(sprintf('The select "%s" was not found in the page %s', $select, $this->getSession()->getCurrentUrl())); @@ -512,7 +531,7 @@ public function assertFieldOptionNotSelected($option, $select) { * * @Then I should have a :type (content )page titled :title */ - public function assertContentPageByTitle($type, $title) { + public function assertContentPageByTitle(string $type, string $title): void { $type = $this->getEntityByLabel('node_type', $type); // If the node doesn't exist, the exception will be thrown here. $this->getEntityByLabel('node', $title, $type->id()); @@ -604,9 +623,12 @@ public function deleteUser(string $username): void { /** * Click on an element by css class. * + * @param string $element + * The element label to click. + * * @Then /^I click on element "([^"]*)"$/ */ - public function iClickOn($element) { + public function iClickOn(string $element): void { $page = $this->getSession()->getPage(); $findName = $page->find('css', $element); if (!$findName) { @@ -708,7 +730,7 @@ public function assertNoContextualLinksInRegion(string $region): void { * * @When I move the :label slider to the :direction */ - public function moveSlider($label, $direction) { + public function moveSlider(string $label, string $direction): void { // Check that the direction is either 'left' or 'right'. if (!in_array($direction, ['left', 'right'])) { throw new \Exception("The direction $direction is currently not supported. Use either 'left' or 'right'."); @@ -775,9 +797,16 @@ public function clickContextualLinkButton(string $region): void { * * This is intended for verifying things like hover states. * + * @param string $locator + * The xpath locator. + * @param string $element + * The element tag. + * @param string $region + * The region selector. + * * @Then the :locator :element in the :region( region) should not be visible */ - public function assertElementNotVisibleInRegion($locator, $element, $region) { + public function assertElementNotVisibleInRegion(string $locator, string $element, string $region): void { $element = $this->findNamedElementInRegion($locator, $element, $region); $this->assertNotVisuallyVisible($element); } @@ -791,9 +820,16 @@ public function assertElementNotVisibleInRegion($locator, $element, $region) { * * This is intended for verifying things like hover states. * + * @param string $locator + * The xpath locator. + * @param string $element + * The element tag. + * @param string $region + * The region selector. + * * @Then the :locator :element in the :region( region) should be visible */ - public function assertElementVisibleInRegion($locator, $element, $region) { + public function assertElementVisibleInRegion(string $locator, string $element, string $region): void { $element = $this->findNamedElementInRegion($locator, $element, $region); $this->assertVisuallyVisible($element); } @@ -809,7 +845,7 @@ public function assertElementVisibleInRegion($locator, $element, $region) { * * @When I click( the) :tab tab */ - public function clickVerticalTabLink($tab) { + public function clickVerticalTabLink(string $tab): void { // When this is running in a browser without JavaScript the vertical tabs // are rendered as a details element. if (!$this->browserSupportsJavaScript()) { @@ -830,7 +866,7 @@ public function clickVerticalTabLink($tab) { * * @Then the :tab tab should be active */ - public function assertVerticalTabActive($tab) { + public function assertVerticalTabActive(string $tab): void { $element = $this->findVerticalTab($tab); if (!$element->hasClass('is-selected')) { @@ -845,7 +881,7 @@ public function assertVerticalTabActive($tab) { * * @beforeScenario @terms */ - public function provideTestingTerms() { + public function provideTestingTerms(): void { $fixture = file_get_contents(__DIR__ . '/../../fixtures/testing_terms.yml'); $hierarchy = Yaml::decode($fixture); foreach ($hierarchy as $vid => $terms) { @@ -893,7 +929,7 @@ public function provideTestingTerms() { * * @When I fill in :field with values :values */ - public function fillFieldWithValues($field, $values) { + public function fillFieldWithValues(string $field, string $values): void { $values = $this->explodeCommaSeparatedStepArgument($values); /** @var \Behat\Mink\Element\NodeElement[] $items */ @@ -923,7 +959,7 @@ public function fillFieldWithValues($field, $values) { * * @Then I should not see the :region region */ - public function assertRegionNotPresent($region) { + public function assertRegionNotPresent(string $region): void { $session = $this->getSession(); $element = $session->getPage()->find('region', $region); if ($element) { @@ -944,7 +980,7 @@ public function assertRegionNotPresent($region) { * * @Then the HTML title of the page should be :text */ - public function assertPageTitleTagContainsText(string $text) { + public function assertPageTitleTagContainsText(string $text): void { $session = $this->getSession(); $page_title = $session->getPage()->find('xpath', '//head/title'); if (!$page_title) { @@ -965,9 +1001,12 @@ public function assertPageTitleTagContainsText(string $text) { /** * Asserts that the page contains a certain capitalised heading. * + * @param string $heading + * The heading to search for. + * * @Then I (should )see the capitalised heading :heading */ - public function assertCapitalisedHeading($heading) { + public function assertCapitalisedHeading(string $heading): void { $heading = strtoupper($heading); $element = $this->getSession()->getPage(); foreach (array('h1', 'h2', 'h3', 'h4', 'h5', 'h6') as $tag) { @@ -989,9 +1028,12 @@ public function assertCapitalisedHeading($heading) { * | Heading 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $headingsTable + * A list of headings. + * * @Then I (should )see the following headings: */ - public function assertHeadings(TableNode $headingsTable) { + public function assertHeadings(TableNode $headingsTable): void { $page = $this->getSession()->getPage(); $headings = $headingsTable->getColumn(0); foreach (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as $tag) { @@ -1017,9 +1059,12 @@ public function assertHeadings(TableNode $headingsTable) { * | Heading 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $headingsTable + * A list of headings. + * * @Then I should not see the following headings: */ - public function assertNoHeadings(TableNode $headingsTable) { + public function assertNoHeadings(TableNode $headingsTable): void { $page = $this->getSession()->getPage(); $headings = $headingsTable->getColumn(0); $found_headings = []; @@ -1045,9 +1090,12 @@ public function assertNoHeadings(TableNode $headingsTable) { * | Text 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $table + * A list of texts. + * * @Then I (should )see the following lines of text: */ - public function assertTexts(TableNode $table) { + public function assertTexts(TableNode $table): void { $lines = $table->getColumn(0); $errors = []; foreach ($lines as $line) { @@ -1071,9 +1119,12 @@ public function assertTexts(TableNode $table) { * | Text 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $table + * A list of texts. + * * @Then I should not see the following lines of text: */ - public function assertNoTexts(TableNode $table) { + public function assertNoTexts(TableNode $table): void { $lines = $table->getColumn(0); $errors = []; foreach ($lines as $line) { @@ -1097,9 +1148,12 @@ public function assertNoTexts(TableNode $table) { * | Link text 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $table + * A list of links. + * * @Then I (should )see the following links: */ - public function assertLinks(TableNode $table) { + public function assertLinks(TableNode $table): void { $links = $table->getColumn(0); $errors = []; foreach ($links as $link) { @@ -1121,9 +1175,12 @@ public function assertLinks(TableNode $table) { * | Link text 2 | * | ... | * + * @param \Behat\Gherkin\Node\TableNode $table + * A list of links. + * * @Then I should not see the following links: */ - public function assertNoLinks(TableNode $table) { + public function assertNoLinks(TableNode $table): void { $links = $table->getColumn(0); $errors = []; foreach ($links as $link) { @@ -1142,7 +1199,7 @@ public function assertNoLinks(TableNode $table) { * * @Then the page should be cacheable */ - public function assertPageCacheable() { + public function assertPageCacheable(): void { Assert::assertTrue($this->isPageCacheable()); } @@ -1151,7 +1208,7 @@ public function assertPageCacheable() { * * @Then the page should not be cacheable */ - public function assertPageNotCacheable() { + public function assertPageNotCacheable(): void { Assert::assertFalse($this->isPageCacheable()); } @@ -1160,7 +1217,7 @@ public function assertPageNotCacheable() { * * @Then the page should be cached */ - public function assertPageCached() { + public function assertPageCached(): void { Assert::assertTrue($this->isPageCached()); } @@ -1169,7 +1226,7 @@ public function assertPageCached() { * * @Then the page should not be cached */ - public function assertPageNotCached() { + public function assertPageNotCached(): void { Assert::assertFalse($this->isPageCached()); } @@ -1187,7 +1244,7 @@ public function assertPageNotCached() { * * @Then the row :text is selected/checked */ - public function assertRowIsChecked($text) { + public function assertRowIsChecked(string $text): void { if (!$this->getCheckboxOrRadioByRowText($text)->isChecked()) { throw new ExpectationException("Checkbox/radio-button in '$text' row is unchecked/unselected but it should be checked/selected.", $this->getSession()->getDriver()); } @@ -1207,7 +1264,7 @@ public function assertRowIsChecked($text) { * * @Then the row :text is not selected/checked */ - public function assertRowIsNotChecked($text) { + public function assertRowIsNotChecked(string $text): void { if ($this->getCheckboxOrRadioByRowText($text)->isChecked()) { throw new ExpectationException("Checkbox/radio-button in '$text' row is checked/selected but it should be unchecked/unselected.", $this->getSession()->getDriver()); } @@ -1299,7 +1356,7 @@ protected function getCheckboxOrRadioByRowText(string $text): NodeElement { * * @Given I wait for the batch process to finish */ - public function waitForBatchProcess() { + public function waitForBatchProcess(): void { while ($refresh = $this->getSession() ->getPage() ->find('css', 'meta[http-equiv="Refresh"]')) { @@ -1336,6 +1393,9 @@ public function waitForBatchProcess() { * @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. + * * @AfterStep */ public function clearCacheTagsStaticCache(AfterStepScope $event): void { @@ -1360,16 +1420,19 @@ public function clearCacheTagsStaticCache(AfterStepScope $event): void { * * @AfterStep */ - public function indexEntities() { + public function indexEntities(): void { \Drupal::service('search_api.post_request_indexing')->destruct(); } /** * Waits until a text is dynamically added to the page. * + * @param string $text + * The text to search for. + * * @Given I wait until the page contains the text :text */ - public function iWaitUntilPageContains($text) { + public function iWaitUntilPageContains(string $text): void { $text = addslashes($text); $this->getSession()->wait(60000, "jQuery(':contains(\"$text\")').length > 0" @@ -1379,9 +1442,12 @@ public function iWaitUntilPageContains($text) { /** * Strips elements from tables that are only readable by screen readers. * + * @param \LoversOfBehat\TableExtension\Hook\Scope\AfterTableFetchScope $scope + * The scope class. + * * @AfterTableFetch */ - public static function stripScreenReaderElements(AfterTableFetchScope $scope) { + public static function stripScreenReaderElements(AfterTableFetchScope $scope): void { $html_manipulator = new HtmlManipulator($scope->getHtml()); $scope->setHtml($html_manipulator->removeElements('.visually-hidden')->html()); } @@ -1440,7 +1506,7 @@ public function fillAutoCompleteField(string $field, string $value): void { * * @BeforeScenario @commitSearchIndex */ - public function commitSearchIndexBeforeScenario() { + public function commitSearchIndexBeforeScenario(): void { $this->commitSearchIndex(); } @@ -1449,7 +1515,7 @@ public function commitSearchIndexBeforeScenario() { * * @BeforeScenario @errorPage */ - public function installErrorPageTestingModule() { + public function installErrorPageTestingModule(): void { static::toggleModule('install', 'error_page_test'); // The test writes to the PHP error log because it's in its scope to test @@ -1490,7 +1556,7 @@ public function uninstallErrorPageTestingModule(): void { * * @Given the site error reporting verbosity is( set to) :error_level */ - public function setSiteErrorLevel(string $error_level = NULL) { + public function setSiteErrorLevel(string $error_level = NULL): void { static $original_error_level; $config = \Drupal::configFactory()->getEditable('system.logging'); @@ -1513,7 +1579,7 @@ public function setSiteErrorLevel(string $error_level = NULL) { * * @param string $vocabulary_name * The name of the vocabulary. - * @param string $terme_name + * @param string $term_name * The term name. * @param string $format * The RDF serialization format. From 16771616b9adc80605eb90ababc56f84882fbb4b Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 14 Jan 2020 16:48:45 +0200 Subject: [PATCH 029/957] ISAICP-5406: Fix the abstract of the front page meta tag. --- config/sync/metatag.metatag_defaults.front.yml | 2 +- tests/features/joinup_seo/basic_metatags.feature | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.front.yml b/config/sync/metatag.metatag_defaults.front.yml index 04b1c20097..c5c98d417d 100644 --- a/config/sync/metatag.metatag_defaults.front.yml +++ b/config/sync/metatag.metatag_defaults.front.yml @@ -7,7 +7,7 @@ _core: id: front label: 'Front page' tags: - abstract: 'It offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' + abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' title: '[site:name]' shortlink: '[site:url]' diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature index 05432e63a1..7c9aea4858 100644 --- a/tests/features/joinup_seo/basic_metatags.feature +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -8,7 +8,7 @@ Feature: Given I am When I am on the homepage Then the "description" metatag should be set to "Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme." - And the "abstract" metatag should be set to "It offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions." + And the "abstract" metatag should be set to "Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions." And the HTML title of the page should be "Joinup" Examples: From 32f83568489ee11f921646dd8b76f52f2f128dbc Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 20 Jan 2020 08:13:04 +0200 Subject: [PATCH 030/957] ISAICP-5407: Split news to a separate sitemap. --- config/sync/language.content_settings.node.news.yml | 11 +++++++++++ ...mple_sitemap.bundle_settings.default.node.news.yml | 6 +++--- .../simple_sitemap.bundle_settings.news.node.news.yml | 4 ++++ .../sync/simple_sitemap.variants.default_hreflang.yml | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 config/sync/language.content_settings.node.news.yml create mode 100644 config/sync/simple_sitemap.bundle_settings.news.node.news.yml diff --git a/config/sync/language.content_settings.node.news.yml b/config/sync/language.content_settings.node.news.yml new file mode 100644 index 0000000000..24eb219b40 --- /dev/null +++ b/config/sync/language.content_settings.node.news.yml @@ -0,0 +1,11 @@ +uuid: ab29d843-c4c9-4c1a-8563-b49a6bbc3958 +langcode: en +status: true +dependencies: + config: + - node.type.news +id: node.news +target_entity_type_id: node +target_bundle: news +default_langcode: site_default +language_alterable: false diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml index 6da10af2c4..f5fcb338b4 100644 --- a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml +++ b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml @@ -1,6 +1,6 @@ -index: true -priority: '0.5' -changefreq: weekly +index: false +priority: '1.0' +changefreq: daily include_images: false _core: default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.news.node.news.yml b/config/sync/simple_sitemap.bundle_settings.news.node.news.yml new file mode 100644 index 0000000000..dc7583e1e5 --- /dev/null +++ b/config/sync/simple_sitemap.bundle_settings.news.node.news.yml @@ -0,0 +1,4 @@ +index: true +priority: '1.0' +changefreq: hourly +include_images: false diff --git a/config/sync/simple_sitemap.variants.default_hreflang.yml b/config/sync/simple_sitemap.variants.default_hreflang.yml index edb2d0ee47..cd000ca618 100644 --- a/config/sync/simple_sitemap.variants.default_hreflang.yml +++ b/config/sync/simple_sitemap.variants.default_hreflang.yml @@ -2,5 +2,8 @@ variants: default: label: Default weight: 0 + news: + label: News + weight: 1 _core: default_config_hash: nQAXscP-SDpsmqHlQ6u0iBvcuJPrAikb09c3cP2_n0k From 20ef736162fbd8094f8dc9ea196953b03a06f7c1 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 13:35:17 +0200 Subject: [PATCH 031/957] ISAICP-5407: Provide the new generator plugins and a new sitemap type for news. --- .../custom/joinup_seo/joinup_seo.module | 21 ++ .../SitemapType/LatestNewsSitemapType.php | 23 +++ .../UrlGenerator/JoinupEntityUrlGenerator.php | 32 +++ .../UrlGenerator/JoinupUrlGeneratorBase.php | 182 ++++++++++++++++++ .../UrlGenerator/LatestNewsUrlGenerator.php | 31 +++ 5 files changed, 289 insertions(+) create mode 100644 web/modules/custom/joinup_seo/joinup_seo.module create mode 100644 web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php create mode 100755 web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupEntityUrlGenerator.php create mode 100644 web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php create mode 100755 web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module new file mode 100644 index 0000000000..848ff19f46 --- /dev/null +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -0,0 +1,21 @@ +condition('published_at', $two_days_ago, '<'); + } + } + +} diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php new file mode 100644 index 0000000000..c8ee52c796 --- /dev/null +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -0,0 +1,182 @@ +urlGeneratorManager = $url_generator_manager; + $this->relationManager = $relation_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('simple_sitemap.generator'), + $container->get('simple_sitemap.logger'), + $container->get('language_manager'), + $container->get('entity_type.manager'), + $container->get('simple_sitemap.entity_helper'), + $container->get('plugin.manager.simple_sitemap.url_generator'), + $container->get('joinup_core.relations_manager') + ); + } + + /** + * Returns an array of datasets to be processed. + * + * @return array + * An array of arrays, each of which contains the entity key and entity id. + */ + public function getDataSets(): array { + $data_sets = []; + $sitemap_entity_types = $this->entityHelper->getSupportedEntityTypes(); + + foreach ($this->generator->setVariants($this->sitemapVariant)->getBundleSettings() as $entity_type_id => $bundles) { + if (isset($sitemap_entity_types[$entity_type_id])) { + + // Skip this entity type if another plugin is written to override its + // generation. + foreach ($this->urlGeneratorManager->getDefinitions() as $plugin) { + if (isset($plugin['settings']['overrides_entity_type']) + && $plugin['settings']['overrides_entity_type'] === $entity_type_id) { + continue 2; + } + } + + $entityTypeStorage = $this->entityTypeManager->getStorage($entity_type_id); + $keys = $sitemap_entity_types[$entity_type_id]->getKeys(); + + foreach ($bundles as $bundle_name => $bundle_settings) { + if (!empty($bundle_settings['index'])) { + $query = $entityTypeStorage->getQuery(); + + if (empty($keys['id'])) { + $query->sort($keys['id'], 'ASC'); + } + if (!empty($keys['bundle'])) { + $query->condition($keys['bundle'], $bundle_name); + } + if (!empty($keys['status'])) { + $query->condition($keys['status'], 1); + } + + // Mainly this is the only line we need but we need to override the + // whole method. + $this->alterQuery($query, $entity_type_id, $bundle_name, $bundle_settings); + + foreach ($query->execute() as $entity_id) { + $data_sets[] = [ + 'entity_type' => $entity_type_id, + 'id' => $entity_id, + ]; + } + } + } + } + } + + return $data_sets; + } + + /** + * {@inheritdoc} + */ + protected function processDataSet($data_set) { + if (empty($entity = $this->entityTypeManager->getStorage($data_set['entity_type'])->load($data_set['id']))) { + return FALSE; + } + + // In case the entity type is a node, we also need to also take into account + // the status of the parent. + if ($entity->getEntityTypeId() === 'node') { + $parent = $this->relationManager->getParent($entity); + if (empty($parent) || !$parent->isPublished()) { + return FALSE; + } + } + + // Not overriding the rest of the method will cause the entity to again be + // loaded but at this point, it is stored in the static cache so there + // should be minimal performance impact with better code readability. + return parent::processDataSet($data_set); + } + + /** + * Alters the query that is responsible for fetching entities for the sitemap. + * + * @param \Drupal\Core\Entity\Query\QueryInterface $query + * The query object before being executed. + * @param string $entity_type_id + * The entity type id of the query. + * @param string $bundle + * The entity bundle passed in the query. + * @param array $bundle_settings + * The sitemap bundle settings. + */ + abstract public function alterQuery(QueryInterface $query, string $entity_type_id, string $bundle, array $bundle_settings): void; + +} diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php new file mode 100755 index 0000000000..7ea67483ce --- /dev/null +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php @@ -0,0 +1,31 @@ +condition('published_at', PUBLICATION_DATE_DEFAULT, '<'); + $query->condition('published_at', $two_days_ago, '>='); + } + +} From 3018d42c5bb9a437d1e19d66dfd545f3a3836617 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 13:37:34 +0200 Subject: [PATCH 032/957] ISAICP-5407: Update the settings to match the new sitemap plugins. --- .../simple_sitemap.bundle_settings.default.node.news.yml | 6 +++--- .../sync/simple_sitemap.bundle_settings.news.node.news.yml | 2 +- config/sync/simple_sitemap.variants.default_hreflang.yml | 3 --- config/sync/simple_sitemap.variants.latest_news.yml | 4 ++++ 4 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 config/sync/simple_sitemap.variants.latest_news.yml diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml index f5fcb338b4..8ff3792439 100644 --- a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml +++ b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml @@ -1,6 +1,6 @@ -index: false -priority: '1.0' -changefreq: daily +index: true +priority: '0.5' +changefreq: hourly include_images: false _core: default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ diff --git a/config/sync/simple_sitemap.bundle_settings.news.node.news.yml b/config/sync/simple_sitemap.bundle_settings.news.node.news.yml index dc7583e1e5..e81f4c9517 100644 --- a/config/sync/simple_sitemap.bundle_settings.news.node.news.yml +++ b/config/sync/simple_sitemap.bundle_settings.news.node.news.yml @@ -1,4 +1,4 @@ index: true priority: '1.0' changefreq: hourly -include_images: false +include_images: true diff --git a/config/sync/simple_sitemap.variants.default_hreflang.yml b/config/sync/simple_sitemap.variants.default_hreflang.yml index cd000ca618..edb2d0ee47 100644 --- a/config/sync/simple_sitemap.variants.default_hreflang.yml +++ b/config/sync/simple_sitemap.variants.default_hreflang.yml @@ -2,8 +2,5 @@ variants: default: label: Default weight: 0 - news: - label: News - weight: 1 _core: default_config_hash: nQAXscP-SDpsmqHlQ6u0iBvcuJPrAikb09c3cP2_n0k diff --git a/config/sync/simple_sitemap.variants.latest_news.yml b/config/sync/simple_sitemap.variants.latest_news.yml new file mode 100644 index 0000000000..8cbdaa0643 --- /dev/null +++ b/config/sync/simple_sitemap.variants.latest_news.yml @@ -0,0 +1,4 @@ +variants: + news: + label: News + weight: 1 From e0f070a05ed1e577349d26b6843a277579447862 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 14:04:56 +0200 Subject: [PATCH 033/957] ISAICP-5407: Fix the constructor definition. --- .../UrlGenerator/JoinupUrlGeneratorBase.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index c8ee52c796..62c7aaee75 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -44,8 +44,8 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * The configuration array. * @param string $plugin_id * The plugin id. - * @param \Drupal\Component\Plugin\Definition\PluginDefinitionInterface $plugin_definition - * The plugin definition. + * @param array $plugin_definition + * The plugin definition array. * @param \Drupal\simple_sitemap\Simplesitemap $generator * The sitemap generator service. * @param \Drupal\simple_sitemap\Logger $logger @@ -61,8 +61,8 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager * The joinup relation manager service. */ - public function __construct(array $configuration, string $plugin_id, PluginDefinitionInterface $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_manager) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $generator, $logger, $language_manager, $entity_type_manager, $entityHelper); + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_manager) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $generator, $logger, $language_manager, $entity_type_manager, $entityHelper, $url_generator_manager); $this->urlGeneratorManager = $url_generator_manager; $this->relationManager = $relation_manager; } From c1e0fc025e3de7504fec719750d4dcd0a456b447 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 14:06:05 +0200 Subject: [PATCH 034/957] ISAICP-5407: Update the test to match the separated sitemaps. --- tests/features/joinup_seo/sitemap.feature | 35 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature index ddcc336ecb..4381d05ce4 100644 --- a/tests/features/joinup_seo/sitemap.feature +++ b/tests/features/joinup_seo/sitemap.feature @@ -65,14 +65,13 @@ Feature: | Sitemap discussion validated | | Sitemap document validated | | Sitemap event validated | - | Sitemap news validated | But I should not see the absolute urls of the following RDF entities: | Sitemap collection draft | | Sitemap solution draft | | Sitemap release 2 | - | Sitemap distribution | - | Sitemap licence | + | Sitemap distribution | + | Sitemap licence | | Sitemap owner | | Sitemap secreteriat | And I should not see the absolute urls of the following content entities: @@ -84,4 +83,34 @@ Feature: | Sitemap event draft | | Sitemap event validated but parent is not | | Sitemap news draft | + | Sitemap news validated | + | Sitemap news validated but parent is not | + + When I visit "/news/sitemap.xml" + And I should see the absolute urls of the following content entities: + | Sitemap news validated | + + But I should not see the absolute urls of the following RDF entities: + | Sitemap collection draft | + | Sitemap collection validated | + | Sitemap distribution | + | Sitemap solution draft | + | Sitemap solution validated | + | Sitemap release 1 | + | Sitemap release 2 | + | Sitemap licence | + | Sitemap owner | + | Sitemap secreteriat | + And I should not see the absolute urls of the following content entities: + | Sitemap custom page of draft | + | Sitemap discussion draft | + | Sitemap discussion validated | + | Sitemap discussion validated but parent is not | + | Sitemap document draft | + | Sitemap document validated | + | Sitemap document validated but parent is not | + | Sitemap event draft | + | Sitemap event validated | + | Sitemap event validated but parent is not | + | Sitemap news draft | | Sitemap news validated but parent is not | From ce9579c5642517f5d9d6822fa35a28b7ff4a5399 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 14:10:22 +0200 Subject: [PATCH 035/957] ISAICP-5407: Allow for publication date to be preset in tests. --- web/profiles/joinup/joinup.behat.inc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 2514d93ddb..26f11ce3ce 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -640,6 +640,17 @@ class JoinupSubContext extends DrupalSubContextBase { ]); } + if (property_exists($node, 'published_at') && !empty($node->published_at)) { + // If the entry is not numeric, then it means that the user has provided a + // human readable version of the timestamp. + // Example: Sun, 01 Dec 2019 13:00:00 +0100. + // 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)) { + $node->published_at = strtotime($node->published_at); + } + } + // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -701,6 +712,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'keywords' => 'field_keywords', 'spatial coverage' => 'field_news_spatial_coverage', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'shared' => [ 'collection' => OgGroupAudienceHelperInterface::DEFAULT_FIELD, From 6439ecfd0e1f179350a412054308a84edf5e4d8c Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 14:18:03 +0200 Subject: [PATCH 036/957] ISAICP-5407: Provide a test with proper publication dates. --- tests/features/joinup_seo/sitemap.feature | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature index 4381d05ce4..26e136087e 100644 --- a/tests/features/joinup_seo/sitemap.feature +++ b/tests/features/joinup_seo/sitemap.feature @@ -34,10 +34,11 @@ Feature: | Sitemap custom page of draft | Sitemap collection draft | N/A | logo.png | | Sitemap custom page of validated | Sitemap collection validated | N/A | logo.png | And news content: - | title | headline | body | solution | state | - | Sitemap news draft | Sitemap news | Sitemap news body | Sitemap solution validated | draft | - | Sitemap news validated | Sitemap news | Sitemap news body | Sitemap solution validated | validated | - | Sitemap news validated but parent is not | Sitemap news | Sitemap news body | Sitemap solution draft | validated | + | title | headline | body | solution | state | publication date | + | Sitemap news draft | Sitemap news | Sitemap news body | Sitemap solution validated | draft | | + | Sitemap news validated and recent | Sitemap news | Sitemap news body | Sitemap solution validated | validated | 1 day ago | + | Sitemap news validated but old | Sitemap news | Sitemap news body | Sitemap solution validated | validated | 2 months ago | + | Sitemap news validated but parent is not | Sitemap news | Sitemap news body | Sitemap solution draft | validated | Sun, 01 Dec 2019 13:00:00 +0100 | And event content: | title | short title | body | agenda | location | organisation | scope | solution | state | | Sitemap event draft | Sitemap event draft | It will include fireworks | Event agenda. | Some place | European Commission | International | Sitemap solution validated | draft | @@ -65,6 +66,7 @@ Feature: | Sitemap discussion validated | | Sitemap document validated | | Sitemap event validated | + | Sitemap news validated but old | But I should not see the absolute urls of the following RDF entities: | Sitemap collection draft | @@ -83,12 +85,12 @@ Feature: | Sitemap event draft | | Sitemap event validated but parent is not | | Sitemap news draft | - | Sitemap news validated | + | Sitemap news validated and recent | | Sitemap news validated but parent is not | When I visit "/news/sitemap.xml" And I should see the absolute urls of the following content entities: - | Sitemap news validated | + | Sitemap news validated and recent | But I should not see the absolute urls of the following RDF entities: | Sitemap collection draft | @@ -113,4 +115,5 @@ Feature: | Sitemap event validated | | Sitemap event validated but parent is not | | Sitemap news draft | + | Sitemap news validated but old | | Sitemap news validated but parent is not | From 85f3001bd71aeafb75a8e9560c2379b3bf7e90f7 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 14:20:23 +0200 Subject: [PATCH 037/957] ISAICP-5407: Forgot to remove this usage statement. --- .../simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index 62c7aaee75..36271e85fe 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -4,7 +4,6 @@ namespace Drupal\joinup_seo\Plugin\simple_sitemap\UrlGenerator; -use Drupal\Component\Plugin\Definition\PluginDefinitionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Query\QueryInterface; use Drupal\Core\Language\LanguageManagerInterface; From 823259adad16034899f8ce7ff87a1f93c80a4f9d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 15:30:31 +0200 Subject: [PATCH 038/957] ISAICP-5407: Extend the tests to cover the case where the news are getting old. --- tests/features/joinup_seo/sitemap.feature | 40 +++++++++++++++++++++++ web/profiles/joinup/joinup.behat.inc | 32 ++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature index 26e136087e..226660ce00 100644 --- a/tests/features/joinup_seo/sitemap.feature +++ b/tests/features/joinup_seo/sitemap.feature @@ -117,3 +117,43 @@ Feature: | Sitemap news draft | | Sitemap news validated but old | | Sitemap news validated but parent is not | + + # Simulate that 2 days have passed since last time the sitemaps have been created. + When the publication date of the "Sitemap news validated and recent" news content is changed to "3 days ago" + And I run cron + # Assert that the "Sitemap news validated and recent" is now part of the generic + And I visit "/sitemap.xml" + Then I should see the absolute urls of the following RDF entities: + | Sitemap collection validated | + | Sitemap solution validated | + | Sitemap release 1 | + And I should see the absolute urls of the following content entities: + | Sitemap custom page of validated | + | Sitemap discussion validated | + | Sitemap document validated | + | Sitemap event validated | + | Sitemap news validated and recent | + | Sitemap news validated but old | + + But I should not see the absolute urls of the following RDF entities: + | Sitemap collection draft | + | Sitemap solution draft | + | Sitemap release 2 | + | Sitemap distribution | + | Sitemap licence | + | Sitemap owner | + | Sitemap secreteriat | + And I should not see the absolute urls of the following content entities: + | Sitemap custom page of draft | + | Sitemap discussion draft | + | Sitemap discussion validated but parent is not | + | Sitemap document draft | + | Sitemap document validated but parent is not | + | Sitemap event draft | + | Sitemap event validated but parent is not | + | Sitemap news draft | + | Sitemap news validated but parent is not | + + # The sitemap has been removed and the page is invalid since no entries are in there. + When I go to "/news/sitemap.xml" + Then the response status code should be 404 diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 26f11ce3ce..c16622d197 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -2757,6 +2757,38 @@ JS; } } + /** + * Changes the publication date of an entity. + * + * @param string $title + * The title of the entity. + * @param string $bundle + * The bundle of the entity. + * @param string $entity_type_id + * The entity type id. Either 'content' or 'rdf entity' is accepted. + * @param string $new_publication_date + * The new publication date. + * + * @throws \InvalidArgumentException + * Thrown when one of the parameters is not correct. + * + * @Given the publication date of the :title :bundle :entity_type_id is changed to :new_value + */ + public function givenPublicationDateChanged(string $title, string $bundle, string $entity_type_id, string $new_publication_date): void { + if (!in_array($entity_type_id, ['content', 'rdf entity'])) { + throw new \InvalidArgumentException('Only "content" and "rdf entity" are allowed for the $entity_type_id parameter.'); + } + $entity_type_id = $entity_type_id === 'content' ? 'node' : 'rdf_entity'; + $entity = $this->getEntityByLabel($entity_type_id, $title, $bundle); + $publication_date = is_numeric($new_publication_date) ? ((int) $new_publication_date) : strtotime($new_publication_date); + if (empty($new_publication_date)) { + throw new \InvalidArgumentException("'{$new_publication_date}' could not be converted to a proper timestamp."); + } + + $entity->set('published_at', $publication_date); + $entity->save(); + } + /** * Asserts that the absolute url of an rdf entity exists as a link. * From 1c57a68ad2124c0eb9b941c5aefbccfe288e3238 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 15:40:36 +0200 Subject: [PATCH 039/957] ISAICP-5407: Declare that news don't change often when they get old. --- .../sync/simple_sitemap.bundle_settings.default.node.news.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml index 8ff3792439..6da10af2c4 100644 --- a/config/sync/simple_sitemap.bundle_settings.default.node.news.yml +++ b/config/sync/simple_sitemap.bundle_settings.default.node.news.yml @@ -1,6 +1,6 @@ index: true priority: '0.5' -changefreq: hourly +changefreq: weekly include_images: false _core: default_config_hash: C1qobnpweWVmXjlRDpRDIa6ulqsasAUvlpjeOjyF_HQ From e064a21c3fbcd0af93110bcc2bddf22bc991d7f9 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 21 Jan 2020 16:12:10 +0200 Subject: [PATCH 040/957] ISAICP-5407: Copy the installed config over to the config/install directory of the joinup_seo module. --- ...mple_sitemap.bundle_settings.news.node.news.yml | 4 ++++ .../simple_sitemap.custom_links.default.yml | 5 +++++ .../config/install/simple_sitemap.settings.yml | 14 ++++++++++++++ .../simple_sitemap.variants.default_hreflang.yml | 4 ++++ .../simple_sitemap.variants.latest_news.yml | 4 ++++ web/modules/custom/joinup_seo/joinup_seo.info.yml | 5 +++++ 6 files changed, 36 insertions(+) create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.news.node.news.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.custom_links.default.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.default_hreflang.yml create mode 100644 web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.latest_news.yml diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.news.node.news.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.news.node.news.yml new file mode 100644 index 0000000000..e81f4c9517 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.bundle_settings.news.node.news.yml @@ -0,0 +1,4 @@ +index: true +priority: '1.0' +changefreq: hourly +include_images: true diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.custom_links.default.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.custom_links.default.yml new file mode 100644 index 0000000000..7d9aed84b7 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.custom_links.default.yml @@ -0,0 +1,5 @@ +links: + - + path: / + priority: '1.0' + changefreq: daily diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml new file mode 100644 index 0000000000..6c6c93bbcb --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.settings.yml @@ -0,0 +1,14 @@ +max_links: 2000 +cron_generate: true +cron_generate_interval: 0 +generate_duration: 20000 +remove_duplicates: true +skip_untranslated: true +xsl: false +base_url: '' +default_variant: default +custom_links_include_images: false +excluded_languages: { } +enabled_entity_types: + - node + - rdf_entity diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.default_hreflang.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.default_hreflang.yml new file mode 100644 index 0000000000..3daedf6377 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.default_hreflang.yml @@ -0,0 +1,4 @@ +variants: + default: + label: Default + weight: 0 diff --git a/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.latest_news.yml b/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.latest_news.yml new file mode 100644 index 0000000000..8cbdaa0643 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/simple_sitemap.variants.latest_news.yml @@ -0,0 +1,4 @@ +variants: + news: + label: News + weight: 1 diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index 4ac46a6039..f704cc3bf1 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -17,3 +17,8 @@ config_devel: - simple_sitemap.bundle_settings.default.rdf_entity.asset_release - simple_sitemap.bundle_settings.default.rdf_entity.collection - simple_sitemap.bundle_settings.default.rdf_entity.solution + - simple_sitemap.bundle_settings.news.node.news + - simple_sitemap.custom_links.default + - simple_sitemap.settings + - simple_sitemap.variants.default_hreflang + - simple_sitemap.variants.latest_news From a1aec9cd7e43db2f824508cc55be19dfef1aed6c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 22 Jan 2020 15:41:03 +0200 Subject: [PATCH 041/957] ISAICP-5407: Fix typo. --- tests/features/joinup_seo/sitemap.feature | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature index 226660ce00..10304ec2ef 100644 --- a/tests/features/joinup_seo/sitemap.feature +++ b/tests/features/joinup_seo/sitemap.feature @@ -9,20 +9,20 @@ Feature: | name | type | | Sitemap owner | Company | And the following contact: - | name | Sitemap secreteriat | - | email | sitemap.secreteriat@example.com | + | name | Sitemap secretariat | + | email | sitemap.secretariat@example.com | And the following collections: | title | state | | Sitemap collection draft | draft | | Sitemap collection validated | validated | And the following solutions: | title | description | owner | contact information | collection | state | - | Sitemap solution draft | Sitemap keywords everywhere | Sitemap owner | Sitemap secreteriat | Sitemap collection validated | draft | - | Sitemap solution validated | Sitemap keywords everywhere | Sitemap owner | Sitemap secreteriat | Sitemap collection validated | validated | + | Sitemap solution draft | Sitemap keywords everywhere | Sitemap owner | Sitemap secretariat | Sitemap collection validated | draft | + | Sitemap solution validated | Sitemap keywords everywhere | Sitemap owner | Sitemap secretariat | Sitemap collection validated | validated | And the following releases: | title | release number | release notes | is version of | owner | contact information | state | - | Sitemap release 1 | 1 | New release | Sitemap solution validated | Sitemap owner | Sitemap secreteriat | validated | - | Sitemap release 2 | 2 | Newer release | Sitemap solution validated | Sitemap owner | Sitemap secreteriat | draft | + | Sitemap release 1 | 1 | New release | Sitemap solution validated | Sitemap owner | Sitemap secretariat | validated | + | Sitemap release 2 | 2 | Newer release | Sitemap solution validated | Sitemap owner | Sitemap secretariat | draft | And the following distributions: | title | description | parent | access url | | Sitemap distribution | Some kind of download | Sitemap release 1 | test.zip | @@ -75,7 +75,7 @@ Feature: | Sitemap distribution | | Sitemap licence | | Sitemap owner | - | Sitemap secreteriat | + | Sitemap secretariat | And I should not see the absolute urls of the following content entities: | Sitemap custom page of draft | | Sitemap discussion draft | @@ -102,7 +102,7 @@ Feature: | Sitemap release 2 | | Sitemap licence | | Sitemap owner | - | Sitemap secreteriat | + | Sitemap secretariat | And I should not see the absolute urls of the following content entities: | Sitemap custom page of draft | | Sitemap discussion draft | @@ -142,7 +142,7 @@ Feature: | Sitemap distribution | | Sitemap licence | | Sitemap owner | - | Sitemap secreteriat | + | Sitemap secretariat | And I should not see the absolute urls of the following content entities: | Sitemap custom page of draft | | Sitemap discussion draft | From 07022bcaf8a7d5a54db65b9dd150e5996fd6242a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 22 Jan 2020 15:48:17 +0200 Subject: [PATCH 042/957] ISAICP-5407: Update documentation. --- tests/features/joinup_seo/sitemap.feature | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/features/joinup_seo/sitemap.feature b/tests/features/joinup_seo/sitemap.feature index 10304ec2ef..8bc9586423 100644 --- a/tests/features/joinup_seo/sitemap.feature +++ b/tests/features/joinup_seo/sitemap.feature @@ -88,6 +88,8 @@ Feature: | Sitemap news validated and recent | | Sitemap news validated but parent is not | + # Check the dedicated sitemap for news articles that only contains hot news + # topics published in the last 2 days. When I visit "/news/sitemap.xml" And I should see the absolute urls of the following content entities: | Sitemap news validated and recent | @@ -121,7 +123,8 @@ Feature: # Simulate that 2 days have passed since last time the sitemaps have been created. When the publication date of the "Sitemap news validated and recent" news content is changed to "3 days ago" And I run cron - # Assert that the "Sitemap news validated and recent" is now part of the generic + # Assert that the "Sitemap news validated and recent" news article is no + # longer considered as a hot topic and has moved to the standard sitemap. And I visit "/sitemap.xml" Then I should see the absolute urls of the following RDF entities: | Sitemap collection validated | @@ -154,6 +157,7 @@ Feature: | Sitemap news draft | | Sitemap news validated but parent is not | - # The sitemap has been removed and the page is invalid since no entries are in there. + # The hot news article is now removed from the news sitemap, and the page + # should no longer be present since it doesn't contain any more entries. When I go to "/news/sitemap.xml" Then the response status code should be 404 From 5f2b4ca0f1dd26c68e7b1a831c6afc5247f9fcd1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 22 Jan 2020 17:22:03 +0200 Subject: [PATCH 043/957] ISAICP-5407: Documentation updates. --- web/modules/custom/joinup_seo/joinup_seo.module | 2 +- .../UrlGenerator/JoinupEntityUrlGenerator.php | 11 ++++++----- web/profiles/joinup/joinup.behat.inc | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index 848ff19f46..ee3ffa0cf5 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -2,7 +2,7 @@ /** * @file - * Contains functions and hooks for the joinup_seo module. + * Contains hook implementations for the Joinup SEO module. */ /** diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupEntityUrlGenerator.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupEntityUrlGenerator.php index 5a13c045d9..7630b30b7b 100755 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupEntityUrlGenerator.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupEntityUrlGenerator.php @@ -1,13 +1,13 @@ condition('published_at', $two_days_ago, '<'); } } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index c16622d197..da7e16fc12 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -641,7 +641,7 @@ class JoinupSubContext extends DrupalSubContextBase { } if (property_exists($node, 'published_at') && !empty($node->published_at)) { - // If the entry is not numeric, then it means that the user has provided a + // If the entry is not numeric, then it means that the scenario is using a // human readable version of the timestamp. // Example: Sun, 01 Dec 2019 13:00:00 +0100. // This will allow dynamic tests as well. `strtotime` will also be able to From 10ffb7e415bfdd632a0a8cddbc4ab1eae175763e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 22 Jan 2020 17:22:25 +0200 Subject: [PATCH 044/957] ISAICP-5407: Use strict typing. --- web/modules/custom/joinup_seo/joinup_seo.module | 4 +++- .../simple_sitemap/SitemapType/LatestNewsSitemapType.php | 2 ++ .../simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index ee3ffa0cf5..aec14facf5 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -5,10 +5,12 @@ * Contains hook implementations for the Joinup SEO module. */ +declare(strict_types = 1); + /** * Implements hook_simple_sitemap_sitemap_types_alter(). */ -function joinup_seo_simple_sitemap_sitemap_types_alter(array &$sitemap_types) { +function joinup_seo_simple_sitemap_sitemap_types_alter(array &$sitemap_types): void { if (!isset($sitemap_types['default_hreflang'])) { return; } diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php index 38654e26e2..5238866db4 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php @@ -1,5 +1,7 @@ Date: Thu, 23 Jan 2020 01:01:53 +0200 Subject: [PATCH 045/957] ISAICP-5406: ::getText() is already called once. --- tests/features/bootstrap/FeatureContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index dca31e3bd3..c22e8c4917 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -989,7 +989,7 @@ public function assertPageTitleTagContainsText(string $text): void { $page_title = $page_title->getText(); if (strpos($page_title, '|') !== FALSE) { - list($page_title, $site_name) = explode(' | ', $page_title->getText()); + list($page_title, $site_name) = explode(' | ', $page_title); } $page_title = trim($page_title); From 750661d945e4c6d9388194ef87649895005757a6 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 23 Jan 2020 01:10:07 +0200 Subject: [PATCH 046/957] ISAICP-5407: Fix nitpicks from QA. --- .../simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php | 4 +--- .../simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index a7ce28a550..324b5deb92 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -17,8 +17,6 @@ /** * Base class for Joinup Url Generators. - * - * @package Drupal\joinup_seo\Plugin\simple_sitemap\UrlGenerator */ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { @@ -37,7 +35,7 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { protected $relationManager; /** - * JoinupUrlGeneratorBase constructor. + * Constructs a JoinupUrlGeneratorBase object. * * @param array $configuration * The configuration array. diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php index 7ea67483ce..1674cc7ecc 100755 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php @@ -1,5 +1,7 @@ Date: Fri, 24 Jan 2020 15:46:26 +0200 Subject: [PATCH 047/957] ISAICP-5406: Include configuration yml files in the joinup_seo config install as well. --- .../install/metatag.metatag_defaults.403.yml | 8 ++++++++ .../install/metatag.metatag_defaults.404.yml | 8 ++++++++ .../install/metatag.metatag_defaults.front.yml | 11 +++++++++++ .../install/metatag.metatag_defaults.global.yml | 8 ++++++++ .../install/metatag.metatag_defaults.node.yml | 9 +++++++++ .../metatag.metatag_defaults.node__news.yml | 17 +++++++++++++++++ .../metatag.metatag_defaults.taxonomy_term.yml | 9 +++++++++ .../install/metatag.metatag_defaults.user.yml | 9 +++++++++ .../custom/joinup_seo/joinup_seo.info.yml | 8 ++++++++ 9 files changed, 87 insertions(+) create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.403.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.404.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.403.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.403.yml new file mode 100644 index 0000000000..3f88243f10 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.403.yml @@ -0,0 +1,8 @@ +langcode: en +status: true +dependencies: { } +id: '403' +label: '403 access denied' +tags: + canonical_url: '[site:url]' + shortlink: '[site:url]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.404.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.404.yml new file mode 100644 index 0000000000..2e44127e99 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.404.yml @@ -0,0 +1,8 @@ +langcode: en +status: true +dependencies: { } +id: '404' +label: '404 page not found' +tags: + canonical_url: '[site:url]' + shortlink: '[site:url]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml new file mode 100644 index 0000000000..2efa88385a --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml @@ -0,0 +1,11 @@ +langcode: en +status: true +dependencies: { } +id: front +label: 'Front page' +tags: + abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' + description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' + title: '[site:name]' + shortlink: '[site:url]' + canonical_url: '[site:url]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml new file mode 100644 index 0000000000..b0ccb81ddf --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml @@ -0,0 +1,8 @@ +langcode: en +status: true +dependencies: { } +id: global +label: Global +tags: + canonical_url: '[current-page:url]' + title: '[current-page:title] | [site:name]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml new file mode 100644 index 0000000000..5e7841a46e --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml @@ -0,0 +1,9 @@ +langcode: en +status: true +dependencies: { } +id: node +label: Content +tags: + title: '[node:title] | [site:name]' + description: '[node:summary]' + canonical_url: '[node:url]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml new file mode 100644 index 0000000000..1c9e2c8bac --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -0,0 +1,17 @@ +langcode: en +status: true +dependencies: { } +id: node__news +label: 'Content: News' +tags: + schema_article_author: 'a:3:{s:5:"@type";s:6:"Person";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_type: NewsArticle + schema_article_main_entity_of_page: '[current-page:url]' + schema_article_name: '[node:title]' + schema_article_about: '[node:field_keywords]' + schema_article_date_published: '[node:published]' + schema_article_headline: '[node:field_news_headline]' + schema_article_date_modified: '[node:changed]' + schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' + schema_article_description: '[node:body]' + schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:26:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml new file mode 100644 index 0000000000..a562d1fa1f --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml @@ -0,0 +1,9 @@ +langcode: en +status: true +dependencies: { } +id: taxonomy_term +label: 'Taxonomy term' +tags: + canonical_url: '[term:url]' + description: '[term:description]' + title: '[term:name] | [site:name]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml new file mode 100644 index 0000000000..06dfbe3d13 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml @@ -0,0 +1,9 @@ +langcode: en +status: true +dependencies: { } +id: user +label: User +tags: + canonical_url: '[user:url]' + description: '[site:name]' + title: '[user:display-name] | [site:name]' diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index 4ac46a6039..6bb8b880c6 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -9,6 +9,14 @@ dependencies: config_devel: install: + - metatag.metatag_defaults.403 + - metatag.metatag_defaults.404 + - metatag.metatag_defaults.front + - metatag.metatag_defaults.global + - metatag.metatag_defaults.node + - metatag.metatag_defaults.node__news + - metatag.metatag_defaults.taxonomy_term + - metatag.metatag_defaults.user - simple_sitemap.bundle_settings.default.node.custom_page - simple_sitemap.bundle_settings.default.node.discussion - simple_sitemap.bundle_settings.default.node.document From b77138a6e3d958a46c42089ffcad81b44196b3e5 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 24 Jan 2020 16:09:46 +0200 Subject: [PATCH 048/957] ISAICP-5406: Fix minor QA remarks. --- tests/features/joinup_seo/news.feature | 9 +++++---- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 10 +++++----- web/profiles/joinup/joinup.behat.inc | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 25abe48970..6e9ae6f9a0 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -1,9 +1,10 @@ @api -Feature: As an owner of the website +Feature: SEO for news article. + As an owner of the website in order for my news to be better visible on the web I need proper metatag to be encapsulated in the html code. - Scenario: Basic metatags are attached as json schema on the page. + Scenario: Basic metatags are attached as JSON schema on the page. Given collections: | title | state | | Joinup SEO news collection | validated | @@ -15,7 +16,7 @@ Feature: As an owner of the website | Joinup SEO news | Headline of Joinup SEO news | logo.png | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | When I visit the "Joinup SEO news" news - Then the metatag json should be attached in the page + Then the metatag JSON should be attached in the page And 1 metatag graph of type "NewsArticle" should exist in the page And the metatag graph of the item with "name" "Joinup SEO news" should have the following properties: | property | value | @@ -50,4 +51,4 @@ Feature: As an owner of the website # No metatags are defined for the keep up to date page. # No metatags JSON in general means also that the entity metatags of the news item # is also not attached when the tile is present. - And the metatag json should not be attached in the page + And the metatag JSON should not be attached in the page diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index d8100152c2..161f2a216e 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -18,7 +18,7 @@ use PHPUnit\Framework\Assert; class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { /** - * Assert a meta tag value in the page. + * Asserts a meta tag value in the page. * * @param string $meta_name * The meta tag name. @@ -40,7 +40,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte /** * Asserts that the schema.org metatags are attached in page. * - * @Given the metatag json should be attached in the page + * @Given the metatag JSON should be attached in the page */ public function assertJsonMetatagsInPage(): void { $json = $this->getMetatagsAsJson(); @@ -62,16 +62,16 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte } /** - * Assert the amount of entity graphs of a certain type. + * Asserts the amount of entity graphs of a certain type. * - * @param string $count + * @param int $count * The number of graphs of the given type. * @param string $type * The type of graph which is the schema class. * * @Given :count metatag graph of type :type should exist in the page */ - public function assertNumberOfEntityGraphsExist(string $count, string $type): void { + public function assertNumberOfEntityGraphsExist(int $count, string $type): void { $json = $this->getMetatagsAsJson(); $found = 0; foreach ($json['@graph'] as $graph) { diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index e817d7fea7..c1c478235a 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -711,10 +711,10 @@ class JoinupSubContext extends DrupalSubContextBase { 'news' => [ 'headline' => 'field_news_headline', 'keywords' => 'field_keywords', - 'spatial coverage' => 'field_news_spatial_coverage', - 'state' => 'field_state', 'logo' => 'field_news_logo', 'publication date' => 'published_at', + 'spatial coverage' => 'field_news_spatial_coverage', + 'state' => 'field_state', ], 'shared' => [ 'collection' => OgGroupAudienceHelperInterface::DEFAULT_FIELD, From 0b8cb2261fd687bdf49e10c769e322054ee51099 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 24 Jan 2020 16:09:46 +0200 Subject: [PATCH 049/957] ISAICP-5406: Fix minor QA remarks. --- tests/features/joinup_seo/news.feature | 9 +++++---- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 12 ++++++------ web/profiles/joinup/joinup.behat.inc | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 25abe48970..6e9ae6f9a0 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -1,9 +1,10 @@ @api -Feature: As an owner of the website +Feature: SEO for news article. + As an owner of the website in order for my news to be better visible on the web I need proper metatag to be encapsulated in the html code. - Scenario: Basic metatags are attached as json schema on the page. + Scenario: Basic metatags are attached as JSON schema on the page. Given collections: | title | state | | Joinup SEO news collection | validated | @@ -15,7 +16,7 @@ Feature: As an owner of the website | Joinup SEO news | Headline of Joinup SEO news | logo.png | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | When I visit the "Joinup SEO news" news - Then the metatag json should be attached in the page + Then the metatag JSON should be attached in the page And 1 metatag graph of type "NewsArticle" should exist in the page And the metatag graph of the item with "name" "Joinup SEO news" should have the following properties: | property | value | @@ -50,4 +51,4 @@ Feature: As an owner of the website # No metatags are defined for the keep up to date page. # No metatags JSON in general means also that the entity metatags of the news item # is also not attached when the tile is present. - And the metatag json should not be attached in the page + And the metatag JSON should not be attached in the page diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index d8100152c2..fa269a0e90 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -18,7 +18,7 @@ use PHPUnit\Framework\Assert; class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { /** - * Assert a meta tag value in the page. + * Asserts a meta tag value in the page. * * @param string $meta_name * The meta tag name. @@ -40,7 +40,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte /** * Asserts that the schema.org metatags are attached in page. * - * @Given the metatag json should be attached in the page + * @Given the metatag JSON should be attached in the page */ public function assertJsonMetatagsInPage(): void { $json = $this->getMetatagsAsJson(); @@ -54,7 +54,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte /** * Asserts that the schema.org metatags are attached in page. * - * @Given the metatag json should not be attached in the page + * @Given the metatag JSON should not be attached in the page */ public function assertMetatagsNotInPage(): void { $json = $this->getMetatagsAsJson(); @@ -62,16 +62,16 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte } /** - * Assert the amount of entity graphs of a certain type. + * Asserts the amount of entity graphs of a certain type. * - * @param string $count + * @param int $count * The number of graphs of the given type. * @param string $type * The type of graph which is the schema class. * * @Given :count metatag graph of type :type should exist in the page */ - public function assertNumberOfEntityGraphsExist(string $count, string $type): void { + public function assertNumberOfEntityGraphsExist(int $count, string $type): void { $json = $this->getMetatagsAsJson(); $found = 0; foreach ($json['@graph'] as $graph) { diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index e817d7fea7..c1c478235a 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -711,10 +711,10 @@ class JoinupSubContext extends DrupalSubContextBase { 'news' => [ 'headline' => 'field_news_headline', 'keywords' => 'field_keywords', - 'spatial coverage' => 'field_news_spatial_coverage', - 'state' => 'field_state', 'logo' => 'field_news_logo', 'publication date' => 'published_at', + 'spatial coverage' => 'field_news_spatial_coverage', + 'state' => 'field_state', ], 'shared' => [ 'collection' => OgGroupAudienceHelperInterface::DEFAULT_FIELD, From a46b80ebba0aa3621f28ee666b9d2f2553f73861 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 26 Jan 2020 22:19:41 +0200 Subject: [PATCH 050/957] ISAICP-5406: Fix the metatag publisher image for news. --- config/sync/metatag.metatag_defaults.node__news.yml | 4 ++-- .../config/install/metatag.metatag_defaults.node__news.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml index 7220973ba3..7c4ef65782 100644 --- a/config/sync/metatag.metatag_defaults.node__news.yml +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -13,6 +13,6 @@ tags: schema_article_date_published: '[node:published]' schema_article_headline: '[node:field_news_headline]' schema_article_date_modified: '[node:changed]' - schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' + schema_article_publisher: 'a:4:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";s:4:"logo";a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:83:"https://joinup.ec.europa.eu/themes/joinup/images/favicon/apple-touch-icon-60x60.png";s:5:"width";s:2:"60";s:6:"height";s:2:"60";}}' schema_article_description: '[node:body]' - schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:26:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' + schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml index 1c9e2c8bac..8943937a2d 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -14,4 +14,4 @@ tags: schema_article_date_modified: '[node:changed]' schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' schema_article_description: '[node:body]' - schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:26:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' + schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' From 5423577d935d9c5e9db1854a3b05727afe956fde Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 26 Jan 2020 22:22:50 +0200 Subject: [PATCH 051/957] ISAICP-5406: Use the summary of the body instead of the full text. --- config/sync/metatag.metatag_defaults.node__news.yml | 2 +- .../config/install/metatag.metatag_defaults.node__news.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml index 7c4ef65782..def7d4ee9c 100644 --- a/config/sync/metatag.metatag_defaults.node__news.yml +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -14,5 +14,5 @@ tags: schema_article_headline: '[node:field_news_headline]' schema_article_date_modified: '[node:changed]' schema_article_publisher: 'a:4:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";s:4:"logo";a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:83:"https://joinup.ec.europa.eu/themes/joinup/images/favicon/apple-touch-icon-60x60.png";s:5:"width";s:2:"60";s:6:"height";s:2:"60";}}' - schema_article_description: '[node:body]' + schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml index 8943937a2d..e0fd1ab0fd 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -13,5 +13,5 @@ tags: schema_article_headline: '[node:field_news_headline]' schema_article_date_modified: '[node:changed]' schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' - schema_article_description: '[node:body]' + schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' From 7ce07ba379d5ffbf993a9fa229b52f9413675607 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 26 Jan 2020 22:35:44 +0200 Subject: [PATCH 052/957] ISAICP-5406: Change the test to ensure that summary is prefered over body. --- tests/features/joinup_seo/news.feature | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 6e9ae6f9a0..88801ee1fd 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -12,8 +12,8 @@ Feature: SEO for news article. | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Kurk | Smith | And "news" content: - | title | headline | logo | body | created | publication date | changed | state | author | collection | - | Joinup SEO news | Headline of Joinup SEO news | logo.png | Body of Joinup SEO news | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | + | title | headline | logo | body | created | publication date | changed | state | author | collection | + | Joinup SEO news | Headline of Joinup SEO news | logo.png | summary: Summary of news. - value: Body of news. | Sun, 01 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | validated | Joinup SEO author | Joinup SEO news collection | When I visit the "Joinup SEO news" news Then the metatag JSON should be attached in the page @@ -22,7 +22,8 @@ Feature: SEO for news article. | property | value | | @type | NewsArticle | | headline | Headline of Joinup SEO news | - | description | Body of Joinup SEO news | + # Summary is preferred over the body of the entity. + | description | Summary of news | | datePublished | Wed, 25/12/2019 - 13:00 | | dateModified | Wed, 01/01/2020 - 13:00 | # $base_url$ will be replaced with the base url of the website. From ad505f70fd8d80b50c503c2765ac336bcd7b7340 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 27 Jan 2020 09:59:05 +0200 Subject: [PATCH 053/957] ISAICP-5406: Allow pages to have pipes in the title. --- tests/features/bootstrap/FeatureContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index de07d97798..1e4211767b 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -1031,7 +1031,7 @@ public function assertPageTitleTagContainsText(string $text): void { $page_title = $page_title->getText(); if (strpos($page_title, '|') !== FALSE) { - [$page_title, $site_name] = explode(' | ', $page_title); + [$page_title, $site_name] = implode(' | ', explode(' | ', $page_title, -1)); } $page_title = trim($page_title); From 5c7434e30640ff2355af1fd38d7bad24b61659d9 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 27 Jan 2020 10:28:44 +0200 Subject: [PATCH 054/957] ISAICP-5406: Remove config which is inherited from the Metatag module but not needed or changed by us. --- .../install/metatag.metatag_defaults.taxonomy_term.yml | 9 --------- .../config/install/metatag.metatag_defaults.user.yml | 9 --------- web/modules/custom/joinup_seo/joinup_seo.info.yml | 2 -- 3 files changed, 20 deletions(-) delete mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml delete mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml deleted file mode 100644 index a562d1fa1f..0000000000 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.taxonomy_term.yml +++ /dev/null @@ -1,9 +0,0 @@ -langcode: en -status: true -dependencies: { } -id: taxonomy_term -label: 'Taxonomy term' -tags: - canonical_url: '[term:url]' - description: '[term:description]' - title: '[term:name] | [site:name]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml deleted file mode 100644 index 06dfbe3d13..0000000000 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.user.yml +++ /dev/null @@ -1,9 +0,0 @@ -langcode: en -status: true -dependencies: { } -id: user -label: User -tags: - canonical_url: '[user:url]' - description: '[site:name]' - title: '[user:display-name] | [site:name]' diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index 6bb8b880c6..ba683e6f13 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -15,8 +15,6 @@ config_devel: - metatag.metatag_defaults.global - metatag.metatag_defaults.node - metatag.metatag_defaults.node__news - - metatag.metatag_defaults.taxonomy_term - - metatag.metatag_defaults.user - simple_sitemap.bundle_settings.default.node.custom_page - simple_sitemap.bundle_settings.default.node.discussion - simple_sitemap.bundle_settings.default.node.document From 7248be655d9834e63e8541be1a51c5914f6c0dcd Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 27 Jan 2020 12:05:18 +0200 Subject: [PATCH 055/957] ISAICP-5406: Fix test failure due to typo. --- tests/features/joinup_seo/news.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 88801ee1fd..e59f48b570 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -1,5 +1,5 @@ @api -Feature: SEO for news article. +Feature: SEO for news articles. As an owner of the website in order for my news to be better visible on the web I need proper metatag to be encapsulated in the html code. @@ -23,7 +23,7 @@ Feature: SEO for news article. | @type | NewsArticle | | headline | Headline of Joinup SEO news | # Summary is preferred over the body of the entity. - | description | Summary of news | + | description | Summary of news. | | datePublished | Wed, 25/12/2019 - 13:00 | | dateModified | Wed, 01/01/2020 - 13:00 | # $base_url$ will be replaced with the base url of the website. From df146540881df96eeab626eb2f059bc6e4d3ff59 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 27 Jan 2020 12:05:35 +0200 Subject: [PATCH 056/957] ISAICP-5406: Update documentation. --- .../src/Plugin/Block/RecommendedContentBlock.php | 2 ++ .../custom/joinup_user/src/Routing/RouteSubscriber.php | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php b/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php index cdc4301a7f..f79ed047f7 100644 --- a/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php +++ b/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php @@ -124,6 +124,8 @@ public function build() { $build = [ 'header' => [ '#type' => 'inline_template', + // Warning: when changing this text, also update the metatags to match. + // See `metatag.metatag_defaults.front.yml`. '#template' => '

{% trans %}Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme. It offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.{% endtrans %}

', ], ]; diff --git a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php index b7497019c8..c8e75c9016 100644 --- a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php +++ b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php @@ -20,6 +20,11 @@ protected function alterRoutes(RouteCollection $collection) { ]); } + // Update the route of the user login form. This needs to be done here + // instead of in a form alter so that this change is picked up by the + // Metatag module. + // @todo Remove this when the Drupal login page has been removed and we are + // fully migrated to EU Login. if ($route = $collection->get('user.login')) { $route->addDefaults([ '_title' => 'Sign in', From f9ad432ec73f879d28a69a249edc3bc2c20e1460 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 27 Jan 2020 12:05:53 +0200 Subject: [PATCH 057/957] ISAICP-5406: Enforce strict typing. --- web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php index c8e75c9016..4d38420cd5 100644 --- a/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php +++ b/web/modules/custom/joinup_user/src/Routing/RouteSubscriber.php @@ -1,5 +1,7 @@ Date: Mon, 27 Jan 2020 13:40:54 +0200 Subject: [PATCH 058/957] ISAICP-5406: Handle empty page titles. --- tests/features/bootstrap/FeatureContext.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index 1e4211767b..12fd0ebb3d 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -1030,8 +1030,12 @@ public function assertPageTitleTagContainsText(string $text): void { } $page_title = $page_title->getText(); - if (strpos($page_title, '|') !== FALSE) { - [$page_title, $site_name] = implode(' | ', explode(' | ', $page_title, -1)); + if (!$page_title) { + throw new \Exception(sprintf('Page title tag is found but contains no text on page "%s".', $session->getCurrentUrl())); + } + + if (strpos($page_title, ' | ') !== FALSE) { + $page_title = implode(' | ', explode(' | ', $page_title, -1)); } $page_title = trim($page_title); From be5c07a796dbf6c786ff2fe607af71b1f0e73442 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 5 Feb 2020 16:56:17 +0200 Subject: [PATCH 059/957] ISAICP-5408: Enable the schema_event module. --- config/sync/core.extension.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 2c9b271f50..a8fcbad313 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -126,6 +126,7 @@ module: redis: 0 rest: 0 schema_article: 0 + schema_event: 0 schema_metatag: 0 search_api: 0 search_api_arbitrary_facet: 0 From e566136624606805bc43e9a4f9e98b7733ea1b0a Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 5 Feb 2020 16:57:42 +0200 Subject: [PATCH 060/957] ISAICP-5408: Initial export of the event metatags. --- .../sync/metatag.metatag_defaults.node__event.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.node__event.yml diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml new file mode 100644 index 0000000000..09e938e272 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -0,0 +1,15 @@ +uuid: 7f794961-e37a-432b-8ae5-8de3aa121032 +langcode: en +status: true +dependencies: { } +id: node__event +label: 'Content: Event' +tags: + schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' + schema_event_url: '[node:url]' + schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:27:"[node:field_event_logo:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' + schema_event_id: '[node:url]' + schema_event_type: Event + schema_event_description: '[node:summary]' + schema_event_name: '[node:title]' + schema_event_start_date: '[node:field_event_date:start_date:html_datetime]' From dcc2dcd5eb68e888c47ea2aa447906c857deadc8 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 6 Feb 2020 14:21:56 +0200 Subject: [PATCH 061/957] ISAICP-5408: Initial inclusion of address in the event metatags. --- config/sync/metatag.metatag_defaults.node__event.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index 09e938e272..ac1f62adce 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -6,8 +6,9 @@ id: node__event label: 'Content: Event' tags: schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' - schema_event_url: '[node:url]' + schema_event_url: '[node:field_event_web_url]' schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:27:"[node:field_event_logo:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' + schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:34:"[node:field_event_online_location]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' schema_event_id: '[node:url]' schema_event_type: Event schema_event_description: '[node:summary]' From 82fe11e0f6cd0497f9629ba95267573081c00cc9 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 6 Feb 2020 22:38:47 +0200 Subject: [PATCH 062/957] ISAICP-5408: Improve behat metatag subgraph handling. Allow multiple graph returns. Fix event start/end dates. --- .../joinup_event/joinup_event.behat.inc | 5 +- .../custom/joinup_seo/joinup_seo.behat.inc | 131 ++++++++++++------ web/profiles/joinup/joinup.behat.inc | 3 +- 3 files changed, 92 insertions(+), 47 deletions(-) diff --git a/web/modules/custom/joinup_event/joinup_event.behat.inc b/web/modules/custom/joinup_event/joinup_event.behat.inc index 1712b51dcc..ffdfa320b4 100644 --- a/web/modules/custom/joinup_event/joinup_event.behat.inc +++ b/web/modules/custom/joinup_event/joinup_event.behat.inc @@ -9,6 +9,7 @@ declare(strict_types = 1); use Behat\Behat\Hook\Scope\AfterFeatureScope; use Drupal\Core\Site\Settings; +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope; use Drupal\joinup\Traits\NodeTrait; @@ -56,6 +57,8 @@ class JoinupEventSubContext extends DrupalSubContextBase { */ public static function massageEventFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope): void { $node = $scope->getEntity(); + /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */ + $date_formatter = \Drupal::service('date.formatter'); if ($node->type !== 'event') { return; @@ -69,7 +72,7 @@ class JoinupEventSubContext extends DrupalSubContextBase { throw new \Exception(sprintf('Invalid format for date specified: %s', $node->$field)); } - $node->$field = $date; + $node->$field = $date_formatter->format($date, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT); } } } diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index fa269a0e90..ba6a574b5c 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -92,23 +92,20 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The value of the property of which to identify the graph by. * @param \Behat\Gherkin\Node\TableNode $table * A table of properties for the given graph. - * @param string $sub_property + * @param string|NULL $sub_property * A sub property to look into. * * @throws \Exception * Thrown if the graph is not found in the page or the requested sub * property does not exist. * - * @Given the metatag graph of the item with :property :value should have the following properties: - * @Given the metatag graph of the item with :property :value should have the following :sub_property properties: + * @Given the metatag (sub)graph of the item with :property :value should have the following properties: + * @Given the metatag (sub)graph of the item with :property :value should have the following :sub_property properties: */ - public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = ''): void { - $graph = $this->getGraphFromMetatags($property, $value); - if (empty($graph)) { - throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}'."); - } - if (!empty($sub_property) && !isset($graph[$sub_property])) { - throw new \Exception("The graph with property '{$property}' of value '{$value}' does not have a sub property '{$sub_property}'."); + public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = NULL): void { + $graphs = $this->getGraphsFromMetatags($property, $value, $sub_property); + if (empty($graphs)) { + throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}' or none of them contain a '{$sub_property}' property."); } // The url structure is very important in the SEO metatags as a wrong url @@ -116,37 +113,23 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte // the full url must be always asserted. $base_url = \Drupal::request()->getSchemeAndHttpHost(); - if (!empty($sub_property)) { - $graph = (array) $graph[$sub_property]; - } - - $not_exists = []; - $wrong_value = []; - foreach ($table->getColumnsHash() as $row) { - if (!isset($graph[$row['property']])) { - $not_exists[] = $row['property']; - } - - $row['value'] = str_replace('$base_url$', $base_url, $row['value']); - if ($graph[$row['property']] !== $row['value']) { - $wrong_value[$row['property']] = [ - 'expected' => $row['value'], - 'found' => $graph[$row['property']], - ]; + $hash = $table->getColumnsHash(); + foreach ($graphs as $graph) { + foreach ($hash as $row) { + if (!isset($graph[$row['property']])) { + continue 2; + } + + $row['value'] = str_replace('$base_url$', $base_url, $row['value']); + if ($graph[$row['property']] !== $row['value']) { + continue 2; + } } + // Graph was found. + return; } - if (!empty($not_exists) || !empty($wrong_value)) { - $error_messages = []; - foreach ($not_exists as $property) { - $error_messages[] = "The property '{$property}' was not found in the graph."; - } - foreach ($wrong_value as $property => $data) { - $error_messages[] = "The property '{$property}' had an expected value '{$data['expected']}' but '{$data['found']}' was found."; - } - - throw new Exception(implode("\n", $error_messages)); - } + throw new Exception('None of the found graphs meet the criteria.'); } /** @@ -159,7 +142,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte $page = $this->getSession()->getPage(); if ($script = $page->find('xpath', '//script[@type="application/ld+json"]')) { $json = $script->getText(); - return (array) json_decode($json); + return json_decode($json, TRUE); } return NULL; @@ -172,20 +155,78 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The property of which to identify the graph by. * @param string $value * The value of the property of which to identify the graph by. + * @param string|NULL $sub_graph + * (optional) Fetch a subgraph of the graphs instead of the graph itself. + * * * @return array|null * The first graph that matches the criteria as an array or null if no match * is found. */ - protected function getGraphFromMetatags(string $property, string $value): ?array { + protected function getGraphsFromMetatags(string $property, string $value, string $sub_graph = NULL): ?array { $json = $this->getMetatagsAsJson(); - foreach ($json['@graph'] as $graph) { - if (isset($graph->$property) && $graph->$property === $value) { - return (array) $graph; - } + $sub_graphs = $this->getSubGraphsFromGraph($json, $property, $value); + if (!empty($sub_graph)) { + $sub_graphs = array_map(function (array $graph) use ($sub_graph) { + return array_key_exists($sub_graph, $graph) ? $graph[$sub_graph] : NULL; + }, $sub_graphs); } + return array_filter($sub_graphs); + } - return NULL; + /** + * Retrieves a list of subgraphs from a graph. + * + * Used to search for a property within the graph that contains a subproperty. + * For example, a graph contains a location property which in turn contains a + * sub property that has a latitude and a longitude. This method can search + * either simply by the identifier or if the identifier contains a property or + * if the property contained by an identifier matches a value. + * + * @param array $graph + * The parent graph. + * @param string $identifier + * The property name to identify the graph with. + * @param string|NULL $identifier_value + * (optional) The identifier value. Should not be used along with $property + * filter as the $identifier_value requires $identifier to have a string + * value, while $property requires it to have an array as a value. + * @param bool $reset + * Reset the list of graphs. This method might run multiple times over many + * scenarios so the static variable $graphs_found might leak results in + * other cases. Initial value must always be TRUE while every subsequent + * call from within the method will be FALSE. + * + * @return array + * An array of subgraphs that match the above criteria. + */ + protected function getSubGraphsFromGraph(array $graph, string $identifier, string $identifier_value = NULL, bool $reset = TRUE): array { + static $graphs_found = []; + if ($reset) { + $graphs_found = []; + } + foreach ($graph as $graph_identifier => $sub_graph_or_value) { + if (is_array($sub_graph_or_value)) { + if (array_key_exists($identifier, $sub_graph_or_value)) { + if (is_array($sub_graph_or_value[$identifier])) { + if (empty($property)) { + // No filter is required on the subgraph so the whole graph is + // valid. + $graphs_found[] = $sub_graph_or_value; + } + } + // A non strict comparison is used because in behat, parameter values + // are usually strings. Values can still be integers though. + elseif (!empty($identifier_value) && $sub_graph_or_value[$identifier] == $identifier_value) { + $graphs_found[] = $sub_graph_or_value; + } + } + // In any case, the subgraph is an array so search deeper for valid + // instances of subgraphs. + $this->getSubGraphsFromGraph($sub_graph_or_value, $identifier, $identifier_value, FALSE); + } + } + return $graphs_found; } } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 5ce28730ca..39dd3c1d36 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -644,7 +644,7 @@ class JoinupSubContext extends DrupalSubContextBase { $node->published_at = strtotime($node->published_at); } - $image_fields = ['field_news_logo']; + $image_fields = ['field_news_logo', 'field_event_logo']; foreach ($image_fields as $image_field) { if (!empty($node->$image_field)) { $file = $this->createFile($node->$image_field); @@ -699,6 +699,7 @@ class JoinupSubContext extends DrupalSubContextBase { ], 'event' => [ 'keywords' => 'field_keywords', + 'logo' => 'field_event_logo', 'short title' => 'field_short_title', 'start date' => 'field_event_date:value', 'end date' => 'field_event_date:end_value', From 111437c225574d04ff581917114ed0cee32826f4 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 6 Feb 2020 22:39:07 +0200 Subject: [PATCH 063/957] ISAICP-5408: Provide a test for the event metatags. --- tests/features/joinup_seo/event.feature | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/features/joinup_seo/event.feature diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature new file mode 100644 index 0000000000..a456ff4db0 --- /dev/null +++ b/tests/features/joinup_seo/event.feature @@ -0,0 +1,61 @@ +@api +Feature: SEO for news articles. + As an owner of the website + in order for my news to be better visible on the web + I need proper metatag to be encapsulated in the html code. + + Scenario: Basic metatags are attached as JSON schema on the page. + Given collections: + | title | state | + | Joinup SEO event collection | validated | + And users: + | Username | E-mail | First name | Family name | + | Joinup SEO author | joinup.seo@example.com | Patrick | Stewart | + And "event" content: + | title | short title | start date | end date | body | logo | agenda | location | organisation | scope | keywords | collection | state | + | Joinup SEO event | JOINUPSEO2020 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | summary: Summary of event. - value: Body of event. | logo.png | Event agenda. | Rue Belliard 28, Brussels, Belgium | European Commission | International | Alphabet | Joinup SEO event collection | validated | + + When I visit the "Joinup SEO event" event + Then the metatag JSON should be attached in the page + And 1 metatag graph of type "Event" should exist in the page + And the metatag graph of the item with "name" "Joinup SEO event" should have the following properties: + | property | value | + | @type | Event | + | name | Joinup SEO event | + # Summary is preferred over the body of the entity. + | description | Summary of event. | + | startDate | 2019-12-25T15:00:00+0100 | + | endDate | 2020-01-01T15:00:00+0100 | + # $base_url$ will be replaced with the base url of the website. + | @id | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | + And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: + | property | value | + | @type | ImageObject | + | representativeOfPage | True | + # The test files are assigned a random name so it is very hard to assert the real url. However, when the file is + # found and added to the page, the dimensions are added as well. Asserting the dimensions also asserts the url in + # a way. + | width | 377 | + | height | 139 | + And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: + | property | value | + | @type | Place | + | name | Rue Belliard 28 | + # Target the location subgraph which has the name property set to "Rue Belliard 28". + And the metatag subgraph of the item with "name" "Rue Belliard 28" should have the following "address" properties: + | property | value | + | @type | PostalAddress | + | streetAddress | Rue Belliard 28 | + And the metatag subgraph of the item with "name" "Rue Belliard 28" should have the following "geo" properties: + | property | value | + | @type | GeoCoordinates | + # Geo coordinates are hardcoded as offered by the service. + | latitude | 45.82372 | + | longitude | 6.55121 | + + When I click "Keep up to date" + Then I should see the "Joinup SEO event" tile + # No metatags are defined for the keep up to date page. + # No metatags JSON in general means also that the entity metatags of the news item + # is also not attached when the tile is present. + And the metatag JSON should not be attached in the page From b6fb89a182bbe4ff445fc822631344e554b8e598 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 6 Feb 2020 22:54:04 +0200 Subject: [PATCH 064/957] ISAICP-5408: Phpcs fixes. --- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index ba6a574b5c..d830e4a888 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -92,7 +92,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The value of the property of which to identify the graph by. * @param \Behat\Gherkin\Node\TableNode $table * A table of properties for the given graph. - * @param string|NULL $sub_property + * @param string|null $sub_property * A sub property to look into. * * @throws \Exception @@ -155,10 +155,9 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The property of which to identify the graph by. * @param string $value * The value of the property of which to identify the graph by. - * @param string|NULL $sub_graph + * @param string|null $sub_graph * (optional) Fetch a subgraph of the graphs instead of the graph itself. * - * * @return array|null * The first graph that matches the criteria as an array or null if no match * is found. @@ -187,7 +186,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The parent graph. * @param string $identifier * The property name to identify the graph with. - * @param string|NULL $identifier_value + * @param string|null $identifier_value * (optional) The identifier value. Should not be used along with $property * filter as the $identifier_value requires $identifier to have a string * value, while $property requires it to have an array as a value. @@ -205,7 +204,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte if ($reset) { $graphs_found = []; } - foreach ($graph as $graph_identifier => $sub_graph_or_value) { + foreach ($graph as $sub_graph_or_value) { if (is_array($sub_graph_or_value)) { if (array_key_exists($identifier, $sub_graph_or_value)) { if (is_array($sub_graph_or_value[$identifier])) { From a128ea8e7f902b7929ca0bb15a47d6309a681f3d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 7 Feb 2020 00:39:57 +0200 Subject: [PATCH 065/957] ISAICP-5408: Support a global event url and fix the behat support. --- .../custom/joinup_event/joinup_event.module | 41 +++++++++++++++++++ web/profiles/joinup/joinup.behat.inc | 1 + 2 files changed, 42 insertions(+) diff --git a/web/modules/custom/joinup_event/joinup_event.module b/web/modules/custom/joinup_event/joinup_event.module index 6b630c0858..ec3b44957c 100644 --- a/web/modules/custom/joinup_event/joinup_event.module +++ b/web/modules/custom/joinup_event/joinup_event.module @@ -8,6 +8,7 @@ declare(strict_types = 1); use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Render\BubbleableMetadata; use Drupal\joinup_event\Plugin\Field\FieldFormatter\WebtoolsMapFormatter; /** @@ -52,3 +53,43 @@ function joinup_event_field_formatter_info_alter(array &$info) { $info['oe_webtools_maps_map']['class'] = WebtoolsMapFormatter::class; } } + +/** + * Implements hook_token_info_alter(). + */ +function joinup_event_token_info_alter(&$info) { + $info['tokens']['node']['event_url'] = [ + 'name' => t('Url of the event'), + 'description' => t('The website provided if available or the Joinup event URL.'), + ]; +} + +/** + * Implements hook_tokens(). + */ +function joinup_event_tokens($type, array $tokens, array $data = [], array $options = [], BubbleableMetadata $bubbleable_metadata = NULL) { + $replacements = []; + + if ($type == 'node' && !empty($data['node'])) { + /** @var \Drupal\node\NodeInterface $node */ + $node = $data['node']; + + foreach ($tokens as $name => $original) { + switch ($name) { + // Returns the event url. If the user has inserted a value in the + // field_event_web_url, then this is the event url, otherwise, uses the + // joinup url. + case 'event_url': + if ($node->isNew() || $node->bundle() !== 'event') { + break; + } + + $replacements[$original] = $node->get('field_event_web_url')->isEmpty() ? + $node->toUrl('canonical', ['absolute' => TRUE])->toString() : + $node->get('field_event_web_url')->uri; + } + } + } + + return $replacements; +} diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 39dd3c1d36..0b2e06d918 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -706,6 +706,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'agenda' => 'field_event_agenda', 'location' => 'field_location', 'organisation' => 'field_organisation', + 'web url' => 'field_event_web_url', 'scope' => 'field_scope', 'state' => 'field_state', ], From 4345239b6d83087ff6fd7ba64e9f759493915f4f Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 7 Feb 2020 00:40:27 +0200 Subject: [PATCH 066/957] ISAICP-5408: Expand the tests to cover both cases of a URL. --- tests/features/joinup_seo/event.feature | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index a456ff4db0..877cee7cc5 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -4,7 +4,7 @@ Feature: SEO for news articles. in order for my news to be better visible on the web I need proper metatag to be encapsulated in the html code. - Scenario: Basic metatags are attached as JSON schema on the page. + Scenario Outline: Basic metatags are attached as JSON schema on the page. Given collections: | title | state | | Joinup SEO event collection | validated | @@ -12,22 +12,26 @@ Feature: SEO for news articles. | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Patrick | Stewart | And "event" content: - | title | short title | start date | end date | body | logo | agenda | location | organisation | scope | keywords | collection | state | - | Joinup SEO event | JOINUPSEO2020 | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | summary: Summary of event. - value: Body of event. | logo.png | Event agenda. | Rue Belliard 28, Brussels, Belgium | European Commission | International | Alphabet | Joinup SEO event collection | validated | + | title | short title | web url | start date | end date | body | logo | agenda | location | organisation | scope | keywords | collection | state | + | Joinup SEO event | JOINUPSEO2020 | | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | summary: Summary of event. - value: Body of event. | logo.png | Event agenda. | Rue Belliard 28, Brussels, Belgium | European Commission | International | Alphabet | Joinup SEO event collection | validated | When I visit the "Joinup SEO event" event Then the metatag JSON should be attached in the page And 1 metatag graph of type "Event" should exist in the page And the metatag graph of the item with "name" "Joinup SEO event" should have the following properties: - | property | value | - | @type | Event | - | name | Joinup SEO event | + | property | value | + | @type | Event | + | name | Joinup SEO event | + # Though it would be nice to have this to the Joinup URL, Search Engines expect this to be the URL of the event. + # If a website is provided, then that means that the entity in Joinup is simply a promotion, and all the handling + # of registrations etc, already has a website, thus we point to that location. + | url | | # Summary is preferred over the body of the entity. - | description | Summary of event. | - | startDate | 2019-12-25T15:00:00+0100 | - | endDate | 2020-01-01T15:00:00+0100 | + | description | Summary of event. | + | startDate | 2019-12-25T15:00:00+0100 | + | endDate | 2020-01-01T15:00:00+0100 | # $base_url$ will be replaced with the base url of the website. - | @id | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | + | @id | | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: | property | value | | @type | ImageObject | @@ -59,3 +63,11 @@ Feature: SEO for news articles. # No metatags JSON in general means also that the entity metatags of the news item # is also not attached when the tile is present. And the metatag JSON should not be attached in the page + + Examples: + | web url | expected url | + | | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | + # Urls need a title value in the 0 index and a url in the 1 index of the value to work, otherwise it is parsed + # wrongly. + # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand + | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | From 1e48f357503fd6cc2a15af179e72f0b71182e2d8 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 7 Feb 2020 00:44:14 +0200 Subject: [PATCH 067/957] ISAICP-5408: Update the tokens related to urls to the event metatag config. --- config/sync/metatag.metatag_defaults.node__event.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index ac1f62adce..9f67fc24d5 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -6,10 +6,10 @@ id: node__event label: 'Content: Event' tags: schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' - schema_event_url: '[node:field_event_web_url]' + schema_event_url: '[node:event_url]' schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:27:"[node:field_event_logo:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:34:"[node:field_event_online_location]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' - schema_event_id: '[node:url]' + schema_event_id: '[node:event_url]' schema_event_type: Event schema_event_description: '[node:summary]' schema_event_name: '[node:title]' From 58db383b1605a19391a0d5ef96d375a473f1897c Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 7 Feb 2020 01:29:12 +0200 Subject: [PATCH 068/957] ISAICP-5408: Advanced debug messages is back baby. --- .../custom/joinup_seo/joinup_seo.behat.inc | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index d830e4a888..e7268ff072 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -114,22 +114,46 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte $base_url = \Drupal::request()->getSchemeAndHttpHost(); $hash = $table->getColumnsHash(); - foreach ($graphs as $graph) { + $missing_properties = []; + $wrong_value = []; + foreach ($graphs as $index => $graph) { + $found = TRUE; foreach ($hash as $row) { if (!isset($graph[$row['property']])) { - continue 2; + $missing_properties[$index][] = $row['property']; + $found = FALSE; + continue; } $row['value'] = str_replace('$base_url$', $base_url, $row['value']); if ($graph[$row['property']] !== $row['value']) { - continue 2; + $wrong_value[$index][] = [ + 'property' => $row['property'], + 'expected' => $row['value'], + 'found' => $graph[$row['property']], + ]; } } - // Graph was found. - return; + + if ($found === TRUE) { + return; + } } - throw new Exception('None of the found graphs meet the criteria.'); + // Construct the error messages for each graph found. + $error_messages = []; + foreach ($graphs as $index => $graph) { + if (!empty($missing_properties[$index])) { + $properties = implode(', ', $missing_properties[$index]); + $error_messages[] = "Index {$index}: The graph is missing the following properties: {$properties}"; + } + if (isset($wrong_value[$index])) { + foreach ($wrong_value[$index] as $data) { + $error_messages[] = "Index {$index}: Wrong property '{$data['property']}' value: Expected '{$data['expected']}' but '{$data['found']}' was found."; + } + } + } + throw new Exception(implode("\n", $error_messages)); } /** From 969dc8c540b4fe29da97c1528d4c1ed66630b4a6 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 7 Feb 2020 02:24:58 +0200 Subject: [PATCH 069/957] ISAICP-5408: Add the new sample values for the geocoding cache. --- .../AWwFG-gCD9s-V3WPX3OkYcsDnJywbheIUoq6_K3_HJM | Bin 0 -> 6929 bytes .../KGtWmzJtD9UBalvfFVAxpqs1gSe74Wwkv7NDQ7DWkWA | Bin 0 -> 6491 bytes .../nptNaZexeWGrxh-GJAPXd9Ea1Vevk2ThfEWs0ksxbIA | Bin 0 -> 6823 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fixtures/webtools_geocoding_cache/AWwFG-gCD9s-V3WPX3OkYcsDnJywbheIUoq6_K3_HJM create mode 100644 tests/fixtures/webtools_geocoding_cache/KGtWmzJtD9UBalvfFVAxpqs1gSe74Wwkv7NDQ7DWkWA create mode 100644 tests/fixtures/webtools_geocoding_cache/nptNaZexeWGrxh-GJAPXd9Ea1Vevk2ThfEWs0ksxbIA diff --git a/tests/fixtures/webtools_geocoding_cache/AWwFG-gCD9s-V3WPX3OkYcsDnJywbheIUoq6_K3_HJM b/tests/fixtures/webtools_geocoding_cache/AWwFG-gCD9s-V3WPX3OkYcsDnJywbheIUoq6_K3_HJM new file mode 100644 index 0000000000000000000000000000000000000000..a6e328343f0c322d3d9cb597733109ca2cd9e9ff GIT binary patch literal 6929 zcmeHM+iu%95cQ`ReAy=%;zc+5Nj2KOWAOn*{l*{y~4NLrHcn zw&ggxix`3RV!$2^hn$(iGsovV=EzoZk_&4Q5BZ(tl%q^bG`2j9IGQVy8L9X`YFZhS z+rQf{bTQ|G&1NK^Y9^T^vq&*Nq0?9>%vdlJAto7)WD*nSig6@GCD8bsQ^L{b)@%9o z6ny7jQz=Vj?Zo7{$|`LN#IXy7K`et^wu9Vc!o6hCSnz<~Y3{=^Wa~2Eyzx$ht=*j+es|Z&onqyZ`eaj)}L8yM$DBBkqH470sy#@E2+H~*MNQ*wOm!Pvr5Ebf z6w8wCEC145YpLW1*ooyB0$oRKSgxzU!^THCii0FhmiQL#4UnEc@(B+7qLW;|D`%{X-R5%N+Wy(Iblls`oIPEop5>Z-7|< z3Hu^$>`kH?Hw?Yw%KhUsn?xSG_Dt7i7l+;b{8G+ZU-aIAv+{0>Z@bh1*xzc|qH flH(x8J_#_5M+Cds8LsB+Qf1$4y>LRhKfeDBk^dJ= literal 0 HcmV?d00001 diff --git a/tests/fixtures/webtools_geocoding_cache/KGtWmzJtD9UBalvfFVAxpqs1gSe74Wwkv7NDQ7DWkWA b/tests/fixtures/webtools_geocoding_cache/KGtWmzJtD9UBalvfFVAxpqs1gSe74Wwkv7NDQ7DWkWA new file mode 100644 index 0000000000000000000000000000000000000000..43e2e2395225b592abfc5006e48026b919eeb234 GIT binary patch literal 6491 zcmeHMQE!_t5ay>uycZcT2Arohnx;uz^02Peq)HQDFSF|43X^ti)c?LS5Y`n!n|9LD zC_MC`InL+1`#yg@W;CLFp>mtLCKL>@SkKv7Qe}yGN!#Ou26QDTf@Qpo%YgIByB}=yZe>apOyo() z!7Df;otP(&ET~r{4vd~g`^d_Y5M{Y!+#WL;ActT?A}{ts1P=)yNj~Iz(1FV5tq1H7 z;-V0;Uper?@dJ23T@OuityC>@2D_P>m3l&5+v&34yqqo(Uf*jD9v zAgOwpo|JrmBxD2ST`3x=iE*I_dck61EWeDZk;es;g;%PJgW}y6p&H z>4w`ixBglsp@^;?OmW=4*Q?Hlep}{c0cq)N+)49m-Dh4;7>$LMw}lw8GKe;)1bCf% zIJK+J87M_57W`i2>+}wlqEI)2adrYb(bR=NySxF*3F`K5wCSo{Kq&Sd9O2kC=rm8b zEkKW=(1{50gSdIf-XauA4L~|mxA{o@7@crA7t2M}U_-sK>#zkp>@8v6^6Qu5|3Q;gA$MBHVB{cBGA&JRtz!&L5&k&1yIQ&y!`ClWk^Xy7k#0zQ zQfo+r@b>%|62}X1OONsXUi3gl!dbVLkuZ~}wZlO}Ru|S+X-HtnDZd?kQ^nQ$VM$P~ zvs~pYnI{L5d^1VnohL~@c6<-}K}(Y6Jl|#(b`&AUbqT_24Y|)8dC-uI{}~*=Nkh6Y z0K4G29G#0|E^-0$>Gz@}A@Z~2PO9R-kZ)v2Gjjl4&VOBt0!EyI9+?>ph>kLu!_}f5 q-)ai5%L)!31mM#MgLzlvA}?_L$cbVwhjTXj$+IhM=3eFl#KUj$w}*cK literal 0 HcmV?d00001 diff --git a/tests/fixtures/webtools_geocoding_cache/nptNaZexeWGrxh-GJAPXd9Ea1Vevk2ThfEWs0ksxbIA b/tests/fixtures/webtools_geocoding_cache/nptNaZexeWGrxh-GJAPXd9Ea1Vevk2ThfEWs0ksxbIA new file mode 100644 index 0000000000000000000000000000000000000000..6ae58771ac47f707da8a643c4a810b58e6ae607b GIT binary patch literal 6823 zcmeHM$!^;)5Y?v`yhqSNYN1b#8ngw{#gaT#3ekYxE9z5}35Lds1|darE;GqEz2nnL%3OVJeh|f+ z2GKMoUWENw#Q7{@gmaEVAIIFAG5F3x;)KjKt}sO`tx`0;q`pVd>&9z&^$vXJR};oc zu2drPoM)Ag1){Eof&q*5oUN71EY%MwG)^g@_kudGjJI(aaBjT&WTSU0ld@!@NGlFr z!CBD3oIJ9io(UWnJw^M-%E|#{RWpvpj1tF=F!p1o{rC`WAHqHOye#Hx2iW#W;H;k~ zE*USuh0}G>2G^R(x?r%I3%yhi)Rmp8O3tf`dNJi?YYnIO6xb8%bOGBko(F=e>ghS0 zRW7P;tudU@Cdc|z8%w2=^t7y%;yK_4^aFTqq^i<9fwX!aPs$deIOn&Dt$U zTng&_X3X9n$Gp@P(YrrGH&EntQI(L3y=;-R|2D<#^&EF=VKt%E**|2}gc1-zGM}9z zQ?9+o+kmUYf`6CADvgIyzLd9uadrwjQPc&XU9yJd+N|4qTJ!@4#~2%G+l3ZGC-8t7 zBh9QNK3G;XWIL1%SvHbCvBi5n^nIK5@O3J|z0G+(sXs zM4=scP8`JT2OlgG!kq_l_Jh1DMshYf3dJ7I+eIkG6nzpZgT6`>Ms@cpsWq+chf;*j z4!wfTY-F^V5k&n8u#0r*G;~7NfINRmU;oWIY_+Y0L<{%4JcdrI0U1 zJHkBHB)~R+_f|9}lZ(GE8g(?F72{uTL(AA>zyuGuxuzNmVkeK_Og5AYB8GXMYp literal 0 HcmV?d00001 From 583a3eb7cb4e821758c7859f5a3ae035a19c6d38 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 9 Feb 2020 12:08:26 +0200 Subject: [PATCH 070/957] ISAICP-5791: Fix the annoying config export changes. --- config/sync/contact_information.settings.yml | 1 - config/sync/search_api.index.published.yml | 6 +++--- config/sync/search_api.index.unpublished.yml | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/config/sync/contact_information.settings.yml b/config/sync/contact_information.settings.yml index 010d2b063c..36f4a481eb 100644 --- a/config/sync/contact_information.settings.yml +++ b/config/sync/contact_information.settings.yml @@ -1,4 +1,3 @@ -# The allowed conditions for the contact information workflow transitions. transitions: validated: __new__: diff --git a/config/sync/search_api.index.published.yml b/config/sync/search_api.index.published.yml index 0b91d8b4a6..1189316141 100644 --- a/config/sync/search_api.index.published.yml +++ b/config/sync/search_api.index.published.yml @@ -488,9 +488,6 @@ datasource_settings: processor_settings: add_url: { } aggregated_field: { } - index_distribution_data: - weights: - preprocess_index: -50 html_filter: all_fields: false fields: @@ -540,6 +537,9 @@ processor_settings: weights: preprocess_index: -49 preprocess_query: -50 + index_distribution_data: + weights: + preprocess_index: -50 joinup_entity_published_revision: { } joinup_entity_status: inverse: false diff --git a/config/sync/search_api.index.unpublished.yml b/config/sync/search_api.index.unpublished.yml index ba0adaf856..135f205703 100644 --- a/config/sync/search_api.index.unpublished.yml +++ b/config/sync/search_api.index.unpublished.yml @@ -448,9 +448,6 @@ datasource_settings: processor_settings: add_url: { } aggregated_field: { } - index_distribution_data: - weights: - preprocess_index: -50 html_filter: all_fields: false fields: @@ -500,6 +497,9 @@ processor_settings: weights: preprocess_index: -49 preprocess_query: -50 + index_distribution_data: + weights: + preprocess_index: -50 joinup_entity_latest_revision: { } joinup_entity_status: inverse: true From a54a8c1cae089f5184065c492aca4a7e0b50ac8a Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 10 Feb 2020 20:17:53 +0200 Subject: [PATCH 071/957] ISAICP-5791: Create mail configuration trait to be reused also by existing site tests. --- tests/src/Traits/MailConfigTrait.php | 55 +++++++++++++++++++ .../joinup_notification.behat.inc | 28 ++++------ 2 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 tests/src/Traits/MailConfigTrait.php diff --git a/tests/src/Traits/MailConfigTrait.php b/tests/src/Traits/MailConfigTrait.php new file mode 100644 index 0000000000..a6edbd307a --- /dev/null +++ b/tests/src/Traits/MailConfigTrait.php @@ -0,0 +1,55 @@ + 'interface.default', + 'mailsystem.settings' => 'defaults.sender', + ]; + + /** + * Checks is mail configs are overridden in settings.php, settings.local.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 the '{$config_name}:{$config_path}' is overridden in settings.php or settings.local.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/web/modules/custom/joinup_notification/joinup_notification.behat.inc b/web/modules/custom/joinup_notification/joinup_notification.behat.inc index dbef127b62..bf5e214f30 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.behat.inc +++ b/web/modules/custom/joinup_notification/joinup_notification.behat.inc @@ -13,8 +13,9 @@ use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\TagTrait; use Drupal\joinup\Traits\ConfigReadOnlyTrait; use Drupal\joinup\Traits\MailCollectorTrait; -use Drupal\joinup\Traits\UtilityTrait; +use Drupal\joinup\Traits\MailConfigTrait; use Drupal\joinup\Traits\UserTrait; +use Drupal\joinup\Traits\UtilityTrait; use Drupal\message\Entity\MessageTemplate; use PHPUnit\Framework\Assert; @@ -25,6 +26,7 @@ class JoinupNotificationSubContext extends DrupalSubContextBase { use ConfigReadOnlyTrait; use MailCollectorTrait; + use MailConfigTrait; use TagTrait; use UserTrait; use UtilityTrait; @@ -506,29 +508,19 @@ class JoinupNotificationSubContext extends DrupalSubContextBase { * @BeforeScenario @email */ public function beforeEmailScenario(): void { - // Check if the user is overriding the mail system configuration in - // settings.php, and abort the test if this is the case. - $settings = \Drupal::configFactory()->get('mailsystem.settings'); - $settings_are_overridden = $settings->hasOverrides('defaults.sender'); - $settings_are_using_test_mail_collector = $settings->get('defaults.sender') === 'test_mail_collector'; - if ($settings_are_overridden && !$settings_are_using_test_mail_collector) { - throw new \Exception('Cannot inspect emails since the "mailsystem.settings.defaults.sender" is overridden in settings.php.'); - } - // Set up the testing mail system. This is only needed if we aren't already - // using it. - if (!$settings_are_using_test_mail_collector) { - self::bypassReadOnlyConfig(); + if (!$this->isTestMailCollectorUsed()) { + // Check if the mail system configuration has been overridden in + // settings.php or settings.local.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(); } - - // Clear out any mails from previous scenarios. - \Drupal::state()->set('system.test_mail_collector', []); - \Drupal::state()->resetCache(); + // Reset the mail collector by wiping any leftovers from a previous test. + \Drupal::state()->delete('system.test_mail_collector'); } /** From 9e45cbcae2517ca5e1296fda17c30104e1a1cedc Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 11 Feb 2020 18:33:39 +0200 Subject: [PATCH 072/957] ISAICP-5791: JoinupExistingSiteTestBase to enable test mail collector. --- .../JoinupExistingSiteTestBase.php | 87 +++++++++++++++++-- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index bdcd06f1cd..8ccf98af30 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -5,34 +5,60 @@ namespace Drupal\Tests\joinup_core\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. */ -class JoinupExistingSiteTestBase extends ExistingSiteBase { +abstract class JoinupExistingSiteTestBase extends ExistingSiteBase { use AntibotTrait; + use MailCollectionTrait { + startMailCollection as traitStartMailCollection; + restoreMailSettings as traitRestoreMailSettings; + } + use MailConfigTrait; + + /** + * The list of Honeypot forms. + * + * @var bool[] + */ + protected static $honeypotForms; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); + + // Use the testing mail collector during tests. + $this->startMailCollection(); + // As ExistingSiteBase tests are running without javascript, we disable - // Antibot during the tests run. - static::disableAntibot(); + // Antibot and Honeypot functionality during the tests run. + $this->disableAntibot(); + $this->disableHoneypot(); } /** * {@inheritdoc} */ public function tearDown(): void { + // Restore Antibot and Honeypot functionality after test run. + $this->restoreAntibot(); + $this->restoreHoneypot(); + // Make sure we don't send any notifications during test entities cleanup. foreach ($this->cleanupEntities as $entity) { $entity->skip_notification = TRUE; } + // Restore the mail settings. + $this->restoreMailSettings(); + parent::tearDown(); /** @var \Drupal\Component\Plugin\PluginManagerInterface $delete_orphans_manager */ @@ -42,9 +68,60 @@ public function tearDown(): void { // Delete the OG group content orphans now because parent::tearDown() is // destroying the container and the registered shutdown callback will fail. $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.local.php. + */ + protected function startMailCollection(): void { + // Check if the mail system configuration has been overridden in + // settings.php or settings.local.php. + $this->checkMailConfigOverride(); + + static::bypassReadOnlyConfig(); + $this->traitStartMailCollection(); + static::restoreReadOnlyConfig(); - // Restores the Antibot functionality. - static::restoreAntibot(); + $this->resetTestMailCollector(); + } + + /** + * 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. + */ + protected function disableHoneypot(): void { + static::bypassReadOnlyConfig(); + $config_factory = \Drupal::configFactory(); + $config = $config_factory->getEditable('honeypot.settings'); + if (!isset($this->honeypotForms)) { + static::$honeypotForms = $config->get('form_settings'); + } + $config + ->set('form_settings', array_fill_keys(array_keys(static::$honeypotForms), FALSE)) + ->save(); + static::restoreReadOnlyConfig(); + } + + /** + * Restores Honeypot settings after test run. + */ + protected function restoreHoneypot(): void { + static::bypassReadOnlyConfig(); + \Drupal::configFactory()->getEditable('honeypot.settings') + ->set('form_settings', static::$honeypotForms) + ->save(); + static::restoreReadOnlyConfig(); } } From 452f52afa9242e55ffdd873347970649176e168f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 10 Feb 2020 20:21:01 +0200 Subject: [PATCH 073/957] ISAICP-5791: Provide test coverage. --- .../JoinupEuLoginRandomPasswordTest.php | 59 ------ .../src/ExistingSite/JoinupEuLoginTest.php | 188 ++++++++++++++++++ 2 files changed, 188 insertions(+), 59 deletions(-) delete mode 100644 web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginRandomPasswordTest.php create mode 100644 web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginRandomPasswordTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginRandomPasswordTest.php deleted file mode 100644 index 6b324df40e..0000000000 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginRandomPasswordTest.php +++ /dev/null @@ -1,59 +0,0 @@ -addUser([ - 'username' => $authname = $this->randomMachineName(), - 'email' => "{$authname}@example.com", - 'password' => $eulogin_pass = $this->randomString(), - ]); - // Create a local user. - $local_account = $this->createUser(); - // Store the hashed password in a variables. - $original_hashed_pass = $local_account->getPassword(); - - // Login with EU Login. - $this->drupalGet('/caslogin'); - $page = $this->getSession()->getPage(); - $page->fillField('E-mail address', "{$authname}@example.com"); - $page->fillField('Password', $eulogin_pass); - $page->pressButton('Log in'); - - // Select the option tha allows pairing with the local account. - $page->selectFieldOption('account_exist', 'yes'); - - // Use the local credentials to pair the account. - $page->fillField('Email or username', $local_account->getAccountName()); - $page->fillField('Password', $local_account->pass_raw); - $page->pressButton('Sign in'); - $this->assertSession()->pageTextContains("Your EU Login account {$authname} has been successfully linked to your local account {$local_account->getAccountName()}."); - - $final_hashed_pass = User::load($local_account->id())->getPassword(); - - // Check that a random password has been set. As we cannot intercept the - // generated random password, and neither can we reverse engineer the hash, - // we only compare the original and the final local account password hashes. - $this->assertNotSame($final_hashed_pass, $original_hashed_pass); - } - -} diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php new file mode 100644 index 0000000000..3e64b2b068 --- /dev/null +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -0,0 +1,188 @@ +randomMachineName(); + $email = "{$authname}@example.com"; + $eulogin_pass = $this->randomString(); + $this->createCasUser($authname, $email, $eulogin_pass); + + // Create a local user. + $local_account = $this->createUser(); + // Store the hashed password in a variables. + $original_hashed_pass = $local_account->getPassword(); + + // Login with EU Login. + $this->casLogin($email, $eulogin_pass); + + $page = $this->getSession()->getPage(); + + // Select the option tha allows pairing with the local account. + $page->selectFieldOption('account_exist', 'yes'); + + // Use the local credentials to pair the account. + $page->fillField('Email or username', $local_account->getAccountName()); + $page->fillField('Password', $local_account->pass_raw); + $page->pressButton('Sign in'); + $this->assertSession()->pageTextContains("Your EU Login account {$authname} has been successfully linked to your local account {$local_account->getAccountName()}."); + + $final_hashed_pass = User::load($local_account->id())->getPassword(); + + // Check that a random password has been set. As we cannot intercept the + // generated random password, and neither can we reverse engineer the hash, + // we only compare the original and the final local account password hashes. + $this->assertNotSame($final_hashed_pass, $original_hashed_pass); + } + + /** + * Test limited access for one-time-login sessions. + */ + public function testLimitedAccess(): void { + $assert = $this->assertSession(); + $page = $this->getSession()->getPage(); + + // Anonymous cannot see '/user/limited-access' as page. + $this->drupalGet('/user/limited-access'); + $assert->statusCodeEquals(404); + + $this->account = $this->createUser([], NULL, FALSE, [ + 'field_user_first_name' => $this->randomString(), + 'field_user_family_name' => $this->randomString(), + ]); + // Store the hashed password in a variables. + $original_hashed_pass = $this->account->getPassword(); + + $this->drupalGet('/user/password'); + + $this->drupalPostForm(NULL, ['name' => $this->account->getEmail()], 'Submit'); + $assert->pageTextContains('Further instructions have been sent to your email address.'); + + $this->assertMailString('id', 'user_password_reset', 1); + $this->assertMailString('subject', 'Please confirm the request of a new password.', 1); + $this->drupalGet($this->extractPasswordResetUrlFromMail()); + $page->pressButton('Log in'); + $assert->pageTextContains('You have just used your one-time login link. It is no longer necessary to use this link to log in. Please change your password.'); + + // Try to navigate to pages that are not accessible . + $this->assertLimitedAccess(''); + $this->assertLimitedAccess('/collections'); + $this->assertLimitedAccess('/solutions'); + $this->assertLimitedAccess('/keep-up-to-date'); + $this->assertLimitedAccess('/search'); + + // Check that the user is still able to contact the support. + $this->assertAccess('/contact', 'Contact'); + // Check that the user is still able to access its profile page. + $this->assertAccess('/user', $this->account->getDisplayName()); + // Check that the user is still able to access its account edit page. + $this->assertAccess($this->account->toUrl('edit-form'), $this->account->getDisplayName()); + + // Set a new password. + $page->fillField('Current password', $this->account->passRaw); + $page->fillField('Password', $new_pass = $this->randomString()); + $page->fillField('Confirm password', $new_pass); + $page->pressButton('Save'); + + // Check that the password has been changed. + $assert->addressEquals("/user/{$this->account->id()}"); + $assert->pageTextContains('The changes have been saved.'); + $this->assertNotSame($original_hashed_pass, User::load($this->account->id())->getPassword()); + + // Create a EU Login user and link it to the local user. + $authname = $this->randomMachineName(); + $this->createCasUser($authname, "{$authname}@example.com", $this->randomString(), [], $this->account); + + // The access is allowed. + $this->assertAccess(''); + $this->assertAccess('/collections'); + $this->assertAccess('/solutions'); + $this->assertAccess('/keep-up-to-date'); + $this->assertAccess('/search'); + $this->assertAccess('/contact', 'Contact'); + $this->assertAccess('/user', $this->account->getDisplayName()); + $this->assertAccess($this->account->toUrl('edit-form'), $this->account->getDisplayName()); + } + + /** + * Asserts that navigating to a URL will end on the 'Limited access' page. + * + * @param \Drupal\Core\Url|string $url + * The URL. + * + * @throws \Behat\Mink\Exception\ExpectationException + * When the test expectations are not met. + * @throws \Behat\Mink\Exception\ResponseTextException + * When the test response expectations are not met. + */ + protected function assertLimitedAccess($url): void { + $this->drupalGet($url); + $assert = $this->assertSession(); + $assert->statusCodeEquals(403); + $assert->pageTextContains("Dear {$this->account->getDisplayName()}"); + $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.'); + } + + /** + * Asserts that navigating to a URL is allowed. + * + * @param \Drupal\Core\Url|string $url + * The URL. + * @param string|null $expected_text_string + * (optional) String expected to be present in the page text. + * + * @throws \Behat\Mink\Exception\ExpectationException + * When the test expectations are not met. + * @throws \Behat\Mink\Exception\ResponseTextException + * When the test response expectations are not met. + */ + protected function assertAccess($url, ?string $expected_text_string = NULL): void { + $this->drupalGet($url); + $assert = $this->assertSession(); + $assert->statusCodeEquals(200); + if ($expected_text_string) { + $assert->pageTextContains($expected_text_string); + } + } + + /** + * Retrieves the password reset link. + * + * @return string + * The reset URL. + */ + protected function extractPasswordResetUrlFromMail() { + $mails = $this->getMails(); + $mail = end($mails); + preg_match('#(/user/reset/[^"].+)"#', (string) $mail['body'], $urls); + return $urls[1]; + } + +} From d731bfddba1680e76e97a79f0b8b42b525561cff Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 10 Feb 2020 20:26:30 +0200 Subject: [PATCH 074/957] ISAICP-5791: Add a 'user.is_eulogin' cache context. --- .../eulogin/joinup_eulogin.services.yml | 5 ++ .../Cache/Context/EuLoginUserCacheContext.php | 68 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php diff --git a/web/modules/custom/eulogin/joinup_eulogin.services.yml b/web/modules/custom/eulogin/joinup_eulogin.services.yml index bf212142f5..4f1eec8b31 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.services.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.services.yml @@ -12,3 +12,8 @@ services: class: Drupal\joinup_eulogin\Routing\JoinupEuLoginRouteSubscriber tags: - { name: 'event_subscriber' } + cache_context.user.is_eulogin: + class: Drupal\joinup_eulogin\Cache\Context\EuLoginUserCacheContext + arguments: ['@current_user', '@entity_type.manager'] + tags: + - { name: cache.context} diff --git a/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php new file mode 100644 index 0000000000..14e7a16618 --- /dev/null +++ b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php @@ -0,0 +1,68 @@ +entityTypeManager = $entityTypeManager; + } + + /** + * {@inheritdoc} + */ + public static function getLabel() { + return t('Is EU Login user'); + } + + /** + * {@inheritdoc} + */ + public function getContext() { + if ($this->user->isAnonymous()) { + return 0; + } + + /** @var \Drupal\user\UserInterface $account */ + $account = $this->entityTypeManager->getStorage('user')->load($this->user->id()); + + return !$account->get('eulogin_authname')->isEmpty() ? '1' : '0'; + } + + /** + * {@inheritdoc} + */ + public function getCacheableMetadata() { + return new CacheableMetadata(); + } + +} From 05639b744ddd5c15dd1dedc848e998f450336df5 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 10 Feb 2020 20:27:34 +0200 Subject: [PATCH 075/957] ISAICP-5791: Add a 'Limited access' page. --- .../custom/eulogin/joinup_eulogin.routing.yml | 7 ++++ .../Controller/LimitedAccessController.php | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 web/modules/custom/eulogin/joinup_eulogin.routing.yml create mode 100644 web/modules/custom/eulogin/src/Controller/LimitedAccessController.php diff --git a/web/modules/custom/eulogin/joinup_eulogin.routing.yml b/web/modules/custom/eulogin/joinup_eulogin.routing.yml new file mode 100644 index 0000000000..105e6b0c42 --- /dev/null +++ b/web/modules/custom/eulogin/joinup_eulogin.routing.yml @@ -0,0 +1,7 @@ +joinup_eulogin.limited_access: + path: '/user/limited-access' + defaults: + _controller: Drupal\joinup_eulogin\Controller\LimitedAccessController::page + _title: 'Limited access' + requirements: + _access: 'TRUE' diff --git a/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php new file mode 100644 index 0000000000..fa32e9cf20 --- /dev/null +++ b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php @@ -0,0 +1,33 @@ + 'status_messages', + '#message_list' => [ + 'warning' => [ + $this->t('

Dear @name

Your account access is limited.
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.

', ['@name' => $this->currentUser()->getDisplayName()]), + ], + ], + ], + ]; + } + +} From be33f5e36b14a83b0b984a9f1498aef563685512 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 10 Feb 2020 20:28:24 +0200 Subject: [PATCH 076/957] ISAICP-5791: Redirect non-EU Login users to the 'Limited access' page. --- .../eulogin/joinup_eulogin.services.yml | 5 + .../JoinupEuLoginKernelSubscriber.php | 189 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php diff --git a/web/modules/custom/eulogin/joinup_eulogin.services.yml b/web/modules/custom/eulogin/joinup_eulogin.services.yml index 4f1eec8b31..c3b07e9340 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.services.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.services.yml @@ -12,6 +12,11 @@ services: class: Drupal\joinup_eulogin\Routing\JoinupEuLoginRouteSubscriber tags: - { name: 'event_subscriber' } + joinup_eulogin.kernel.subscriber: + class: Drupal\joinup_eulogin\Event\Subscriber\JoinupEuLoginKernelSubscriber + arguments: ['@current_route_match', '@current_user', '@externalauth.authmap'] + tags: + - { name: 'event_subscriber' } cache_context.user.is_eulogin: class: Drupal\joinup_eulogin\Cache\Context\EuLoginUserCacheContext arguments: ['@current_user', '@entity_type.manager'] diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php new file mode 100644 index 0000000000..2bd78079ed --- /dev/null +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -0,0 +1,189 @@ +routeMatch = $route_match; + $this->currentUser = $current_user; + $this->authmap = $authmap; + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array { + return [ + // Run before 'entity_legal.subscriber', so that the user will not get the + // legal notice instead of the 'Limited access' page. + KernelEvents::REQUEST => [['redirectWhenNoAccess', 10]], + KernelEvents::RESPONSE => 'setAccessDeniedCode', + ]; + } + + /** + * Sets the response code to 403 when accessing /user/limited-access page. + * + * It's not enough to show the 'Limited access' page to the user, we have some + * appropriate response also for the browser. + * + * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event + * The response event object. + */ + public function setAccessDeniedCode(FilterResponseEvent $event): void { + $route_match = $this->routeMatch->getRouteMatchFromRequest($event->getRequest()); + if ($route_match->getRouteName() === 'joinup_eulogin.limited_access') { + // For anonymous or EU Login users this page doesn't exist. + if ($this->isAnonymousOrEuLoginUser()) { + throw new NotFoundHttpException(); + } + $event->getResponse()->setStatusCode(Response::HTTP_FORBIDDEN); + } + } + + /** + * Limits the access to the site functionality for one-time-login sessions. + * + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + * The request event. + */ + public function redirectWhenNoAccess(GetResponseEvent $event): void { + // Allow anonymous or EU Login users. + if ($this->isAnonymousOrEuLoginUser()) { + return; + } + + $request = $event->getRequest(); + + // Applicable only for humans. + if ($request->getRequestFormat() !== 'html') { + return; + } + + // Don't redirect on POST requests. + if (!$request->isMethodSafe()) { + return; + } + + // Check if the current route is allowed. + if ($this->isRouteAllowed()) { + return; + } + + // The browser caches the redirect. Make sure the cache is not leaking + // between user with different EU Login link status. + $cache_metadata = (new CacheableMetadata())->addCacheContexts(['user.is_eulogin']); + // Redirect to 'Limited access' page. + $response = new LocalRedirectResponse(Url::fromRoute('joinup_eulogin.limited_access')->toString()); + $event->setResponse($response->addCacheableDependency($cache_metadata)); + } + + /** + * Checks if the current route is allowed. + * + * @return bool + * If the current route is excluded. + */ + protected function isRouteAllowed(): bool { + // Un-routed? + if (!$route_name = $this->routeMatch->getRouteName()) { + return TRUE; + } + + $allowed_routes = [ + // 'Page not found' is always accessible. + 'joinup_core.not_found', + // The 'Limited access' warning page. + 'joinup_eulogin.limited_access', + // CSRF token route. + 'system.csrftoken', + // Still able to contact support. + 'contact_form.contact_page', + // Can see their account page. + 'user.page', + // Able to log out. + 'user.logout', + // A Well-Known URL for Changing Passwords. + // @see https://wicg.github.io/change-password-url + 'user.well-known.change_password', + ]; + + // Check first routes without parameters. + if (in_array($route_name, $allowed_routes, TRUE)) { + return TRUE; + } + + // Allowed if we're on the current user canonical page or edit form. + if (in_array($route_name, ['entity.user.canonical', 'entity.user.edit_form'], TRUE) && $this->routeMatch->getRawParameter('user') === $this->currentUser->id()) { + return TRUE; + } + + return FALSE; + } + + /** + * Checks if the current user is anonymous or has an EU Login linked account. + * + * @return bool + * TRUE if the user is anonymous or has an EU Login linked account. + */ + protected function isAnonymousOrEuLoginUser(): bool { + return $this->currentUser->isAnonymous() || $this->authmap->get($this->currentUser->id(), 'cas'); + } + +} From c28148be8f6e52ce4e33ae4f3b45f0a5ba50f198 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 11 Feb 2020 11:46:05 +0200 Subject: [PATCH 077/957] ISAICP-5791: Implement a kill-switch that allows disabling the limited access functionality in tests. --- .../custom/eulogin/joinup_eulogin.behat.inc | 38 +++++++++++++++++++ .../eulogin/joinup_eulogin.services.yml | 2 +- .../JoinupEuLoginKernelSubscriber.php | 31 ++++++++++++++- .../src/ExistingSite/JoinupEuLoginTest.php | 8 ++++ .../JoinupExistingSiteTestBase.php | 6 +++ 5 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 web/modules/custom/eulogin/joinup_eulogin.behat.inc diff --git a/web/modules/custom/eulogin/joinup_eulogin.behat.inc b/web/modules/custom/eulogin/joinup_eulogin.behat.inc new file mode 100644 index 0000000000..3f6686c1fd --- /dev/null +++ b/web/modules/custom/eulogin/joinup_eulogin.behat.inc @@ -0,0 +1,38 @@ +set('joinup_eulogin.limited_access', FALSE); + } + + /** + * Restores the limited access functionality after tests run. + * + * @AfterSuite + * + * @see self::disableLimitedAccess() + */ + public static function restoreLimitedAccess(): void { + \Drupal::state()->delete('joinup_eulogin.limited_access'); + } + +} diff --git a/web/modules/custom/eulogin/joinup_eulogin.services.yml b/web/modules/custom/eulogin/joinup_eulogin.services.yml index c3b07e9340..7e7108bbeb 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.services.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.services.yml @@ -14,7 +14,7 @@ services: - { name: 'event_subscriber' } joinup_eulogin.kernel.subscriber: class: Drupal\joinup_eulogin\Event\Subscriber\JoinupEuLoginKernelSubscriber - arguments: ['@current_route_match', '@current_user', '@externalauth.authmap'] + arguments: ['@current_route_match', '@current_user', '@externalauth.authmap', '@state'] tags: - { name: 'event_subscriber' } cache_context.user.is_eulogin: diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index 2bd78079ed..07d70bca7e 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -9,6 +9,7 @@ use Drupal\Core\Routing\LocalRedirectResponse; use Drupal\Core\Routing\ResettableStackedRouteMatchInterface; use Drupal\Core\Session\AccountProxyInterface; +use Drupal\Core\State\StateInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Url; use Drupal\externalauth\AuthmapInterface; @@ -48,6 +49,13 @@ class JoinupEuLoginKernelSubscriber implements EventSubscriberInterface { */ protected $authmap; + /** + * The state service. + * + * @var \Drupal\Core\State\StateInterface + */ + protected $state; + /** * Constructs a new event subscriber instance. * @@ -57,11 +65,14 @@ class JoinupEuLoginKernelSubscriber implements EventSubscriberInterface { * The current user. * @param \Drupal\externalauth\AuthmapInterface $authmap * The external authentication map service. + * @param \Drupal\Core\State\StateInterface $state + * The state service. */ - public function __construct(ResettableStackedRouteMatchInterface $route_match, AccountProxyInterface $current_user, AuthmapInterface $authmap) { + public function __construct(ResettableStackedRouteMatchInterface $route_match, AccountProxyInterface $current_user, AuthmapInterface $authmap, StateInterface $state) { $this->routeMatch = $route_match; $this->currentUser = $current_user; $this->authmap = $authmap; + $this->state = $state; } /** @@ -86,6 +97,10 @@ public static function getSubscribedEvents(): array { * The response event object. */ public function setAccessDeniedCode(FilterResponseEvent $event): void { + if (!$this->limitedAccessIsEnabled()) { + return; + } + $route_match = $this->routeMatch->getRouteMatchFromRequest($event->getRequest()); if ($route_match->getRouteName() === 'joinup_eulogin.limited_access') { // For anonymous or EU Login users this page doesn't exist. @@ -103,6 +118,10 @@ public function setAccessDeniedCode(FilterResponseEvent $event): void { * The request event. */ public function redirectWhenNoAccess(GetResponseEvent $event): void { + if (!$this->limitedAccessIsEnabled()) { + return; + } + // Allow anonymous or EU Login users. if ($this->isAnonymousOrEuLoginUser()) { return; @@ -186,4 +205,14 @@ protected function isAnonymousOrEuLoginUser(): bool { return $this->currentUser->isAnonymous() || $this->authmap->get($this->currentUser->id(), 'cas'); } + /** + * Checks if limiting access is enabled. + * + * @return bool + * If limiting access is enabled. + */ + protected function limitedAccessIsEnabled(): bool { + return $this->state->get('joinup_eulogin.limited_access', TRUE); + } + } diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 3e64b2b068..5062276484 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -65,6 +65,11 @@ public function testPasswordImpersonation(): void { * Test limited access for one-time-login sessions. */ public function testLimitedAccess(): void { + $state = \Drupal::state(); + + // This test needs the limited access functionality enabled. + $state->delete('joinup_eulogin.limited_access'); + $assert = $this->assertSession(); $page = $this->getSession()->getPage(); @@ -128,6 +133,9 @@ public function testLimitedAccess(): void { $this->assertAccess('/contact', 'Contact'); $this->assertAccess('/user', $this->account->getDisplayName()); $this->assertAccess($this->account->toUrl('edit-form'), $this->account->getDisplayName()); + + // Disable the limited access functionality. + \Drupal::state()->set('joinup_eulogin.limited_access', FALSE); } /** diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 8ccf98af30..4d405830ea 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -41,6 +41,9 @@ protected function setUp(): void { // Antibot and Honeypot functionality during the tests run. $this->disableAntibot(); $this->disableHoneypot(); + + // Disable limited access functionality. + \Drupal::state()->set('joinup_eulogin.limited_access', FALSE); } /** @@ -56,6 +59,9 @@ public function tearDown(): void { $entity->skip_notification = TRUE; } + // Re-enable limited access functionality. + \Drupal::state()->delete('joinup_eulogin.limited_access'); + // Restore the mail settings. $this->restoreMailSettings(); From 5a75f67d63c9611d0934c60f5dcf16e9fc401483 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 13 Feb 2020 08:27:48 +0200 Subject: [PATCH 078/957] ISAICP-5791: Removed method usage. --- .../tests/src/ExistingSite/JoinupExistingSiteTestBase.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 4d405830ea..0fd643be1d 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -90,8 +90,6 @@ protected function startMailCollection(): void { static::bypassReadOnlyConfig(); $this->traitStartMailCollection(); static::restoreReadOnlyConfig(); - - $this->resetTestMailCollector(); } /** From 481d41567418f595aed09ada3f0d24ad943c9f7b Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 13 Feb 2020 11:34:29 +0200 Subject: [PATCH 079/957] ISAICP-5791: Pair the demo users to CAS accounts so they can be used in development. --- build.dist.xml | 17 +++++++++++++++++ build.project.xml | 39 ++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/build.dist.xml b/build.dist.xml index c64e2fbe27..20901b321a 100644 --- a/build.dist.xml +++ b/build.dist.xml @@ -194,6 +194,23 @@ ${drupal.demo.user} ${drupal.demo.user} + + ${drupal.demo.user} + + + ${drupal.demo.user} + ${drupal.demo.user} +
diff --git a/build.project.xml b/build.project.xml index c00bb1efe0..87661668b9 100644 --- a/build.project.xml +++ b/build.project.xml @@ -417,17 +417,34 @@ - - - - + + + + + + user + + + user + user + Date: Thu, 13 Feb 2020 16:57:19 +0200 Subject: [PATCH 080/957] ISAICP-5408: Balance tests across test suites. --- tests/features/joinup_seo/event.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 877cee7cc5..1c714eb275 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -1,4 +1,4 @@ -@api +@api @group-a Feature: SEO for news articles. As an owner of the website in order for my news to be better visible on the web From b6a6a889f116b9fb351a6331547c3602457907e1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 13 Feb 2020 18:20:36 +0200 Subject: [PATCH 081/957] ISAICP-5791: Apply XML style indentation. --- build.project.xml | 112 +++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/build.project.xml b/build.project.xml index 87661668b9..c3dfa4e203 100644 --- a/build.project.xml +++ b/build.project.xml @@ -50,10 +50,10 @@ + command="site-install" + assume="yes" + root="${website.drupal.dir}" + bin="${drush.bin}"> @@ -348,8 +348,8 @@ + description="Disable persistent session cookies" + depends="writable-settings-folder, writable-services-yml"> @@ -366,10 +366,9 @@ - + @@ -398,10 +397,9 @@ - + @@ -417,34 +415,34 @@ - - - - - - user - - - user - user - + + + + + + user + + + user + user + Date: Fri, 14 Feb 2020 12:34:58 +0200 Subject: [PATCH 082/957] ISAICP-5791: Move project specific Phing targets into build.project.xml. --- build.dist.xml | 41 ++++++++++++----------------------------- build.project.xml | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/build.dist.xml b/build.dist.xml index 20901b321a..a879fada89 100644 --- a/build.dist.xml +++ b/build.dist.xml @@ -178,36 +178,19 @@ + command="user-create" + assume="yes" + root="${website.drupal.dir}" + bin="${drush.bin}"> - ${drupal.demo.user} - ${drupal.demo.user} - - - ${drupal.demo.user} - - + command="user-add-role" + assume="yes" + root="${website.drupal.dir}" + bin="${drush.bin}"> ${drupal.demo.user} ${drupal.demo.user} @@ -278,10 +261,10 @@ + command="pm-enable" + assume="yes" + root="${website.drupal.dir}" + bin="${drush.bin}"> ${module} diff --git a/build.project.xml b/build.project.xml index c3dfa4e203..a89cae4f53 100644 --- a/build.project.xml +++ b/build.project.xml @@ -454,6 +454,44 @@ + + + + + + ${drupal.demo.user} + ${drupal.demo.user} + + + ${drupal.demo.user} + + + ${drupal.demo.user} + ${drupal.demo.user} + + + Date: Fri, 14 Feb 2020 13:57:49 +0200 Subject: [PATCH 083/957] ISAICP-5791: Update documentation. --- .../eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 5062276484..ace703fe6d 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -36,10 +36,10 @@ public function testPasswordImpersonation(): void { // Create a local user. $local_account = $this->createUser(); - // Store the hashed password in a variables. + // Store the hashed password in a variable for later comparison. $original_hashed_pass = $local_account->getPassword(); - // Login with EU Login. + // Log in with EU Login. $this->casLogin($email, $eulogin_pass); $page = $this->getSession()->getPage(); From 31a1fb37db6dd72a406606a64d53db7cfcaf44ff Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 14 Feb 2020 15:43:20 +0200 Subject: [PATCH 084/957] ISAICP-5408: Fix the image url for evetns. --- config/sync/metatag.metatag_defaults.node__event.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index 9f67fc24d5..857e685fc5 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -7,7 +7,7 @@ label: 'Content: Event' tags: schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' schema_event_url: '[node:event_url]' - schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:27:"[node:field_event_logo:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' + schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:34:"[node:field_event_online_location]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' schema_event_id: '[node:event_url]' schema_event_type: Event From 78022a4f81b3b1ed062140d3864a7b67156f684f Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 14 Feb 2020 16:14:07 +0200 Subject: [PATCH 085/957] ISAICP-5408: Allow to check for urls with partial random texts. --- tests/features/joinup_seo/event.feature | 16 ++++++++-------- .../custom/joinup_seo/joinup_seo.behat.inc | 13 ++++++++++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 1c714eb275..3e7c4d75eb 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -33,14 +33,14 @@ Feature: SEO for news articles. # $base_url$ will be replaced with the base url of the website. | @id | | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: - | property | value | - | @type | ImageObject | - | representativeOfPage | True | - # The test files are assigned a random name so it is very hard to assert the real url. However, when the file is - # found and added to the page, the dimensions are added as well. Asserting the dimensions also asserts the url in - # a way. - | width | 377 | - | height | 139 | + | property | value | + | @type | ImageObject | + | representativeOfPage | True | + # $random_text$ can be any string that is appointed by the system and we cannot predict. + # In this case, it is a random file name that is appointed to the image. + | url | $base_url$/sites/default/files/$random_text$.jpg | + | width | 377 | + | height | 139 | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: | property | value | | @type | Place | diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index e7268ff072..ba46aa67c9 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -126,7 +126,18 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte } $row['value'] = str_replace('$base_url$', $base_url, $row['value']); - if ($graph[$row['property']] !== $row['value']) { + if (strpos($row['value'], '$random_text$')) { + $row['value'] = preg_quote($row['value'], '#'); + // $random_text$ is escaped into \$random_text\$ from the preg_quote + // above. + $row['value'] = str_replace('\$random_text\$', '(.*)?', $row['value']); + $found = preg_match("#{$row['value']}#", $graph[$row['property']]) === 1; + } + else { + $found = $graph[$row['property']] === $row['value']; + } + + if ($found === FALSE) { $wrong_value[$index][] = [ 'property' => $row['property'], 'expected' => $row['value'], From d775c08e253046230dd3440a2fafa1397a05ad1b Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 14 Feb 2020 21:36:58 +0200 Subject: [PATCH 086/957] ISAICP-5408: Extend the tests to also cover addresses and online locations. --- tests/features/joinup_seo/event.feature | 24 +++++++++++++----------- web/profiles/joinup/joinup.behat.inc | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 3e7c4d75eb..20997082d2 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -12,8 +12,8 @@ Feature: SEO for news articles. | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Patrick | Stewart | And "event" content: - | title | short title | web url | start date | end date | body | logo | agenda | location | organisation | scope | keywords | collection | state | - | Joinup SEO event | JOINUPSEO2020 | | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | summary: Summary of event. - value: Body of event. | logo.png | Event agenda. | Rue Belliard 28, Brussels, Belgium | European Commission | International | Alphabet | Joinup SEO event collection | validated | + | title | short title | web url | start date | end date | body | logo | agenda | location | online location | organisation | scope | keywords | collection | state | + | Joinup SEO event | JOINUPSEO2020 | | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | summary: Summary of event. - value: Body of event. | logo.png | Event agenda. | | 0: Some title - 1: http://example.com/some-online-meetup | European Commission | International | Alphabet | Joinup SEO event collection | validated | When I visit the "Joinup SEO event" event Then the metatag JSON should be attached in the page @@ -42,14 +42,15 @@ Feature: SEO for news articles. | width | 377 | | height | 139 | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: - | property | value | - | @type | Place | - | name | Rue Belliard 28 | + | property | value | + | @type | Place | + | name | | + | url | http://example.com/some-online-meetup | # Target the location subgraph which has the name property set to "Rue Belliard 28". And the metatag subgraph of the item with "name" "Rue Belliard 28" should have the following "address" properties: - | property | value | - | @type | PostalAddress | - | streetAddress | Rue Belliard 28 | + | property | value | + | @type | PostalAddress | + | streetAddress | | And the metatag subgraph of the item with "name" "Rue Belliard 28" should have the following "geo" properties: | property | value | | @type | GeoCoordinates | @@ -65,9 +66,10 @@ Feature: SEO for news articles. And the metatag JSON should not be attached in the page Examples: - | web url | expected url | - | | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | + | web url | expected url | location | expected location | + | | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | # Urls need a title value in the 0 index and a url in the 1 index of the value to work, otherwise it is parsed # wrongly. # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand - | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | + | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | + | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | | | diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 97a1235a5e..ed00aa55a7 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -713,6 +713,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'end date' => 'field_event_date:end_value', 'agenda' => 'field_event_agenda', 'location' => 'field_location', + 'online location' => 'field_event_online_location', 'organisation' => 'field_organisation', 'web url' => 'field_event_web_url', 'scope' => 'field_scope', From e0a253da8ede70a0b6575daaedf386acda76761e Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sat, 15 Feb 2020 11:05:46 +0200 Subject: [PATCH 087/957] ISAICP-5408: Update the online url field to show the uri instead of the rendered field. --- config/sync/metatag.metatag_defaults.node__event.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index 857e685fc5..0969be3956 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -8,7 +8,7 @@ tags: schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' schema_event_url: '[node:event_url]' schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' - schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:34:"[node:field_event_online_location]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' + schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:40:"[node:field_event_online_location:0:uri]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' schema_event_id: '[node:event_url]' schema_event_type: Event schema_event_description: '[node:summary]' From e278068129a373ea2bff7601a11d9c2f5b2f48fe Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sat, 15 Feb 2020 11:47:55 +0200 Subject: [PATCH 088/957] ISAICP-5408: Empty location throws test exception as the address is not rendered at all. --- tests/features/joinup_seo/event.feature | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 20997082d2..8b6ac104a4 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -72,4 +72,22 @@ Feature: SEO for news articles. # wrongly. # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | - | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | | | + + Scenario: Events without physical address but with online location should still show the online location. + Given collections: + | title | state | + | Joinup SEO event collection | validated | + And users: + | Username | E-mail | First name | Family name | + | Joinup SEO author | joinup.seo@example.com | Patrick | Stewart | + And "event" content: + | title | short title | online location | collection | state | + | Joinup SEO event | JOINUPSEO2021 | 0: Some title - 1: http://example.com/some-online-meetup | Joinup SEO event collection | validated | + + When I visit the "Joinup SEO event" event + Then the metatag JSON should be attached in the page + And 1 metatag graph of type "Event" should exist in the page + And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: + | property | value | + | @type | Place | + | url | http://example.com/some-online-meetup | From ddaccf79aae89717201b778e80f6af7a8c84a368 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 16 Feb 2020 23:07:48 +0200 Subject: [PATCH 089/957] ISAICP-5787: Include and install the paragraphs module. --- composer.json | 1 + composer.lock | 154 ++++++++++++++++++++++++++++++++- config/sync/core.extension.yml | 2 + 3 files changed, 153 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 73dd7910c0..cdf5063a85 100644 --- a/composer.json +++ b/composer.json @@ -48,6 +48,7 @@ "drupal/meta_entity": "^1.0", "drupal/og": "^1.0", "drupal/og_menu": "dev-1.x", + "drupal/paragraphs": "^1.11", "drupal/password_policy": "^3.0-alpha5", "drupal/pathauto": "~1.5", "drupal/persistent_login": "~1.1", diff --git a/composer.lock b/composer.lock index 2e56127483..a77fc34378 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": "750502b29081f46ba78f949610312c75", + "content-hash": "9e006a06b3fd74dd318b0b83da3c6a7d", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -3995,6 +3995,68 @@ "source": "https://git.drupalcode.org/project/entity_legal" } }, + { + "name": "drupal/entity_reference_revisions", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/entity_reference_revisions.git", + "reference": "8.x-1.7" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/entity_reference_revisions-8.x-1.7.zip", + "reference": "8.x-1.7", + "shasum": "4e3b849b0d984cd3c0a4330c9aa4cb16bf1f79f6" + }, + "require": { + "drupal/core": "~8.0" + }, + "require-dev": { + "drupal/diff": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.7", + "datestamp": "1570284187", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Berdir", + "homepage": "https://www.drupal.org/user/214652" + }, + { + "name": "Frans", + "homepage": "https://www.drupal.org/user/514222" + }, + { + "name": "jeroen.b", + "homepage": "https://www.drupal.org/user/1853532" + }, + { + "name": "miro_dietiker", + "homepage": "https://www.drupal.org/user/227761" + } + ], + "description": "Adds a Entity Reference field type with revision support.", + "homepage": "https://www.drupal.org/project/entity_reference_revisions", + "support": { + "source": "https://git.drupalcode.org/project/entity_reference_revisions" + } + }, { "name": "drupal/error_page", "version": "1.0.0-alpha1", @@ -5419,6 +5481,90 @@ }, "time": "2019-12-02T19:38:32+00:00" }, + { + "name": "drupal/paragraphs", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/paragraphs.git", + "reference": "8.x-1.11" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/paragraphs-8.x-1.11.zip", + "reference": "8.x-1.11", + "shasum": "4fa849a249fbc689ca0c83523a967c08767e91af" + }, + "require": { + "drupal/core": "^8.7.7 || ^9", + "drupal/entity_reference_revisions": "~1.3" + }, + "require-dev": { + "drupal/block_field": "~1.0", + "drupal/ctools": "3.x-dev", + "drupal/diff": "~1.0", + "drupal/entity_browser": "2.x-dev", + "drupal/entity_usage": "2.x-dev", + "drupal/field_group": "3.x-dev", + "drupal/inline_entity_form": "~1.0", + "drupal/paragraphs-paragraphs_library": "*", + "drupal/replicate": "~1.0", + "drupal/search_api": "~1.0", + "drupal/search_api_db": "*" + }, + "suggest": { + "drupal/entity_browser": "Recommended for an improved user experience when using the Paragraphs library module" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.11", + "datestamp": "1581850829", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Berdir", + "homepage": "https://www.drupal.org/user/214652" + }, + { + "name": "Frans", + "homepage": "https://www.drupal.org/user/514222" + }, + { + "name": "Primsi", + "homepage": "https://www.drupal.org/user/282629" + }, + { + "name": "jeroen.b", + "homepage": "https://www.drupal.org/user/1853532" + }, + { + "name": "jstoller", + "homepage": "https://www.drupal.org/user/99012" + }, + { + "name": "miro_dietiker", + "homepage": "https://www.drupal.org/user/227761" + } + ], + "description": "Enables the creation of Paragraphs entities.", + "homepage": "https://www.drupal.org/project/paragraphs", + "support": { + "source": "https://git.drupalcode.org/project/paragraphs" + } + }, { "name": "drupal/password_policy", "version": "3.0.0-alpha5", @@ -6004,7 +6150,7 @@ }, "drupal": { "version": "8.x-1.2", - "datestamp": "1568275684", + "datestamp": "1581183007", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7807,7 +7953,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-10-31T20:10:45+00:00" + "time": "2018-05-01T01:48:25+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -9966,7 +10112,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2019-04-02T18:33:21+00:00" }, { "name": "stack/builder", diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index ef1cc8a339..617af128eb 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -37,6 +37,7 @@ module: email_registration: 0 embed_block: 0 entity_legal: 0 + entity_reference_revisions: 0 error_page: 0 eupl: 0 facets: 0 @@ -165,6 +166,7 @@ module: content_translation: 10 externalauth: 10 views: 10 + paragraphs: 11 publication_date: 99 joinup: 1000 joinup_debug: 1001 From fdcb6d5d6edcca7402874f3f2d906575c6c590d3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 16 Feb 2020 23:08:43 +0200 Subject: [PATCH 090/957] ISAICP-5787: Export default paragraphs configuration. --- .../sync/core.entity_view_mode.paragraph.preview.yml | 12 ++++++++++++ config/sync/paragraphs.settings.yml | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 config/sync/core.entity_view_mode.paragraph.preview.yml create mode 100644 config/sync/paragraphs.settings.yml diff --git a/config/sync/core.entity_view_mode.paragraph.preview.yml b/config/sync/core.entity_view_mode.paragraph.preview.yml new file mode 100644 index 0000000000..95f51a8610 --- /dev/null +++ b/config/sync/core.entity_view_mode.paragraph.preview.yml @@ -0,0 +1,12 @@ +uuid: 05d742d0-617c-45c1-9120-68c9245caa5b +langcode: en +status: true +dependencies: + module: + - paragraphs +_core: + default_config_hash: fAWHL-ZbCR4HOdE03GYzQfiMYfEvVhTWNBHWcU_pa18 +id: paragraph.preview +label: Preview +targetEntityType: paragraph +cache: true diff --git a/config/sync/paragraphs.settings.yml b/config/sync/paragraphs.settings.yml new file mode 100644 index 0000000000..cafb40940c --- /dev/null +++ b/config/sync/paragraphs.settings.yml @@ -0,0 +1,3 @@ +show_unpublished: true +_core: + default_config_hash: 7eR0sk71Eol86r_A7BMqn5_46wzenh5J1O5vZRCGKv8 From 9ce851cf0bc6a32cc9e5c7c486b70a16725d268c Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 09:14:43 +0200 Subject: [PATCH 091/957] ISAICP-5801: Fix the pipeline URL for the Joinup collection. --- .../src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php index ac7ca0577c..f5ccf03af9 100644 --- a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php +++ b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php @@ -31,7 +31,7 @@ class JoinupCollectionPipeline extends JoinupFederationPipelinePluginBase { * {@inheritdoc} */ public function getCollection(): ?string { - return 'http://placeHolder/11c81d8f-1527-4044-a694-b847d66362e1'; + return 'http://data.europa.eu/w21/df34e3a2-207b-4910-a804-344931654e20 '; } } From 44616ab973dfb186f4f08faa7e3b836d9a7ca42d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 09:15:10 +0200 Subject: [PATCH 092/957] ISAICP-5801: Introduce a new module for the eu_sic community. --- .../joinup_communities/eu_sic/eu_sic.info.yml | 5 +++ .../pipeline/Pipeline/EuSicPipeline.php | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 web/modules/custom/joinup_communities/eu_sic/eu_sic.info.yml create mode 100644 web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php diff --git a/web/modules/custom/joinup_communities/eu_sic/eu_sic.info.yml b/web/modules/custom/joinup_communities/eu_sic/eu_sic.info.yml new file mode 100644 index 0000000000..efc669f041 --- /dev/null +++ b/web/modules/custom/joinup_communities/eu_sic/eu_sic.info.yml @@ -0,0 +1,5 @@ +name: EU SIC +type: module +description: EU Schemantic Interoperability Catalogue community. +core: 8.x +package: Joinup communities diff --git a/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php b/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php new file mode 100644 index 0000000000..23f7be2305 --- /dev/null +++ b/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php @@ -0,0 +1,37 @@ + Date: Tue, 18 Feb 2020 13:41:39 +0100 Subject: [PATCH 093/957] ISAICP-5707 - Hack to improve search bar visibility on search pages. --- web/themes/joinup/joinup_theme.theme | 9 ++++++--- web/themes/joinup/js/global-search.js | 4 ++++ .../joinup/prototype/sass/components/_search-bar.sass | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index bca14c8321..ad539efc35 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -534,11 +534,12 @@ function joinup_theme_preprocess_menu(&$variables) { * Implements hook_preprocess_block(). */ function joinup_theme_preprocess_block(&$variables) { + $route_match = \Drupal::routeMatch(); + $route_name = $route_match->getRouteName(); + $block_id = $variables['elements']['#id'] ?? NULL; if (isset($block_id) && $block_id == 'joinup_theme_content') { - $route_match = \Drupal::routeMatch(); - $route_name = $route_match->getRouteName(); // Indicate if page contains listing // and should not have white background. $is_listing = FALSE; @@ -605,7 +606,9 @@ function joinup_theme_preprocess_block(&$variables) { // Add classes to identify the search bars. case 'global_search': case 'exposed_form_search_page': - $variables['attributes']['class'][] = 'search-bar search-bar--header search-bar--white mdl-textfield mdl-js-textfield mdl-chipfield mdl-textfield--expandable mdl-textfield--floating-label mdl-textfield--align-right'; + $variables['attributes']['class'][] = 'search-bar search-bar--header search-bar--white mdl-textfield mdl-chipfield mdl-textfield--expandable mdl-textfield--floating-label mdl-textfield--align-right '; + // Set special classes to let the search bar open on search pages. + $variables['attributes']['class'][] .= ($route_name == 'view.search.page_1' ? 'search-bar-advanced is-focused' : 'mdl-js-textfield'); break; // Add special classes for dropdown menus in header. diff --git a/web/themes/joinup/js/global-search.js b/web/themes/joinup/js/global-search.js index 7e1f4b2ea1..aa1116ab0f 100644 --- a/web/themes/joinup/js/global-search.js +++ b/web/themes/joinup/js/global-search.js @@ -40,6 +40,10 @@ } } }); + // Custom visibility toggle for search bar on search pages. + $(context).find(".search-bar-advanced .search-bar__label").on('click', function () { + $('.search-bar-advanced').toggleClass('is-focused'); + }); }); } }; diff --git a/web/themes/joinup/prototype/sass/components/_search-bar.sass b/web/themes/joinup/prototype/sass/components/_search-bar.sass index 7ca2267610..a8e4775613 100644 --- a/web/themes/joinup/prototype/sass/components/_search-bar.sass +++ b/web/themes/joinup/prototype/sass/components/_search-bar.sass @@ -34,6 +34,7 @@ color: lighten($color-grey-medium, 10%) border-bottom-color: lighten($color-grey-medium, 10%) box-sizing: border-box + outline: none &::-webkit-input-placeholder font-size: $font-size-base font-weight: $font-weight-thin @@ -77,6 +78,8 @@ height: 64px padding: 0 +z-index(highlight) + .mdl-chip + opacity: 0 .search-bar--header-shifted right: 120px @@ -163,6 +166,8 @@ .search-bar__input-container width: calc(100% - 50px) max-width: 100% + .mdl-chip + opacity: 1 .search-bar--header-shifted &.is-focused, From 48cae88e6dfc1fe62035fd38f8b3000fa39032f4 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 20:28:32 +0200 Subject: [PATCH 094/957] ISAICP-5801: Ensure that the collection exists every time the pipeline takes some action. --- .../src/JoinupFederationStepPluginBase.php | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php index 611073db2e..3805e399fb 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_federation; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\pipeline\Exception\PipelineStepPrepareLogicException; use Drupal\pipeline\Plugin\PipelineStepInterface; @@ -32,6 +33,13 @@ abstract class JoinupFederationStepPluginBase extends PipelineStepPluginBase imp */ protected $pipeline; + /** + * The entity type manager service. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + /** * Creates a new pipeline step plugin instance. * @@ -43,10 +51,13 @@ abstract class JoinupFederationStepPluginBase extends PipelineStepPluginBase imp * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql) { + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->sparql = $sparql; + $this->entityTypeManager = $entity_type_manager; } /** @@ -57,7 +68,8 @@ public static function create(ContainerInterface $container, array $configuratio $configuration, $plugin_id, $plugin_definition, - $container->get('sparql_endpoint') + $container->get('sparql_endpoint'), + $container->get('entity_type.manager') ); } @@ -79,6 +91,16 @@ public function prepare() { '#markup' => $this->t("This import has timed-out. In the meantime another user has started a new import. Please come back later and retry."), ]); } + + // Ensure that the collection still exists and the URI is correct. + $collection_id = $this->getPipeline()->getCollection(); + if (empty($collection_id) || empty($this->entityTypeManager->getStorage('rdf_entity')->load($collection_id))) { + throw (new PipelineStepPrepareLogicException())->setError([ + '#markup' => $this->t("A collection with URI %collection_id was not found in the page", [ + '%collection_id' => $collection_id, + ]), + ]); + } } /** From c5b53a7eab5c589cffd516726cf042f37c999b3e Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 22:30:37 +0200 Subject: [PATCH 095/957] ISAICP-5801: Test that a collection always exists during the federation wizard. --- .../src/JoinupFederationStepPluginBase.php | 7 +- .../pipeline/Step/AddJoinupVocabularies.php | 8 +- .../Plugin/pipeline/Step/AdmsValidation.php | 8 +- .../pipeline/Step/AnalyzeIncomingEntities.php | 3 +- .../Plugin/pipeline/Step/BrokenReferences.php | 3 +- .../Plugin/pipeline/Step/ConvertToAdms2.php | 8 +- .../src/Plugin/pipeline/Step/Import.php | 2 +- .../Plugin/pipeline/Step/JoinupValidation.php | 8 +- .../pipeline/Step/ProvenanceActivity.php | 8 +- .../Step/SparqlEntityStorageTrait.php | 7 -- .../pipeline/Step/SpdxToJoinupLicence.php | 36 --------- .../Plugin/pipeline/Step/ThreeWayMerge.php | 3 +- ...JoinupFederationInvalidTestingPipeline.php | 36 +++++++++ .../src/Kernel/InvalidCollectionTest.php | 78 +++++++++++++++++++ .../tests/src/Kernel/StepTestBase.php | 24 ++++++ 15 files changed, 174 insertions(+), 65 deletions(-) create mode 100644 web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php create mode 100644 web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php index 3805e399fb..b753663a0e 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php @@ -94,12 +94,9 @@ public function prepare() { // Ensure that the collection still exists and the URI is correct. $collection_id = $this->getPipeline()->getCollection(); + if (empty($collection_id) || empty($this->entityTypeManager->getStorage('rdf_entity')->load($collection_id))) { - throw (new PipelineStepPrepareLogicException())->setError([ - '#markup' => $this->t("A collection with URI %collection_id was not found in the page", [ - '%collection_id' => $collection_id, - ]), - ]); + throw new PipelineStepPrepareLogicException("A collection with URI '{$collection_id}' does not exist."); } } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AddJoinupVocabularies.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AddJoinupVocabularies.php index d4a624d88c..5d6ee2db2e 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AddJoinupVocabularies.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AddJoinupVocabularies.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\joinup_federation\JoinupFederationStepPluginBase; use Drupal\pipeline\Plugin\PipelineStepInterface; use Drupal\pipeline\Plugin\PipelineStepWithClientRedirectResponseTrait; @@ -48,11 +49,13 @@ class AddJoinupVocabularies extends JoinupFederationStepPluginBase implements Pi * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\sparql_entity_storage\SparqlEntityStorageGraphHandlerInterface $graph_handler * The SPARQL graph handler service. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, SparqlEntityStorageGraphHandlerInterface $graph_handler) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, SparqlEntityStorageGraphHandlerInterface $graph_handler) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->graphHandler = $graph_handler; } @@ -65,6 +68,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('sparql_endpoint'), + $container->get('entity_type.manager'), $container->get('sparql.graph_handler') ); } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsValidation.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsValidation.php index 82b28574f3..6f74504992 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsValidation.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsValidation.php @@ -5,6 +5,7 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; use Drupal\adms_validator\AdmsValidatorInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\joinup_federation\JoinupFederationStepPluginBase; use Drupal\pipeline\Exception\PipelineStepExecutionLogicException; use Drupal\pipeline\Plugin\PipelineStepInterface; @@ -53,11 +54,13 @@ class AdmsValidation extends JoinupFederationStepPluginBase implements PipelineS * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\adms_validator\AdmsValidatorInterface $adms_validator * The ADMS validator service. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, AdmsValidatorInterface $adms_validator) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, AdmsValidatorInterface $adms_validator) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->admsValidator = $adms_validator; } @@ -70,6 +73,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('sparql_endpoint'), + $container->get('entity_type.manager'), $container->get('adms_validator.validator') ); } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AnalyzeIncomingEntities.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AnalyzeIncomingEntities.php index 9dac1531dc..368ae1d682 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AnalyzeIncomingEntities.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AnalyzeIncomingEntities.php @@ -115,8 +115,7 @@ class AnalyzeIncomingEntities extends JoinupFederationStepPluginBase implements * The hash generator service. */ public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, ProvenanceHelperInterface $provenance_helper, SchemaFieldValidatorInterface $rdf_schema_field_validator, JoinupFederationHashGenerator $hash_generator) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); - $this->entityTypeManager = $entity_type_manager; + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->entityFieldManager = $entity_field_manager; $this->provenanceHelper = $provenance_helper; $this->rdfSchemaFieldValidator = $rdf_schema_field_validator; diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/BrokenReferences.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/BrokenReferences.php index a4dd8411a7..67729fadbc 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/BrokenReferences.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/BrokenReferences.php @@ -71,8 +71,7 @@ class BrokenReferences extends JoinupFederationStepPluginBase implements Pipelin * The RDF schema field validator service. */ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, SchemaFieldValidatorInterface $rdf_schema_field_validator) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); - $this->entityTypeManager = $entity_type_manager; + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->entityFieldManager = $entity_field_manager; $this->rdfSchemaFieldValidator = $rdf_schema_field_validator; } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ConvertToAdms2.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ConvertToAdms2.php index 235710d68a..004aee1f49 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ConvertToAdms2.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ConvertToAdms2.php @@ -2,6 +2,7 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginManager; use Drupal\joinup_federation\JoinupFederationStepPluginBase; use Drupal\pipeline\Plugin\PipelineStepInterface; @@ -47,11 +48,13 @@ class ConvertToAdms2 extends JoinupFederationStepPluginBase implements PipelineS * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginManager $adms2_conver_pass_plugin_manager * The ADMS v1 to v2 transformation plugin manager. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, JoinupFederationAdms2ConvertPassPluginManager $adms2_conver_pass_plugin_manager) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, JoinupFederationAdms2ConvertPassPluginManager $adms2_conver_pass_plugin_manager) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->adms2ConverPassPluginManager = $adms2_conver_pass_plugin_manager; } @@ -64,6 +67,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('sparql_endpoint'), + $container->get('entity_type.manager'), $container->get('plugin.manager.joinup_federation_adms2_convert_pass') ); } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/Import.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/Import.php index 21f4591943..217017009d 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/Import.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/Import.php @@ -70,7 +70,7 @@ class Import extends JoinupFederationStepPluginBase implements PipelineStepWithB * The RDF schema field validator service. */ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, SchemaFieldValidatorInterface $rdf_schema_field_validator) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->entityTypeManager = $entity_type_manager; $this->entityFieldManager = $entity_field_manager; $this->rdfSchemaFieldValidator = $rdf_schema_field_validator; diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/JoinupValidation.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/JoinupValidation.php index 3d56a3314a..c1cef10de6 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/JoinupValidation.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/JoinupValidation.php @@ -5,6 +5,7 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; use Drupal\Component\Plugin\PluginManagerInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\joinup_federation\JoinupFederationStepPluginBase; use Drupal\pipeline\Exception\PipelineStepExecutionLogicException; use Drupal\pipeline\Plugin\PipelineStepInterface; @@ -86,11 +87,13 @@ class JoinupValidation extends JoinupFederationStepPluginBase implements Pipelin * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $connection * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\Component\Plugin\PluginManagerInterface $constraint_manager * The constraint plugin manager service. */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $connection, PluginManagerInterface $constraint_manager) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $connection); + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $connection, EntityTypeManagerInterface $entity_type_manager, PluginManagerInterface $constraint_manager) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $connection, $entity_type_manager); $this->constraintManager = $constraint_manager; } @@ -103,6 +106,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('sparql_endpoint'), + $container->get('entity_type.manager'), $container->get('validation.constraint') ); } diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ProvenanceActivity.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ProvenanceActivity.php index 758a2d128b..2a8af9cf7e 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ProvenanceActivity.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ProvenanceActivity.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\joinup_federation\JoinupFederationStepPluginBase; use Drupal\pipeline\Plugin\PipelineStepInterface; @@ -58,13 +59,15 @@ class ProvenanceActivity extends JoinupFederationStepPluginBase implements Pipel * The plugin implementation definition. * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql * The SPARQL database connection. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\rdf_entity_provenance\ProvenanceHelperInterface $rdf_entity_provenance_helper * The RDF entity provenance helper service. * @param \Drupal\Core\Session\AccountProxyInterface $current_user * The current user. */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $sparql, ProvenanceHelperInterface $rdf_entity_provenance_helper, AccountProxyInterface $current_user) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, ProvenanceHelperInterface $rdf_entity_provenance_helper, AccountProxyInterface $current_user) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->provenanceHelper = $rdf_entity_provenance_helper; $this->currentUser = $current_user; } @@ -78,6 +81,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('sparql_endpoint'), + $container->get('entity_type.manager'), $container->get('rdf_entity_provenance.provenance_helper'), $container->get('current_user') ); diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SparqlEntityStorageTrait.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SparqlEntityStorageTrait.php index e07895e4a2..a248626b71 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SparqlEntityStorageTrait.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SparqlEntityStorageTrait.php @@ -12,13 +12,6 @@ */ trait SparqlEntityStorageTrait { - /** - * The entity type manager service. - * - * @var \Drupal\Core\Entity\EntityTypeManagerInterface - */ - protected $entityTypeManager; - /** * The RDF entity SPARQL storage. * diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SpdxToJoinupLicence.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SpdxToJoinupLicence.php index 9ffb628b33..aaa21ae7f7 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SpdxToJoinupLicence.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/SpdxToJoinupLicence.php @@ -4,13 +4,9 @@ namespace Drupal\joinup_federation\Plugin\pipeline\Step; -use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\joinup_federation\JoinupFederationStepPluginBase; -use Drupal\pipeline\Plugin\PipelineStepInterface; use Drupal\pipeline\Plugin\PipelineStepWithBatchInterface; use Drupal\pipeline\Plugin\PipelineStepWithBatchTrait; -use Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines a process step that converts SPDX into Joinup licences. @@ -32,38 +28,6 @@ class SpdxToJoinupLicence extends JoinupFederationStepPluginBase implements Pipe */ const BATCH_SIZE = 10; - /** - * Creates a new pipeline step plugin instance. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin_id for the plugin instance. - * @param array $plugin_definition - * The plugin implementation definition. - * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql - * The SPARQL database connection. - * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager - * The entity type manager service. - */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); - $this->entityTypeManager = $entity_type_manager; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): PipelineStepInterface { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('sparql.endpoint'), - $container->get('entity_type.manager') - ); - } - /** * {@inheritdoc} */ diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ThreeWayMerge.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ThreeWayMerge.php index b1da90bb4f..b8f62ac1de 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ThreeWayMerge.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/ThreeWayMerge.php @@ -83,8 +83,7 @@ class ThreeWayMerge extends JoinupFederationStepPluginBase implements PipelineSt * The time service. */ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, SchemaFieldValidatorInterface $field_validator, TimeInterface $time) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); - $this->entityTypeManager = $entity_type_manager; + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->entityFieldManager = $entity_field_manager; $this->fieldValidator = $field_validator; $this->time = $time; diff --git a/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php new file mode 100644 index 0000000000..7abcabbefe --- /dev/null +++ b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php @@ -0,0 +1,36 @@ +pluginDefinition['steps'] = $steps; + } + + /** + * {@inheritdoc} + */ + public function getCollection(): ?string { + return 'http://invalid-collection-id'; + } + +} diff --git a/web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php b/web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php new file mode 100644 index 0000000000..16fc26b54f --- /dev/null +++ b/web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php @@ -0,0 +1,78 @@ + []]; + } + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'field', + 'joinup_sparql', + 'rdf_schema_field_validation', + 'rdf_taxonomy', + 'taxonomy', + 'text', + 'user', + 'system', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + $this->installSchema('system', ['key_value_expire']); + $graph = Yaml::decode(file_get_contents(DRUPAL_ROOT . '/modules/contrib/sparql_entity_storage/config/install/sparql_entity_storage.graph.default.yml')); + SparqlGraph::create($graph)->save(); + + // Create the collection bundle. + RdfEntityType::create(['rid' => 'collection', 'name' => 'Collection'])->save(); + $mapping = Yaml::decode(file_get_contents(__DIR__ . '/../../../../collection/config/install/sparql_entity_storage.mapping.rdf_entity.collection.yml')); + SparqlMapping::create($mapping)->save(); + } + + /** + * Sets up the pipeline with the joinup_federation_testing_pipeline plugin. + */ + protected function setUpPipeline(): void { + /** @var \Drupal\pipeline\Plugin\PipelinePipelinePluginManager $pipeline_plugin_manager */ + $pipeline_plugin_manager = $this->container->get('plugin.manager.pipeline_pipeline'); + /** @var \Drupal\pipeline\Plugin\PipelinePipelineInterface $pipeline */ + $this->pipeline = $pipeline_plugin_manager->createInstance('joinup_federation_invalid_testing_pipeline'); + $this->pipeline->setSteps($this->getUsedStepPlugins()); + } + + /** + * Test the invalid collection URI. + */ + public function testInvalidCollectionUri(): void { + $this->expectException(PipelineStepPrepareLogicException::class); + $this->expectExceptionMessage("A collection with URI 'http://invalid-collection-id' does not exist."); + $this->runPipelinePrepare('add_joinup_vocabularies'); + } + +} diff --git a/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php b/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php index 2ea97ec984..30b9267b42 100644 --- a/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php +++ b/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php @@ -51,7 +51,13 @@ abstract protected function getUsedStepPlugins(): array; protected function setUp() { parent::setUp(); $this->setUpSparql(); + $this->setUpPipeline(); + } + /** + * Sets up the pipeline with the joinup_federation_testing_pipeline plugin. + */ + protected function setUpPipeline(): void { /** @var \Drupal\pipeline\Plugin\PipelinePipelinePluginManager $pipeline_plugin_manager */ $pipeline_plugin_manager = $this->container->get('plugin.manager.pipeline_pipeline'); /** @var \Drupal\pipeline\Plugin\PipelinePipelineInterface $pipeline */ @@ -59,6 +65,24 @@ protected function setUp() { $this->pipeline->setSteps($this->getUsedStepPlugins()); } + /** + * Runs the ::prepare method of the given step. + * + * @param string $step_plugin_id + * The pipeline step. + * @param \Drupal\pipeline\PipelineStateInterface $state + * (optional) The pipeline state object. If missed a brand new will be + * created from the passed step. + */ + protected function runPipelinePrepare(string $step_plugin_id, PipelineStateInterface $state = NULL) { + $step_plugin_instance = $this->pipeline->createStepInstance($step_plugin_id); + if (!$state) { + $state = (new PipelineState())->setStepId($step_plugin_id); + } + $this->pipeline->setCurrentState($state); + $step_plugin_instance->prepare(); + } + /** * Runs a given step. * From 946449954b6da3b8e6183c396d324c8ba7d414de Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 23:08:19 +0200 Subject: [PATCH 096/957] ISAICP-5801: Enable the eu_sic module and assign the moderator permissions. --- config/sync/core.extension.yml | 1 + config/sync/user.role.moderator.yml | 1 + .../custom/joinup_user/config/install/user.role.moderator.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index ef1cc8a339..7c44955539 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -38,6 +38,7 @@ module: embed_block: 0 entity_legal: 0 error_page: 0 + eu_sic: 0 eupl: 0 facets: 0 field: 0 diff --git a/config/sync/user.role.moderator.yml b/config/sync/user.role.moderator.yml index 2a2bb66b81..467463865b 100644 --- a/config/sync/user.role.moderator.yml +++ b/config/sync/user.role.moderator.yml @@ -46,6 +46,7 @@ permissions: - 'edit licence rdf entity' - 'edit own document content' - 'edit owner rdf entity' + - 'execute eu_sic pipeline' - 'execute joinup_collection pipeline' - 'execute nio pipeline' - 'execute spain pipeline' diff --git a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml index de0fe0e32a..5520bf3b49 100644 --- a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml +++ b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml @@ -45,6 +45,7 @@ permissions: - 'edit licence rdf entity' - 'edit own document content' - 'edit owner rdf entity' + - 'execute eu_sic pipeline' - 'execute joinup_collection pipeline' - 'execute nio pipeline' - 'execute spain pipeline' From 1542bdadee9ae730f345493ac370c5d9bbd99e3b Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 18 Feb 2020 23:11:19 +0200 Subject: [PATCH 097/957] ISAICP-5801: Add a test for the existence of the pipeline. --- tests/features/joinup_federation/import.feature | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/features/joinup_federation/import.feature b/tests/features/joinup_federation/import.feature index dab2834eb0..211f6edb8a 100644 --- a/tests/features/joinup_federation/import.feature +++ b/tests/features/joinup_federation/import.feature @@ -10,10 +10,11 @@ Feature: As a site moderator I am able to import RDF files. Scenario: Test available pipelines Given I click "ADMS-AP importer" in the "Administration toolbar" region Then the "Data pipeline" select should contain the following options: - | - Select - | - | Joinup collection | - | Slovenian Interoperability Portal - NIO | - | Spain - Center for Technology Transfer | + | - Select - | + | EU Schemantic Interoperability Catalogue | + | Joinup collection | + | Slovenian Interoperability Portal - NIO | + | Spain - Center for Technology Transfer | Scenario: Test the pipeline functionality Given collection: From 6fe15c3e5c07104b487907061815cc8b25f02c6d Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 19 Feb 2020 14:03:41 +0200 Subject: [PATCH 098/957] ISAICP-5801: The step must be serializable. --- .../joinup_federation/src/JoinupFederationStepPluginBase.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php index b753663a0e..b3cd560950 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_federation; +use Drupal\Core\DependencyInjection\DependencySerializationTrait; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\pipeline\Exception\PipelineStepPrepareLogicException; @@ -17,6 +18,8 @@ */ abstract class JoinupFederationStepPluginBase extends PipelineStepPluginBase implements ContainerFactoryPluginInterface { + use DependencySerializationTrait; + /** * The SPARQL connection. * From 9d37bd9341d18dfb90f4e2bb9ff0a55606486347 Mon Sep 17 00:00:00 2001 From: joosthe Date: Wed, 19 Feb 2020 15:35:53 +0100 Subject: [PATCH 099/957] feat(node): added lasted to discussion + news + documents - FRONT-809 --- web/themes/joinup/joinup_theme.theme | 9 +++++++++ .../content/page-title--node--discussion.html.twig | 5 +++++ .../content/page-title--node--document.html.twig | 5 +++++ .../templates/content/page-title--node--news.html.twig | 5 +++++ 4 files changed, 24 insertions(+) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index efa5075d36..20e12ad90e 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1018,6 +1018,9 @@ function joinup_theme_preprocess_page_title__node__news(&$variables) { $published = \Drupal::service('date.formatter')->format($node->published_at->published_at_or_created, 'date_only'); $variables['additional_content']['published'] = $published; + $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $updateDate; + $author_inline = _joinup_theme_get_author($node); $variables['additional_content']['author'] = $author_inline; } @@ -1032,6 +1035,9 @@ function joinup_theme_preprocess_page_title__node__discussion(&$variables) { $published = \Drupal::service('date.formatter')->format($node->published_at->published_at_or_created, 'date_only'); $variables['additional_content']['published'] = $published; + $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $updateDate; + $author_inline = _joinup_theme_get_author($node); $variables['additional_content']['author'] = $author_inline; } @@ -1062,6 +1068,9 @@ function joinup_theme_preprocess_page_title__node__document(&$variables) { $field_document_publication_date = $viewBuilder->viewField($node->field_document_publication_date, 'default'); $variables['additional_content']['field_document_publication_date'] = $field_document_publication_date; + $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $updateDate; + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ $field_short_title = $viewBuilder->viewField($node->field_short_title, 'default'); $variables['additional_content']['field_short_title'] = $field_short_title; diff --git a/web/themes/joinup/templates/content/page-title--node--discussion.html.twig b/web/themes/joinup/templates/content/page-title--node--discussion.html.twig index e414471d23..877198e24e 100644 --- a/web/themes/joinup/templates/content/page-title--node--discussion.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--discussion.html.twig @@ -24,6 +24,11 @@
{{ 'Published on'|t }}: {{ additional_content.published }}
+ {% if additional_content.published != additional_content.updated %} +
+
{{ 'Last update'|t }}: {{ additional_content.updated }}
+
+ {% endif %} {% endif %} diff --git a/web/themes/joinup/templates/content/page-title--node--document.html.twig b/web/themes/joinup/templates/content/page-title--node--document.html.twig index 3d083549c8..e07095a734 100644 --- a/web/themes/joinup/templates/content/page-title--node--document.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--document.html.twig @@ -31,6 +31,11 @@
{{ 'Published on'|t }}: {{ additional_content.field_document_publication_date }}
+ {% if additional_content.published != additional_content.updated %} +
+
{{ 'Last update'|t }}: {{ additional_content.updated }}
+
+ {% endif %} {% endif %} diff --git a/web/themes/joinup/templates/content/page-title--node--news.html.twig b/web/themes/joinup/templates/content/page-title--node--news.html.twig index 7f67ebafe2..e5717005f9 100644 --- a/web/themes/joinup/templates/content/page-title--node--news.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--news.html.twig @@ -29,6 +29,11 @@
{{ 'Published on'|t }}: {{ additional_content.published }}
+ {% if additional_content.published != additional_content.updated %} +
+
{{ 'Last update'|t }}: {{ additional_content.updated }}
+
+ {% endif %} {% endif %} From 69badee847382b7c867625c878fb16f1c07b3066 Mon Sep 17 00:00:00 2001 From: joosthe Date: Wed, 19 Feb 2020 16:29:48 +0100 Subject: [PATCH 100/957] feat(node):remove title from news tile - FRONT-87 --- .../templates/content/node--news--listing-item.html.twig | 3 --- 1 file changed, 3 deletions(-) diff --git a/web/themes/joinup/templates/content/node--news--listing-item.html.twig b/web/themes/joinup/templates/content/node--news--listing-item.html.twig index 5897af41ff..46c8f6fac2 100644 --- a/web/themes/joinup/templates/content/node--news--listing-item.html.twig +++ b/web/themes/joinup/templates/content/node--news--listing-item.html.twig @@ -100,9 +100,6 @@ {{ title_suffix }} - {% if content.field_keywords|render %} -
{{ content.field_keywords }}
- {% endif %}
{{ published }} From fbd3594f9221e7c6e582699f0502b088364c8008 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 19 Feb 2020 16:58:14 +0200 Subject: [PATCH 101/957] ISAICP-5801: Fix some tests. --- tests/features/joinup_federation/import.feature | 15 +++++---------- .../Plugin/pipeline/Step/UserSelectionFilter.php | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/tests/features/joinup_federation/import.feature b/tests/features/joinup_federation/import.feature index 211f6edb8a..2a1204becf 100644 --- a/tests/features/joinup_federation/import.feature +++ b/tests/features/joinup_federation/import.feature @@ -2,7 +2,11 @@ Feature: As a site moderator I am able to import RDF files. Background: - Given users: + Given collection: + | uri | http://administracionelectronica.gob.es/ctt | + | title | Spain | + | state | validated | + And users: | Username | Roles | | Antoine Batiste | moderator | And I am logged in as "Antoine Batiste" @@ -17,10 +21,6 @@ Feature: As a site moderator I am able to import RDF files. | Spain - Center for Technology Transfer | Scenario: Test the pipeline functionality - Given collection: - | uri | http://administracionelectronica.gob.es/ctt | - | title | Spain | - | state | validated | And users: | Username | Roles | | LaDonna | moderator | @@ -331,11 +331,6 @@ Feature: As a site moderator I am able to import RDF files. @joinup_collection Scenario: Test that solutions cannot be re-federated in a different collection. - And collection: - | uri | http://administracionelectronica.gob.es/ctt | - | title | Spain | - | state | validated | - Given I click "ADMS-AP importer" in the "Administration toolbar" region And I select "Spain - Center for Technology Transfer" from "Data pipeline" And I press "Execute" diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/UserSelectionFilter.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/UserSelectionFilter.php index 1b19cd07c7..22cd6c6a2d 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/UserSelectionFilter.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/UserSelectionFilter.php @@ -90,7 +90,7 @@ class UserSelectionFilter extends JoinupFederationStepPluginBase implements Pipe * The RDF schema field validator service. */ public function __construct(array $configuration, $plugin_id, array $plugin_definition, ConnectionInterface $sparql, EntityTypeManagerInterface $entity_type_manager, ProvenanceHelperInterface $rdf_entity_provenance_helper, DateFormatterInterface $date_formatter, EntityFieldManagerInterface $entity_field_manager, SchemaFieldValidatorInterface $rdf_schema_field_validator) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql); + parent::__construct($configuration, $plugin_id, $plugin_definition, $sparql, $entity_type_manager); $this->entityTypeManager = $entity_type_manager; $this->provenanceHelper = $rdf_entity_provenance_helper; $this->dateFormatter = $date_formatter; From 9338cb5edb0349223d80066feac49149aaa48a18 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 20 Feb 2020 09:21:20 +0200 Subject: [PATCH 102/957] ISAICP-5791: Rename the 'limited access' warning page route. --- web/modules/custom/eulogin/joinup_eulogin.routing.yml | 2 +- .../eulogin/src/Controller/LimitedAccessController.php | 2 +- .../src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/eulogin/joinup_eulogin.routing.yml b/web/modules/custom/eulogin/joinup_eulogin.routing.yml index 105e6b0c42..34492b8128 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.routing.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.routing.yml @@ -1,4 +1,4 @@ -joinup_eulogin.limited_access: +joinup_eulogin.page.limited_access: path: '/user/limited-access' defaults: _controller: Drupal\joinup_eulogin\Controller\LimitedAccessController::page diff --git a/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php index fa32e9cf20..a306b02438 100644 --- a/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php +++ b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php @@ -7,7 +7,7 @@ use Drupal\Core\Controller\ControllerBase; /** - * Provides a controller for the joinup_eulogin.limited_access route. + * Provides a controller for the joinup_eulogin.page.limited_access route. */ class LimitedAccessController extends ControllerBase { diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index 07d70bca7e..6fa104ca04 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -102,7 +102,7 @@ public function setAccessDeniedCode(FilterResponseEvent $event): void { } $route_match = $this->routeMatch->getRouteMatchFromRequest($event->getRequest()); - if ($route_match->getRouteName() === 'joinup_eulogin.limited_access') { + if ($route_match->getRouteName() === 'joinup_eulogin.page.limited_access') { // For anonymous or EU Login users this page doesn't exist. if ($this->isAnonymousOrEuLoginUser()) { throw new NotFoundHttpException(); @@ -148,7 +148,7 @@ public function redirectWhenNoAccess(GetResponseEvent $event): void { // between user with different EU Login link status. $cache_metadata = (new CacheableMetadata())->addCacheContexts(['user.is_eulogin']); // Redirect to 'Limited access' page. - $response = new LocalRedirectResponse(Url::fromRoute('joinup_eulogin.limited_access')->toString()); + $response = new LocalRedirectResponse(Url::fromRoute('joinup_eulogin.page.limited_access')->toString()); $event->setResponse($response->addCacheableDependency($cache_metadata)); } @@ -168,7 +168,7 @@ protected function isRouteAllowed(): bool { // 'Page not found' is always accessible. 'joinup_core.not_found', // The 'Limited access' warning page. - 'joinup_eulogin.limited_access', + 'joinup_eulogin.page.limited_access', // CSRF token route. 'system.csrftoken', // Still able to contact support. From fb6ff41be70b2055d3237ac61ca1826f445d21c9 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 20 Feb 2020 10:32:10 +0200 Subject: [PATCH 103/957] ISAICP-5801: Now THAT's a typo. --- .../src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php index f5ccf03af9..47c36a5393 100644 --- a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php +++ b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php @@ -31,7 +31,7 @@ class JoinupCollectionPipeline extends JoinupFederationPipelinePluginBase { * {@inheritdoc} */ public function getCollection(): ?string { - return 'http://data.europa.eu/w21/df34e3a2-207b-4910-a804-344931654e20 '; + return 'http://data.europa.eu/w21/df34e3a2-207b-4910-a804-344931654e20'; } } From 1a8a48dc0ae99f5a893b0311f440a19572799858 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 20 Feb 2020 10:32:31 +0200 Subject: [PATCH 104/957] ISAICP-5801: Set up the error message also for the display. --- .../src/JoinupFederationStepPluginBase.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php index b3cd560950..c8abf6dced 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationStepPluginBase.php @@ -99,7 +99,15 @@ public function prepare() { $collection_id = $this->getPipeline()->getCollection(); if (empty($collection_id) || empty($this->entityTypeManager->getStorage('rdf_entity')->load($collection_id))) { - throw new PipelineStepPrepareLogicException("A collection with URI '{$collection_id}' does not exist."); + $exception = new PipelineStepPrepareLogicException("A collection with URI '{$collection_id}' does not exist."); + // The error is for the user display. The exception message above is for + // the tests. + $exception->setError([ + '#markup' => $this->t("A collection with URI ':collection_id' does not exist.", [ + ':collection_id' => $collection_id, + ]), + ]); + throw $exception; } } From e4bd20b51516cd4d9abd0c3b3d5eba2f95391600 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 21 Feb 2020 16:51:00 +0200 Subject: [PATCH 105/957] ISAICP-5801: Fix QA remarks. Fallback to a collection declared in annotation. --- .../pipeline/Pipeline/EuSicPipeline.php | 2 +- .../Pipeline/JoinupCollectionPipeline.php | 2 +- .../Plugin/pipeline/Pipeline/NioPipeline.php | 2 +- .../pipeline/Pipeline/SpainCttPipeline.php | 2 +- .../src/JoinupFederationPipelineInterface.php | 6 +-- .../JoinupFederationPipelinePluginBase.php | 14 ++++++- ...JoinupFederationInvalidTestingPipeline.php | 21 +++++++--- .../JoinupFederationTestingPipeline.php | 2 +- ...llectionTest.php => CollectionUriTest.php} | 40 ++++++++++++++----- 9 files changed, 65 insertions(+), 26 deletions(-) rename web/modules/custom/joinup_federation/tests/src/Kernel/{InvalidCollectionTest.php => CollectionUriTest.php} (72%) diff --git a/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php b/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php index 23f7be2305..4e574d4fc4 100644 --- a/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php +++ b/web/modules/custom/joinup_communities/eu_sic/src/Plugin/pipeline/Pipeline/EuSicPipeline.php @@ -30,7 +30,7 @@ class EuSicPipeline extends JoinupFederationPipelinePluginBase { /** * {@inheritdoc} */ - public function getCollection(): ?string { + public function getCollection(): string { return 'http://data.europa.eu/w21/b1e19fbc-f96e-478a-a449-fdaaeed17e3a'; } diff --git a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php index 47c36a5393..99bc2820c9 100644 --- a/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php +++ b/web/modules/custom/joinup_communities/joinup_collection/src/Plugin/pipeline/Pipeline/JoinupCollectionPipeline.php @@ -30,7 +30,7 @@ class JoinupCollectionPipeline extends JoinupFederationPipelinePluginBase { /** * {@inheritdoc} */ - public function getCollection(): ?string { + public function getCollection(): string { return 'http://data.europa.eu/w21/df34e3a2-207b-4910-a804-344931654e20'; } diff --git a/web/modules/custom/joinup_communities/nio/src/Plugin/pipeline/Pipeline/NioPipeline.php b/web/modules/custom/joinup_communities/nio/src/Plugin/pipeline/Pipeline/NioPipeline.php index 57dfce38aa..6558bacafa 100644 --- a/web/modules/custom/joinup_communities/nio/src/Plugin/pipeline/Pipeline/NioPipeline.php +++ b/web/modules/custom/joinup_communities/nio/src/Plugin/pipeline/Pipeline/NioPipeline.php @@ -31,7 +31,7 @@ class NioPipeline extends JoinupFederationPipelinePluginBase { /** * {@inheritdoc} */ - public function getCollection(): ?string { + public function getCollection(): string { return 'http://nio.gov.si/nio/'; } diff --git a/web/modules/custom/joinup_communities/spain_ctt/src/Plugin/pipeline/Pipeline/SpainCttPipeline.php b/web/modules/custom/joinup_communities/spain_ctt/src/Plugin/pipeline/Pipeline/SpainCttPipeline.php index 8996c409db..29dbf919fd 100644 --- a/web/modules/custom/joinup_communities/spain_ctt/src/Plugin/pipeline/Pipeline/SpainCttPipeline.php +++ b/web/modules/custom/joinup_communities/spain_ctt/src/Plugin/pipeline/Pipeline/SpainCttPipeline.php @@ -30,7 +30,7 @@ class SpainCttPipeline extends JoinupFederationPipelinePluginBase { /** * {@inheritdoc} */ - public function getCollection(): ?string { + public function getCollection(): string { return 'http://administracionelectronica.gob.es/ctt'; } diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationPipelineInterface.php b/web/modules/custom/joinup_federation/src/JoinupFederationPipelineInterface.php index 1ee06e20da..4b6760de68 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationPipelineInterface.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationPipelineInterface.php @@ -14,10 +14,10 @@ interface JoinupFederationPipelineInterface extends PipelinePipelineInterface { /** * Returns the uri of the collection that the pipeline is related to. * - * @return string|null - * The uri of the collection. + * @return string + * The URI of the collection. */ - public function getCollection(): ?string; + public function getCollection(): string; /** * Returns the graph URI for a specific federation graph. diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationPipelinePluginBase.php b/web/modules/custom/joinup_federation/src/JoinupFederationPipelinePluginBase.php index 075433f15e..ad1a78dfda 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationPipelinePluginBase.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationPipelinePluginBase.php @@ -110,8 +110,12 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} */ - public function getCollection(): ?string { - return NULL; + public function getCollection(): string { + // Allow also to set the pipeline collection ID from pipeline annotation. + if (!empty($this->getPluginDefinition()['collection'])) { + return $this->getPluginDefinition()['collection']; + } + return ''; } /** @@ -137,6 +141,12 @@ public function defaultConfiguration(): array { * {@inheritdoc} */ public function prepare() { + if (empty($this->getCollection())) { + return $this->t('The %pipeline import pipeline is not linked to any collection. Contact the site administrator.', [ + '%pipeline' => $this->getPluginDefinition()['label'], + ]); + } + if (!$this->lock()) { $arguments = ['@pipeline' => $this->getPluginDefinition()['label']]; return $this->t("There's another ongoing import process run by other user. You cannot run '@pipeline' right now.", $arguments); diff --git a/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php index 7abcabbefe..745c57f5a8 100644 --- a/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php +++ b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationInvalidTestingPipeline.php @@ -5,11 +5,11 @@ use Drupal\joinup_federation\JoinupFederationPipelinePluginBase; /** - * Provides a pipline testing plugin. + * Provides a pipeline testing plugin. * * @PipelinePipeline( - * id = "joinup_federation_invalid_testing_pipeline", - * label = @Translation("Joinup federation invalid testing pipeline"), + * id = "joinup_federation_pipeline_collection_uri_test", + * label = @Translation("Joinup federation pipeline collection URI testing"), * steps = {}, * ) */ @@ -29,8 +29,19 @@ public function setSteps(array $steps) { /** * {@inheritdoc} */ - public function getCollection(): ?string { - return 'http://invalid-collection-id'; + public function getCollection(): string { + switch (\Drupal::state()->get('joinup_federation.test.collection')) { + case 'missed': + return ''; + + case 'invalid': + return 'http://invalid-collection-id'; + + case 'from_annotation': + $this->pluginDefinition['collection'] = 'http://from-annotation'; + return parent::getCollection(); + } + throw new \Exception('Invalid test case'); } } diff --git a/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationTestingPipeline.php b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationTestingPipeline.php index bd3bb8661d..88f1b5b5fc 100644 --- a/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationTestingPipeline.php +++ b/web/modules/custom/joinup_federation/tests/modules/joinup_federation_test/src/Plugin/pipeline/Pipeline/JoinupFederationTestingPipeline.php @@ -29,7 +29,7 @@ public function setSteps(array $steps) { /** * {@inheritdoc} */ - public function getCollection(): ?string { + public function getCollection(): string { return 'http://catalog'; } diff --git a/web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php b/web/modules/custom/joinup_federation/tests/src/Kernel/CollectionUriTest.php similarity index 72% rename from web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php rename to web/modules/custom/joinup_federation/tests/src/Kernel/CollectionUriTest.php index 16fc26b54f..0e6326e6dd 100644 --- a/web/modules/custom/joinup_federation/tests/src/Kernel/InvalidCollectionTest.php +++ b/web/modules/custom/joinup_federation/tests/src/Kernel/CollectionUriTest.php @@ -15,16 +15,7 @@ * * @group joinup_federation */ -class InvalidCollectionTest extends StepTestBase { - - /** - * {@inheritdoc} - */ - protected function getUsedStepPlugins(): array { - // We need a sample step to run to ensure the exception. - // 'add_joinup_vocabularies' is a randomly selected step. - return ['add_joinup_vocabularies' => []]; - } +class CollectionUriTest extends StepTestBase { /** * {@inheritdoc} @@ -40,6 +31,15 @@ protected function getUsedStepPlugins(): array { 'system', ]; + /** + * {@inheritdoc} + */ + protected function getUsedStepPlugins(): array { + // We need a sample step to run to ensure the exception. + // 'add_joinup_vocabularies' is a randomly selected step. + return ['add_joinup_vocabularies' => []]; + } + /** * {@inheritdoc} */ @@ -62,17 +62,35 @@ protected function setUpPipeline(): void { /** @var \Drupal\pipeline\Plugin\PipelinePipelinePluginManager $pipeline_plugin_manager */ $pipeline_plugin_manager = $this->container->get('plugin.manager.pipeline_pipeline'); /** @var \Drupal\pipeline\Plugin\PipelinePipelineInterface $pipeline */ - $this->pipeline = $pipeline_plugin_manager->createInstance('joinup_federation_invalid_testing_pipeline'); + $this->pipeline = $pipeline_plugin_manager->createInstance('joinup_federation_pipeline_collection_uri_test'); $this->pipeline->setSteps($this->getUsedStepPlugins()); } + /** + * Test the missed collection URI. + */ + public function testMissedCollectionUri(): void { + $this->container->get('state')->set('joinup_federation.test.collection', 'missed'); + $error = strip_tags($this->pipeline->prepare()->__toString()); + $this->assertEquals('The Joinup federation pipeline collection URI testing import pipeline is not linked to any collection. Contact the site administrator.', $error); + } + /** * Test the invalid collection URI. */ public function testInvalidCollectionUri(): void { + $this->container->get('state')->set('joinup_federation.test.collection', 'invalid'); $this->expectException(PipelineStepPrepareLogicException::class); $this->expectExceptionMessage("A collection with URI 'http://invalid-collection-id' does not exist."); $this->runPipelinePrepare('add_joinup_vocabularies'); } + /** + * Test the collection URI declared in annotation. + */ + public function testCollectionUriFromAnnotation(): void { + $this->container->get('state')->set('joinup_federation.test.collection', 'from_annotation'); + $this->assertEquals('http://from-annotation', $this->pipeline->getCollection()); + } + } From a006c2b62516cfe21f6cb09a2db6c194a0693397 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 20 Feb 2020 15:24:51 +0200 Subject: [PATCH 106/957] Declare the name of the project. --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 2883af804c..3b241c96a8 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,6 @@ - + From bacc955010ff28fbb561dcfc2c92a944bd0b5738 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 12:39:12 +0200 Subject: [PATCH 107/957] ISAICP-5791: Rename ::isAnonymousOrEuLoginUser() to ::userHasUnlimitedAccess(). --- .../Subscriber/JoinupEuLoginKernelSubscriber.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index 6fa104ca04..a2b2d7c7a4 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -104,7 +104,7 @@ public function setAccessDeniedCode(FilterResponseEvent $event): void { $route_match = $this->routeMatch->getRouteMatchFromRequest($event->getRequest()); if ($route_match->getRouteName() === 'joinup_eulogin.page.limited_access') { // For anonymous or EU Login users this page doesn't exist. - if ($this->isAnonymousOrEuLoginUser()) { + if ($this->userHasUnlimitedAccess()) { throw new NotFoundHttpException(); } $event->getResponse()->setStatusCode(Response::HTTP_FORBIDDEN); @@ -123,7 +123,7 @@ public function redirectWhenNoAccess(GetResponseEvent $event): void { } // Allow anonymous or EU Login users. - if ($this->isAnonymousOrEuLoginUser()) { + if ($this->userHasUnlimitedAccess()) { return; } @@ -196,13 +196,17 @@ protected function isRouteAllowed(): bool { } /** - * Checks if the current user is anonymous or has an EU Login linked account. + * Checks if the current user has unlimited access. * * @return bool - * TRUE if the user is anonymous or has an EU Login linked account. + * TRUE if the current user has unlimited access. */ - protected function isAnonymousOrEuLoginUser(): bool { - return $this->currentUser->isAnonymous() || $this->authmap->get($this->currentUser->id(), 'cas'); + protected function userHasUnlimitedAccess(): bool { + // A user has unlimited access if: + // - is anonymous. + return $this->currentUser->isAnonymous() + // - or is an EU Login linked user. + || $this->authmap->get($this->currentUser->id(), 'cas'); } /** From 2341b9d17c354ece14eb901e7be528ae97c0a326 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 12:43:20 +0200 Subject: [PATCH 108/957] ISAICP-5791: Reverse the limited access killswitch. --- web/modules/custom/eulogin/joinup_eulogin.behat.inc | 4 ++-- .../Subscriber/JoinupEuLoginKernelSubscriber.php | 12 ++++++------ .../tests/src/ExistingSite/JoinupEuLoginTest.php | 4 ++-- .../src/ExistingSite/JoinupExistingSiteTestBase.php | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/web/modules/custom/eulogin/joinup_eulogin.behat.inc b/web/modules/custom/eulogin/joinup_eulogin.behat.inc index 3f6686c1fd..2fbca9beae 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.behat.inc +++ b/web/modules/custom/eulogin/joinup_eulogin.behat.inc @@ -21,7 +21,7 @@ class JoinupEuLoginSubContext extends DrupalSubContextBase { * @BeforeSuite */ public static function disableLimitedAccess(): void { - \Drupal::state()->set('joinup_eulogin.limited_access', FALSE); + \Drupal::state()->set('joinup_eulogin.disable_limited_access', TRUE); } /** @@ -32,7 +32,7 @@ class JoinupEuLoginSubContext extends DrupalSubContextBase { * @see self::disableLimitedAccess() */ public static function restoreLimitedAccess(): void { - \Drupal::state()->delete('joinup_eulogin.limited_access'); + \Drupal::state()->delete('joinup_eulogin.disable_limited_access'); } } diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index a2b2d7c7a4..bef5db9d4e 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -97,7 +97,7 @@ public static function getSubscribedEvents(): array { * The response event object. */ public function setAccessDeniedCode(FilterResponseEvent $event): void { - if (!$this->limitedAccessIsEnabled()) { + if ($this->limitedAccessIsDisabled()) { return; } @@ -118,7 +118,7 @@ public function setAccessDeniedCode(FilterResponseEvent $event): void { * The request event. */ public function redirectWhenNoAccess(GetResponseEvent $event): void { - if (!$this->limitedAccessIsEnabled()) { + if ($this->limitedAccessIsDisabled()) { return; } @@ -210,13 +210,13 @@ protected function userHasUnlimitedAccess(): bool { } /** - * Checks if limiting access is enabled. + * Checks if limiting access is disabled. * * @return bool - * If limiting access is enabled. + * If limiting access is disabled. */ - protected function limitedAccessIsEnabled(): bool { - return $this->state->get('joinup_eulogin.limited_access', TRUE); + protected function limitedAccessIsDisabled(): bool { + return $this->state->get('joinup_eulogin.disable_limited_access', FALSE); } } diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index ace703fe6d..3fcbd1020d 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -68,7 +68,7 @@ public function testLimitedAccess(): void { $state = \Drupal::state(); // This test needs the limited access functionality enabled. - $state->delete('joinup_eulogin.limited_access'); + $state->delete('joinup_eulogin.disable_limited_access'); $assert = $this->assertSession(); $page = $this->getSession()->getPage(); @@ -135,7 +135,7 @@ public function testLimitedAccess(): void { $this->assertAccess($this->account->toUrl('edit-form'), $this->account->getDisplayName()); // Disable the limited access functionality. - \Drupal::state()->set('joinup_eulogin.limited_access', FALSE); + $state->set('joinup_eulogin.disable_limited_access', TRUE); } /** diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index d6215227f8..5f00a597a7 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -49,7 +49,7 @@ protected function setUp(): void { $this->disableHoneypot(); // Disable limited access functionality. - \Drupal::state()->set('joinup_eulogin.limited_access', FALSE); + \Drupal::state()->set('joinup_eulogin.disable_limited_access', TRUE); if ($this->disableAntibot) { // As ExistingSiteBase tests are running without javascript, we disable @@ -74,7 +74,7 @@ public function tearDown(): void { } // Re-enable limited access functionality. - \Drupal::state()->delete('joinup_eulogin.limited_access'); + \Drupal::state()->delete('joinup_eulogin.disable_limited_access'); // Restore the mail settings. $this->restoreMailSettings(); From 8b9020ea562d9dd3cab4453c7e55fecdf3ca144d Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 12:43:52 +0200 Subject: [PATCH 109/957] ISAICP-5791: Fix a service definition spacing. --- web/modules/custom/eulogin/joinup_eulogin.services.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/joinup_eulogin.services.yml b/web/modules/custom/eulogin/joinup_eulogin.services.yml index 7e7108bbeb..08ff94d385 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.services.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.services.yml @@ -21,4 +21,4 @@ services: class: Drupal\joinup_eulogin\Cache\Context\EuLoginUserCacheContext arguments: ['@current_user', '@entity_type.manager'] tags: - - { name: cache.context} + - { name: cache.context } From a338987947e2aff93d462517356e7481e95152f3 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 12:45:06 +0200 Subject: [PATCH 110/957] ISAICP-5791: Consolidate the spam protection kill-switch. --- .../tests/src/ExistingSite/ConfigTest.php | 2 +- .../JoinupExistingSiteTestBase.php | 29 +++++++++---------- 2 files changed, 14 insertions(+), 17 deletions(-) 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 750da1bb60..b939688faa 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php @@ -18,7 +18,7 @@ class ConfigTest extends JoinupExistingSiteTestBase { /** * {@inheritdoc} */ - protected $disableAntibot = FALSE; + protected $disableSpamProtection = FALSE; /** * Tests that the active and sync stores are the same. diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 5f00a597a7..8ad823ef00 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -26,14 +26,14 @@ abstract class JoinupExistingSiteTestBase extends ExistingSiteBase { * * @var bool[] */ - protected static $honeypotForms; + protected $honeypotForms; /** - * Whether the current test should run with Antibot features disabled. + * Whether the current test should run without Antibot & Honeypot features. * * @var bool */ - protected $disableAntibot = TRUE; + protected $disableSpamProtection = TRUE; /** * {@inheritdoc} @@ -44,17 +44,14 @@ protected function setUp(): void { // Use the testing mail collector during tests. $this->startMailCollection(); - // As ExistingSiteBase tests are running without javascript, we disable - // Antibot and Honeypot functionality during the tests run. - $this->disableHoneypot(); - // Disable limited access functionality. \Drupal::state()->set('joinup_eulogin.disable_limited_access', TRUE); - if ($this->disableAntibot) { + if ($this->disableSpamProtection) { // As ExistingSiteBase tests are running without javascript, we disable - // Antibot during the tests run, if it has been requested. + // Antibot & Honeypot during the tests run, if it has been requested. $this->disableAntibot(); + $this->disableHoneypot(); } } @@ -62,11 +59,11 @@ protected function setUp(): void { * {@inheritdoc} */ public function tearDown(): void { - // Restores the Antibot functionality, if case. - if ($this->disableAntibot) { - static::restoreAntibot(); + // Restores the spam protection functionality, if case. + if ($this->disableSpamProtection) { + $this->restoreAntibot(); + $this->restoreHoneypot(); } - $this->restoreHoneypot(); // Make sure we don't send any notifications during test entities cleanup. foreach ($this->cleanupEntities as $entity) { @@ -123,10 +120,10 @@ protected function disableHoneypot(): void { $config_factory = \Drupal::configFactory(); $config = $config_factory->getEditable('honeypot.settings'); if (!isset($this->honeypotForms)) { - static::$honeypotForms = $config->get('form_settings'); + $this->honeypotForms = $config->get('form_settings'); } $config - ->set('form_settings', array_fill_keys(array_keys(static::$honeypotForms), FALSE)) + ->set('form_settings', array_fill_keys(array_keys($this->honeypotForms), FALSE)) ->save(); static::restoreReadOnlyConfig(); } @@ -137,7 +134,7 @@ protected function disableHoneypot(): void { protected function restoreHoneypot(): void { static::bypassReadOnlyConfig(); \Drupal::configFactory()->getEditable('honeypot.settings') - ->set('form_settings', static::$honeypotForms) + ->set('form_settings', $this->honeypotForms) ->save(); static::restoreReadOnlyConfig(); } From 9ff7613849ae95e085261d1a5406e8d7278c9340 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 12:57:47 +0200 Subject: [PATCH 111/957] ISAICP-5791: Document why we're disabling limited access during testing. --- .../src/ExistingSite/JoinupExistingSiteTestBase.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 8ad823ef00..96034681ba 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -44,7 +44,15 @@ protected function setUp(): void { // Use the testing mail collector during tests. $this->startMailCollection(); - // Disable limited access functionality. + // 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 + // password recovery. On the other hand, in testing, we use the + // one-time-login mechanism to perform the authentication, instead of + // following the CAS login process, thus we disable limited access. Tests + // that are specifically testing limited access are able to use this + // kill-switch by temporary re-enabling the functionality during testing. + // @see \Drupal\Tests\joinup_eulogin\ExistingSite\JoinupEuLoginTest::testLimitedAccess() \Drupal::state()->set('joinup_eulogin.disable_limited_access', TRUE); if ($this->disableSpamProtection) { From a836408ab09e327a4526ac7855b4bcffe08bf7d4 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sun, 23 Feb 2020 13:56:55 +0200 Subject: [PATCH 112/957] ISAICP-5791: Use the active store mail configurations during config diffs test. --- .../tests/src/ExistingSite/ConfigTest.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) 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 b939688faa..8b61a01d58 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php @@ -20,6 +20,20 @@ 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_core\ExistingSite\JoinupExistingSiteTestBase::setUp() + $this->restoreMailSettings(); + } + /** * Tests that the active and sync stores are the same. */ @@ -35,6 +49,15 @@ 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(); + } + /** * Returns a list of ignored configuration names. * From 32035b7e77f2d4c6c6aa3f06ba6a62e7d6cf53e2 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 00:08:58 +0200 Subject: [PATCH 113/957] ISAICP-5408: Update documentation. --- tests/features/joinup_seo/event.feature | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 8b6ac104a4..ff6325b2be 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -22,9 +22,11 @@ Feature: SEO for news articles. | property | value | | @type | Event | | name | Joinup SEO event | - # Though it would be nice to have this to the Joinup URL, Search Engines expect this to be the URL of the event. - # If a website is provided, then that means that the entity in Joinup is simply a promotion, and all the handling - # of registrations etc, already has a website, thus we point to that location. + # Though it would be nice to have this to the Joinup URL, Search Engines + # expect this to be the URL of the event. If a website is provided, then + # that means that the entity in Joinup is simply a promotion, and all the + # handling of registrations etc, already has a website, thus we point to + # that location. | url | | # Summary is preferred over the body of the entity. | description | Summary of event. | @@ -36,8 +38,8 @@ Feature: SEO for news articles. | property | value | | @type | ImageObject | | representativeOfPage | True | - # $random_text$ can be any string that is appointed by the system and we cannot predict. - # In this case, it is a random file name that is appointed to the image. + # $random_text$ can be any string that is appointed by the system and we + # cannot predict. In this case it is the random file name of the image. | url | $base_url$/sites/default/files/$random_text$.jpg | | width | 377 | | height | 139 | @@ -46,7 +48,8 @@ Feature: SEO for news articles. | @type | Place | | name | | | url | http://example.com/some-online-meetup | - # Target the location subgraph which has the name property set to "Rue Belliard 28". + # Target the location subgraph which has the name property set to "Rue + # Belliard 28". And the metatag subgraph of the item with "name" "Rue Belliard 28" should have the following "address" properties: | property | value | | @type | PostalAddress | @@ -61,15 +64,15 @@ Feature: SEO for news articles. When I click "Keep up to date" Then I should see the "Joinup SEO event" tile # No metatags are defined for the keep up to date page. - # No metatags JSON in general means also that the entity metatags of the news item - # is also not attached when the tile is present. + # No metatags JSON in general means also that the entity metatags of the + # news item is also not attached when the tile is present. And the metatag JSON should not be attached in the page Examples: | web url | expected url | location | expected location | | | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | - # Urls need a title value in the 0 index and a url in the 1 index of the value to work, otherwise it is parsed - # wrongly. + # Urls need a title value in the 0 index and a url in the 1 index of the + # value to work, otherwise it is parsed wrongly. # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | From a4ec9e3701bdc33741995fb3644d713af9601503 Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 25 Feb 2020 09:58:50 +0100 Subject: [PATCH 114/957] feat(solutions & collection): add required asterisk - FRONT-808 --- web/themes/joinup/joinup_theme.theme | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index e3ca538989..b2a6510bce 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -885,26 +885,26 @@ function joinup_theme_preprocess_field__comment(&$variables) { */ function joinup_theme_preprocess_form(&$variables) { // Exclude collection and solution forms. - $form_ids = [ - 'rdf_entity_collection_edit_form', - 'rdf_entity_collection_propose_form', - 'rdf_entity_collection_add_form', - 'rdf_entity_solution_edit_form', - 'rdf_entity_solution_form', - 'rdf_entity_solution_add_form', - ]; + // $form_ids = [ + // 'rdf_entity_collection_edit_form', + // 'rdf_entity_collection_propose_form', + // 'rdf_entity_collection_add_form', + // 'rdf_entity_solution_edit_form', + // 'rdf_entity_solution_form', + // 'rdf_entity_solution_add_form', + // ]; // Display asterisk for required fields. - if (!in_array($variables['element']['#form_id'], $form_ids)) { + //if (!in_array($variables['element']['#form_id'], $form_ids)) { $variables['attributes']['class'][] = 'form__with-asterisk'; - } + //} // Additional classes for members overview. if (strpos($variables['element']['#form_id'], 'views_form_og_members_overview_default_rdf_entity') !== FALSE) { $variables['attributes']['class'][] = 'form__content'; $variables['attributes']['class'][] = 'form__margin-top'; $variables['attributes']['class'][] = 'form__member-actions'; - } + } } /** From 057e97ec603d017fcf8f26caa4c6b606a9e3e434 Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 25 Feb 2020 10:56:26 +0100 Subject: [PATCH 115/957] feattiles): changed logo area - FRONT-810 --- web/themes/joinup/prototype/sass/components/_listing.sass | 5 +++-- web/themes/joinup/prototype/sass/variables/_variables.sass | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/web/themes/joinup/prototype/sass/components/_listing.sass b/web/themes/joinup/prototype/sass/components/_listing.sass index c8df7e8894..852926c492 100644 --- a/web/themes/joinup/prototype/sass/components/_listing.sass +++ b/web/themes/joinup/prototype/sass/components/_listing.sass @@ -25,8 +25,9 @@ position: relative overflow: hidden height: 140px + margin: 10px 10px 0 text-align: center - background: $color-grey-lighter + background: $color-grey-white +z-index(highlight) img max-width: 100% @@ -95,7 +96,7 @@ bottom: 0 left: 0 width: 100% - padding: 0 10px + padding: 0 20px text-align: right .listing__stat diff --git a/web/themes/joinup/prototype/sass/variables/_variables.sass b/web/themes/joinup/prototype/sass/variables/_variables.sass index 5cadd93997..012fc4ba62 100644 --- a/web/themes/joinup/prototype/sass/variables/_variables.sass +++ b/web/themes/joinup/prototype/sass/variables/_variables.sass @@ -2,6 +2,7 @@ // -------------------------------------------------- $color-base: #211b38 +$color-grey-white: #fff $color-grey-lighter: #f4f6f7 $color-grey-light: #e1e1e1 $color-grey-medium: #707475 From a86988dd099f08ab092131750f2422ac46342c68 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 13:00:36 +0200 Subject: [PATCH 116/957] ISAICP-5684: Store the release in a file after installing or updating dependencies. --- composer.json | 4 + composer.lock | 136 +++++++++++++++------- scripts/composer/CaptureGitReleaseTag.php | 37 ++++++ 3 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 scripts/composer/CaptureGitReleaseTag.php diff --git a/composer.json b/composer.json index 92f565c6e3..49561e3ec4 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "composer/composer": "^1.9.1", "composer/installers": "^1.7", "continuousphp/aws-sdk-phing": "~0.5", + "cpliakas/git-wrapper": "~1.7", "cweagans/composer-patches": "^1.6.4", "drupal/allowed_formats": "^1.2", "drupal/antibot": "^1.3", @@ -143,6 +144,7 @@ "DrupalProject\\": "src" }, "classmap": [ + "scripts/composer/CaptureGitReleaseTag.php", "scripts/composer/ScriptHandler.php", "scripts/composer/RemoveWrongPatchedObjects.php", "web/modules/custom/joinup_sparql/driver/joinup_sparql/Connection.php", @@ -158,10 +160,12 @@ }, "scripts": { "post-install-cmd": [ + "DrupalProject\\composer\\CaptureGitReleaseTag::capture", "DrupalProject\\composer\\ScriptHandler::createRequiredFiles", "DrupalProject\\composer\\RemoveWrongPatchedObjects::remove" ], "post-update-cmd": [ + "DrupalProject\\composer\\CaptureGitReleaseTag::capture", "DrupalProject\\composer\\ScriptHandler::createRequiredFiles", "DrupalProject\\composer\\RemoveWrongPatchedObjects::remove" ] diff --git a/composer.lock b/composer.lock index 4d29ae0e1e..1bc794b0ac 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": "0755c7156ec4b9838aff95b0863890b6", + "content-hash": "7c0335502d2ffce379cf6ff3c2483ca2", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.15", + "version": "3.133.21", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "18289bf4a3fe68e9a0853f29d82b6cd4b1de2f9e" + "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/18289bf4a3fe68e9a0853f29d82b6cd4b1de2f9e", - "reference": "18289bf4a3fe68e9a0853f29d82b6cd4b1de2f9e", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3501468a7ef894703141d1c4d68caa3b914cbd96", + "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-14T19:09:24+00:00" + "time": "2020-02-24T19:15:07+00:00" }, { "name": "caxy/php-htmldiff", @@ -1168,26 +1168,26 @@ }, { "name": "consolidation/robo", - "version": "1.4.11", + "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "5fa1d901776a628167a325baa9db95d8edf13a80" + "reference": "eb45606f498b3426b9a98b7c85e300666a968e51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/5fa1d901776a628167a325baa9db95d8edf13a80", - "reference": "5fa1d901776a628167a325baa9db95d8edf13a80", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/eb45606f498b3426b9a98b7c85e300666a968e51", + "reference": "eb45606f498b3426b9a98b7c85e300666a968e51", "shasum": "" }, "require": { - "consolidation/annotated-command": "^2.11.0", - "consolidation/config": "^1.2", - "consolidation/log": "~1", - "consolidation/output-formatters": "^3.1.13", - "consolidation/self-update": "^1", - "grasmash/yaml-expander": "^1.3", - "league/container": "^2.2", + "consolidation/annotated-command": "^2.11.0|^4.1", + "consolidation/config": "^1.2.1", + "consolidation/log": "^1.1.1|^2", + "consolidation/output-formatters": "^3.1.13|^4.1", + "consolidation/self-update": "^1.1.5", + "grasmash/yaml-expander": "^1.4", + "league/container": "^2.4.1", "php": ">=5.5.0", "symfony/console": "^2.8|^3|^4", "symfony/event-dispatcher": "^2.5|^3|^4", @@ -1199,20 +1199,13 @@ "codegyre/robo": "< 1.0" }, "require-dev": { - "codeception/aspect-mock": "^1|^2.1.1", - "codeception/base": "^2.3.7", - "codeception/verify": "^0.3.2", "g1a/composer-test-scenarios": "^3", - "goaop/framework": "~2.1.2", - "goaop/parser-reflection": "^1.1.0", "natxet/cssmin": "3.0.4", - "nikic/php-parser": "^3.1.5", - "patchwork/jsqueeze": "~2", + "patchwork/jsqueeze": "^2", "pear/archive_tar": "^1.4.4", "php-coveralls/php-coveralls": "^1", - "phpunit/php-code-coverage": "~2|~4", - "sebastian/comparator": "^1.2.4", - "squizlabs/php_codesniffer": "^2.8" + "phpunit/phpunit": "^5.7.27", + "squizlabs/php_codesniffer": "^3" }, "suggest": { "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch", @@ -1240,8 +1233,11 @@ "require": { "symfony/console": "^2.8" }, + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, "remove": [ - "goaop/framework" + "php-coveralls/php-coveralls" ], "config": { "platform": { @@ -1254,7 +1250,7 @@ } }, "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -1273,7 +1269,7 @@ } ], "description": "Modern task runner", - "time": "2019-10-29T15:50:02+00:00" + "time": "2020-02-18T17:31:26+00:00" }, { "name": "consolidation/self-update", @@ -1543,6 +1539,61 @@ "homepage": "https://github.com/continuousphp/aws-sdk-phing", "time": "2017-10-13T13:25:42+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" + ], + "time": "2016-04-19T16:12:33+00:00" + }, { "name": "cweagans/composer-patches", "version": "1.6.7", @@ -4447,17 +4498,17 @@ }, { "name": "drupal/geocoder", - "version": "3.0.0-beta7", + "version": "3.0.0-beta9", "source": { "type": "git", "url": "https://git.drupalcode.org/project/geocoder.git", - "reference": "8.x-3.0-beta7" + "reference": "8.x-3.0-beta9" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-3.0-beta7.zip", - "reference": "8.x-3.0-beta7", - "shasum": "c9ba155150a57dd2a9c6629e3a96c1eb71a5a20f" + "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-3.0-beta9.zip", + "reference": "8.x-3.0-beta9", + "shasum": "29007881f6d79d6838ee97e74cc0d4ab89e8c519" }, "require": { "davedevelopment/stiphle": "^0.9.2", @@ -4502,8 +4553,8 @@ "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-3.0-beta7", - "datestamp": "1580097487", + "version": "8.x-3.0-beta9", + "datestamp": "1582227193", "security-coverage": { "status": "not-covered", "message": "Beta releases are not covered by Drupal security advisories." @@ -6006,8 +6057,7 @@ } }, "patches_applied": { - "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...bd61c32c6f877f2c0376ec9aa213b89b6bcb19b8.diff", - "Update url alias to path alias @see https://github.com/ec-europa/rdf_entity/pull/112": "https://patch-diff.githubusercontent.com/raw/ec-europa/rdf_entity/pull/112.diff" + "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...bd61c32c6f877f2c0376ec9aa213b89b6bcb19b8.diff" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -7951,7 +8001,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-05-01T01:48:25+00:00" + "time": "2018-10-31T20:10:45+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -10110,7 +10160,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2019-04-02T18:33:21+00:00" }, { "name": "stack/builder", @@ -13480,10 +13530,6 @@ "name": "See contributors", "homepage": "https://www.drupal.org/node/3236/committers" }, - { - "name": "pcambra", - "homepage": "https://www.drupal.org/user/122101" - }, { "name": "salvis", "homepage": "https://www.drupal.org/user/82964" diff --git a/scripts/composer/CaptureGitReleaseTag.php b/scripts/composer/CaptureGitReleaseTag.php new file mode 100644 index 0000000000..b1e637d0a0 --- /dev/null +++ b/scripts/composer/CaptureGitReleaseTag.php @@ -0,0 +1,37 @@ +workingCopy($directory); + $version = trim((string) $git->run(['describe --tags'])); + + $fs = new Filesystem(); + $fs->dumpFile("$directory/VERSION", $version); + } + +} From eada0ce611b51f3acb78b71206073ec11f0136af Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 13:02:44 +0200 Subject: [PATCH 117/957] ISAICP-5684: Avoid the version to be committed, it is regenerated automatically. --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 75339273d0..3920761f3b 100644 --- a/.gitignore +++ b/.gitignore @@ -43,8 +43,9 @@ # Ignore the config_readonly killswitch. /disable-config-readonly -# Ignore temporary files +# Ignore temporary and auto-generated files. /tmp +/VERSION # Ignore local docker-compose file. docker-compose.local.yml From 4b14868a901d6fb61f4ca25441ed26295f54a287 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 18:01:07 +0200 Subject: [PATCH 118/957] ISAICP-5684: Started on the JoinupVersion service. --- .../custom/joinup_core/joinup_core.services.yml | 10 ++++++---- .../custom/joinup_core/src/JoinupVersion.php | 15 +++++++++++++++ .../joinup/templates/parts/footer.html.twig | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 web/modules/custom/joinup_core/src/JoinupVersion.php diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index d3bbc135d9..b1326eca77 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -1,16 +1,18 @@ services: - joinup_core.og_subscriber: - class: Drupal\joinup_core\EventSubscriber\JoinupCoreOgSubscriber - tags: - - name: event_subscriber joinup_core.fulfillment_guard: class: Drupal\joinup_core\Guard\NodeGuard arguments: ['@joinup_core.relations_manager', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } + joinup_core.joinup_version: + class: Drupal\joinup_core\JoinupVersion joinup_core.node_workflow_access: class: Drupal\joinup_core\NodeWorkflowAccessControlHandler arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_core.relations_manager', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] + joinup_core.og_subscriber: + class: Drupal\joinup_core\EventSubscriber\JoinupCoreOgSubscriber + tags: + - name: event_subscriber joinup_core.relations_manager: class: Drupal\joinup_core\JoinupRelationManager arguments: ['@og.membership_manager', '@entity_type.manager'] diff --git a/web/modules/custom/joinup_core/src/JoinupVersion.php b/web/modules/custom/joinup_core/src/JoinupVersion.php new file mode 100644 index 0000000000..b023951fdd --- /dev/null +++ b/web/modules/custom/joinup_core/src/JoinupVersion.php @@ -0,0 +1,15 @@ + +
From cae010f6a5e105e6ef5dd0d301b4bbcb4fee0d7c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 19:30:57 +0200 Subject: [PATCH 119/957] ISAICP-5684: Provide a service that can be used to retrieve the Joinup version and a link to the Github page that corresponds best with this version. --- .../custom/joinup_core/src/JoinupVersion.php | 54 ++++++++++++++++++- .../src/JoinupVersionInterface.php | 40 ++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 web/modules/custom/joinup_core/src/JoinupVersionInterface.php diff --git a/web/modules/custom/joinup_core/src/JoinupVersion.php b/web/modules/custom/joinup_core/src/JoinupVersion.php index b023951fdd..b96c5614b1 100644 --- a/web/modules/custom/joinup_core/src/JoinupVersion.php +++ b/web/modules/custom/joinup_core/src/JoinupVersion.php @@ -4,12 +4,62 @@ namespace Drupal\joinup_core; +use Drupal\Core\Url; + /** - * Retrieves the current Joinup version. + * 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. */ -class JoinupVersion { +class JoinupVersion implements JoinupVersionInterface { + + /** + * The current Joinup version. + * + * @var string + */ + protected $version; + + /** + * {@inheritdoc} + */ + public function getVersion(): string { + if (empty($this->version)) { + $filename = DRUPAL_ROOT . '/../VERSION'; + $this->version = file_exists($filename) ? $this->version = trim(file_get_contents($filename)) : 'n/a'; + + // 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 + // this will ensure that our version string and derived link will never + // break the page layout. + $this->version = preg_replace('/[^\w.-]/', '', $this->version); + } + + return $this->version; + } + + /** + * {@inheritdoc} + */ + public function getUrl(): Url { + $version = $this->getVersion(); + + // 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]); + } + + // 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 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); + } } diff --git a/web/modules/custom/joinup_core/src/JoinupVersionInterface.php b/web/modules/custom/joinup_core/src/JoinupVersionInterface.php new file mode 100644 index 0000000000..2d6c1641c0 --- /dev/null +++ b/web/modules/custom/joinup_core/src/JoinupVersionInterface.php @@ -0,0 +1,40 @@ + Date: Tue, 25 Feb 2020 22:28:35 +0200 Subject: [PATCH 120/957] ISAICP-5684: Test the presence of the Joinup version in the footer. --- tests/features/bootstrap/FeatureContext.php | 66 ++++++++++++++++++++- tests/features/homepage.feature | 13 ++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index f5e4a878bf..6db19713c9 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -15,13 +15,12 @@ use Behat\Mink\Element\TraversableElement; use Behat\Mink\Exception\ExpectationException; use Behat\Mink\Exception\ResponseTextException; -use Behat\Mink\Selector\Xpath\Escaper; use Drupal\Component\Serialization\Yaml; +use Drupal\Core\Cache\Cache; use Drupal\Core\Site\Settings; use Drupal\DrupalExtension\Context\RawDrupalContext; use Drupal\DrupalExtension\TagTrait; use Drupal\joinup\HtmlManipulator; -use Drupal\joinup\KeyboardEventKeyCodes as BrowserKey; use Drupal\joinup\Traits\AntibotTrait; use Drupal\joinup\Traits\BrowserCapabilityDetectionTrait; use Drupal\joinup\Traits\ContextualLinksTrait; @@ -32,6 +31,7 @@ use Drupal\joinup\Traits\TraversingTrait; use Drupal\joinup\Traits\UserTrait; use Drupal\joinup\Traits\UtilityTrait; +use Drupal\joinup_core\JoinupVersionInterface; use LoversOfBehat\TableExtension\Hook\Scope\AfterTableFetchScope; use PHPUnit\Framework\Assert; use WebDriver\Exception; @@ -54,6 +54,15 @@ class FeatureContext extends RawDrupalContext implements SnippetAcceptingContext use UserTrait; use UtilityTrait; + /** + * The Joinup version, retrieved from the `VERSION` file in the project root. + * + * Will contain the contents of the file, or FALSE if the file is not present. + * + * @var string|bool + */ + protected $version; + /** * Checks that a 200 OK response occurred. * @@ -1673,4 +1682,57 @@ public function cleanupMessageEntities(): void { $message_storage->delete($message_storage->loadMultiple($mids)); } + /** + * Creates a backup of the Joinup `VERSION` file. + * + * Tests that interact with the version file should be tagged with `@version`. + * + * @BeforeScenario @version + */ + public function backupJoinupVersion(): void { + $filename = DRUPAL_ROOT . '/../VERSION'; + $this->version = file_exists($filename) ? $this->version = file_get_contents($filename) : FALSE; + } + + /** + * Restores the backup of the Joinup `VERSION` file. + * + * @AfterScenario @version + */ + public function restoreJoinupVersion(): void { + if ($this->version === FALSE) { + unlink(JoinupVersionInterface::PATH); + } + else { + file_put_contents(JoinupVersionInterface::PATH, $this->version); + } + } + + /** + * Sets the Joinup version. + * + * Since this overwrites the `VERSION` file in the root folder, any scenario + * that includes this step should be tagged with `@version` so that the + * original contents of the file will be restored at the end of the scenario. + * + * @param string $version + * The Joinup version to set, e.g. 'v1.57.0' or 'v1.57.0-66-g1234abcde'. + * + * @When the Joinup version is set to :version + */ + public function setJoinupVersion(string $version): void { + // Alert the user that the `@version` tag is required. + Assert::assertTrue($this->hasTag('version'), 'The `@version` tag is required for scenarios that want to change the Joinup version.'); + + // We also require the Drupal API to retrieve the project root folder. + Assert::assertTrue($this->hasTag('api'), 'The `@api` tag is required for scenarios that use the `@version` tag.'); + + file_put_contents(JoinupVersionInterface::PATH, $version); + + // The version string is not meant to change in between deployments, so it + // doesn't employ a cache context. In order to make the version show up on + // previously cached pages we need to invalidate the render cache manually. + Cache::invalidateTags(['rendered']); + } + } diff --git a/tests/features/homepage.feature b/tests/features/homepage.feature index 43aa132b80..f54912e104 100644 --- a/tests/features/homepage.feature +++ b/tests/features/homepage.feature @@ -222,3 +222,16 @@ Feature: Homepage Then I should see the link "LinkedIn" in the Footer region And I should see the link "Twitter" in the Footer region But I should not see the link "Facebook" in the Footer region + + @version + Scenario Outline: The current version of the Joinup platform is shown in the footer. + Given the Joinup version is set to "" + When I am on the homepage + Then I should see the link "" in the Footer region + When I click "" + Then the url should match "" + + 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 | From adbcbd6ee76ac777b25dfe8ae7e34ca1dc5882d4 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 22:29:07 +0200 Subject: [PATCH 121/957] ISAICP-5684: Display the Joinup version in the footer. --- web/modules/custom/joinup_core/src/JoinupVersion.php | 4 ++-- .../custom/joinup_core/src/JoinupVersionInterface.php | 5 +++++ web/themes/joinup/joinup_theme.theme | 6 ++++++ web/themes/joinup/templates/parts/footer.html.twig | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_core/src/JoinupVersion.php b/web/modules/custom/joinup_core/src/JoinupVersion.php index b96c5614b1..c174134cb6 100644 --- a/web/modules/custom/joinup_core/src/JoinupVersion.php +++ b/web/modules/custom/joinup_core/src/JoinupVersion.php @@ -26,8 +26,8 @@ class JoinupVersion implements JoinupVersionInterface { */ public function getVersion(): string { if (empty($this->version)) { - $filename = DRUPAL_ROOT . '/../VERSION'; - $this->version = file_exists($filename) ? $this->version = trim(file_get_contents($filename)) : 'n/a'; + $path = JoinupVersionInterface::PATH; + $this->version = file_exists($path) ? $this->version = trim(file_get_contents($path)) : 'n/a'; // 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 diff --git a/web/modules/custom/joinup_core/src/JoinupVersionInterface.php b/web/modules/custom/joinup_core/src/JoinupVersionInterface.php index 2d6c1641c0..86710be8a1 100644 --- a/web/modules/custom/joinup_core/src/JoinupVersionInterface.php +++ b/web/modules/custom/joinup_core/src/JoinupVersionInterface.php @@ -12,6 +12,11 @@ */ interface JoinupVersionInterface { + /** + * The path to the file that contains the Joinup version. + */ + const PATH = DRUPAL_ROOT . '/../VERSION'; + /** * Returns a string that uniquely identifies the current Joinup version. * diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index e3ca538989..5eaf21ff4f 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -393,6 +393,12 @@ function joinup_theme_preprocess_page(&$variables) { unset($variables['page']['content']['pagetitle']); } + // Retrieve the Joinup version and link to display in the footer. + /** @var \Drupal\joinup_core\JoinupVersionInterface $joinup_version */ + $joinup_version = \Drupal::service('joinup_core.joinup_version'); + $variables['version'] = $joinup_version->getVersion(); + $variables['version_url'] = $joinup_version->getUrl(); + // Remove title on pages, where title is already in the header. if ($route_name == 'entity.rdf_entity.canonical') { diff --git a/web/themes/joinup/templates/parts/footer.html.twig b/web/themes/joinup/templates/parts/footer.html.twig index b6a1b598b7..8457adcb71 100644 --- a/web/themes/joinup/templates/parts/footer.html.twig +++ b/web/themes/joinup/templates/parts/footer.html.twig @@ -12,7 +12,7 @@ {{ 'Home'|t }} - +
From db2394138806962a6e2d0432ca26a8c12144c91f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 25 Feb 2020 22:53:23 +0200 Subject: [PATCH 122/957] ISAICP-5684: Provide some rudimentary styling for the version link in the footer. --- .../prototype/sass/layouts/sections/_section--footer.sass | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass b/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass index a5a66af0d8..c20a4a8255 100644 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass +++ b/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass @@ -19,3 +19,8 @@ img height: 30px width: auto + .footer__version + a + color: #acb7c4 + font-size: 0.85em + text-decoration: none From 79d326318f95163fea9b9103af5c1592418a1f98 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 6 Feb 2020 16:27:19 +0200 Subject: [PATCH 123/957] ISAICP-5785: Basic configuration of Site Alerts for moderators. --- composer.json | 1 + composer.lock | 67 +++++++++++++++++-- .../block.block.eiradeprecatedtermmessage.yml | 2 +- .../block.block.joinup_theme_messages.yml | 2 +- .../block.block.licencedeprecatedmessage.yml | 3 +- config/sync/block.block.navigation.yml | 3 +- ...k.block.rdf_entities_in_proposed_state.yml | 1 + config/sync/block.block.site_alerts.yml | 20 ++++++ ...ock.block.unpublished_content_of_group.yml | 1 + config/sync/core.extension.yml | 1 + config/sync/user.role.moderator.yml | 4 ++ .../joinup_core/joinup_core.links.menu.yml | 9 ++- .../config/install/user.role.moderator.yml | 4 ++ .../block.block.eiradeprecatedtermmessage.yml | 2 +- .../block.block.joinup_theme_messages.yml | 2 +- .../block.block.licencedeprecatedmessage.yml | 3 +- .../config/install/block.block.navigation.yml | 3 +- ...k.block.rdf_entities_in_proposed_state.yml | 1 + .../install/block.block.site_alerts.yml | 19 ++++++ ...ock.block.unpublished_content_of_group.yml | 1 + 20 files changed, 132 insertions(+), 17 deletions(-) create mode 100644 config/sync/block.block.site_alerts.yml create mode 100644 web/profiles/joinup/config/install/block.block.site_alerts.yml diff --git a/composer.json b/composer.json index 4d9b0b3228..9a65a870fc 100644 --- a/composer.json +++ b/composer.json @@ -63,6 +63,7 @@ "drupal/search_api": "1.13", "drupal/search_api_solr": "2.2", "drupal/simplenews": "^1.0-beta1", + "drupal/site_alert": "^1.0", "drupal/smart_trim": "~1.2", "drupal/social_media_links": "^2.6", "drupal/spdx": "^1.0.0-alpha5", diff --git a/composer.lock b/composer.lock index 2588b16ee4..6d002a29d1 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": "6d3281939fd4f08272fed99614527068", + "content-hash": "1668aacdcb02c620e42b45ab5f6fba3d", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.21", + "version": "3.133.22", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96" + "reference": "4dd1cc4416a997769b0c2fab95a586190318ad30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3501468a7ef894703141d1c4d68caa3b914cbd96", - "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4dd1cc4416a997769b0c2fab95a586190318ad30", + "reference": "4dd1cc4416a997769b0c2fab95a586190318ad30", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-24T19:15:07+00:00" + "time": "2020-02-25T19:10:01+00:00" }, { "name": "caxy/php-htmldiff", @@ -6404,6 +6404,61 @@ "source": "https://git.drupalcode.org/project/simplenews" } }, + { + "name": "drupal/site_alert", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/site_alert.git", + "reference": "8.x-1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/site_alert-8.x-1.0.zip", + "reference": "8.x-1.0", + "shasum": "b6f40ea8c39ebc34758764e556c0bd9eb190c7cb" + }, + "require": { + "drupal/core": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.0", + "datestamp": "1571325228", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "cecrs", + "homepage": "https://www.drupal.org/user/1876384" + }, + { + "name": "nicola85", + "homepage": "https://www.drupal.org/user/1746956" + }, + { + "name": "pfrenssen", + "homepage": "https://www.drupal.org/user/382067" + } + ], + "description": "Allows site admins to display a site-wide alert to all users.", + "homepage": "https://www.drupal.org/project/site_alert", + "support": { + "source": "https://git.drupalcode.org/project/site_alert" + } + }, { "name": "drupal/smart_trim", "version": "1.2.0", diff --git a/config/sync/block.block.eiradeprecatedtermmessage.yml b/config/sync/block.block.eiradeprecatedtermmessage.yml index 23afbc2224..be1aa66856 100644 --- a/config/sync/block.block.eiradeprecatedtermmessage.yml +++ b/config/sync/block.block.eiradeprecatedtermmessage.yml @@ -10,7 +10,7 @@ dependencies: id: eiradeprecatedtermmessage theme: joinup_theme region: content_top -weight: 0 +weight: -19 provider: null plugin: eira_derprecated_term_block settings: diff --git a/config/sync/block.block.joinup_theme_messages.yml b/config/sync/block.block.joinup_theme_messages.yml index d5e57c5610..8b1b6c0015 100644 --- a/config/sync/block.block.joinup_theme_messages.yml +++ b/config/sync/block.block.joinup_theme_messages.yml @@ -11,7 +11,7 @@ _core: id: joinup_theme_messages theme: joinup_theme region: content_top -weight: -18 +weight: -20 provider: null plugin: system_messages_block settings: diff --git a/config/sync/block.block.licencedeprecatedmessage.yml b/config/sync/block.block.licencedeprecatedmessage.yml index 035973a29c..f35b6eafc3 100644 --- a/config/sync/block.block.licencedeprecatedmessage.yml +++ b/config/sync/block.block.licencedeprecatedmessage.yml @@ -3,13 +3,14 @@ langcode: en status: true dependencies: module: + - joinup_core - joinup_licence theme: - joinup_theme id: licencedeprecatedmessage theme: joinup_theme region: content_top -weight: 0 +weight: -18 provider: null plugin: licence_deprecated_message_block settings: diff --git a/config/sync/block.block.navigation.yml b/config/sync/block.block.navigation.yml index 388158c9d6..f19ac8b8fe 100644 --- a/config/sync/block.block.navigation.yml +++ b/config/sync/block.block.navigation.yml @@ -5,8 +5,7 @@ dependencies: config: - og_menu.ogmenu.navigation module: - - collection - - solution + - joinup_group - og theme: - joinup_theme diff --git a/config/sync/block.block.rdf_entities_in_proposed_state.yml b/config/sync/block.block.rdf_entities_in_proposed_state.yml index 72b84eedb9..0d5578be9e 100644 --- a/config/sync/block.block.rdf_entities_in_proposed_state.yml +++ b/config/sync/block.block.rdf_entities_in_proposed_state.yml @@ -4,6 +4,7 @@ status: true dependencies: module: - joinup_core + - joinup_group - user theme: - joinup_theme diff --git a/config/sync/block.block.site_alerts.yml b/config/sync/block.block.site_alerts.yml new file mode 100644 index 0000000000..be689ebe2c --- /dev/null +++ b/config/sync/block.block.site_alerts.yml @@ -0,0 +1,20 @@ +uuid: 3204b36b-f978-4f1b-bd6d-b2d3fe0660c4 +langcode: en +status: true +dependencies: + module: + - site_alert + theme: + - joinup_theme +id: site_alerts +theme: joinup_theme +region: content_top +weight: -21 +provider: null +plugin: site_alert_block +settings: + id: site_alert_block + label: 'Site alerts' + provider: site_alert + label_display: '0' +visibility: { } diff --git a/config/sync/block.block.unpublished_content_of_group.yml b/config/sync/block.block.unpublished_content_of_group.yml index 1e3d3f777e..1b9049c565 100644 --- a/config/sync/block.block.unpublished_content_of_group.yml +++ b/config/sync/block.block.unpublished_content_of_group.yml @@ -5,6 +5,7 @@ dependencies: module: - ctools - joinup_core + - joinup_group theme: - joinup_theme _core: diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index d75af410c6..263fdacdc0 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -131,6 +131,7 @@ module: semic: 0 serialization: 0 simplenews: 0 + site_alert: 0 smart_trim: 0 social_media_links: 0 social_media_links_field: 0 diff --git a/config/sync/user.role.moderator.yml b/config/sync/user.role.moderator.yml index 2a2bb66b81..e7c61a7dcb 100644 --- a/config/sync/user.role.moderator.yml +++ b/config/sync/user.role.moderator.yml @@ -16,6 +16,7 @@ permissions: - 'access release create field' - 'access toolbar' - 'access uri converter' + - 'add site alerts' - 'administer collection ownership' - 'administer comments' - 'administer entity legal' @@ -25,6 +26,7 @@ permissions: - 'administer nodes' - 'administer search fields' - 'administer shared entities' + - 'administer site alert' - 'administer solution ownership' - 'administer support menu items' - 'administer tallinn settings' @@ -40,6 +42,7 @@ permissions: - 'delete contact_information rdf entity' - 'delete licence rdf entity' - 'delete owner rdf entity' + - 'delete site alerts' - 'edit any custom_page content' - 'edit any discussion content' - 'edit contact_information rdf entity' @@ -60,6 +63,7 @@ permissions: - 'unfeature entity' - 'unpin entity' - 'update any simple_block block content' + - 'update site alerts' - 'view any unpublished content' - 'view licence overview page' - 'view rdf entity overview' diff --git a/web/modules/custom/joinup_core/joinup_core.links.menu.yml b/web/modules/custom/joinup_core/joinup_core.links.menu.yml index bde29db671..f5a625823c 100644 --- a/web/modules/custom/joinup_core/joinup_core.links.menu.yml +++ b/web/modules/custom/joinup_core/joinup_core.links.menu.yml @@ -18,10 +18,17 @@ joinup_core.edit_support_menu: route_name: entity.menu.edit_form route_parameters: menu: support - description: 'Allows to manage of the user support menu.' + description: 'Allows to manage the user support menu.' parent: system.admin weight: 0 +joinup_core.site_alerts: + title: 'Site alerts' + route_name: entity.site_alert.collection + description: 'Manage site wide alerts.' + parent: system.admin + weight: 3 + joinup_core.support.tour: title: 'Take a tour' menu_name: support diff --git a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml index de0fe0e32a..3bbd650c72 100644 --- a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml +++ b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml @@ -15,6 +15,7 @@ permissions: - 'access release create field' - 'access toolbar' - 'access uri converter' + - 'add site alerts' - 'administer collection ownership' - 'administer comments' - 'administer entity legal' @@ -24,6 +25,7 @@ permissions: - 'administer nodes' - 'administer search fields' - 'administer shared entities' + - 'administer site alert' - 'administer solution ownership' - 'administer support menu items' - 'administer tallinn settings' @@ -39,6 +41,7 @@ permissions: - 'delete contact_information rdf entity' - 'delete licence rdf entity' - 'delete owner rdf entity' + - 'delete site alerts' - 'edit any custom_page content' - 'edit any discussion content' - 'edit contact_information rdf entity' @@ -58,6 +61,7 @@ permissions: - 'unfeature entity' - 'unpin entity' - 'update any simple_block block content' + - 'update site alerts' - 'view any unpublished content' - 'view licence overview page' - 'view rdf entity overview' diff --git a/web/profiles/joinup/config/install/block.block.eiradeprecatedtermmessage.yml b/web/profiles/joinup/config/install/block.block.eiradeprecatedtermmessage.yml index b13bcc953a..18d0cd14c6 100644 --- a/web/profiles/joinup/config/install/block.block.eiradeprecatedtermmessage.yml +++ b/web/profiles/joinup/config/install/block.block.eiradeprecatedtermmessage.yml @@ -9,7 +9,7 @@ dependencies: id: eiradeprecatedtermmessage theme: joinup_theme region: content_top -weight: 0 +weight: -19 provider: null plugin: eira_derprecated_term_block settings: diff --git a/web/profiles/joinup/config/install/block.block.joinup_theme_messages.yml b/web/profiles/joinup/config/install/block.block.joinup_theme_messages.yml index 4365c02826..88e7438abb 100644 --- a/web/profiles/joinup/config/install/block.block.joinup_theme_messages.yml +++ b/web/profiles/joinup/config/install/block.block.joinup_theme_messages.yml @@ -8,7 +8,7 @@ dependencies: id: joinup_theme_messages theme: joinup_theme region: content_top -weight: -18 +weight: -20 provider: null plugin: system_messages_block settings: diff --git a/web/profiles/joinup/config/install/block.block.licencedeprecatedmessage.yml b/web/profiles/joinup/config/install/block.block.licencedeprecatedmessage.yml index 9f32e64ba7..08f69b39a9 100644 --- a/web/profiles/joinup/config/install/block.block.licencedeprecatedmessage.yml +++ b/web/profiles/joinup/config/install/block.block.licencedeprecatedmessage.yml @@ -2,13 +2,14 @@ langcode: en status: true dependencies: module: + - joinup_core - joinup_licence theme: - joinup_theme id: licencedeprecatedmessage theme: joinup_theme region: content_top -weight: 0 +weight: -18 provider: null plugin: licence_deprecated_message_block settings: diff --git a/web/profiles/joinup/config/install/block.block.navigation.yml b/web/profiles/joinup/config/install/block.block.navigation.yml index 7dbbcf0480..cdde99b585 100644 --- a/web/profiles/joinup/config/install/block.block.navigation.yml +++ b/web/profiles/joinup/config/install/block.block.navigation.yml @@ -4,8 +4,7 @@ dependencies: config: - og_menu.ogmenu.navigation module: - - collection - - solution + - joinup_group - og theme: - joinup_theme diff --git a/web/profiles/joinup/config/install/block.block.rdf_entities_in_proposed_state.yml b/web/profiles/joinup/config/install/block.block.rdf_entities_in_proposed_state.yml index 92b8cf5f47..11ed305abf 100644 --- a/web/profiles/joinup/config/install/block.block.rdf_entities_in_proposed_state.yml +++ b/web/profiles/joinup/config/install/block.block.rdf_entities_in_proposed_state.yml @@ -3,6 +3,7 @@ status: true dependencies: module: - joinup_core + - joinup_group - user theme: - joinup_theme diff --git a/web/profiles/joinup/config/install/block.block.site_alerts.yml b/web/profiles/joinup/config/install/block.block.site_alerts.yml new file mode 100644 index 0000000000..6b83a1a0a2 --- /dev/null +++ b/web/profiles/joinup/config/install/block.block.site_alerts.yml @@ -0,0 +1,19 @@ +langcode: en +status: true +dependencies: + module: + - site_alert + theme: + - joinup_theme +id: site_alerts +theme: joinup_theme +region: content_top +weight: -21 +provider: null +plugin: site_alert_block +settings: + id: site_alert_block + label: 'Site alerts' + provider: site_alert + label_display: '0' +visibility: { } diff --git a/web/profiles/joinup/config/install/block.block.unpublished_content_of_group.yml b/web/profiles/joinup/config/install/block.block.unpublished_content_of_group.yml index 493e98ab10..acb9208651 100644 --- a/web/profiles/joinup/config/install/block.block.unpublished_content_of_group.yml +++ b/web/profiles/joinup/config/install/block.block.unpublished_content_of_group.yml @@ -4,6 +4,7 @@ dependencies: module: - ctools - joinup_core + - joinup_group theme: - joinup_theme id: unpublished_content_of_group From 226a72e1f6c8a300ad940a362edf4c6b6a46ce14 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 7 Feb 2020 16:28:28 +0200 Subject: [PATCH 124/957] ISAICP-5785: Add newly exported configuration to config_devel section. --- web/profiles/joinup/joinup.info.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/profiles/joinup/joinup.info.yml b/web/profiles/joinup/joinup.info.yml index 299de3bd70..c51f82691f 100644 --- a/web/profiles/joinup/joinup.info.yml +++ b/web/profiles/joinup/joinup.info.yml @@ -41,6 +41,7 @@ config_devel: - block.block.primaryadminactions - block.block.rdf_entities_in_proposed_state - block.block.seven_login + - block.block.site_alerts - block.block.solutiontype - block.block.spatial_coverage_facet - block.block.statistics From cbb162f092658922f7fee4e6e107d1581781a1a2 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 14 Feb 2020 11:10:39 +0200 Subject: [PATCH 125/957] ISAICP-5785: Temporarily switch to the development version of Site Alert while we work on improving the module. --- composer.json | 2 +- composer.lock | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 9a65a870fc..5592903c01 100644 --- a/composer.json +++ b/composer.json @@ -63,7 +63,7 @@ "drupal/search_api": "1.13", "drupal/search_api_solr": "2.2", "drupal/simplenews": "^1.0-beta1", - "drupal/site_alert": "^1.0", + "drupal/site_alert": "dev-1.x", "drupal/smart_trim": "~1.2", "drupal/social_media_links": "^2.6", "drupal/spdx": "^1.0.0-alpha5", diff --git a/composer.lock b/composer.lock index 6d002a29d1..211799781f 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": "1668aacdcb02c620e42b45ab5f6fba3d", + "content-hash": "8f098eeab9d3255c59bb9a9c15047956", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -6406,17 +6406,11 @@ }, { "name": "drupal/site_alert", - "version": "1.0.0", + "version": "dev-1.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/site_alert.git", - "reference": "8.x-1.0" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/site_alert-8.x-1.0.zip", - "reference": "8.x-1.0", - "shasum": "b6f40ea8c39ebc34758764e556c0bd9eb190c7cb" + "reference": "d26edf5817931279d921a4c91b859a2215efa095" }, "require": { "drupal/core": "*" @@ -6427,11 +6421,11 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0", - "datestamp": "1571325228", + "version": "8.x-1.0+7-dev", + "datestamp": "1581670730", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Dev releases are not covered by Drupal security advisories." } } }, @@ -6457,7 +6451,8 @@ "homepage": "https://www.drupal.org/project/site_alert", "support": { "source": "https://git.drupalcode.org/project/site_alert" - } + }, + "time": "2020-02-19T14:34:14+00:00" }, { "name": "drupal/smart_trim", @@ -16324,6 +16319,7 @@ "drupal/matomo_reporting_api": 20, "drupal/og_menu": 20, "drupal/phingdrushtask": 20, + "drupal/site_alert": 20, "drupal/swiftmailer": 20, "drupal/view_unpublished": 15, "ec-europa/infra": 20, From 5c9629c3d3e2c365eb591649e91117b94ca8d6ba Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 27 Feb 2020 14:34:32 +0200 Subject: [PATCH 126/957] ISAICP-5833: Update dependencies. --- composer.json | 5 +---- composer.lock | 35 ++++++++++++++++------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/composer.json b/composer.json index 4d9b0b3228..c3e0d21bc9 100644 --- a/composer.json +++ b/composer.json @@ -98,7 +98,7 @@ "ext-dom": "*", "ext-libxml": "*", "behat/behat": "~3.4", - "behat/gherkin": "~4.6", + "behat/gherkin": "^4.6.1", "behat/mink": "~1.7", "behat/mink-goutte-driver": "~1.2", "behat/mink-selenium2-driver": "~1.4", @@ -195,9 +195,6 @@ "drupal/core": "-p2" }, "patches": { - "behat/gherkin": { - "Correctly filter features, now that the base path is correctly set": "https://github.com/Behat/Gherkin/compare/v4.6.0...a7d84eb6ba245ea268a304312d14660788bf6c29.patch" - }, "drupal/cas": { "Allow a pre-login subscriber to set the reason for cancelling the login @see https://www.drupal.org/project/cas/issues/3111073": "https://www.drupal.org/files/issues/2020-02-04/3111073-2.patch" }, diff --git a/composer.lock b/composer.lock index 2588b16ee4..5f884643c2 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": "6d3281939fd4f08272fed99614527068", + "content-hash": "edb37d668c69f7e79dc4792b54c288b7", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.21", + "version": "3.133.23", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96" + "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3501468a7ef894703141d1c4d68caa3b914cbd96", - "reference": "3501468a7ef894703141d1c4d68caa3b914cbd96", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", + "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-24T19:15:07+00:00" + "time": "2020-02-26T19:11:26+00:00" }, { "name": "caxy/php-htmldiff", @@ -7156,16 +7156,16 @@ }, { "name": "drush/drush", - "version": "10.2.1", + "version": "10.2.2", "source": { "type": "git", "url": "https://github.com/drush-ops/drush.git", - "reference": "756e7a9e82bfe424f02ff5eb006bf514b9a4365d" + "reference": "8307a4e7dae9c63a279d8b59b9dca6c1973576c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drush-ops/drush/zipball/756e7a9e82bfe424f02ff5eb006bf514b9a4365d", - "reference": "756e7a9e82bfe424f02ff5eb006bf514b9a4365d", + "url": "https://api.github.com/repos/drush-ops/drush/zipball/8307a4e7dae9c63a279d8b59b9dca6c1973576c2", + "reference": "8307a4e7dae9c63a279d8b59b9dca6c1973576c2", "shasum": "" }, "require": { @@ -7281,7 +7281,7 @@ ], "description": "Drush is a command line shell and scripting interface for Drupal, a veritable Swiss Army knife designed to make life easier for those of us who spend some of our working hours hacking away at the command prompt.", "homepage": "http://www.drush.org", - "time": "2020-02-07T17:53:36+00:00" + "time": "2020-02-26T21:07:53+00:00" }, { "name": "easyrdf/easyrdf", @@ -12533,16 +12533,16 @@ }, { "name": "behat/gherkin", - "version": "v4.6.0", + "version": "v4.6.1", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07" + "reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/ab0a02ea14893860bca00f225f5621d351a3ad07", - "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/25bdcaf37898b4a939fa3031d5d753ced97e4759", + "reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759", "shasum": "" }, "require": { @@ -12560,9 +12560,6 @@ "extra": { "branch-alias": { "dev-master": "4.4-dev" - }, - "patches_applied": { - "Correctly filter features, now that the base path is correctly set": "https://github.com/Behat/Gherkin/compare/v4.6.0...a7d84eb6ba245ea268a304312d14660788bf6c29.patch" } }, "autoload": { @@ -12591,7 +12588,7 @@ "gherkin", "parser" ], - "time": "2019-01-16T14:22:17+00:00" + "time": "2020-02-27T11:29:57+00:00" }, { "name": "behat/mink", From 30ea8b5c05cc1adc2786ef18eefbda11dba2b9cc Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 27 Feb 2020 17:50:09 +0200 Subject: [PATCH 127/957] ISAICP-5650: Convert the collection_feed to a group_feed. --- ...ion_feed.yml => views.view.group_feed.yml} | 10 ++--- ...ion_feed.yml => views.view.group_feed.yml} | 6 ++- .../custom/joinup_rss/joinup_rss.info.yml | 2 +- .../joinup_rss/joinup_rss.links.task.yml | 4 +- .../custom/joinup_rss/joinup_rss.module | 38 +++++++++++-------- ...Controller.php => GroupFeedController.php} | 9 ++--- .../src/Routing/RouteSubscriber.php | 6 +-- 7 files changed, 42 insertions(+), 33 deletions(-) rename config/sync/{views.view.collection_feed.yml => views.view.group_feed.yml} (99%) rename web/modules/custom/joinup_rss/config/install/{views.view.collection_feed.yml => views.view.group_feed.yml} (99%) rename web/modules/custom/joinup_rss/src/Controller/{CollectionFeedController.php => GroupFeedController.php} (87%) diff --git a/config/sync/views.view.collection_feed.yml b/config/sync/views.view.group_feed.yml similarity index 99% rename from config/sync/views.view.collection_feed.yml rename to config/sync/views.view.group_feed.yml index b5808d416d..ef3e6e5587 100644 --- a/config/sync/views.view.collection_feed.yml +++ b/config/sync/views.view.group_feed.yml @@ -1,4 +1,4 @@ -uuid: 09fe5267-bb9a-40bb-8a2a-e9abc9b70a97 +uuid: 3d4ff932-e3a5-4c38-ba8a-c6778c8006c9 langcode: en status: true dependencies: @@ -6,16 +6,15 @@ dependencies: - field.storage.node.body - field.storage.rdf_entity.field_is_description - rdf_entity.rdfentity.collection + - rdf_entity.rdfentity.solution - search_api.index.published module: - joinup_search - search_api - smart_trim - user -_core: - default_config_hash: MS8QjS3LfnqbmpOoqmv2OZ0H42yr_MGeOfM_6eeLB2E -id: collection_feed -label: 'Collection feed' +id: group_feed +label: 'Group feed' module: views description: '' tag: '' @@ -1653,6 +1652,7 @@ display: validate_options: bundles: collection: collection + solution: solution operation: view multiple: 0 access: false diff --git a/web/modules/custom/joinup_rss/config/install/views.view.collection_feed.yml b/web/modules/custom/joinup_rss/config/install/views.view.group_feed.yml similarity index 99% rename from web/modules/custom/joinup_rss/config/install/views.view.collection_feed.yml rename to web/modules/custom/joinup_rss/config/install/views.view.group_feed.yml index 63bdf5278e..1b3c4349d1 100644 --- a/web/modules/custom/joinup_rss/config/install/views.view.collection_feed.yml +++ b/web/modules/custom/joinup_rss/config/install/views.view.group_feed.yml @@ -5,14 +5,15 @@ dependencies: - field.storage.node.body - field.storage.rdf_entity.field_is_description - rdf_entity.rdfentity.collection + - rdf_entity.rdfentity.solution - search_api.index.published module: - joinup_search - search_api - smart_trim - user -id: collection_feed -label: 'Collection feed' +id: group_feed +label: 'Group feed' module: views description: '' tag: '' @@ -1650,6 +1651,7 @@ display: validate_options: bundles: collection: collection + solution: solution operation: view multiple: 0 access: false diff --git a/web/modules/custom/joinup_rss/joinup_rss.info.yml b/web/modules/custom/joinup_rss/joinup_rss.info.yml index 126e98d4b7..cdda6371da 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.info.yml +++ b/web/modules/custom/joinup_rss/joinup_rss.info.yml @@ -11,4 +11,4 @@ dependencies: - smart_trim:smart_trim config_devel: - - views.view.collection_feed + - views.view.group_feed diff --git a/web/modules/custom/joinup_rss/joinup_rss.links.task.yml b/web/modules/custom/joinup_rss/joinup_rss.links.task.yml index 23bab9c40a..667b069eb3 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.links.task.yml +++ b/web/modules/custom/joinup_rss/joinup_rss.links.task.yml @@ -1,5 +1,5 @@ -joinup_rss.feed: - route_name: view.collection_feed.rss_feed +joinup_rss.collection: + route_name: view.group_feed.rss_feed title: 'RSS feed' base_route: entity.rdf_entity.canonical weight: 200 diff --git a/web/modules/custom/joinup_rss/joinup_rss.module b/web/modules/custom/joinup_rss/joinup_rss.module index 34d840a378..da15229e3e 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.module +++ b/web/modules/custom/joinup_rss/joinup_rss.module @@ -21,7 +21,7 @@ use Drupal\views\ViewExecutable; * @see joinup_group_views_query_alter() */ function joinup_rss_views_query_alter(ViewExecutable $view, QueryPluginBase $query): void { - if ($view->id() !== 'collection_feed') { + if ($view->id() !== 'group_feed') { return; } @@ -40,25 +40,32 @@ function joinup_rss_views_query_alter(ViewExecutable $view, QueryPluginBase $que * * Adds dynamic title and description to the rss. */ -function joinup_rss_preprocess_views_view_rss__collection_feed__rss_feed(&$variables): void { +function joinup_rss_preprocess_views_view_rss__group_feed__rss_feed(&$variables): void { // Load the entity from the first view argument. The argument has been already - // validated early so we can expect a collection to be loaded successfully. + // validated early so we can expect a group to be loaded successfully. $encoded_collection_id = $variables['view']->args[0]; - $collection = Rdf::load(UriEncoder::decodeUrl($encoded_collection_id)); + $group = Rdf::load(UriEncoder::decodeUrl($encoded_collection_id)); - $variables['title'] = t('Latest updates from the @collection collection', [ - '@collection' => $collection->label(), + $variables['title'] = t('Latest updates from the @label @bundle', [ + '@label' => $group->label(), + '@bundle' => $group->bundle(), ]); - $variables['description'] = t('This feed contains the latest published content from the @collection collection, including the newest solutions.', [ - '@collection' => $collection->label(), + + $description = $group->bundle() === 'collection' ? + 'This feed contains the latest published content from the @label @bundle, including the newest solutions.' : + 'This feed contains the latest published content from the @label @bundle.'; + + $variables['description'] = t($description, [ + '@label' => $group->label(), + '@bundle' => $group->bundle(), ]); // According to the RSS specifications this should be the URL of the website's - // front page. But for the collection feeds the homepage is the collection's - // canonical URL. + // front page. But for the collection or solution feeds the homepage is the + // group's canonical URL. // @see https://validator.w3.org/feed/docs/rss2.html#requiredChannelElements // @see https://www.drupal.org/project/drupal/issues/3070620 - $variables['link'] = $collection->toUrl()->setAbsolute()->toString(); + $variables['link'] = $group->toUrl()->setAbsolute()->toString(); } /** @@ -74,19 +81,20 @@ function joinup_rss_page_attachments(array &$attachments): void { /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ $entity = $route->getParameter('rdf_entity'); - if ($entity->bundle() !== 'collection') { + if (!in_array($entity->bundle(), ['collection', 'solution'])) { return; } - $url = Url::fromRoute('view.collection_feed.rss_feed', [ + $url = Url::fromRoute("view.group_feed.rss_feed", [ 'rdf_entity' => UriEncoder::encodeUrl($entity->id()), ])->setAbsolute(); if ($url->access()) { $attachments['#attached']['feed'][] = [ $url->toString(), - t('Latest updates from the @collection collection', [ - '@collection' => $entity->label(), + t('Latest updates from the @label @bundle', [ + '@label' => $entity->label(), + '@bundle' => $entity->bundle(), ]), ]; } diff --git a/web/modules/custom/joinup_rss/src/Controller/CollectionFeedController.php b/web/modules/custom/joinup_rss/src/Controller/GroupFeedController.php similarity index 87% rename from web/modules/custom/joinup_rss/src/Controller/CollectionFeedController.php rename to web/modules/custom/joinup_rss/src/Controller/GroupFeedController.php index 094587cc26..dec1e80ce9 100644 --- a/web/modules/custom/joinup_rss/src/Controller/CollectionFeedController.php +++ b/web/modules/custom/joinup_rss/src/Controller/GroupFeedController.php @@ -15,7 +15,7 @@ /** * Provide additional access checks for the collection feed view. */ -class CollectionFeedController extends ControllerBase { +class GroupFeedController extends ControllerBase { /** * The SPARQL storage. @@ -25,7 +25,7 @@ class CollectionFeedController extends ControllerBase { private $sparqlStorage; /** - * Instantiates a new CollectionFeedController object. + * Instantiates a new GroupFeedController object. * * @param \Drupal\sparql_entity_storage\SparqlEntityStorageInterface $sparql_storage * The RDF entity storage. @@ -44,7 +44,7 @@ public static function create(ContainerInterface $container) { } /** - * Access check for the collection feed view route. + * Access check for the group feed view route. * * @param string $rdf_entity * The encoded ID of an RDF entity. @@ -54,10 +54,9 @@ public static function create(ContainerInterface $container) { */ public function access(string $rdf_entity): AccessResultInterface { $loaded_entity = $this->sparqlStorage->load(UriEncoder::decodeUrl($rdf_entity)); - return AccessResult::allowedIf( $loaded_entity instanceof RdfInterface && - $loaded_entity->bundle() === 'collection' && + in_array($loaded_entity->bundle(), ['collection', 'solution']) && $loaded_entity->isPublished() )->addCacheableDependency($loaded_entity); } diff --git a/web/modules/custom/joinup_rss/src/Routing/RouteSubscriber.php b/web/modules/custom/joinup_rss/src/Routing/RouteSubscriber.php index 3f964a1410..40eded0550 100644 --- a/web/modules/custom/joinup_rss/src/Routing/RouteSubscriber.php +++ b/web/modules/custom/joinup_rss/src/Routing/RouteSubscriber.php @@ -5,7 +5,7 @@ namespace Drupal\joinup_rss\Routing; use Drupal\Core\Routing\RouteSubscriberBase; -use Drupal\joinup_rss\Controller\CollectionFeedController; +use Drupal\joinup_rss\Controller\GroupFeedController; use Symfony\Component\Routing\RouteCollection; /** @@ -17,8 +17,8 @@ class RouteSubscriber extends RouteSubscriberBase { * {@inheritdoc} */ protected function alterRoutes(RouteCollection $collection) { - if ($route = $collection->get('view.collection_feed.rss_feed')) { - $route->setRequirement('_custom_access', CollectionFeedController::class . '::access'); + if ($route = $collection->get('view.group_feed.rss_feed')) { + $route->setRequirement('_custom_access', GroupFeedController::class . '::access'); } } From 769464a4b62560141cb04add1551299dbd49c698 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 27 Feb 2020 17:50:48 +0200 Subject: [PATCH 128/957] ISAICP-5650: Update the tests to try and match the timezones. --- .../joinup_rss/collection_feed.feature | 40 +++++++++---------- tests/src/Context/RssContext.php | 3 +- web/profiles/joinup/joinup.behat.inc | 12 ++++++ 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/tests/features/joinup_rss/collection_feed.feature b/tests/features/joinup_rss/collection_feed.feature index 51fa00d273..27955d8863 100644 --- a/tests/features/joinup_rss/collection_feed.feature +++ b/tests/features/joinup_rss/collection_feed.feature @@ -21,29 +21,29 @@ Feature: Collection RSS feed. | Indigo Monkey | forest | facilitator | | Dreaded Scissors | otto | facilitator | And solutions: - | title | state | author | creation date | collection | - | Lantern Global | validated | alejake | 2018-12-18 08:00 | Indigo Monkey | - | Proton Lonesome | validated | alejake | 2019-01-05 10:00 | Indigo Monkey | - | Shiny Ray | validated | otto | 2018-08-14 17:36 | Dreaded Scissors | + | title | state | author | creation date | collection | + | Lantern Global | validated | alejake | 2018-12-18 08:00 +0100 | Indigo Monkey | + | Proton Lonesome | validated | alejake | 2019-01-05 10:00 +0100 | Indigo Monkey | + | Shiny Ray | validated | otto | 2018-08-14 17:36 +0200 | Dreaded Scissors | And news content: - | title | body | state | author | created | collection | solution | - | Monkeys favourite indigo amongst colors | Research results are out. | validated | alejake | 2019-01-21 12:36 | Indigo Monkey | | - | Proton lonesomeness reaches peak | More than 200 thousand protons were interviewed. | validated | forest | 2019-01-07 12:00 | | Proton Lonesome | - | New metal alloy improves scissors | It improves sharpness but they are more subject to rust. | validated | otto | 2018-04-11 09:00 | Dreaded Scissors | | + | title | body | state | author | created | collection | solution | + | Monkeys favourite indigo amongst colors | Research results are out. | validated | alejake | 2019-01-21 12:36 +0100 | Indigo Monkey | | + | Proton lonesomeness reaches peak | More than 200 thousand protons were interviewed. | validated | forest | 2019-01-07 12:00 +0100 | | Proton Lonesome | + | New metal alloy improves scissors | It improves sharpness but they are more subject to rust. | validated | otto | 2018-04-11 09:00 +0200 | Dreaded Scissors | | And event content: - | title | body | state | author | created | collection | - | Banana tasting | Testing more than 20 varities of bananas from all over the world. | validated | forest | 2018-09-14 07:36 | Indigo Monkey | - | Scissor sharpening party | value:

The place where to be if you want to keep cutting the paper at the best of your scissors possibilities.

Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.
- format: content_editor | validated | otto | 2017-11-26 14:18 | Dreaded Scissors | + | title | body | state | author | created | collection | + | Banana tasting | Testing more than 20 varities of bananas from all over the world. | validated | forest | 2018-09-14 07:36 +0200 | Indigo Monkey | + | Scissor sharpening party | value:

The place where to be if you want to keep cutting the paper at the best of your scissors possibilities.

Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.
- format: content_editor | validated | otto | 2017-11-26 14:18 +0100 | Dreaded Scissors | And document content: - | title | body | state | author | created | collection | - | Indigo technical paper | All technical information about the rare indigo monkeys. | validated | alejake | 2016-05-30 12:21 | Indigo Monkey | + | title | body | state | author | created | collection | + | Indigo technical paper | All technical information about the rare indigo monkeys. | validated | alejake | 2016-05-30 12:21 +0200 | Indigo Monkey | And discussion content: - | title | body | state | author | created | collection | - | Is the indigo coloration caused by their food? | I was reading the technical paper and it seems their main food is the indigo cherries. | validated | alejake | 2019-01-21 13:00 | Indigo Monkey | + | title | body | state | author | created | collection | + | Is the indigo coloration caused by their food? | I was reading the technical paper and it seems their main food is the indigo cherries. | validated | alejake | 2019-01-21 13:00 +0100 | Indigo Monkey | And custom_page content: - | title | body | state | author | created | collection | - | Indigo variations | The four major tones of indigo are listed here. | validated | forest | 2017-10-15 18:30 | Indigo Monkey | - | List of devices | Available remote electrical devices. | validated | | 2019-02-08 09:00 | Remote Electrical | + | title | body | state | author | created | collection | + | Indigo variations | The four major tones of indigo are listed here. | validated | forest | 2017-10-15 18:30 +0200 | Indigo Monkey | + | List of devices | Available remote electrical devices. | validated | | 2019-02-08 09:00 +0100 | Remote Electrical | When I am an anonymous user And I go to the homepage of the "Indigo Monkey" collection @@ -87,8 +87,8 @@ Feature: Collection RSS feed. | Event: Scissor sharpening party | /collection/dreaded-scissors/event/scissor-sharpening-party | The place where to be if you want to keep cutting the paper at the best of your scissors possibilities. Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta | Sun, 26 Nov 2017 14:18:00 +0100 | Otto Drake | When I go to the homepage of the "Lantern Global" solution - Then I should not see the link "RSS feed" in the "Entity actions" region - And the page should contain 0 RSS autodiscovery links + Then I should see the link "RSS feed" in the "Entity actions" region + And the page should contain 1 RSS autodiscovery links When I am logged in as a facilitator of the "Remote Electrical" collection And I go to the homepage of the "Remote Electrical" collection diff --git a/tests/src/Context/RssContext.php b/tests/src/Context/RssContext.php index 056cff4346..021a805ffd 100644 --- a/tests/src/Context/RssContext.php +++ b/tests/src/Context/RssContext.php @@ -121,7 +121,8 @@ public function assertRssItems(TableNode $table): void { $nodes = $xpath->query("//channel/item[$xpath_node_index]/$key"); // Support is limited to nodes that appear once only. Assert::assertCount(1, $nodes, "Invalid count for $key element."); - Assert::assertEquals($value, trim($nodes->item(0)->nodeValue)); + $actual_value = trim($nodes->item(0)->nodeValue); + Assert::assertEquals($value, $actual_value, "'{$value}' is equal to '{$actual_value}'."); } } } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 0c6ecaa434..f5795681d3 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -640,6 +640,17 @@ class JoinupSubContext extends DrupalSubContextBase { ]); } + if (property_exists($node, 'published_at') && !empty($node->published_at)) { + // If the entry is not numeric, then it means that the scenario is using a + // human readable version of the timestamp. + // Example: Sun, 01 Dec 2019 13:00:00 +0100. + // 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)) { + $node->published_at = strtotime($node->published_at); + } + } + // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -710,6 +721,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'visits' => 'visit_count', 'featured' => 'field_site_featured', 'pinned to front page' => 'field_site_pinned', + 'publication date' => 'published_at', ], ]; From c32063205f7b3260c9b7cb5e7d1cf2eff48b40ad Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 27 Feb 2020 17:51:04 +0200 Subject: [PATCH 129/957] ISAICP-5650: Provide a solution feed test. --- .../features/joinup_rss/solution_feed.feature | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tests/features/joinup_rss/solution_feed.feature diff --git a/tests/features/joinup_rss/solution_feed.feature b/tests/features/joinup_rss/solution_feed.feature new file mode 100644 index 0000000000..34c9bc1439 --- /dev/null +++ b/tests/features/joinup_rss/solution_feed.feature @@ -0,0 +1,56 @@ +@api +Feature: Solution RSS feed. + In order to stay up to date with solution updates + As a user of Joinup + I want to subscribe to RSS feeds for each solution + + Scenario: Solution RSS feed. + Given users: + | Username | First name | Family name | + | scorlan | Sartin | Corlan | + And solutions: + | title | state | author | creation date | + | Lantern Domestic | validated | scorlan | 2018-12-18 08:00 +0100 | + | Deuteron Lonesome | draft | scorlan | 2019-01-05 10:00 +0100 | + And solution user memberships: + | solution | user | role | + | Lantern Domestic | scorlan | facilitator | + | Deuteron Lonesome | scorlan | facilitator | + And news content: + | title | body | state | author | created | solution | + | Monkeys worst indigo amongst colors | Research results are out. | validated | scorlan | 2019-01-21 12:36 +0100 | Lantern Domestic | + | Proton lonesomeness doesn't reach peak | More than 200 thousand protons were interviewed. | validated | scorlan | 2019-01-07 12:00 +0100 | Deuteron Lonesome | + | Old metal alloy improves scissors | It improves sharpness but they are more subject to rust. | validated | scorlan | 2018-04-11 09:00 +0100 | Lantern Domestic | + And event content: + | title | body | state | author | created | solution | + | Scissor sharpening funeral | value:

The place where to be if you want to keep cutting the paper at the best of your scissors possibilities.

Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta lectus sit amet nulla feugiat et viverra massa fringilla.
- format: content_editor | validated | scorlan | 2017-11-26 14:18 +0100 | Lantern Domestic | + And discussion content: + | title | body | state | author | created | solution | + | Is the indigo coloration caused by their smile? | I was reading the technical paper and it seems their main food is the indigo cherries. | validated | scorlan | 2019-01-21 13:00 +0100 | Deuteron Lonesome | + And custom_page content: + | title | body | state | author | created | solution | + | Indigo variations | The four major tones of indigo are listed here. | validated | scorlan | 2017-10-15 19:30 +0200 | Lantern Domestic | + | List of devices | Available remote electrical devices. | validated | scorlan | 2019-02-08 10:00 +0200 | Deuteron Lonesome | + + When I am an anonymous user + And I go to the homepage of the "Lantern Domestic" solution + Then the page should contain an RSS autodiscovery link with title "Latest updates from the Lantern Domestic solution" pointing to "/solution/lantern-domestic/feed.xml" + And the page should contain 1 RSS autodiscovery link + When I click "RSS feed" in the "Entity actions" region + Then I should see a valid RSS feed + And the RSS feed channel elements should be: + | title | Latest updates from the Lantern Domestic solution | + | description | This feed contains the latest published content from the Lantern Domestic solution. | + | link | /solution/lantern-domestic | + And the RSS feed should have 4 items + And the RSS feed items should be: + | title | link | description | publication date | author | + | News: Monkeys worst indigo amongst colors | /solution/lantern-domestic/news/monkeys-worst-indigo-amongst-colors |

Research results are out.

| Mon, 21 Jan 2019 12:36:00 +0100 | Sartin Corlan | + | News: Old metal alloy improves scissors | /solution/lantern-domestic/news/old-metal-alloy-improves-scissors |

It improves sharpness but they are more subject to rust.

| Wed, 11 Apr 2018 10:00:00 +0200 | Sartin Corlan | + | Event: Scissor sharpening funeral | /solution/lantern-domestic/event/scissor-sharpening-funeral | The place where to be if you want to keep cutting the paper at the best of your scissors possibilities. Lorem ipsum dolor sit amet consectetur adipiscing elit. Etiam sed consectetur turpis. In porta | Sun, 26 Nov 2017 14:18:00 +0100 | Sartin Corlan | + | Custom page: Indigo variations | /solution/lantern-domestic/indigo-variations |

The four major tones of indigo are listed here.

| Sun, 15 Oct 2017 19:30:00 +0200 | Sartin Corlan | + + When I am logged in as a facilitator of the "Deuteron Lonesome" solution + And I go to the homepage of the "Deuteron Lonesome" solution + Then I should not see the link "RSS feed" in the "Entity actions" region + And the page should contain 0 RSS autodiscovery links From b0deb0532b124351a82b33e186ccc515d7f0a1d4 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 27 Feb 2020 17:52:52 +0200 Subject: [PATCH 130/957] ISAICP-5650: Do not pass variables in t(). --- web/modules/custom/joinup_rss/joinup_rss.module | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/joinup_rss/joinup_rss.module b/web/modules/custom/joinup_rss/joinup_rss.module index da15229e3e..a792ec40cf 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.module +++ b/web/modules/custom/joinup_rss/joinup_rss.module @@ -51,14 +51,14 @@ function joinup_rss_preprocess_views_view_rss__group_feed__rss_feed(&$variables) '@bundle' => $group->bundle(), ]); - $description = $group->bundle() === 'collection' ? - 'This feed contains the latest published content from the @label @bundle, including the newest solutions.' : - 'This feed contains the latest published content from the @label @bundle.'; - - $variables['description'] = t($description, [ + $variables = [ '@label' => $group->label(), '@bundle' => $group->bundle(), - ]); + ]; + + $variables['description'] = $group->bundle() === 'collection' ? + t('This feed contains the latest published content from the @label @bundle, including the newest solutions.', $variables) : + t('This feed contains the latest published content from the @label @bundle.', $variables); // According to the RSS specifications this should be the URL of the website's // front page. But for the collection or solution feeds the homepage is the From 7bdf2984f3d6d4a48a42c94b643bb8ecc93f4b27 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 27 Feb 2020 23:58:49 +0200 Subject: [PATCH 131/957] ISAICP-5650: Fix some of the wrongdoings. --- .../custom/joinup_rss/joinup_rss.links.task.yml | 2 +- web/modules/custom/joinup_rss/joinup_rss.module | 14 +++++--------- web/profiles/joinup/joinup.behat.inc | 12 ------------ 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/web/modules/custom/joinup_rss/joinup_rss.links.task.yml b/web/modules/custom/joinup_rss/joinup_rss.links.task.yml index 667b069eb3..84199afe16 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.links.task.yml +++ b/web/modules/custom/joinup_rss/joinup_rss.links.task.yml @@ -1,4 +1,4 @@ -joinup_rss.collection: +joinup_rss.feed: route_name: view.group_feed.rss_feed title: 'RSS feed' base_route: entity.rdf_entity.canonical diff --git a/web/modules/custom/joinup_rss/joinup_rss.module b/web/modules/custom/joinup_rss/joinup_rss.module index a792ec40cf..0cde65622f 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.module +++ b/web/modules/custom/joinup_rss/joinup_rss.module @@ -36,26 +36,22 @@ function joinup_rss_views_query_alter(ViewExecutable $view, QueryPluginBase $que } /** - * Implements hook_preprocess_views_view_rss__collection_feed__rss_feed(). + * Implements hook_preprocess_views_view_rss__group_feed__rss_feed(). * * Adds dynamic title and description to the rss. */ function joinup_rss_preprocess_views_view_rss__group_feed__rss_feed(&$variables): void { // Load the entity from the first view argument. The argument has been already // validated early so we can expect a group to be loaded successfully. - $encoded_collection_id = $variables['view']->args[0]; - $group = Rdf::load(UriEncoder::decodeUrl($encoded_collection_id)); - - $variables['title'] = t('Latest updates from the @label @bundle', [ - '@label' => $group->label(), - '@bundle' => $group->bundle(), - ]); + $encoded_uri_id = $variables['view']->args[0]; + $group = Rdf::load(UriEncoder::decodeUrl($encoded_uri_id)); $variables = [ '@label' => $group->label(), '@bundle' => $group->bundle(), ]; + $variables['title'] = t('Latest updates from the @label @bundle', $variables); $variables['description'] = $group->bundle() === 'collection' ? t('This feed contains the latest published content from the @label @bundle, including the newest solutions.', $variables) : t('This feed contains the latest published content from the @label @bundle.', $variables); @@ -85,7 +81,7 @@ function joinup_rss_page_attachments(array &$attachments): void { return; } - $url = Url::fromRoute("view.group_feed.rss_feed", [ + $url = Url::fromRoute('view.group_feed.rss_feed', [ 'rdf_entity' => UriEncoder::encodeUrl($entity->id()), ])->setAbsolute(); diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 8eaf09b06b..b6b7db69d2 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -639,17 +639,6 @@ class JoinupSubContext extends DrupalSubContextBase { ]); } - if (property_exists($node, 'published_at') && !empty($node->published_at)) { - // If the entry is not numeric, then it means that the scenario is using a - // human readable version of the timestamp. - // Example: Sun, 01 Dec 2019 13:00:00 +0100. - // 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)) { - $node->published_at = strtotime($node->published_at); - } - } - // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -720,7 +709,6 @@ class JoinupSubContext extends DrupalSubContextBase { 'visits' => 'visit_count', 'featured' => 'field_site_featured', 'pinned to front page' => 'field_site_pinned', - 'publication date' => 'published_at', ], ]; From a734be924fd9ce75ac39dad5f697c588fe1b65f3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 28 Feb 2020 07:07:44 +0200 Subject: [PATCH 132/957] ISAICP-5650: Do not name EVERYTHING '\$variables' and then wonder why your tests are failing. --- web/modules/custom/joinup_rss/joinup_rss.module | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_rss/joinup_rss.module b/web/modules/custom/joinup_rss/joinup_rss.module index 0cde65622f..aa27f5e30e 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.module +++ b/web/modules/custom/joinup_rss/joinup_rss.module @@ -46,15 +46,15 @@ function joinup_rss_preprocess_views_view_rss__group_feed__rss_feed(&$variables) $encoded_uri_id = $variables['view']->args[0]; $group = Rdf::load(UriEncoder::decodeUrl($encoded_uri_id)); - $variables = [ + $replacements = [ '@label' => $group->label(), '@bundle' => $group->bundle(), ]; - $variables['title'] = t('Latest updates from the @label @bundle', $variables); + $variables['title'] = t('Latest updates from the @label @bundle', $replacements); $variables['description'] = $group->bundle() === 'collection' ? - t('This feed contains the latest published content from the @label @bundle, including the newest solutions.', $variables) : - t('This feed contains the latest published content from the @label @bundle.', $variables); + t('This feed contains the latest published content from the @label @bundle, including the newest solutions.', $replacements) : + t('This feed contains the latest published content from the @label @bundle.', $replacements); // According to the RSS specifications this should be the URL of the website's // front page. But for the collection or solution feeds the homepage is the From 4b504c67ec10d0196aa92da6b4d652229e30bd1c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 28 Feb 2020 16:48:47 +0200 Subject: [PATCH 133/957] ISAICP-5650: Drop unneeded assertion message. --- tests/src/Context/RssContext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/Context/RssContext.php b/tests/src/Context/RssContext.php index 021a805ffd..a190907f19 100644 --- a/tests/src/Context/RssContext.php +++ b/tests/src/Context/RssContext.php @@ -122,7 +122,7 @@ public function assertRssItems(TableNode $table): void { // Support is limited to nodes that appear once only. Assert::assertCount(1, $nodes, "Invalid count for $key element."); $actual_value = trim($nodes->item(0)->nodeValue); - Assert::assertEquals($value, $actual_value, "'{$value}' is equal to '{$actual_value}'."); + Assert::assertSame($value, $actual_value); } } } From b6173417e9de35f8aca9379e5b5e377c1b4b7dfe Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 2 Mar 2020 11:57:41 +0200 Subject: [PATCH 134/957] ISAICP-5833: Update dependencies. --- composer.json | 7 +- composer.lock | 263 +++++++++++++++++++++++++------------------------- 2 files changed, 136 insertions(+), 134 deletions(-) diff --git a/composer.json b/composer.json index c3e0d21bc9..7b1e277cd9 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "drupal/cas_attributes": "dev-1.x", "drupal/changed_fields": "^3.2", "drupal/config_exclude": "dev-1.x", - "drupal/config_ignore": "dev-2.x", + "drupal/config_ignore": "dev-3.x", "drupal/config_readonly": "^1.0", "drupal/config_update": "dev-1.x", "drupal/core": "^8.8.1", @@ -66,7 +66,7 @@ "drupal/smart_trim": "~1.2", "drupal/social_media_links": "^2.6", "drupal/spdx": "^1.0.0-alpha5", - "drupal/state_machine": "^1.0-rc1", + "drupal/state_machine": "^1.0", "drupal/subpathauto": "~1.0", "drupal/swiftmailer": "dev-1.x#694cbf25d8c026b0c7c118093696d151a7874754", "drupal/token": "~1.5", @@ -265,9 +265,6 @@ "Missing config schema for field, widget and formatter @see https://www.drupal.org/node/2898680": "https://www.drupal.org/files/issues/2898680-6.patch", "Plugins with URL prefix should not allow URLs as user input @see https://www.drupal.org/node/2898726": "https://www.drupal.org/files/issues/2898726-3.patch" }, - "drupal/state_machine": { - "StateItem cache is leaking @see https://www.drupal.org/project/state_machine/issues/3086207": "https://www.drupal.org/files/issues/2019-10-08/3086207-5.patch" - }, "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" diff --git a/composer.lock b/composer.lock index 5f884643c2..51f7f34282 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": "edb37d668c69f7e79dc4792b54c288b7", + "content-hash": "53029a9d69cee90b61880a9a819ed273", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.23", + "version": "3.133.26", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a" + "reference": "0bccb2841d035fe983a811b964d3b485171c0406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", - "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0bccb2841d035fe983a811b964d3b485171c0406", + "reference": "0bccb2841d035fe983a811b964d3b485171c0406", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-26T19:11:26+00:00" + "time": "2020-02-29T00:41:14+00:00" }, { "name": "caxy/php-htmldiff", @@ -689,16 +689,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "cbe23383749496fe0f373345208b79568e4bc248" + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", - "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", "shasum": "" }, "require": { @@ -729,7 +729,7 @@ "Xdebug", "performance" ], - "time": "2019-11-06T16:40:04+00:00" + "time": "2020-03-01T12:26:26+00:00" }, { "name": "consolidation/annotated-command", @@ -2933,24 +2933,27 @@ }, { "name": "drupal/config_ignore", - "version": "dev-2.x", + "version": "dev-3.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/config_ignore.git", - "reference": "760312572e1b8a8b392994240ba73bbec19b954f" + "reference": "498063a9781f3b9ee42ee06909bfca8da9989b0d" }, "require": { - "drupal/config_filter": "1.*", - "drupal/core": "~8.0" + "drupal/core": "^8.8 || ^9", + "php": ">=7.1.3" + }, + "require-dev": { + "drush/drush": "^10" }, "type": "drupal-module", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-2.1+8-dev", - "datestamp": "1575757684", + "version": "8.x-3.x-dev", + "datestamp": "1583006472", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." @@ -2985,7 +2988,7 @@ "issues": "http://drupal.org/project/config_ignore", "irc": "irc://irc.freenode.org/drupal-contribute" }, - "time": "2019-12-07T22:43:13+00:00" + "time": "2020-02-29T20:45:27+00:00" }, { "name": "drupal/config_readonly", @@ -6613,20 +6616,21 @@ }, { "name": "drupal/state_machine", - "version": "1.0.0-rc1", + "version": "1.0.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/state_machine.git", - "reference": "8.x-1.0-rc1" + "reference": "8.x-1.0" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/state_machine-8.x-1.0-rc1.zip", - "reference": "8.x-1.0-rc1", - "shasum": "bea94c4def643f60d3134f9c5d8495ddb56c93dd" + "url": "https://ftp.drupal.org/files/projects/state_machine-8.x-1.0.zip", + "reference": "8.x-1.0", + "shasum": "b39ca317ca8d9cd5c9ebcf720a84d44ca697d57f" }, "require": { - "drupal/core": "~8.0" + "drupal/core": "^8.7.7 || ^9", + "php": ">=7.0.8" }, "type": "drupal-module", "extra": { @@ -6634,20 +6638,17 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-rc1", - "datestamp": "1542124077", + "version": "8.x-1.0", + "datestamp": "1582902575", "security-coverage": { - "status": "not-covered", - "message": "RC releases are not covered by Drupal security advisories." + "status": "covered", + "message": "Covered by Drupal's security advisory policy" } - }, - "patches_applied": { - "StateItem cache is leaking @see https://www.drupal.org/project/state_machine/issues/3086207": "https://www.drupal.org/files/issues/2019-10-08/3086207-5.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", "license": [ - "GPL-2.0-or-later" + "GPL-2.0+" ], "authors": [ { @@ -6704,7 +6705,7 @@ } ], "description": "Provides code-driven workflow functionality.", - "homepage": "https://www.drupal.org/project/state_machine", + "homepage": "http://drupal.org/project/state_machine", "support": { "source": "https://git.drupalcode.org/project/state_machine" } @@ -10116,7 +10117,7 @@ "reference": "master" }, "type": "library", - "time": "2019-04-02T18:33:21+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -10282,7 +10283,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -10338,16 +10339,16 @@ }, { "name": "symfony/console", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12" + "reference": "6827023c5872bea44b29d145de693b21981cf4cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", - "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", + "url": "https://api.github.com/repos/symfony/console/zipball/6827023c5872bea44b29d145de693b21981cf4cd", + "reference": "6827023c5872bea44b29d145de693b21981cf4cd", "shasum": "" }, "require": { @@ -10406,20 +10407,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-10T07:52:48+00:00" + "time": "2020-02-15T13:27:16+00:00" }, { "name": "symfony/debug", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "20236471058bbaa9907382500fc14005c84601f0" + "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0", - "reference": "20236471058bbaa9907382500fc14005c84601f0", + "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21", + "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21", "shasum": "" }, "require": { @@ -10462,20 +10463,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "time": "2020-02-23T14:41:43+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc" + "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/22000f10c9e1cfef051e8b4de46815b41a0223fc", - "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", + "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", "shasum": "" }, "require": { @@ -10533,20 +10534,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-01-08T11:20:51+00:00" + "time": "2020-02-19T17:19:43+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8" + "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/79ede8f2836e5ec910ebb325bde40f987244baa8", - "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2f67a869aef3eecf42e7f8be4a8b86c92308686c", + "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c", "shasum": "" }, "require": { @@ -10596,11 +10597,11 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -10650,16 +10651,16 @@ }, { "name": "symfony/finder", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3" + "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3", + "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", + "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", "shasum": "" }, "require": { @@ -10695,20 +10696,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-02-14T07:42:58+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5" + "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", - "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4d440be93adcfd5e4ee0bdc7acd1c3260625728f", + "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f", "shasum": "" }, "require": { @@ -10749,20 +10750,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-06T08:18:51+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4" + "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", - "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", + "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", "shasum": "" }, "require": { @@ -10839,7 +10840,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-21T12:29:51+00:00" + "time": "2020-02-29T10:16:41+00:00" }, { "name": "symfony/polyfill-ctype", @@ -11303,16 +11304,16 @@ }, { "name": "symfony/process", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a" + "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5b9d2bcffe4678911a4c941c00b7c161252cf09a", - "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a", + "url": "https://api.github.com/repos/symfony/process/zipball/b03b02dcea26ba4c65c16a73bab4f00c186b13da", + "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da", "shasum": "" }, "require": { @@ -11348,7 +11349,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -11417,16 +11418,16 @@ }, { "name": "symfony/routing", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa" + "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6366fbf86a05abccf77d6e605abbb0ee342f2cfa", - "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa", + "url": "https://api.github.com/repos/symfony/routing/zipball/c1377905edfa76e6934dd3c73f9a073305b47c00", + "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00", "shasum": "" }, "require": { @@ -11489,20 +11490,20 @@ "uri", "url" ], - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc" + "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/e85feee0d587c65713ec6d3e2a1d8782e6d219dc", - "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc", + "url": "https://api.github.com/repos/symfony/serializer/zipball/f8b99832d016e2d2c77c797c3df561adecd33dd3", + "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3", "shasum": "" }, "require": { @@ -11568,20 +11569,20 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-24T14:33:45+00:00" }, { "name": "symfony/translation", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf" + "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/577ec9ba1d6443947c48058acc3de298ad25e2bf", - "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf", + "url": "https://api.github.com/repos/symfony/translation/zipball/1eb074e0bd94939a30dd14dbecf7a92b165cea34", + "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34", "shasum": "" }, "require": { @@ -11638,20 +11639,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T07:22:30+00:00" }, { "name": "symfony/validator", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "46580e4429797438033fc1f226cb4cba67afe280" + "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/46580e4429797438033fc1f226cb4cba67afe280", - "reference": "46580e4429797438033fc1f226cb4cba67afe280", + "url": "https://api.github.com/repos/symfony/validator/zipball/b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", + "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", "shasum": "" }, "require": { @@ -11724,20 +11725,20 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2020-01-14T18:27:07+00:00" + "time": "2020-02-29T09:08:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6" + "reference": "2572839911702b0405479410ea7a1334bfab0b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96", + "reference": "2572839911702b0405479410ea7a1334bfab0b96", "shasum": "" }, "require": { @@ -11800,20 +11801,20 @@ "debug", "dump" ], - "time": "2020-01-25T12:44:29+00:00" + "time": "2020-02-24T13:10:00+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "aa46bc2233097d5212332c907f9911533acfbf80" + "reference": "bc63e15160866e8730a1f738541b194c401f72bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/aa46bc2233097d5212332c907f9911533acfbf80", - "reference": "aa46bc2233097d5212332c907f9911533acfbf80", + "url": "https://api.github.com/repos/symfony/yaml/zipball/bc63e15160866e8730a1f738541b194c401f72bf", + "reference": "bc63e15160866e8730a1f738541b194c401f72bf", "shasum": "" }, "require": { @@ -11859,7 +11860,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-13T08:00:59+00:00" + "time": "2020-01-16T19:04:26+00:00" }, { "name": "twig/twig", @@ -13483,6 +13484,10 @@ "name": "See contributors", "homepage": "https://www.drupal.org/node/3236/committers" }, + { + "name": "pcambra", + "homepage": "https://www.drupal.org/user/122101" + }, { "name": "salvis", "homepage": "https://www.drupal.org/user/82964" @@ -15814,7 +15819,7 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -15871,16 +15876,16 @@ }, { "name": "symfony/config", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4d3979f54472637169080f802dc82197e21fdcce" + "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4d3979f54472637169080f802dc82197e21fdcce", - "reference": "4d3979f54472637169080f802dc82197e21fdcce", + "url": "https://api.github.com/repos/symfony/config/zipball/cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", + "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", "shasum": "" }, "require": { @@ -15931,20 +15936,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-02-04T09:32:40+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5" + "reference": "ee9b946e7223b11257329a054c64396b19d619e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", - "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee9b946e7223b11257329a054c64396b19d619e1", + "reference": "ee9b946e7223b11257329a054c64396b19d619e1", "shasum": "" }, "require": { @@ -15984,20 +15989,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1" + "reference": "11dcf08f12f29981bf770f097a5d64d65bce5929" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b66fe8ccc850ea11c4cd31677706c1219768bea1", - "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/11dcf08f12f29981bf770f097a5d64d65bce5929", + "reference": "11dcf08f12f29981bf770f097a5d64d65bce5929", "shasum": "" }, "require": { @@ -16045,27 +16050,27 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-02-29T10:05:28+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a" + "reference": "a270dbfe54994138a8037937fd5934827b8605bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/d592d89cd40a5948e949f25a30bcda5b28b2679a", - "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/a270dbfe54994138a8037937fd5934827b8605bf", + "reference": "a270dbfe54994138a8037937fd5934827b8605bf", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -16110,7 +16115,7 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-01-31T09:56:34+00:00" + "time": "2020-02-24T14:58:55+00:00" }, { "name": "theseer/tokenizer", From 49b3434183ab7648eb4b37429519a44ef059a8a7 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 2 Mar 2020 12:03:22 +0200 Subject: [PATCH 135/957] ISAICP-5833: Remove workaround for issue that is fixed upstream in config_ignore 3.x. --- .../tests/src/ExistingSite/ConfigTest.php | 21 ------------------- 1 file changed, 21 deletions(-) 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 750da1bb60..fee2e0dba9 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/ConfigTest.php @@ -27,29 +27,8 @@ public function testConfig(): void { $this->drush('config:status', [], ['format' => 'json']); $diff = array_keys((array) $this->getOutputFromJSON()); - // @todo Remove this line in #3099674. - // @see https://www.drupal.org/project/config_ignore/issues/3099674 - $diff = array_diff($diff, $this->getIgnoredConfigs()); - // Check that there are no differences between database and config sync. $this->assertEmpty($diff, 'Differences between active and sync stores for: ' . implode(', ', $diff)); } - /** - * Returns a list of ignored configuration names. - * - * @return string[] - * A list of ignored configuration names. - * - * @todo Remove this method in #3099674. - * - * @see https://www.drupal.org/project/config_ignore/issues/3099674 - */ - protected function getIgnoredConfigs(): array { - $ignored_configs = (array) $this->container->get('config.factory')->get('config_ignore.settings')->get('ignored_config_entities'); - // Allow hooks to alter the list. - $this->container->get('module_handler')->invokeAll('config_ignore_settings_alter', [&$ignored_configs]); - return $ignored_configs; - } - } From 44b171c29dde551a903e1d61f1a8ad27a352e153 Mon Sep 17 00:00:00 2001 From: joosthe Date: Mon, 2 Mar 2020 13:02:26 +0100 Subject: [PATCH 136/957] updated the issue- FRONT-808 --- web/themes/joinup/joinup_theme.theme | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index b2a6510bce..87f4445fd8 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -884,21 +884,7 @@ function joinup_theme_preprocess_field__comment(&$variables) { * Implements hook_preprocess_HOOK() for form.html.twig. */ function joinup_theme_preprocess_form(&$variables) { - // Exclude collection and solution forms. - // $form_ids = [ - // 'rdf_entity_collection_edit_form', - // 'rdf_entity_collection_propose_form', - // 'rdf_entity_collection_add_form', - // 'rdf_entity_solution_edit_form', - // 'rdf_entity_solution_form', - // 'rdf_entity_solution_add_form', - // ]; - - // Display asterisk for required fields. - //if (!in_array($variables['element']['#form_id'], $form_ids)) { $variables['attributes']['class'][] = 'form__with-asterisk'; - //} - // Additional classes for members overview. if (strpos($variables['element']['#form_id'], 'views_form_og_members_overview_default_rdf_entity') !== FALSE) { $variables['attributes']['class'][] = 'form__content'; From 20b6ac16e7db53ab87eb1d5860d639c4dd77bf82 Mon Sep 17 00:00:00 2001 From: joosthe Date: Mon, 2 Mar 2020 13:03:59 +0100 Subject: [PATCH 137/957] updated the issue- FRONT-808 --- web/themes/joinup/joinup_theme.theme | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 87f4445fd8..5402532687 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -884,13 +884,13 @@ function joinup_theme_preprocess_field__comment(&$variables) { * Implements hook_preprocess_HOOK() for form.html.twig. */ function joinup_theme_preprocess_form(&$variables) { - $variables['attributes']['class'][] = 'form__with-asterisk'; + $variables['attributes']['class'][] = 'form__with-asterisk'; // Additional classes for members overview. if (strpos($variables['element']['#form_id'], 'views_form_og_members_overview_default_rdf_entity') !== FALSE) { $variables['attributes']['class'][] = 'form__content'; $variables['attributes']['class'][] = 'form__margin-top'; $variables['attributes']['class'][] = 'form__member-actions'; - } + } } /** From 46b70c166138c8c4320d75bd9c7527cc8e63747e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 2 Mar 2020 15:06:12 +0200 Subject: [PATCH 138/957] ISAICP-5833: Patch Drush to handle empty JSON data correctly. --- composer.json | 4 ++++ composer.lock | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 7b1e277cd9..7114881f06 100644 --- a/composer.json +++ b/composer.json @@ -272,6 +272,10 @@ "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" }, + "drush/drush": { + "Do not throw an exception when valid JSON data evaluates to empty PHP data @see https://github.com/drush-ops/drush/pull/4342": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4342.diff", + "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4340.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", diff --git a/composer.lock b/composer.lock index 51f7f34282..39c45d1cec 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": "53029a9d69cee90b61880a9a819ed273", + "content-hash": "3d77761b4d60c253870b01693dac49cf", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -7234,6 +7234,10 @@ }, "branch-alias": { "dev-master": "10.x-dev" + }, + "patches_applied": { + "Do not throw an exception when valid JSON data evaluates to empty PHP data @see https://github.com/drush-ops/drush/pull/4342": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4342.diff", + "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4340.diff" } }, "autoload": { From 2b7e198d2c5d16c362dd3a6238724555a3f465b9 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 2 Mar 2020 16:56:57 +0200 Subject: [PATCH 139/957] ISAICP-5833: Use local version of patch that excludes the tests. Drush strips the tests from the source tree when packaging a release, so we cannot directly apply patches that include test changes. --- composer.json | 2 +- composer.lock | 4 ++-- resources/patch/drush-4103.patch | 16 ---------------- resources/patch/drush-4340.patch | 26 ++++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 19 deletions(-) delete mode 100644 resources/patch/drush-4103.patch create mode 100644 resources/patch/drush-4340.patch diff --git a/composer.json b/composer.json index 7114881f06..a4cabb9ec7 100644 --- a/composer.json +++ b/composer.json @@ -274,7 +274,7 @@ }, "drush/drush": { "Do not throw an exception when valid JSON data evaluates to empty PHP data @see https://github.com/drush-ops/drush/pull/4342": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4342.diff", - "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4340.diff" + "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "resources/patch/drush-4340.patch" }, "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", diff --git a/composer.lock b/composer.lock index 39c45d1cec..8dc3b536d4 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": "3d77761b4d60c253870b01693dac49cf", + "content-hash": "41b6da6d42fe6e08538cdaabb36c8b23", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -7237,7 +7237,7 @@ }, "patches_applied": { "Do not throw an exception when valid JSON data evaluates to empty PHP data @see https://github.com/drush-ops/drush/pull/4342": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4342.diff", - "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "https://patch-diff.githubusercontent.com/raw/drush-ops/drush/pull/4340.diff" + "Output correct data for machine readable formats in config:status @see https://github.com/drush-ops/drush/pull/4340": "resources/patch/drush-4340.patch" } }, "autoload": { diff --git a/resources/patch/drush-4103.patch b/resources/patch/drush-4103.patch deleted file mode 100644 index c9709305b1..0000000000 --- a/resources/patch/drush-4103.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/src/Commands/core/UpdateDBCommands.php b/src/Commands/core/UpdateDBCommands.php -index 9132552003..0c6b891c24 100644 ---- a/src/Commands/core/UpdateDBCommands.php -+++ b/src/Commands/core/UpdateDBCommands.php -@@ -364,8 +364,9 @@ public static function updateDoOnePostUpdate($function, DrushBatchContext $conte - */ - public static function updateFinished($success, $results, $operations) - { -- // No code needed but the batch result bookkeeping fails without a finished callback. -- $noop = 1; -+ // Some (post)updates might install/uninstall extensions that require -+ // clearing the static and persistent caches and container invalidation. -+ drupal_flush_all_caches(); - } - - diff --git a/resources/patch/drush-4340.patch b/resources/patch/drush-4340.patch new file mode 100644 index 0000000000..1952616ba2 --- /dev/null +++ b/resources/patch/drush-4340.patch @@ -0,0 +1,26 @@ +diff --git a/src/Drupal/Commands/config/ConfigCommands.php b/src/Drupal/Commands/config/ConfigCommands.php +index ccc6755771..16117435a5 100644 +--- a/src/Drupal/Commands/config/ConfigCommands.php ++++ b/src/Drupal/Commands/config/ConfigCommands.php +@@ -313,11 +313,18 @@ public function status($options = ['state' => 'Only in DB,Only in sync dir,Diffe + ]; + } + +- if ($rows) { +- return new RowsOfFields($rows); +- } else { ++ if (!$rows) { + $this->logger()->notice(dt('No differences between DB and sync directory.')); ++ ++ // Suppress output if there are no differences and we are using the ++ // human readable "table" formatter so that we not uselessly output ++ // empty table headers. ++ if ($options['format'] === 'table') { ++ return null; ++ } + } ++ ++ return new RowsOfFields($rows); + } + + /** From 7da088d26269e4621f19bf16c13518096801abdf Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 3 Mar 2020 13:31:40 +0100 Subject: [PATCH 140/957] ISAICP-5826 -Documentation added --- README.md | 3 + resources/mac/README.md | 205 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 resources/mac/README.md diff --git a/README.md b/README.md index 89a7cffce2..e80fd60d58 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,9 @@ There are two ways to run Joinup. With `docker` and `docker-compose` and buildin To start with docker, please, check the separated [README file](resources/docker/README.md). +### Mac without docker installation +To start on a mac and want to do this without docker, please, check the separated [README file](resources/mac/README.md). + ### Local installation To run Joinup locally, below is a list of requirements and instructions. diff --git a/resources/mac/README.md b/resources/mac/README.md new file mode 100644 index 0000000000..8b104c4e71 --- /dev/null +++ b/resources/mac/README.md @@ -0,0 +1,205 @@ +# joinup on mac without docker +Here you will find the steps to run the joinup project on your mac without docker. + +## Prerequisites +Brew, Composer, Drush +Apache and PHP +[Install Apache & Multiple php versions](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions) +Mysql & Apache Virtual Hosts & DnsMasq +[Install mysql & Apache Virtual Hosts & Dnsmasq](https://getgrav.org/blog/macos-catalina-apache-mysql-vhost-apc) +Redis +[Install and config Redis](https://medium.com/@petehouston/install-and-config-redis-on-mac-os-x-via-homebrew-eb8df9a4f298) + +## Installation + +1 - Uncomment these lines on http.conf file **/usr/local/etc/httpd/httpd.conf** +``` +LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so +Include /usr/local/etc/httpd/extra/httpd-vhosts.conf +```` + +2 - Add virtual-host **/usr/local/etc/httpd/extra/http-vhosts.conf** +``` + + ServerName joinup.test + DocumentRoot "/Users/.../.../joinup-dev/web" + + AllowOverride all + Require all granted + + + ``` +**Please make user ur pathes to the project will match or this won't work** + +3 - Add new host in **/private/etc/hosts** +``` +127.0.0.1 joinup.test +``` +4 - Restart Apache +```` +$ sudo apachectl -k restart +```` +5 - **Only if** you have xdebug installed and Check php.ini file for the configuaration. +```` +[xdebug] +;zend_extension=“xdebug.so” +xdebug.remote_enable=1 +xdebug.remote_autostart=0 +xdebug.max_nesting_level=256 +;xdebug.collect_params=3 +;xdebug.profiler_enabled=1 +;xdebug.profiler_output_dir=/tmp/ +;xdebug.profiler_enable_trigger=1 +```` + + +## Setting up the project +1 - Clone the respository of this project +```` +$ git clone https://github.com/ec-europa/joinup-dev.git +```` + +2 - Create file **build.properties.local** in the project with content +``` +# The location of the Composer binary. +composer.bin = /usr/local/bin/composer + +# Database settings. +drupal.db.name = joinup +drupal.db.user = root +drupal.db.password = + +# Admin user. +drupal.admin.username = admin +drupal.admin.password = admin + +# The base URL to use in Behat tests. +behat.base_url = http://joinup.test/ +drupal.base_url = http://joinup.test/ + +# Paths +isql.bin = /usr/local/bin/isql +sparql.dsn = localhost +sparql.user = dba +sparql.password = dba + +# Migration. +migration.db.name = joinup6 +migration.db.user = joinup6 +migration.db.password = joinup6 + +# Piwik configuration +piwik.db.password = password +piwik.port = 80 +piwik.website_id = 1 +piwik.url.http = http://piwik.test/ + +# The credentials of the S3 bucket containing the databases. +# Production db dumps. +#exports.sql.source = joinupv2.0/dumps/prod/joinup-full-20180220.sql + +# Virtuoso +virtuoso.binary = /usr/local/bin/virtuoso-t + +# Solr +solr.download.url = https://archive.apache.org/dist/lucene/solr/7.7.1/solr-7.7.1.tgz + +# ASDA settings +asda.username = '' +asda.password = '' +exports.virtuoso.source = '' +exports.sql.source = '' +exports.solr.filename = '' +exports.solr.source = '' +exports.s3.bucket = '' +exports.s3.key = '' +exports.s3.secret = '' +``` +**! Important: For the ASDA settings please contact your local developer !** + +2 - Run composer +```` +$ composer install +```` + +3 - Run build dev +``` +$ ./vendor/bin/phing build-dev +``` + +4 - install and/or relink +``` +$ brew unlink unixodbc +$ brew install virtuoso +$ brew unlink virtuoso +$ brew link unixodbc +$ brew link --overwrite virtuoso +``` + +5 - setup viriuoso +``` +$ ./vendor/bin/phing virtuoso-setup +$ ./vendor/bin/phing virtuoso-start +$ ./vendor/bin/phing setup-virtuoso-permissions +``` + +6 - Run install dev +``` +$ ./vendor/bin/phing install-dev +``` + +7 - Setup solar and check if its running +``` +$ ./vendor/bin/phing setup-apache-solr +``` +[Check Virtuoso](http://localhost:8890/sparql) +[Check Solr](http://localhost:8983/solr/#/) + +8 - Download Databases +```` + $ ./vendor/bin/phing download-databases +```` + +9 - Rebuild environment +``` +$ ./vendor/bin/phing install-dev +``` + +10 - Enable developers settings +``` + $ ./vendor/bin/phing setup-dev +``` +**WARNING** If you get an error: +*“ Your site configuration active store is currently locked.”* +comment this line in **/web/sites/default/settings.php** +$settings['config_readonly'] = !file_exists(getcwd() . '/../disable-config-readonly'); + +11 - unblock the admin user +```` +drush user:unblock +```` + +12 - create a new admin user +```` +drush uli +```` + +## Using the gulp +For using the gulp please set your node version to v11.15.0 ( its recommanded to know your current node version so your can put ik back for newer projects ). +To do this check: +[How do down or upgrade your node version.](https://www.surrealcms.com/blog/how-to-upgrade-or-downgrade-nodejs-using-npm.html) + +thenuse the following commands: +```` + $ cd web/themes/joinup/prototype ; + $ npm install; + ```` + check gulp file for all the possible tasks + + +## Switching between branches +This is you need to when you switch a branch to keep your content up to date +```` +./vendor/bin/phing build-dev +./vendor/bin/phing rebuild-environment +```` From c07ba3cf490677775e591abac5ad92f43eccf693 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 3 Mar 2020 15:00:00 +0200 Subject: [PATCH 141/957] ISAICP-5684: Include the current Joinup version number in the RPM package. --- scripts/rpmbuild/make_joinup_build.sh | 2 +- scripts/rpmbuild/make_joinup_build_acc.sh | 2 +- scripts/rpmbuild/make_joinup_build_uat.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/rpmbuild/make_joinup_build.sh b/scripts/rpmbuild/make_joinup_build.sh index 9a7fbbaf69..3dad6b9fcb 100755 --- a/scripts/rpmbuild/make_joinup_build.sh +++ b/scripts/rpmbuild/make_joinup_build.sh @@ -43,7 +43,7 @@ ${COMPOSER_PATH} install --no-dev || exit 1 ./vendor/bin/phing build-dist || exit 1 # Collect the source files for the package. -cp -r build* composer.* config/ resources/ scripts/ src/ vendor/ web/ ${JOINUP_DIR} || exit 1 +cp -r build* composer.* VERSION config/ 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 diff --git a/scripts/rpmbuild/make_joinup_build_acc.sh b/scripts/rpmbuild/make_joinup_build_acc.sh index 48810563ff..02351b4e24 100755 --- a/scripts/rpmbuild/make_joinup_build_acc.sh +++ b/scripts/rpmbuild/make_joinup_build_acc.sh @@ -38,7 +38,7 @@ ${COMPOSER_PATH} install --no-dev || exit 1 ./vendor/bin/phing build-dist || exit 1 # Collect the source files for the package. -cp -r build* composer.* config/ resources/ scripts/ src/ vendor/ web/ ${JOINUP_DIR} || exit 1 +cp -r build* composer.* VERSION config/ 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 diff --git a/scripts/rpmbuild/make_joinup_build_uat.sh b/scripts/rpmbuild/make_joinup_build_uat.sh index 81ebf7c734..0a329a4947 100755 --- a/scripts/rpmbuild/make_joinup_build_uat.sh +++ b/scripts/rpmbuild/make_joinup_build_uat.sh @@ -38,7 +38,7 @@ COMPOSER_DISCARD_CHANGES=true ${COMPOSER_PATH} install --no-interaction --prefer # Collect the source files for the package. -cp -r build* composer.* config/ resources/ scripts/ src/ vendor/ web/ ${JOINUP_DIR} || exit 1 +cp -r build* composer.* VERSION config/ 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 From 7567684e1c341d61aa669f3b60b89f0ea8c94b2e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 3 Mar 2020 15:03:38 +0200 Subject: [PATCH 142/957] ISAICP-5684: Log the action that was taken. --- scripts/composer/CaptureGitReleaseTag.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/composer/CaptureGitReleaseTag.php b/scripts/composer/CaptureGitReleaseTag.php index b1e637d0a0..0dc4eb04f7 100644 --- a/scripts/composer/CaptureGitReleaseTag.php +++ b/scripts/composer/CaptureGitReleaseTag.php @@ -32,6 +32,8 @@ public static function capture(Event $event): void { $fs = new Filesystem(); $fs->dumpFile("$directory/VERSION", $version); + + $event->getIO()->write("$version written to $directory/VERSION."); } } From f285a5200ac695da61f2830aeac0bc8986c561ba Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 3 Mar 2020 15:09:11 +0200 Subject: [PATCH 143/957] ISAICP-5684: Make the fallback version less mysterious. --- web/modules/custom/joinup_core/src/JoinupVersion.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/src/JoinupVersion.php b/web/modules/custom/joinup_core/src/JoinupVersion.php index c174134cb6..da1950e1bc 100644 --- a/web/modules/custom/joinup_core/src/JoinupVersion.php +++ b/web/modules/custom/joinup_core/src/JoinupVersion.php @@ -27,7 +27,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)) : 'n/a'; + $this->version = file_exists($path) ? $this->version = trim(file_get_contents($path)) : 'untagged.version'; // 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 From ac89f520ec717adc2ffc200664ac774aaf0f0d5d Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 3 Mar 2020 15:42:14 +0200 Subject: [PATCH 144/957] ISAICP-5833: Update only the Drupal modules. Ignore everything else. --- composer.lock | 208 +++++++++++++++++++++++++------------------------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/composer.lock b/composer.lock index 8dc3b536d4..3dd1faed3f 100644 --- a/composer.lock +++ b/composer.lock @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.26", + "version": "3.133.23", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0bccb2841d035fe983a811b964d3b485171c0406" + "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0bccb2841d035fe983a811b964d3b485171c0406", - "reference": "0bccb2841d035fe983a811b964d3b485171c0406", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", + "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-29T00:41:14+00:00" + "time": "2020-02-26T19:11:26+00:00" }, { "name": "caxy/php-htmldiff", @@ -689,16 +689,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.4.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" + "reference": "cbe23383749496fe0f373345208b79568e4bc248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", + "reference": "cbe23383749496fe0f373345208b79568e4bc248", "shasum": "" }, "require": { @@ -729,7 +729,7 @@ "Xdebug", "performance" ], - "time": "2020-03-01T12:26:26+00:00" + "time": "2019-11-06T16:40:04+00:00" }, { "name": "consolidation/annotated-command", @@ -10287,7 +10287,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -10343,16 +10343,16 @@ }, { "name": "symfony/console", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6827023c5872bea44b29d145de693b21981cf4cd" + "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6827023c5872bea44b29d145de693b21981cf4cd", - "reference": "6827023c5872bea44b29d145de693b21981cf4cd", + "url": "https://api.github.com/repos/symfony/console/zipball/7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", + "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", "shasum": "" }, "require": { @@ -10411,20 +10411,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-02-15T13:27:16+00:00" + "time": "2020-01-10T07:52:48+00:00" }, { "name": "symfony/debug", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21" + "reference": "20236471058bbaa9907382500fc14005c84601f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21", - "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21", + "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0", + "reference": "20236471058bbaa9907382500fc14005c84601f0", "shasum": "" }, "require": { @@ -10467,20 +10467,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-02-23T14:41:43+00:00" + "time": "2020-01-25T12:44:29+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee" + "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", - "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/22000f10c9e1cfef051e8b4de46815b41a0223fc", + "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc", "shasum": "" }, "require": { @@ -10538,20 +10538,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-02-19T17:19:43+00:00" + "time": "2020-01-08T11:20:51+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c" + "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2f67a869aef3eecf42e7f8be4a8b86c92308686c", - "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/79ede8f2836e5ec910ebb325bde40f987244baa8", + "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8", "shasum": "" }, "require": { @@ -10601,11 +10601,11 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-01-04T12:05:51+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -10655,16 +10655,16 @@ }, { "name": "symfony/finder", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" + "reference": "3a50be43515590faf812fbd7708200aabc327ec3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", + "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3", + "reference": "3a50be43515590faf812fbd7708200aabc327ec3", "shasum": "" }, "require": { @@ -10700,20 +10700,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-02-14T07:42:58+00:00" + "time": "2020-01-04T13:00:46+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f" + "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4d440be93adcfd5e4ee0bdc7acd1c3260625728f", - "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", + "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", "shasum": "" }, "require": { @@ -10754,20 +10754,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-02-06T08:18:51+00:00" + "time": "2020-01-04T12:05:51+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0" + "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", - "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", + "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", "shasum": "" }, "require": { @@ -10844,7 +10844,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-02-29T10:16:41+00:00" + "time": "2020-01-21T12:29:51+00:00" }, { "name": "symfony/polyfill-ctype", @@ -11308,16 +11308,16 @@ }, { "name": "symfony/process", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da" + "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b03b02dcea26ba4c65c16a73bab4f00c186b13da", - "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da", + "url": "https://api.github.com/repos/symfony/process/zipball/5b9d2bcffe4678911a4c941c00b7c161252cf09a", + "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a", "shasum": "" }, "require": { @@ -11353,7 +11353,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-01-01T11:03:25+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -11422,16 +11422,16 @@ }, { "name": "symfony/routing", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00" + "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/c1377905edfa76e6934dd3c73f9a073305b47c00", - "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00", + "url": "https://api.github.com/repos/symfony/routing/zipball/6366fbf86a05abccf77d6e605abbb0ee342f2cfa", + "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa", "shasum": "" }, "require": { @@ -11494,20 +11494,20 @@ "uri", "url" ], - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-01-04T12:05:51+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3" + "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f8b99832d016e2d2c77c797c3df561adecd33dd3", - "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3", + "url": "https://api.github.com/repos/symfony/serializer/zipball/e85feee0d587c65713ec6d3e2a1d8782e6d219dc", + "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc", "shasum": "" }, "require": { @@ -11573,20 +11573,20 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-02-24T14:33:45+00:00" + "time": "2020-01-01T11:03:25+00:00" }, { "name": "symfony/translation", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34" + "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1eb074e0bd94939a30dd14dbecf7a92b165cea34", - "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34", + "url": "https://api.github.com/repos/symfony/translation/zipball/577ec9ba1d6443947c48058acc3de298ad25e2bf", + "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf", "shasum": "" }, "require": { @@ -11643,20 +11643,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-02-04T07:22:30+00:00" + "time": "2020-01-04T12:05:51+00:00" }, { "name": "symfony/validator", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe" + "reference": "46580e4429797438033fc1f226cb4cba67afe280" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", - "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", + "url": "https://api.github.com/repos/symfony/validator/zipball/46580e4429797438033fc1f226cb4cba67afe280", + "reference": "46580e4429797438033fc1f226cb4cba67afe280", "shasum": "" }, "require": { @@ -11729,20 +11729,20 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2020-02-29T09:08:42+00:00" + "time": "2020-01-14T18:27:07+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "2572839911702b0405479410ea7a1334bfab0b96" + "reference": "46b53fd714568af343953c039ff47b67ce8af8d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96", - "reference": "2572839911702b0405479410ea7a1334bfab0b96", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6", + "reference": "46b53fd714568af343953c039ff47b67ce8af8d6", "shasum": "" }, "require": { @@ -11805,20 +11805,20 @@ "debug", "dump" ], - "time": "2020-02-24T13:10:00+00:00" + "time": "2020-01-25T12:44:29+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "bc63e15160866e8730a1f738541b194c401f72bf" + "reference": "aa46bc2233097d5212332c907f9911533acfbf80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/bc63e15160866e8730a1f738541b194c401f72bf", - "reference": "bc63e15160866e8730a1f738541b194c401f72bf", + "url": "https://api.github.com/repos/symfony/yaml/zipball/aa46bc2233097d5212332c907f9911533acfbf80", + "reference": "aa46bc2233097d5212332c907f9911533acfbf80", "shasum": "" }, "require": { @@ -11864,7 +11864,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-16T19:04:26+00:00" + "time": "2020-01-13T08:00:59+00:00" }, { "name": "twig/twig", @@ -15823,7 +15823,7 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -15880,16 +15880,16 @@ }, { "name": "symfony/config", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9" + "reference": "4d3979f54472637169080f802dc82197e21fdcce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", - "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", + "url": "https://api.github.com/repos/symfony/config/zipball/4d3979f54472637169080f802dc82197e21fdcce", + "reference": "4d3979f54472637169080f802dc82197e21fdcce", "shasum": "" }, "require": { @@ -15940,20 +15940,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-02-04T09:32:40+00:00" + "time": "2020-01-04T13:00:46+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.38", + "version": "v3.4.37", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1" + "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee9b946e7223b11257329a054c64396b19d619e1", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", + "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", "shasum": "" }, "require": { @@ -15993,20 +15993,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-01-01T11:03:25+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "11dcf08f12f29981bf770f097a5d64d65bce5929" + "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/11dcf08f12f29981bf770f097a5d64d65bce5929", - "reference": "11dcf08f12f29981bf770f097a5d64d65bce5929", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b66fe8ccc850ea11c4cd31677706c1219768bea1", + "reference": "b66fe8ccc850ea11c4cd31677706c1219768bea1", "shasum": "" }, "require": { @@ -16054,27 +16054,27 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-02-29T10:05:28+00:00" + "time": "2020-01-04T13:00:46+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v4.4.5", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "a270dbfe54994138a8037937fd5934827b8605bf" + "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/a270dbfe54994138a8037937fd5934827b8605bf", - "reference": "a270dbfe54994138a8037937fd5934827b8605bf", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/d592d89cd40a5948e949f25a30bcda5b28b2679a", + "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -16119,7 +16119,7 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-02-24T14:58:55+00:00" + "time": "2020-01-31T09:56:34+00:00" }, { "name": "theseer/tokenizer", From f7994caab9a09c402be85dd8429aed7c7aa324da Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 3 Mar 2020 14:53:09 +0100 Subject: [PATCH 145/957] ISAICP-5826 - Typo's removed --- resources/mac/README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/mac/README.md b/resources/mac/README.md index 8b104c4e71..914ef56f7e 100644 --- a/resources/mac/README.md +++ b/resources/mac/README.md @@ -1,4 +1,4 @@ -# joinup on mac without docker +# Joinup on mac without docker Here you will find the steps to run the joinup project on your mac without docker. ## Prerequisites @@ -127,7 +127,7 @@ $ composer install $ ./vendor/bin/phing build-dev ``` -4 - install and/or relink +4 - Install and/or relink ``` $ brew unlink unixodbc $ brew install virtuoso @@ -136,7 +136,7 @@ $ brew link unixodbc $ brew link --overwrite virtuoso ``` -5 - setup viriuoso +5 - Setup viriuoso ``` $ ./vendor/bin/phing virtuoso-setup $ ./vendor/bin/phing virtuoso-start @@ -148,14 +148,14 @@ $ ./vendor/bin/phing setup-virtuoso-permissions $ ./vendor/bin/phing install-dev ``` -7 - Setup solar and check if its running +7 - Setup solar and check if it's running ``` $ ./vendor/bin/phing setup-apache-solr ``` [Check Virtuoso](http://localhost:8890/sparql) [Check Solr](http://localhost:8983/solr/#/) -8 - Download Databases +8 - Download production Databases ```` $ ./vendor/bin/phing download-databases ```` @@ -171,34 +171,34 @@ $ ./vendor/bin/phing install-dev ``` **WARNING** If you get an error: *“ Your site configuration active store is currently locked.”* -comment this line in **/web/sites/default/settings.php** +Comment this line in **/web/sites/default/settings.php** $settings['config_readonly'] = !file_exists(getcwd() . '/../disable-config-readonly'); -11 - unblock the admin user +11 - Unblock the admin user ```` drush user:unblock ```` -12 - create a new admin user +12 - Create a new admin user ```` drush uli ```` -## Using the gulp +## FRONT-END documentation For using the gulp please set your node version to v11.15.0 ( its recommanded to know your current node version so your can put ik back for newer projects ). To do this check: [How do down or upgrade your node version.](https://www.surrealcms.com/blog/how-to-upgrade-or-downgrade-nodejs-using-npm.html) -thenuse the following commands: +Then use the following commands: ```` $ cd web/themes/joinup/prototype ; $ npm install; ```` - check gulp file for all the possible tasks + Check gulp file for all the possible tasks ## Switching between branches -This is you need to when you switch a branch to keep your content up to date +This is needed when you need to when you switch a branch to keep your content up to date ```` ./vendor/bin/phing build-dev ./vendor/bin/phing rebuild-environment From 05135dd403c8afaa6b7654933ebb811f46b6e4b3 Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 3 Mar 2020 15:07:34 +0100 Subject: [PATCH 146/957] ISAICP-5826 - Gulp part removed --- resources/mac/README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/resources/mac/README.md b/resources/mac/README.md index 914ef56f7e..46c5a85452 100644 --- a/resources/mac/README.md +++ b/resources/mac/README.md @@ -183,20 +183,6 @@ drush user:unblock ```` drush uli ```` - -## FRONT-END documentation -For using the gulp please set your node version to v11.15.0 ( its recommanded to know your current node version so your can put ik back for newer projects ). -To do this check: -[How do down or upgrade your node version.](https://www.surrealcms.com/blog/how-to-upgrade-or-downgrade-nodejs-using-npm.html) - -Then use the following commands: -```` - $ cd web/themes/joinup/prototype ; - $ npm install; - ```` - Check gulp file for all the possible tasks - - ## Switching between branches This is needed when you need to when you switch a branch to keep your content up to date ```` From d0d8c67e89c236d837acf73f384fa6448a720af1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 3 Mar 2020 16:19:21 +0200 Subject: [PATCH 147/957] ISAICP-5833: Latest symfony/dom-crawler release causes test failures. Lock on the previous version 4.4.4 which was working as expected. Ref. https://github.com/symfony/symfony/pull/34059 --- composer.json | 1 + composer.lock | 200 +++++++++++++++++++++++++------------------------- 2 files changed, 101 insertions(+), 100 deletions(-) diff --git a/composer.json b/composer.json index a4cabb9ec7..a251abafbf 100644 --- a/composer.json +++ b/composer.json @@ -123,6 +123,7 @@ "pfrenssen/phpcs-pre-push": "1.1", "phpunit/phpunit": "~6.5", "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/dom-crawler": "4.4.4", "symfony/phpunit-bridge": "^4.2", "weitzman/drupal-test-traits": "~1.3.1", "weitzman/logintrait": "^1.1" diff --git a/composer.lock b/composer.lock index 3dd1faed3f..9f6fab78f7 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": "41b6da6d42fe6e08538cdaabb36c8b23", + "content-hash": "68d3f09da981c78f3e3e3c81d30f35d4", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.23", + "version": "3.133.27", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a" + "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", - "reference": "fd4a74aff537a4f6a7e9ed7efb14693ae5f3013a", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", + "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-02-26T19:11:26+00:00" + "time": "2020-03-02T19:20:19+00:00" }, { "name": "caxy/php-htmldiff", @@ -689,16 +689,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "cbe23383749496fe0f373345208b79568e4bc248" + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", - "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", "shasum": "" }, "require": { @@ -729,7 +729,7 @@ "Xdebug", "performance" ], - "time": "2019-11-06T16:40:04+00:00" + "time": "2020-03-01T12:26:26+00:00" }, { "name": "consolidation/annotated-command", @@ -10287,7 +10287,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -10343,16 +10343,16 @@ }, { "name": "symfony/console", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12" + "reference": "6827023c5872bea44b29d145de693b21981cf4cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", - "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12", + "url": "https://api.github.com/repos/symfony/console/zipball/6827023c5872bea44b29d145de693b21981cf4cd", + "reference": "6827023c5872bea44b29d145de693b21981cf4cd", "shasum": "" }, "require": { @@ -10411,20 +10411,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-10T07:52:48+00:00" + "time": "2020-02-15T13:27:16+00:00" }, { "name": "symfony/debug", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "20236471058bbaa9907382500fc14005c84601f0" + "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0", - "reference": "20236471058bbaa9907382500fc14005c84601f0", + "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21", + "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21", "shasum": "" }, "require": { @@ -10467,20 +10467,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "time": "2020-02-23T14:41:43+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc" + "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/22000f10c9e1cfef051e8b4de46815b41a0223fc", - "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", + "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", "shasum": "" }, "require": { @@ -10538,20 +10538,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-01-08T11:20:51+00:00" + "time": "2020-02-19T17:19:43+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8" + "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/79ede8f2836e5ec910ebb325bde40f987244baa8", - "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2f67a869aef3eecf42e7f8be4a8b86c92308686c", + "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c", "shasum": "" }, "require": { @@ -10601,11 +10601,11 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -10655,16 +10655,16 @@ }, { "name": "symfony/finder", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3" + "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3", + "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", + "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", "shasum": "" }, "require": { @@ -10700,20 +10700,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-02-14T07:42:58+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5" + "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", - "reference": "f3abd07a56111ebe6a1ad6f1cbc23e4f8983f8f5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4d440be93adcfd5e4ee0bdc7acd1c3260625728f", + "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f", "shasum": "" }, "require": { @@ -10754,20 +10754,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-06T08:18:51+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4" + "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", - "reference": "ea8af453ccf14e24a6cb2fcc3ece5814cbcc0ff4", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", + "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", "shasum": "" }, "require": { @@ -10844,7 +10844,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-21T12:29:51+00:00" + "time": "2020-02-29T10:16:41+00:00" }, { "name": "symfony/polyfill-ctype", @@ -11308,16 +11308,16 @@ }, { "name": "symfony/process", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a" + "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5b9d2bcffe4678911a4c941c00b7c161252cf09a", - "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a", + "url": "https://api.github.com/repos/symfony/process/zipball/b03b02dcea26ba4c65c16a73bab4f00c186b13da", + "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da", "shasum": "" }, "require": { @@ -11353,7 +11353,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -11422,16 +11422,16 @@ }, { "name": "symfony/routing", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa" + "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6366fbf86a05abccf77d6e605abbb0ee342f2cfa", - "reference": "6366fbf86a05abccf77d6e605abbb0ee342f2cfa", + "url": "https://api.github.com/repos/symfony/routing/zipball/c1377905edfa76e6934dd3c73f9a073305b47c00", + "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00", "shasum": "" }, "require": { @@ -11494,20 +11494,20 @@ "uri", "url" ], - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc" + "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/e85feee0d587c65713ec6d3e2a1d8782e6d219dc", - "reference": "e85feee0d587c65713ec6d3e2a1d8782e6d219dc", + "url": "https://api.github.com/repos/symfony/serializer/zipball/f8b99832d016e2d2c77c797c3df561adecd33dd3", + "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3", "shasum": "" }, "require": { @@ -11573,20 +11573,20 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-24T14:33:45+00:00" }, { "name": "symfony/translation", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf" + "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/577ec9ba1d6443947c48058acc3de298ad25e2bf", - "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf", + "url": "https://api.github.com/repos/symfony/translation/zipball/1eb074e0bd94939a30dd14dbecf7a92b165cea34", + "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34", "shasum": "" }, "require": { @@ -11643,20 +11643,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "time": "2020-02-04T07:22:30+00:00" }, { "name": "symfony/validator", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "46580e4429797438033fc1f226cb4cba67afe280" + "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/46580e4429797438033fc1f226cb4cba67afe280", - "reference": "46580e4429797438033fc1f226cb4cba67afe280", + "url": "https://api.github.com/repos/symfony/validator/zipball/b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", + "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", "shasum": "" }, "require": { @@ -11729,20 +11729,20 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2020-01-14T18:27:07+00:00" + "time": "2020-02-29T09:08:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6" + "reference": "2572839911702b0405479410ea7a1334bfab0b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96", + "reference": "2572839911702b0405479410ea7a1334bfab0b96", "shasum": "" }, "require": { @@ -11805,20 +11805,20 @@ "debug", "dump" ], - "time": "2020-01-25T12:44:29+00:00" + "time": "2020-02-24T13:10:00+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "aa46bc2233097d5212332c907f9911533acfbf80" + "reference": "bc63e15160866e8730a1f738541b194c401f72bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/aa46bc2233097d5212332c907f9911533acfbf80", - "reference": "aa46bc2233097d5212332c907f9911533acfbf80", + "url": "https://api.github.com/repos/symfony/yaml/zipball/bc63e15160866e8730a1f738541b194c401f72bf", + "reference": "bc63e15160866e8730a1f738541b194c401f72bf", "shasum": "" }, "require": { @@ -11864,7 +11864,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-13T08:00:59+00:00" + "time": "2020-01-16T19:04:26+00:00" }, { "name": "twig/twig", @@ -15823,7 +15823,7 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -15880,16 +15880,16 @@ }, { "name": "symfony/config", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4d3979f54472637169080f802dc82197e21fdcce" + "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4d3979f54472637169080f802dc82197e21fdcce", - "reference": "4d3979f54472637169080f802dc82197e21fdcce", + "url": "https://api.github.com/repos/symfony/config/zipball/cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", + "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", "shasum": "" }, "require": { @@ -15940,20 +15940,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-02-04T09:32:40+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.37", + "version": "v3.4.38", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5" + "reference": "ee9b946e7223b11257329a054c64396b19d619e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", - "reference": "e1b3e1a0621d6e48ee46092b4c7d8280f746b3c5", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee9b946e7223b11257329a054c64396b19d619e1", + "reference": "ee9b946e7223b11257329a054c64396b19d619e1", "shasum": "" }, "require": { @@ -15993,7 +15993,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "time": "2020-02-04T08:04:52+00:00" }, { "name": "symfony/dom-crawler", @@ -16058,23 +16058,23 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v4.4.4", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a" + "reference": "a270dbfe54994138a8037937fd5934827b8605bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/d592d89cd40a5948e949f25a30bcda5b28b2679a", - "reference": "d592d89cd40a5948e949f25a30bcda5b28b2679a", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/a270dbfe54994138a8037937fd5934827b8605bf", + "reference": "a270dbfe54994138a8037937fd5934827b8605bf", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -16119,7 +16119,7 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-01-31T09:56:34+00:00" + "time": "2020-02-24T14:58:55+00:00" }, { "name": "theseer/tokenizer", From 98e4c89942d30e7a8165b0afc988ddd6178060d1 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 16:30:03 +0200 Subject: [PATCH 148/957] ISAICP-5411: Include the new social_media_posting type and enable the module. --- composer.json | 3 +++ composer.lock | 11 +++++++++-- config/sync/core.extension.yml | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 21c980b460..43d409e63b 100644 --- a/composer.json +++ b/composer.json @@ -258,6 +258,9 @@ "drupal/rdf_entity": { "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...bd61c32c6f877f2c0376ec9aa213b89b6bcb19b8.diff" }, + "drupal/schema_metatag": { + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-03/social_media_posting.patch" + }, "drupal/search_api": { "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch", diff --git a/composer.lock b/composer.lock index 85301770a1..e83a8f9863 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": "edb37d668c69f7e79dc4792b54c288b7", + "content-hash": "95916278021b42d91d8c8920cb74086c", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -6270,6 +6270,9 @@ "status": "covered", "message": "Covered by Drupal's security advisory policy" } + }, + "patches_applied": { + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-03/social_media_posting.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -8143,7 +8146,7 @@ "reference": "master" }, "type": "drupal-theme-library", - "time": "2018-10-31T20:10:45+00:00" + "time": "2018-05-01T01:48:25+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -13669,6 +13672,10 @@ "name": "See contributors", "homepage": "https://www.drupal.org/node/3236/committers" }, + { + "name": "pcambra", + "homepage": "https://www.drupal.org/user/122101" + }, { "name": "salvis", "homepage": "https://www.drupal.org/user/82964" diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 3ad77d1c7c..d764cfb849 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -128,6 +128,7 @@ module: schema_article: 0 schema_event: 0 schema_metatag: 0 + schema_social_media_posting: 0 search_api: 0 search_api_arbitrary_facet: 0 search_api_db: 0 From 0c12591d972dfd868732be156db37844f97103e9 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 16:30:58 +0200 Subject: [PATCH 149/957] ISAICP-5411: Add the discussion metatag defaults and ensure that all files are loaded properly. --- ...atag.metatag_defaults.node__discussion.yml | 18 ++++++++ ...atag.metatag_defaults.node__discussion.yml | 17 ++++++++ .../custom/joinup_seo/joinup_seo.module | 41 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.node__discussion.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml diff --git a/config/sync/metatag.metatag_defaults.node__discussion.yml b/config/sync/metatag.metatag_defaults.node__discussion.yml new file mode 100644 index 0000000000..7585d29e98 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__discussion.yml @@ -0,0 +1,18 @@ +uuid: c440cbac-8226-4beb-8231-07b5c3eea705 +langcode: en +status: true +dependencies: { } +id: node__discussion +label: 'Content: Discussion' +tags: + schema_social_media_posting_name: '[node:title]' + schema_social_media_posting_about: '[node:field_keywords]' + schema_social_media_posting_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_date_modified: '[node:changed:html_datetime]' + schema_social_media_posting_main_entity_of_page: '[current-page:url]' + schema_social_media_posting_headline: '[node:title]' + schema_social_media_posting_description: '[node:summary]' + schema_social_media_posting_is_accessible_for_free: 'True' + schema_social_media_posting_date_published: '[node:published:html_datetime]' + schema_social_media_posting_type: DiscussionForumPosting + schema_social_media_posting_shared_content: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:38:"[node:field_attachment:entity:created:html_datetime]";}' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml new file mode 100644 index 0000000000..50a6abc863 --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml @@ -0,0 +1,17 @@ +langcode: en +status: true +dependencies: { } +id: node__discussion +label: 'Content: Discussion' +tags: + schema_social_media_posting_name: '[node:title]' + schema_social_media_posting_about: '[node:field_keywords]' + schema_social_media_posting_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_date_modified: '[node:changed:html_datetime]' + schema_social_media_posting_main_entity_of_page: '[current-page:url]' + schema_social_media_posting_headline: '[node:title]' + schema_social_media_posting_description: '[node:summary]' + schema_social_media_posting_is_accessible_for_free: 'True' + schema_social_media_posting_date_published: '[node:published:html_datetime]' + schema_social_media_posting_type: DiscussionForumPosting + schema_social_media_posting_shared_content: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:38:"[node:field_attachment:entity:created:html_datetime]";}' diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index aec14facf5..e1ce51a98f 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -21,3 +21,44 @@ function joinup_seo_simple_sitemap_sitemap_types_alter(array &$sitemap_types): v $sitemap_types['default_hreflang']['urlGenerators'][$index] = 'joinup_entity'; } } + +/** + * Implements hook_metatags_alter(). + * + * When a field contains multiple values, the normal way of adding one entry for + * each delta is to use the Pivot. Pivot will allow the field to be rendered as + * an array value objects instead of a single object. + * In order to render all deltas in the field, the tag tokens must include all + * deltas separated by comma, e.g. + * '[node:field_file:0:entity:url],[node:field_file:1:entity:url]' etc. + * When the field has unlimited cardinality though, it is impossible to do such + * a thing. Thus, dynamically change the metatags for the entity to include a + * specific number of tokens with delta that ensure that all values are + * rendered. + */ +function joinup_seo_metatags_alter(array &$metatags, array &$context) { + if (!isset($metatags['schema_social_media_posting_shared_content'])) { + return; + } + + $count = count($context['entity']->get('field_attachment')->getValue()); + if ($count === 1) { + return; + } + + $tags = unserialize($metatags['schema_social_media_posting_shared_content']); + $tag_list = [ + '@id' => 'entity:url', + 'name' => 'entity:name', + 'url' => 'entity:url', + 'datePublished' => 'entity:created:html_datetime', + ]; + foreach ($tag_list as $tag_name => $tag_suffix) { + $new_tags = []; + for ($i = 0; $i <= $count; $i++) { + $new_tags[] = "[node:field_attachment:{$i}:{$tag_suffix}]"; + } + $tags[$tag_name] = implode(',', $new_tags); + } + $metatags['schema_social_media_posting_shared_content'] = serialize($tags); +} From a504efe1ae4685e76af8705c999d8df76677a781 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 16:31:36 +0200 Subject: [PATCH 150/957] ISAICP-5411: Add a test for the discussion and update the required files with it. --- tests/features/joinup_seo/discussion.feature | 83 +++++++++++++++++++ .../custom/custom_page/custom_page.behat.inc | 25 ++---- .../custom/joinup_seo/joinup_seo.behat.inc | 12 ++- .../custom/joinup_seo/joinup_seo.info.yml | 1 + web/profiles/joinup/joinup.behat.inc | 20 ++++- 5 files changed, 122 insertions(+), 19 deletions(-) create mode 100644 tests/features/joinup_seo/discussion.feature diff --git a/tests/features/joinup_seo/discussion.feature b/tests/features/joinup_seo/discussion.feature new file mode 100644 index 0000000000..856a2ed966 --- /dev/null +++ b/tests/features/joinup_seo/discussion.feature @@ -0,0 +1,83 @@ +@api @group-a +Feature: SEO for discussion forum posts. + As an owner of the website + in order for my discussions to be better visible on the web + I need proper metatag to be encapsulated in the html code. + + Scenario: Basic metatags are attached as JSON schema on the page. + Given collections: + | title | state | + | Joinup SEO discussion collection | validated | + And users: + | Username | E-mail | First name | Family name | + | Joinup SEO author | joinup.seo@example.com | Kindle | eReader | + And "discussion" content: + | title | publication date | changed | content | author | attachments | keywords | state | collection | + | Discussions are now forum posts | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | This discussion is to ensure that SEO tags are set properly. | Joinup SEO author | test.zip, test1.zip | seo, tags, metatag, schema.org | validated | Joinup SEO discussion collection | + + When I visit the "Discussions are now forum posts" discussion + Then the metatag JSON should be attached in the page + And 1 metatag graph of type "DiscussionForumPosting" should exist in the page + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following properties: + | property | value | + | @type | DiscussionForumPosting | + | headline | Discussions are now forum posts | + | name | Discussions are now forum posts | + | description | This discussion is to ensure that SEO tags are set properly. | + | datePublished | 2019-12-25T13:00:00+0100 | + | isAccessibleForFree | True | + | dateModified | 2020-01-01T13:00:00+0100 | + | mainEntityOfPage | $base_url$/collection/joinup-seo-discussion-collection/discussion/discussions-are-now-forum-posts | + # Adding numerical property values is turning the "about" property into an array comparison. + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "about" properties: + | property | value | + | 0 | seo | + | 1 | tags | + | 2 | metatag | + | 3 | schema.org | + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "image" properties: + | property | value | + | @type | ImageObject | + # Discussions don't have an image field but an image is required by google. Add the Joinup logo as the image of + # all discussions. + | url | https://joinup.ec.europa.eu/sites/default/files/styles/image_style_collection_logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png | + # The index is the delta in the field attachment, with 0 meaning the first of the values. + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 0: + | property | value | + | @type | MediaObject | + # $random_text$ can be any string that is appointed by the system and we + # cannot predict. In this case it is the random file name suffix before the file extension. + | @id | $base_url$/sites/default/files/test$random_text$.zip | + | name | test.zip | + | url | $base_url$/sites/default/files/test$random_text$.zip | + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 1: + | property | value | + | @type | MediaObject | + # $random_text$ can be any string that is appointed by the system and we + # cannot predict. In this case it is the random file name suffix before the file extension. + | @id | $base_url$/sites/default/files/test$random_text$.zip | + | name | test1.zip | + | url | $base_url$/sites/default/files/test$random_text$.zip | + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "author" properties: + | property | value | + | @type | Person | + # The user id is only a number but we can be quite certain that this will be a url to the user since the + # $random_text$ does not include a / character. + | @id | $base_url$/user/$random_text$ | + | name | Kindle eReader | + | url | $base_url$/user/$random_text$ | + And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "publisher" properties: + | property | value | + | @type | Person | + # The user id is only a number but we can be quite certain that this will be a url to the user since the + # $random_text$ does not include a / character. + | @id | $base_url$/user/$random_text$ | + | name | Kindle eReader | + | url | $base_url$/user/$random_text$ | + + When I click "Keep up to date" + Then I should see the "Discussions are now forum posts" tile + # No metatags are defined for the keep up to date page. + # No metatags JSON in general means also that the entity metatags of the + # news item is also not attached when the tile is present. + And the metatag JSON should not be attached in the page diff --git a/web/modules/custom/custom_page/custom_page.behat.inc b/web/modules/custom/custom_page/custom_page.behat.inc index 7707f6f097..a64e2fc77d 100644 --- a/web/modules/custom/custom_page/custom_page.behat.inc +++ b/web/modules/custom/custom_page/custom_page.behat.inc @@ -55,23 +55,16 @@ class CustomPageSubContext extends DrupalSubContextBase implements DrupalSubCont return; } - // We want to copy it from the fixtures into the file system and register it - // in the CustomPageSubContext so it can be cleaned up after the scenario - // ends. Perform a small dance to get access to the context class from - // inside this static callback. - /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ - $environment = $scope->getEnvironment(); - /** @var \CustomPageSubContext $context */ - $context = $environment->getContext(self::class); - - if (!empty($node->attachments)) { - foreach ($context->explodeCommaSeparatedStepArgument($node->attachments) as $filename) { - /** @var \Drupal\file\FileInterface $file */ - $context->createFile($filename); - } - } - if (!empty($node->logo)) { + // We want to copy it from the fixtures into the file system and register + // it in the CustomPageSubContext so it can be cleaned up after the + // scenario ends. Perform a small dance to get access to the context class + // from inside this static callback. + /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ + $environment = $scope->getEnvironment(); + /** @var \CustomPageSubContext $context */ + $context = $environment->getContext(self::class); + /** @var \Drupal\file\FileInterface $file */ $file = $context->createFile($node->logo); $node->logo = $file->getFileUri(); diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index ba46aa67c9..e190b89000 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -94,6 +94,9 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * A table of properties for the given graph. * @param string|null $sub_property * A sub property to look into. + * @param int|null $delta + * If the field contains multiple values, i.e. the pivot is enabled, then + * use the $delta variable to check the specific delta. * * @throws \Exception * Thrown if the graph is not found in the page or the requested sub @@ -101,8 +104,10 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * * @Given the metatag (sub)graph of the item with :property :value should have the following properties: * @Given the metatag (sub)graph of the item with :property :value should have the following :sub_property properties: + * @Given the metatag (sub)graph of the item with :property :value should have the following properties in index :delta: + * @Given the metatag (sub)graph of the item with :property :value should have the following :sub_property properties in index :delta: */ - public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = NULL): void { + public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = NULL, $delta = NULL): void { $graphs = $this->getGraphsFromMetatags($property, $value, $sub_property); if (empty($graphs)) { throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}' or none of them contain a '{$sub_property}' property."); @@ -117,6 +122,9 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte $missing_properties = []; $wrong_value = []; foreach ($graphs as $index => $graph) { + if ($delta !== NULL) { + $graph = $graph[$delta]; + } $found = TRUE; foreach ($hash as $row) { if (!isset($graph[$row['property']])) { @@ -130,7 +138,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte $row['value'] = preg_quote($row['value'], '#'); // $random_text$ is escaped into \$random_text\$ from the preg_quote // above. - $row['value'] = str_replace('\$random_text\$', '(.*)?', $row['value']); + $row['value'] = str_replace('\$random_text\$', '([^/]*)?', $row['value']); $found = preg_match("#{$row['value']}#", $graph[$row['property']]) === 1; } else { diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index 40b8099907..e42a1aee65 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -14,6 +14,7 @@ config_devel: - metatag.metatag_defaults.front - metatag.metatag_defaults.global - metatag.metatag_defaults.node + - metatag.metatag_defaults.node__discussion - metatag.metatag_defaults.node__news - simple_sitemap.bundle_settings.default.node.custom_page - simple_sitemap.bundle_settings.default.node.discussion diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index a9bbb2a076..13ea2bcf5e 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -607,6 +607,22 @@ class JoinupSubContext extends DrupalSubContextBase { } } + if (!empty($node->field_attachment)) { + // We want to copy it from the fixtures into the file system and register + // it in the CustomPageSubContext so it can be cleaned up after the + // scenario ends. Perform a small dance to get access to the context class + // from inside this static callback. + /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ + $environment = $scope->getEnvironment(); + /** @var \CustomPageSubContext $context */ + $context = $environment->getContext(self::class); + foreach ($context->explodeCommaSeparatedStepArgument($node->field_attachment) as $filename) { + // The file is tracked by its filename so the value still remains to be + // the filenames instead of the url. + $context->createFile($filename); + } + } + // Replace collection and solution group references that use titles with the // actual URI. Note that this fails if a URI is supplied for a collection or // solution in a Behat test. This is by design, the URIs are not exposed to @@ -691,8 +707,11 @@ class JoinupSubContext extends DrupalSubContextBase { 'logo' => 'field_custom_page_logo', ], 'discussion' => [ + 'attachments' => 'field_attachment', 'content' => 'body', + 'keywords' => 'field_keywords', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'document' => [ 'document type' => 'field_type', @@ -721,7 +740,6 @@ class JoinupSubContext extends DrupalSubContextBase { 'headline' => 'field_news_headline', 'keywords' => 'field_keywords', 'logo' => 'field_news_logo', - 'publication date' => 'published_at', 'spatial coverage' => 'field_news_spatial_coverage', 'state' => 'field_state', 'publication date' => 'published_at', From f785be930d347b477f2fad5631ecf388e120c78a Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 22:31:25 +0200 Subject: [PATCH 151/957] ISAICP-5411: Use the correct datetime format for the news publication and modification dates. --- config/sync/metatag.metatag_defaults.node__news.yml | 4 ++-- tests/features/joinup_seo/news.feature | 4 ++-- .../config/install/metatag.metatag_defaults.node__news.yml | 4 ++-- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 6 +++++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml index def7d4ee9c..cba2c7c8d2 100644 --- a/config/sync/metatag.metatag_defaults.node__news.yml +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -10,9 +10,9 @@ tags: schema_article_main_entity_of_page: '[current-page:url]' schema_article_name: '[node:title]' schema_article_about: '[node:field_keywords]' - schema_article_date_published: '[node:published]' + schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' - schema_article_date_modified: '[node:changed]' + schema_article_date_modified: '[node:changed:html_datetime]' schema_article_publisher: 'a:4:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";s:4:"logo";a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:83:"https://joinup.ec.europa.eu/themes/joinup/images/favicon/apple-touch-icon-60x60.png";s:5:"width";s:2:"60";s:6:"height";s:2:"60";}}' schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index e59f48b570..32f92782d4 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -24,8 +24,8 @@ Feature: SEO for news articles. | headline | Headline of Joinup SEO news | # Summary is preferred over the body of the entity. | description | Summary of news. | - | datePublished | Wed, 25/12/2019 - 13:00 | - | dateModified | Wed, 01/01/2020 - 13:00 | + | datePublished | 2019-12-25T13:00:00+0100 | + | dateModified | 2020-01-01T13:00:00+0100 | # $base_url$ will be replaced with the base url of the website. | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "image" properties: diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml index e0fd1ab0fd..133cd29c31 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -9,9 +9,9 @@ tags: schema_article_main_entity_of_page: '[current-page:url]' schema_article_name: '[node:title]' schema_article_about: '[node:field_keywords]' - schema_article_date_published: '[node:published]' + schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' - schema_article_date_modified: '[node:changed]' + schema_article_date_modified: '[node:changed:html_datetime]' schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index e190b89000..a2fe192ecf 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -155,10 +155,14 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte } if ($found === TRUE) { - return; + break; } } + if (empty($wrong_value) && empty($missing_properties)) { + return; + } + // Construct the error messages for each graph found. $error_messages = []; foreach ($graphs as $index => $graph) { From f8191c7a148e66fb5d56e2437aeb001dc8581f80 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 22:36:31 +0200 Subject: [PATCH 152/957] ISAICP-5411: Fix the rest of the discussion tests. --- config/sync/metatag.metatag_defaults.node__discussion.yml | 4 +++- .../install/metatag.metatag_defaults.node__discussion.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__discussion.yml b/config/sync/metatag.metatag_defaults.node__discussion.yml index 7585d29e98..b89616fc5d 100644 --- a/config/sync/metatag.metatag_defaults.node__discussion.yml +++ b/config/sync/metatag.metatag_defaults.node__discussion.yml @@ -15,4 +15,6 @@ tags: schema_social_media_posting_is_accessible_for_free: 'True' schema_social_media_posting_date_published: '[node:published:html_datetime]' schema_social_media_posting_type: DiscussionForumPosting - schema_social_media_posting_shared_content: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:38:"[node:field_attachment:entity:created:html_datetime]";}' + schema_social_media_posting_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_image: 'a:2:{s:5:"@type";s:11:"ImageObject";s:3:"url";s:143:"https://joinup.ec.europa.eu/sites/default/files/styles/image_style_collection_logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png";}' + schema_social_media_posting_shared_content: 'a:6:{s:5:"pivot";s:1:"1";s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:52:"[node:field_attachment:entity:created:html_datetime]";}' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml index 50a6abc863..07de621e31 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__discussion.yml @@ -14,4 +14,6 @@ tags: schema_social_media_posting_is_accessible_for_free: 'True' schema_social_media_posting_date_published: '[node:published:html_datetime]' schema_social_media_posting_type: DiscussionForumPosting - schema_social_media_posting_shared_content: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:38:"[node:field_attachment:entity:created:html_datetime]";}' + schema_social_media_posting_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_image: 'a:2:{s:5:"@type";s:11:"ImageObject";s:3:"url";s:143:"https://joinup.ec.europa.eu/sites/default/files/styles/image_style_collection_logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png";}' + schema_social_media_posting_shared_content: 'a:6:{s:5:"pivot";s:1:"1";s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:52:"[node:field_attachment:entity:created:html_datetime]";}' From 414e8b1a7348e1c613457d909b801e4229439d10 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 22:43:26 +0200 Subject: [PATCH 153/957] ISAICP-5411: Standardize the news entity as well. Publisher is the author. --- .../metatag.metatag_defaults.node__news.yml | 5 +-- tests/features/joinup_seo/news.feature | 32 +++++++++++-------- .../metatag.metatag_defaults.node__news.yml | 5 +-- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml index cba2c7c8d2..2cfeba4cb5 100644 --- a/config/sync/metatag.metatag_defaults.node__news.yml +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -5,7 +5,8 @@ dependencies: { } id: node__news label: 'Content: News' tags: - schema_article_author: 'a:3:{s:5:"@type";s:6:"Person";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_is_accessible_for_free: 'True' schema_article_type: NewsArticle schema_article_main_entity_of_page: '[current-page:url]' schema_article_name: '[node:title]' @@ -13,6 +14,6 @@ tags: schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' schema_article_date_modified: '[node:changed:html_datetime]' - schema_article_publisher: 'a:4:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";s:4:"logo";a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:83:"https://joinup.ec.europa.eu/themes/joinup/images/favicon/apple-touch-icon-60x60.png";s:5:"width";s:2:"60";s:6:"height";s:2:"60";}}' + schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 32f92782d4..6c25f38906 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -19,15 +19,16 @@ Feature: SEO for news articles. Then the metatag JSON should be attached in the page And 1 metatag graph of type "NewsArticle" should exist in the page And the metatag graph of the item with "name" "Joinup SEO news" should have the following properties: - | property | value | - | @type | NewsArticle | - | headline | Headline of Joinup SEO news | + | property | value | + | @type | NewsArticle | + | headline | Headline of Joinup SEO news | # Summary is preferred over the body of the entity. - | description | Summary of news. | - | datePublished | 2019-12-25T13:00:00+0100 | - | dateModified | 2020-01-01T13:00:00+0100 | + | description | Summary of news. | + | isAccessibleForFree | True | + | datePublished | 2019-12-25T13:00:00+0100 | + | dateModified | 2020-01-01T13:00:00+0100 | # $base_url$ will be replaced with the base url of the website. - | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | + | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "image" properties: | property | value | | @type | ImageObject | @@ -38,14 +39,17 @@ Feature: SEO for news articles. | width | 377 | | height | 139 | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "author" properties: - | property | value | - | @type | Person | - | name | Kurk Smith | + | property | value | + | @type | Person | + | @id | $base_url$/user/$random_text$ | + | name | Kurk Smith | + | url | $base_url$/user/$random_text$ | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "publisher" properties: - | property | value | - | @type | Organization | - | name | Joinup | - | url | $base_url$/ | + | property | value | + | @type | Person | + | @id | $base_url$/user/$random_text$ | + | name | Kurk Smith | + | url | $base_url$/user/$random_text$ | When I click "Keep up to date" Then I should see the "Joinup SEO news" tile diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml index 133cd29c31..6778a3f932 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -4,7 +4,8 @@ dependencies: { } id: node__news label: 'Content: News' tags: - schema_article_author: 'a:3:{s:5:"@type";s:6:"Person";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_is_accessible_for_free: 'True' schema_article_type: NewsArticle schema_article_main_entity_of_page: '[current-page:url]' schema_article_name: '[node:title]' @@ -12,6 +13,6 @@ tags: schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' schema_article_date_modified: '[node:changed:html_datetime]' - schema_article_publisher: 'a:3:{s:5:"@type";s:12:"Organization";s:4:"name";s:11:"[site:name]";s:3:"url";s:10:"[site:url]";}' + schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' schema_article_description: '[node:summary]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' From b5ac5a1d10f700a8562fdce5f1d117c3acd512dd Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 3 Mar 2020 23:38:16 +0200 Subject: [PATCH 154/957] ISAICP-5411: Fix a failure caused by timezone differences. --- tests/features/joinup_seo/event.feature | 18 ++++++++++-------- .../custom/joinup_seo/joinup_seo.behat.inc | 3 ++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index ff6325b2be..5e26892cbc 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -19,21 +19,23 @@ Feature: SEO for news articles. Then the metatag JSON should be attached in the page And 1 metatag graph of type "Event" should exist in the page And the metatag graph of the item with "name" "Joinup SEO event" should have the following properties: - | property | value | - | @type | Event | - | name | Joinup SEO event | + | property | value | + | @type | Event | + | name | Joinup SEO event | # Though it would be nice to have this to the Joinup URL, Search Engines # expect this to be the URL of the event. If a website is provided, then # that means that the entity in Joinup is simply a promotion, and all the # handling of registrations etc, already has a website, thus we point to # that location. - | url | | + | url | | # Summary is preferred over the body of the entity. - | description | Summary of event. | - | startDate | 2019-12-25T15:00:00+0100 | - | endDate | 2020-01-01T15:00:00+0100 | + | description | Summary of event. | + # The $timezone$ variable will allow any 2-digit number in the string. This is because of different timezones in + # different environments. + | startDate | 2019-12-25T$timezone$:00:00+0100 | + | endDate | 2020-01-01T$timezone$:00:00+0100 | # $base_url$ will be replaced with the base url of the website. - | @id | | + | @id | | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: | property | value | | @type | ImageObject | diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index a2fe192ecf..773151f0ee 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -134,11 +134,12 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte } $row['value'] = str_replace('$base_url$', $base_url, $row['value']); - if (strpos($row['value'], '$random_text$')) { + if (strpos($row['value'], '$random_text$') || strpos($row['value'], '$timezone$')) { $row['value'] = preg_quote($row['value'], '#'); // $random_text$ is escaped into \$random_text\$ from the preg_quote // above. $row['value'] = str_replace('\$random_text\$', '([^/]*)?', $row['value']); + $row['value'] = str_replace('\$timezone\$', '\d{2}', $row['value']); $found = preg_match("#{$row['value']}#", $graph[$row['property']]) === 1; } else { From 3ae214d811f3737e313d53cdf688eb9d12cc99f2 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 4 Mar 2020 14:02:25 +0100 Subject: [PATCH 155/957] ISAICP-5833: New build with config_ignore. --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 9f6fab78f7..5b9374bcd0 100644 --- a/composer.lock +++ b/composer.lock @@ -2937,7 +2937,7 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/config_ignore.git", - "reference": "498063a9781f3b9ee42ee06909bfca8da9989b0d" + "reference": "1c179cb78ce963978c8e24b3a3a09b1294a17483" }, "require": { "drupal/core": "^8.8 || ^9", @@ -2953,7 +2953,7 @@ }, "drupal": { "version": "8.x-3.x-dev", - "datestamp": "1583006472", + "datestamp": "1583009151", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." @@ -2988,7 +2988,7 @@ "issues": "http://drupal.org/project/config_ignore", "irc": "irc://irc.freenode.org/drupal-contribute" }, - "time": "2020-02-29T20:45:27+00:00" + "time": "2020-03-04T08:40:31+00:00" }, { "name": "drupal/config_readonly", @@ -10121,7 +10121,7 @@ "reference": "master" }, "type": "library", - "time": "2020-02-13T14:54:04+00:00" + "time": "2019-03-13T23:53:42+00:00" }, { "name": "stack/builder", From a7491c3cd7089c87c89003a2ac8dfce27f04124e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 4 Mar 2020 14:09:58 +0100 Subject: [PATCH 156/957] ISAICP-5833: Remove Display Suite codebase. --- composer.json | 1 - composer.lock | 75 +-------------------------------------------------- 2 files changed, 1 insertion(+), 75 deletions(-) diff --git a/composer.json b/composer.json index a251abafbf..06400c1e80 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,6 @@ "drupal/core-composer-scaffold": "^8.8.1", "drupal/diff": "~1.0", "drupal/digital_size_formatter": "^1.0-alpha1", - "drupal/ds": "^3.5", "drupal/editor_file": "~1.4", "drupal/email_registration": "^1.0", "drupal/embed_block": "^1.0", diff --git a/composer.lock b/composer.lock index 5b9374bcd0..728c22861d 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": "68d3f09da981c78f3e3e3c81d30f35d4", + "content-hash": "a34294014b12a54e72285f5b5a7e853c", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -3686,79 +3686,6 @@ "irc": "irc://irc.freenode.org/drupal-contribute" } }, - { - "name": "drupal/ds", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://git.drupalcode.org/project/ds.git", - "reference": "8.x-3.5" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/ds-8.x-3.5.zip", - "reference": "8.x-3.5", - "shasum": "089c475534e64829d87fe3b34eca5f25654ea7bf" - }, - "require": { - "drupal/core": "^8.6" - }, - "require-dev": { - "drupal/devel": "*", - "drupal/field_group": "*" - }, - "type": "drupal-module", - "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev" - }, - "drupal": { - "version": "8.x-3.5", - "datestamp": "1574750285", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" - } - } - }, - "notification-url": "https://packages.drupal.org/8/downloads", - "license": [ - "GPL-2.0+" - ], - "authors": [ - { - "name": "Bram Goffings", - "homepage": "https://www.drupal.org/user/172527", - "role": "Maintainer" - }, - { - "name": "Kristof De Jaeger", - "homepage": "http://realize.be/", - "role": "Maintainer" - }, - { - "name": "Brecht Ceyssens", - "homepage": "https://www.drupal.org/user/591438", - "role": "Maintainer" - }, - { - "name": "swentel", - "homepage": "https://www.drupal.org/user/107403" - } - ], - "description": "Extend the display options for every entity type.", - "homepage": "https://www.drupal.org/project/ds", - "keywords": [ - "drupal", - "layout", - "php" - ], - "support": { - "source": "http://git.drupal.org/project/ds.git", - "issues": "https://www.drupal.org/project/issues/ds", - "irc": "irc://irc.freenode.org/drupal-contribute" - } - }, { "name": "drupal/dynamic_entity_reference", "version": "2.0.0-alpha11", From 379762d96d4d5367c297b34bb2c351eeae4d7e84 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 4 Mar 2020 15:22:35 +0100 Subject: [PATCH 157/957] ISAICP-5833: Cleanup some merge confilicts that added back DS. --- .../tests/src/Kernel/RdfEntityValidationTestBase.php | 1 - .../core.entity_view_display.node.event.default.yml | 8 -------- 2 files changed, 9 deletions(-) diff --git a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php index 13368b77eb..0f1ce7fce8 100644 --- a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php @@ -16,7 +16,6 @@ abstract class RdfEntityValidationTestBase extends JoinupKernelTestBase { 'allowed_formats', 'cached_computed_field', 'comment', - 'ds', 'image', 'joinup_core', 'link', diff --git a/web/modules/custom/joinup_event/config/install/core.entity_view_display.node.event.default.yml b/web/modules/custom/joinup_event/config/install/core.entity_view_display.node.event.default.yml index 2eacfddc09..87095ec64c 100644 --- a/web/modules/custom/joinup_event/config/install/core.entity_view_display.node.event.default.yml +++ b/web/modules/custom/joinup_event/config/install/core.entity_view_display.node.event.default.yml @@ -82,14 +82,6 @@ content: label: above settings: { } third_party_settings: - ds: - ds_limit: '' - ft: - id: default - settings: - lb: '' - lb-col: true - classes: { } joinup: template_suggestion: fieldset type: basic_string From 39069eb292c7aedcc9285829e3719d3241c322d3 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 12:11:13 +0200 Subject: [PATCH 158/957] ISAICP-5671: Rename eLibrary creation options to content creation options. This class also belongs in the joinup_group module since it is used both by collections and solutions. --- .../custom/collection/collection.module | 22 ++++++------- .../src/ELibraryCreationOptions.php | 31 ------------------- .../src/ExistingSite/NodeWorkflowTestBase.php | 30 +++++++++--------- .../src/ContentCreationOptions.php | 27 ++++++++++++++++ 4 files changed, 53 insertions(+), 57 deletions(-) delete mode 100644 web/modules/custom/joinup_core/src/ELibraryCreationOptions.php create mode 100644 web/modules/custom/joinup_group/src/ContentCreationOptions.php diff --git a/web/modules/custom/collection/collection.module b/web/modules/custom/collection/collection.module index 2eff224d80..7bf6a845c9 100644 --- a/web/modules/custom/collection/collection.module +++ b/web/modules/custom/collection/collection.module @@ -18,7 +18,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\Session\AccountInterface; use Drupal\field\Entity\FieldStorageConfig; -use Drupal\joinup_core\ELibraryCreationOptions; +use Drupal\joinup_group\ContentCreationOptions; use Drupal\node\NodeInterface; use Drupal\og\Entity\OgRole; use Drupal\og\Og; @@ -114,14 +114,14 @@ function collection_form_rdf_entity_form_alter(&$form, FormStateInterface $form_ // In open collections content can be made by members (option 1) and // authenticated users (option 2). 0 => [ - ELibraryCreationOptions::MEMBERS => ELibraryCreationOptions::MEMBERS, - ELibraryCreationOptions::REGISTERED_USERS => ELibraryCreationOptions::REGISTERED_USERS, + ContentCreationOptions::MEMBERS => ContentCreationOptions::MEMBERS, + ContentCreationOptions::REGISTERED_USERS => ContentCreationOptions::REGISTERED_USERS, ], // In closed collections content can be made by facilitators (option 0) and // members (option 1). 1 => [ - ELibraryCreationOptions::FACILITATORS => ELibraryCreationOptions::FACILITATORS, - ELibraryCreationOptions::MEMBERS => ELibraryCreationOptions::MEMBERS, + ContentCreationOptions::FACILITATORS => ContentCreationOptions::FACILITATORS, + ContentCreationOptions::MEMBERS => ContentCreationOptions::MEMBERS, ], ]; // Take the options as defined in the field storage, and filter them using the @@ -130,11 +130,11 @@ function collection_form_rdf_entity_form_alter(&$form, FormStateInterface $form_ // According to specification, the 'member' option (option 1) should always // appear as the first option, at the left. - if (array_key_exists(ELibraryCreationOptions::MEMBERS, $elibrary_creation_options)) { + if (array_key_exists(ContentCreationOptions::MEMBERS, $elibrary_creation_options)) { // Since this is a numerically ordered array we cannot use array_unshift(). - $member_options = $elibrary_creation_options[ELibraryCreationOptions::MEMBERS]; - unset($elibrary_creation_options[ELibraryCreationOptions::MEMBERS]); - $elibrary_creation_options = [ELibraryCreationOptions::MEMBERS => $member_options] + $elibrary_creation_options; + $member_options = $elibrary_creation_options[ContentCreationOptions::MEMBERS]; + unset($elibrary_creation_options[ContentCreationOptions::MEMBERS]); + $elibrary_creation_options = [ContentCreationOptions::MEMBERS => $member_options] + $elibrary_creation_options; } // Define the option that should be taken in case the originally selected @@ -144,10 +144,10 @@ function collection_form_rdf_entity_form_alter(&$form, FormStateInterface $form_ $option_transitions = [ // If the option 'Only collection facilitators' was selected before, then // take the option 'Only members'. - ELibraryCreationOptions::FACILITATORS => ELibraryCreationOptions::MEMBERS, + ContentCreationOptions::FACILITATORS => ContentCreationOptions::MEMBERS, // If the option 'Any registered user' was selected before, then take the // option 'Only members'. - ELibraryCreationOptions::REGISTERED_USERS => ELibraryCreationOptions::MEMBERS, + ContentCreationOptions::REGISTERED_USERS => ContentCreationOptions::MEMBERS, ]; $elibrary_creation_default_value = array_key_exists($elibrary, $elibrary_creation_options) ? $elibrary : $option_transitions[$elibrary]; diff --git a/web/modules/custom/joinup_core/src/ELibraryCreationOptions.php b/web/modules/custom/joinup_core/src/ELibraryCreationOptions.php deleted file mode 100644 index 90341548f9..0000000000 --- a/web/modules/custom/joinup_core/src/ELibraryCreationOptions.php +++ /dev/null @@ -1,31 +0,0 @@ - [ self::PRE_MODERATION => [ - ELibraryCreationOptions::FACILITATORS => [ + ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', 'proposed', @@ -319,7 +319,7 @@ protected function createAccessProvider(): array { 'validated', ], ], - ELibraryCreationOptions::MEMBERS => [ + ContentCreationOptions::MEMBERS => [ 'userModerator' => [ 'draft', 'proposed', @@ -339,7 +339,7 @@ protected function createAccessProvider(): array { 'proposed', ], ], - ELibraryCreationOptions::REGISTERED_USERS => [ + ContentCreationOptions::REGISTERED_USERS => [ 'userAuthenticated' => [ 'draft', 'proposed', @@ -365,7 +365,7 @@ protected function createAccessProvider(): array { ], ], self::POST_MODERATION => [ - ELibraryCreationOptions::FACILITATORS => [ + ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', 'validated', @@ -375,7 +375,7 @@ protected function createAccessProvider(): array { 'validated', ], ], - ELibraryCreationOptions::MEMBERS => [ + ContentCreationOptions::MEMBERS => [ 'userModerator' => [ 'draft', 'validated', @@ -393,7 +393,7 @@ protected function createAccessProvider(): array { 'validated', ], ], - ELibraryCreationOptions::REGISTERED_USERS => [ + ContentCreationOptions::REGISTERED_USERS => [ 'userAuthenticated' => [ 'draft', 'validated', @@ -419,7 +419,7 @@ protected function createAccessProvider(): array { ], 'solution' => [ self::PRE_MODERATION => [ - ELibraryCreationOptions::FACILITATORS => [ + ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', 'proposed', @@ -431,7 +431,7 @@ protected function createAccessProvider(): array { 'validated', ], ], - ELibraryCreationOptions::REGISTERED_USERS => [ + ContentCreationOptions::REGISTERED_USERS => [ 'userAuthenticated' => [ 'draft', 'proposed', @@ -457,7 +457,7 @@ protected function createAccessProvider(): array { ], ], self::POST_MODERATION => [ - ELibraryCreationOptions::FACILITATORS => [ + ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', 'validated', @@ -467,7 +467,7 @@ protected function createAccessProvider(): array { 'validated', ], ], - ELibraryCreationOptions::REGISTERED_USERS => [ + ContentCreationOptions::REGISTERED_USERS => [ 'userAuthenticated' => [ 'draft', 'validated', @@ -1000,7 +1000,7 @@ protected function createParent($bundle, $state = 'validated', $moderation = NUL 'rid' => $bundle, $field_identifier[$bundle] . 'state' => $state, $field_identifier[$bundle] . 'moderation' => $moderation, - $field_identifier[$bundle] . 'elibrary_creation' => $e_library === NULL ? ELibraryCreationOptions::REGISTERED_USERS : $e_library, + $field_identifier[$bundle] . 'elibrary_creation' => $e_library === NULL ? ContentCreationOptions::REGISTERED_USERS : $e_library, ]; // It's not possible to create orphan solutions. @@ -1040,9 +1040,9 @@ protected function getEntityType(): string { */ protected function getElibraryStates(): array { return [ - ELibraryCreationOptions::FACILITATORS, - ELibraryCreationOptions::MEMBERS, - ELibraryCreationOptions::REGISTERED_USERS, + ContentCreationOptions::FACILITATORS, + ContentCreationOptions::MEMBERS, + ContentCreationOptions::REGISTERED_USERS, ]; } diff --git a/web/modules/custom/joinup_group/src/ContentCreationOptions.php b/web/modules/custom/joinup_group/src/ContentCreationOptions.php new file mode 100644 index 0000000000..fc2949b558 --- /dev/null +++ b/web/modules/custom/joinup_group/src/ContentCreationOptions.php @@ -0,0 +1,27 @@ + Date: Wed, 4 Mar 2020 14:59:18 +0200 Subject: [PATCH 159/957] ISAICP-5671: Replace existing 'Closed collection' and 'eLibrary creation' options with the new, unified 'Content creation' option in the collection UI. --- ..._display.rdf_entity.collection.default.yml | 29 +++++++------- ..._display.rdf_entity.collection.propose.yml | 35 ++++++++--------- ...ew_display.rdf_entity.collection.about.yml | 36 ++++++----------- ..._display.rdf_entity.collection.compact.yml | 2 + ..._display.rdf_entity.collection.default.yml | 2 + ...ntity.collection.digest_message_header.yml | 2 + ...lay.rdf_entity.collection.group_header.yml | 2 + ...isplay.rdf_entity.collection.rdf_draft.yml | 39 ++++++++----------- ...f_entity.collection.view_mode_featured.yml | 2 + ...y.rdf_entity.collection.view_mode_tile.yml | 2 + ...y.collection.field_ar_content_creation.yml | 23 +++++++++++ ...e.rdf_entity.field_ar_content_creation.yml | 37 ++++++++++++++++++ .../custom/collection/collection.info.yml | 2 + ..._display.rdf_entity.collection.default.yml | 29 +++++++------- ...ew_display.rdf_entity.collection.about.yml | 37 +++++++----------- ..._display.rdf_entity.collection.compact.yml | 3 ++ ..._display.rdf_entity.collection.default.yml | 3 ++ ...lay.rdf_entity.collection.group_header.yml | 3 ++ ...isplay.rdf_entity.collection.rdf_draft.yml | 39 ++++++++----------- ...f_entity.collection.view_mode_featured.yml | 5 +++ ...y.rdf_entity.collection.view_mode_tile.yml | 5 +++ 21 files changed, 192 insertions(+), 145 deletions(-) create mode 100644 config/sync/field.field.rdf_entity.collection.field_ar_content_creation.yml create mode 100644 config/sync/field.storage.rdf_entity.field_ar_content_creation.yml diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml index 31ae297b1e..0c4b7eccc2 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -76,8 +77,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage - - field_ar_closed - - field_ar_elibrary_creation + - field_ar_content_creation - field_ar_moderation - field_newsletter parent_name: group_general @@ -132,13 +132,6 @@ content: third_party_settings: { } type: image_image region: content - field_ar_closed: - weight: 16 - settings: - display_label: false - third_party_settings: { } - type: boolean_checkbox - region: content field_ar_contact_information: weight: 5 settings: @@ -152,9 +145,16 @@ content: collapsed: false allow_existing: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content + field_ar_content_creation: + weight: 17 + settings: { } + third_party_settings: { } + type: options_buttons + region: content field_ar_description: weight: 2 settings: @@ -166,12 +166,6 @@ content: hide_guidelines: '1' type: text_textarea region: content - field_ar_elibrary_creation: - weight: 17 - settings: { } - third_party_settings: { } - type: options_buttons - region: content field_ar_logo: weight: 12 settings: @@ -200,6 +194,7 @@ content: collapsible: false collapsed: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content @@ -230,7 +225,7 @@ content: type: options_select region: content field_spatial_coverage: - weight: 15 + weight: 14 settings: match_operator: CONTAINS size: 60 @@ -255,6 +250,8 @@ content: hidden: created: true field_ar_affiliates: true + field_ar_closed: true + field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true langcode: true diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml index 648520dc38..6f8a497741 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml @@ -11,6 +11,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -74,8 +75,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage - - field_ar_closed - - field_ar_elibrary_creation + - field_ar_content_creation - field_ar_moderation parent_name: group_general weight: 6 @@ -122,13 +122,6 @@ content: preview_image_style: thumbnail third_party_settings: { } region: content - field_ar_closed: - weight: 16 - settings: - display_label: false - third_party_settings: { } - type: boolean_checkbox - region: content field_ar_contact_information: weight: 4 settings: @@ -142,9 +135,16 @@ content: collapsed: false allow_existing: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content + field_ar_content_creation: + type: options_buttons + weight: 16 + region: content + settings: { } + third_party_settings: { } field_ar_description: weight: 1 settings: @@ -156,12 +156,6 @@ content: hide_guidelines: '1' type: text_textarea region: content - field_ar_elibrary_creation: - weight: 17 - settings: { } - third_party_settings: { } - type: options_buttons - region: content field_ar_logo: weight: 11 settings: @@ -171,7 +165,7 @@ content: type: image_image region: content field_ar_moderation: - weight: 18 + weight: 17 settings: display_label: false third_party_settings: { } @@ -190,12 +184,13 @@ content: collapsible: false collapsed: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content field_ar_state: type: state_machine_buttons - weight: 4 + weight: 3 settings: use_transition_label: 1 third_party_settings: { } @@ -207,7 +202,7 @@ content: type: options_select region: content field_spatial_coverage: - weight: 15 + weight: 13 settings: match_operator: CONTAINS size: 60 @@ -237,7 +232,7 @@ content: settings: { } third_party_settings: { } translation: - weight: 3 + weight: 2 region: content settings: { } third_party_settings: { } @@ -245,6 +240,8 @@ hidden: created: true current_workflow_state: true field_ar_affiliates: true + field_ar_closed: true + field_ar_elibrary_creation: true field_collection_content: true field_newsletter: true field_site_featured: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml index 2cae4eeb5f..2ccf6841b4 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -34,8 +35,7 @@ third_party_settings: field_group: group_moderation: children: - - field_ar_closed - - field_ar_elibrary_creation + - field_ar_content_creation - field_ar_moderation parent_name: '' weight: 4 @@ -95,18 +95,6 @@ content: template_suggestion: fieldset type: link region: content - field_ar_closed: - weight: 6 - label: hidden - settings: - format: default - format_custom_true: '' - format_custom_false: '' - third_party_settings: - joinup: - template_suggestion: fieldset - type: boolean - region: content field_ar_contact_information: weight: 5 label: above @@ -118,6 +106,13 @@ content: template_suggestion: two_columns type: entity_reference_entity_view region: content + field_ar_content_creation: + type: list_default + weight: 8 + region: content + label: hidden + settings: { } + third_party_settings: { } field_ar_description: weight: 1 label: hidden @@ -125,17 +120,8 @@ content: third_party_settings: { } type: text_default region: content - field_ar_elibrary_creation: - weight: 7 - label: hidden - settings: { } - third_party_settings: - joinup: - template_suggestion: fieldset - type: list_default - region: content field_ar_moderation: - weight: 8 + weight: 9 label: hidden settings: format: default @@ -162,6 +148,8 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true + field_ar_closed: true + field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml index e78ed84a39..182d9af26c 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -63,6 +64,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml index 28dcbcb8f4..e22b00984c 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -134,6 +135,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml index 0a19f2560e..804d70fbe4 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -50,6 +51,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_logo: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml index e44ec50ed7..3a08523b7e 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -102,6 +103,7 @@ hidden: field_ar_affiliates: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index bd1681c4ee..c04a210edf 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -34,7 +35,7 @@ bundle: collection mode: rdf_draft content: field_ar_abstract: - weight: 9 + weight: 7 label: above settings: { } third_party_settings: { } @@ -52,40 +53,30 @@ content: third_party_settings: { } type: link region: content - field_ar_closed: - weight: 10 - label: above - settings: - format: default - format_custom_false: '' - format_custom_true: '' - third_party_settings: { } - type: boolean - region: content field_ar_contact_information: - weight: 4 + weight: 3 label: above settings: link: true third_party_settings: { } type: entity_reference_label region: content - field_ar_description: - weight: 1 + field_ar_content_creation: + type: list_default + weight: 8 + region: content label: above settings: { } third_party_settings: { } - type: text_default - region: content - field_ar_elibrary_creation: - weight: 11 + field_ar_description: + weight: 1 label: above settings: { } third_party_settings: { } - type: list_default + type: text_default region: content field_ar_moderation: - weight: 12 + weight: 9 label: above settings: format: default @@ -95,7 +86,7 @@ content: type: boolean region: content field_ar_owner: - weight: 5 + weight: 4 label: above settings: link: true @@ -103,7 +94,7 @@ content: type: entity_reference_label region: content field_policy_domain: - weight: 6 + weight: 5 label: above settings: link: true @@ -111,7 +102,7 @@ content: type: entity_reference_label region: content field_spatial_coverage: - weight: 7 + weight: 6 label: above settings: link: true @@ -131,6 +122,8 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true + field_ar_closed: true + field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml index abc84b30db..3ee5cb2980 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -84,6 +85,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml index 5d1c90f1a0..dd21694069 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml @@ -10,6 +10,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -84,6 +85,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/config/sync/field.field.rdf_entity.collection.field_ar_content_creation.yml b/config/sync/field.field.rdf_entity.collection.field_ar_content_creation.yml new file mode 100644 index 0000000000..f20e95ea24 --- /dev/null +++ b/config/sync/field.field.rdf_entity.collection.field_ar_content_creation.yml @@ -0,0 +1,23 @@ +uuid: 16731a50-0e01-4fae-83c6-fc9fef12a64b +langcode: en +status: true +dependencies: + config: + - field.storage.rdf_entity.field_ar_content_creation + - rdf_entity.rdfentity.collection + module: + - options +id: rdf_entity.collection.field_ar_content_creation +field_name: field_ar_content_creation +entity_type: rdf_entity +bundle: collection +label: 'Content creation' +description: 'Choose which users can create content (news, events, discussions and documents) in the collection.' +required: true +translatable: false +default_value: + - + value: only_members +default_value_callback: '' +settings: { } +field_type: list_string diff --git a/config/sync/field.storage.rdf_entity.field_ar_content_creation.yml b/config/sync/field.storage.rdf_entity.field_ar_content_creation.yml new file mode 100644 index 0000000000..1fbebc139e --- /dev/null +++ b/config/sync/field.storage.rdf_entity.field_ar_content_creation.yml @@ -0,0 +1,37 @@ +uuid: f6bcedca-713c-4105-9613-eeb15efa7d15 +langcode: en +status: true +dependencies: + module: + - options + - rdf_entity + - sparql_entity_storage +third_party_settings: + sparql_entity_storage: + mapping: + value: + predicate: 'http://joinup.eu/collection/content_creation' + format: literal +id: rdf_entity.field_ar_content_creation +field_name: field_ar_content_creation +entity_type: rdf_entity +type: list_string +settings: + allowed_values: + - + value: any_user + label: 'Any user can create content.' + - + value: only_members + label: 'Only members can create content.' + - + value: only_facilitators + label: 'Only facilitators can create content.' + allowed_values_function: '' +module: options +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/web/modules/custom/collection/collection.info.yml b/web/modules/custom/collection/collection.info.yml index 6db8752392..c49fa7655c 100644 --- a/web/modules/custom/collection/collection.info.yml +++ b/web/modules/custom/collection/collection.info.yml @@ -47,6 +47,7 @@ config_devel: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -65,6 +66,7 @@ config_devel: - field.storage.rdf_entity.field_ar_banner - field.storage.rdf_entity.field_ar_closed - field.storage.rdf_entity.field_ar_contact_information + - field.storage.rdf_entity.field_ar_content_creation - field.storage.rdf_entity.field_ar_description - field.storage.rdf_entity.field_ar_elibrary_creation - field.storage.rdf_entity.field_ar_logo diff --git a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml index a100fcba4b..496bbb57b8 100644 --- a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml +++ b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -75,8 +76,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage - - field_ar_closed - - field_ar_elibrary_creation + - field_ar_content_creation - field_ar_moderation - field_newsletter parent_name: group_general @@ -131,13 +131,6 @@ content: third_party_settings: { } type: image_image region: content - field_ar_closed: - weight: 16 - settings: - display_label: false - third_party_settings: { } - type: boolean_checkbox - region: content field_ar_contact_information: weight: 5 settings: @@ -151,9 +144,16 @@ content: collapsed: false allow_existing: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content + field_ar_content_creation: + weight: 17 + settings: { } + third_party_settings: { } + type: options_buttons + region: content field_ar_description: weight: 2 settings: @@ -165,12 +165,6 @@ content: hide_guidelines: '1' type: text_textarea region: content - field_ar_elibrary_creation: - weight: 17 - settings: { } - third_party_settings: { } - type: options_select - region: content field_ar_logo: weight: 12 settings: @@ -199,6 +193,7 @@ content: collapsible: false collapsed: false allow_duplicate: false + revision: false third_party_settings: { } type: inline_entity_form_complex region: content @@ -229,7 +224,7 @@ content: type: options_select region: content field_spatial_coverage: - weight: 15 + weight: 14 settings: match_operator: CONTAINS size: 60 @@ -254,6 +249,8 @@ content: hidden: created: true field_ar_affiliates: true + field_ar_closed: true + field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true langcode: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml index 822f200210..4c2596eb48 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -24,6 +25,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - field_group + - joinup - link - options - text @@ -32,8 +34,7 @@ third_party_settings: field_group: group_moderation: children: - - field_ar_closed - - field_ar_elibrary_creation + - field_ar_content_creation - field_ar_moderation parent_name: '' weight: 4 @@ -93,18 +94,6 @@ content: template_suggestion: fieldset type: link region: content - field_ar_closed: - weight: 6 - label: hidden - settings: - format: default - format_custom_true: '' - format_custom_false: '' - third_party_settings: - joinup: - template_suggestion: fieldset - type: boolean - region: content field_ar_contact_information: weight: 5 label: above @@ -116,6 +105,13 @@ content: template_suggestion: two_columns type: entity_reference_entity_view region: content + field_ar_content_creation: + type: list_default + weight: 8 + region: content + label: hidden + settings: { } + third_party_settings: { } field_ar_description: weight: 1 label: hidden @@ -123,17 +119,8 @@ content: third_party_settings: { } type: text_default region: content - field_ar_elibrary_creation: - weight: 7 - label: hidden - settings: { } - third_party_settings: - joinup: - template_suggestion: fieldset - type: list_default - region: content field_ar_moderation: - weight: 8 + weight: 9 label: hidden settings: format: default @@ -160,6 +147,8 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true + field_ar_closed: true + field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml index afc006d53c..8f7ad7421b 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -25,6 +26,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - image + - joinup - user id: rdf_entity.collection.compact targetEntityType: rdf_entity @@ -61,6 +63,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml index 172c6eb313..311faf0094 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml @@ -8,6 +8,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -23,6 +24,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - field_group + - joinup - search_api_field - smart_trim - user @@ -132,6 +134,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml index 8893b35995..17af8ed124 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -26,6 +27,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - image + - joinup - joinup_core - user id: rdf_entity.collection.group_header @@ -100,6 +102,7 @@ hidden: field_ar_affiliates: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index f48fafa058..248ef52b4e 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -33,7 +34,7 @@ bundle: collection mode: rdf_draft content: field_ar_abstract: - weight: 9 + weight: 7 label: above settings: { } third_party_settings: { } @@ -51,40 +52,30 @@ content: third_party_settings: { } type: link region: content - field_ar_closed: - weight: 10 - label: above - settings: - format: default - format_custom_false: '' - format_custom_true: '' - third_party_settings: { } - type: boolean - region: content field_ar_contact_information: - weight: 4 + weight: 3 label: above settings: link: true third_party_settings: { } type: entity_reference_label region: content - field_ar_description: - weight: 1 + field_ar_content_creation: + type: list_default + weight: 8 + region: content label: above settings: { } third_party_settings: { } - type: text_default - region: content - field_ar_elibrary_creation: - weight: 11 + field_ar_description: + weight: 1 label: above settings: { } third_party_settings: { } - type: list_default + type: text_default region: content field_ar_moderation: - weight: 12 + weight: 9 label: above settings: format: default @@ -94,7 +85,7 @@ content: type: boolean region: content field_ar_owner: - weight: 5 + weight: 4 label: above settings: link: true @@ -102,7 +93,7 @@ content: type: entity_reference_label region: content field_policy_domain: - weight: 6 + weight: 5 label: above settings: link: true @@ -110,7 +101,7 @@ content: type: entity_reference_label region: content field_spatial_coverage: - weight: 7 + weight: 6 label: above settings: link: true @@ -130,6 +121,8 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true + field_ar_closed: true + field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml index dd16d21b83..ce5e2ad1f8 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -25,6 +26,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - image + - joinup - smart_trim - user id: rdf_entity.collection.view_mode_featured @@ -47,6 +49,8 @@ content: text: false more_class: more-link summary_handler: full + wrap_output: false + wrap_class: trimmed third_party_settings: joinup: template_suggestion: '' @@ -80,6 +84,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml index a1b2bb8911..f7d71e54af 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml @@ -9,6 +9,7 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo @@ -25,6 +26,7 @@ dependencies: - rdf_entity.rdfentity.collection module: - image + - joinup - smart_trim - user id: rdf_entity.collection.view_mode_tile @@ -47,6 +49,8 @@ content: text: false more_class: more-link summary_handler: full + wrap_output: false + wrap_class: trimmed third_party_settings: joinup: template_suggestion: '' @@ -80,6 +84,7 @@ hidden: field_ar_banner: true field_ar_closed: true field_ar_contact_information: true + field_ar_content_creation: true field_ar_description: true field_ar_elibrary_creation: true field_ar_moderation: true From 305cea9dbdd539e99c55eddf16ac37957e202dc4 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 16:04:26 +0200 Subject: [PATCH 160/957] ISAICP-5671: Make sure the collection config matches the currently exported config. --- .../custom/collection/collection.info.yml | 109 +++++++++--------- ...y.collection.field_ar_content_creation.yml | 22 ++++ ...e.rdf_entity.field_ar_content_creation.yml | 36 ++++++ ...mage.style.image_style_collection_logo.yml | 1 - 4 files changed, 113 insertions(+), 55 deletions(-) create mode 100644 web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_content_creation.yml create mode 100644 web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_content_creation.yml diff --git a/web/modules/custom/collection/collection.info.yml b/web/modules/custom/collection/collection.info.yml index c49fa7655c..1dd115922a 100644 --- a/web/modules/custom/collection/collection.info.yml +++ b/web/modules/custom/collection/collection.info.yml @@ -1,6 +1,6 @@ name: Collection type: module -description: Provides Collections for the Joinup project. +description: 'Provides Collections for the Joinup project.' core: 8.x package: Joinup @@ -28,56 +28,57 @@ dependencies: - state_machine:state_machine config_devel: - - collection.settings - - core.base_field_override.rdf_entity.collection.label - - core.entity_form_display.rdf_entity.collection.default - - core.entity_view_display.rdf_entity.collection.about - - core.entity_view_display.rdf_entity.collection.compact - - core.entity_view_display.rdf_entity.collection.default - - core.entity_view_display.rdf_entity.collection.group_header - - core.entity_view_display.rdf_entity.collection.rdf_draft - - core.entity_view_display.rdf_entity.collection.view_mode_featured - - core.entity_view_display.rdf_entity.collection.view_mode_tile - - facets.facet.collection_policy_domain - - facets.facet.collection_type - - facets.facet_source.search_api_field__rdf_entity.field_collection_content - - 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_elibrary_creation - - 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_newsletter - - field.field.rdf_entity.collection.field_policy_domain - - field.field.rdf_entity.collection.field_site_featured - - field.field.rdf_entity.collection.field_site_pinned - - field.field.rdf_entity.collection.field_spatial_coverage - - field.storage.rdf_entity.field_ar_abstract - - field.storage.rdf_entity.field_ar_access_url - - field.storage.rdf_entity.field_ar_affiliates - - field.storage.rdf_entity.field_ar_banner - - field.storage.rdf_entity.field_ar_closed - - field.storage.rdf_entity.field_ar_contact_information - - field.storage.rdf_entity.field_ar_content_creation - - field.storage.rdf_entity.field_ar_description - - field.storage.rdf_entity.field_ar_elibrary_creation - - field.storage.rdf_entity.field_ar_logo - - field.storage.rdf_entity.field_ar_moderation - - field.storage.rdf_entity.field_ar_owner - - field.storage.rdf_entity.field_ar_state - - field.storage.rdf_entity.field_collection_content - - image.style.image_style_collection_logo - - og.og_role.rdf_entity-collection-administrator - - og.og_role.rdf_entity-collection-facilitator - - og.og_role.rdf_entity-collection-member - - og.og_role.rdf_entity-collection-non-member - - rdf_entity.rdfentity.collection - - sparql_entity_storage.mapping.rdf_entity.collection + install: + - collection.settings + - core.base_field_override.rdf_entity.collection.label + - core.entity_form_display.rdf_entity.collection.default + - core.entity_view_display.rdf_entity.collection.about + - core.entity_view_display.rdf_entity.collection.compact + - core.entity_view_display.rdf_entity.collection.default + - core.entity_view_display.rdf_entity.collection.group_header + - core.entity_view_display.rdf_entity.collection.rdf_draft + - core.entity_view_display.rdf_entity.collection.view_mode_featured + - core.entity_view_display.rdf_entity.collection.view_mode_tile + - facets.facet.collection_policy_domain + - facets.facet.collection_type + - facets.facet_source.search_api_field__rdf_entity.field_collection_content + - 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_elibrary_creation + - 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_newsletter + - field.field.rdf_entity.collection.field_policy_domain + - field.field.rdf_entity.collection.field_site_featured + - field.field.rdf_entity.collection.field_site_pinned + - field.field.rdf_entity.collection.field_spatial_coverage + - field.storage.rdf_entity.field_ar_abstract + - field.storage.rdf_entity.field_ar_access_url + - field.storage.rdf_entity.field_ar_affiliates + - field.storage.rdf_entity.field_ar_banner + - field.storage.rdf_entity.field_ar_closed + - field.storage.rdf_entity.field_ar_contact_information + - field.storage.rdf_entity.field_ar_content_creation + - field.storage.rdf_entity.field_ar_description + - field.storage.rdf_entity.field_ar_elibrary_creation + - field.storage.rdf_entity.field_ar_logo + - field.storage.rdf_entity.field_ar_moderation + - field.storage.rdf_entity.field_ar_owner + - field.storage.rdf_entity.field_ar_state + - field.storage.rdf_entity.field_collection_content + - image.style.image_style_collection_logo + - og.og_role.rdf_entity-collection-administrator + - og.og_role.rdf_entity-collection-facilitator + - og.og_role.rdf_entity-collection-member + - og.og_role.rdf_entity-collection-non-member + - rdf_entity.rdfentity.collection + - sparql_entity_storage.mapping.rdf_entity.collection diff --git a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_content_creation.yml b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_content_creation.yml new file mode 100644 index 0000000000..fb68f8a7ba --- /dev/null +++ b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_content_creation.yml @@ -0,0 +1,22 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.rdf_entity.field_ar_content_creation + - rdf_entity.rdfentity.collection + module: + - options +id: rdf_entity.collection.field_ar_content_creation +field_name: field_ar_content_creation +entity_type: rdf_entity +bundle: collection +label: 'Content creation' +description: 'Choose which users can create content (news, events, discussions and documents) in the collection.' +required: true +translatable: false +default_value: + - + value: only_members +default_value_callback: '' +settings: { } +field_type: list_string diff --git a/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_content_creation.yml b/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_content_creation.yml new file mode 100644 index 0000000000..e9d71e6e69 --- /dev/null +++ b/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_content_creation.yml @@ -0,0 +1,36 @@ +langcode: en +status: true +dependencies: + module: + - options + - rdf_entity + - sparql_entity_storage +third_party_settings: + sparql_entity_storage: + mapping: + value: + predicate: 'http://joinup.eu/collection/content_creation' + format: literal +id: rdf_entity.field_ar_content_creation +field_name: field_ar_content_creation +entity_type: rdf_entity +type: list_string +settings: + allowed_values: + - + value: any_user + label: 'Any user can create content.' + - + value: only_members + label: 'Only members can create content.' + - + value: only_facilitators + label: 'Only facilitators can create content.' + allowed_values_function: '' +module: options +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/web/modules/custom/collection/config/install/image.style.image_style_collection_logo.yml b/web/modules/custom/collection/config/install/image.style.image_style_collection_logo.yml index d99247e571..25a0bf64be 100644 --- a/web/modules/custom/collection/config/install/image.style.image_style_collection_logo.yml +++ b/web/modules/custom/collection/config/install/image.style.image_style_collection_logo.yml @@ -1,4 +1,3 @@ -uuid: 08a0cb2b-9f36-4a4c-a4dc-4e1115b3a144 langcode: en status: true dependencies: { } From b162764c843b903f34002a7434cff57c932be2aa Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 17:22:43 +0200 Subject: [PATCH 161/957] ISAICP-5671: Update tests to use the new content creation options that replace the old open/closed collection + eLibrary creation options. --- tests/features/collection/api.feature | 1 - .../collection/collection.edit.feature | 2 +- .../collection/collection.moderation.feature | 54 ++++++++++--------- tests/features/collection/homepage.feature | 7 ++- tests/features/collection/propose.feature | 48 ++--------------- .../document.moderation.feature | 6 +-- 6 files changed, 43 insertions(+), 75 deletions(-) diff --git a/tests/features/collection/api.feature b/tests/features/collection/api.feature index 51fe44c7ac..0aa9442a96 100644 --- a/tests/features/collection/api.feature +++ b/tests/features/collection/api.feature @@ -41,7 +41,6 @@ Feature: Collection API And I press "Add existing" at the "Owner" field And I fill in "Owner" with "Prayfish" And I press "Add owner" - And I check "Closed collection" And I check "Moderated" And I press "Propose" Then I should see the heading "Collection API example" diff --git a/tests/features/collection/collection.edit.feature b/tests/features/collection/collection.edit.feature index 48e54f503b..d87c723757 100644 --- a/tests/features/collection/collection.edit.feature +++ b/tests/features/collection/collection.edit.feature @@ -18,7 +18,7 @@ Feature: Editing collections When I am logged in as a facilitator of the "Überwaldean Land Eels" collection And I go to the homepage of the "Überwaldean Land Eels" collection And I click "Edit" in the "Entity actions" region - Then the following fields should be present "Title, Description, Abstract, Policy domain, Geographical coverage, Closed collection, eLibrary creation, Moderated, Motivation" + Then the following fields should be present "Title, Description, Abstract, Policy domain, Geographical coverage, Content creation, Moderated, Motivation" And the following field widgets should be present "Contact information, Owner" And the following fields should not be present "Langcode, Translation, Affiliates, Enable the search field, Query presets, Limit" And I should see "Short description text of the collection. Appears on the Overview page. (Leave blank to use the trimmed value of the Description field.)" diff --git a/tests/features/collection/collection.moderation.feature b/tests/features/collection/collection.moderation.feature index f463faf3fe..7ba5ed6dee 100644 --- a/tests/features/collection/collection.moderation.feature +++ b/tests/features/collection/collection.moderation.feature @@ -176,6 +176,8 @@ Feature: Collection moderation # Regression test for a bug that caused the slider that controls the # eLibrary creation setting to revert to default state when the form is # resubmitted, as happens during moderation. Ref. ISAICP-3200. + # Note that the eLibrary slider has been replaced with the Content creation + # radio buttons, but we are keeping the coverage for now. Given I am logged in as a user with the "authenticated" role # Propose a collection, filling in the required fields. When I go to the propose collection form @@ -195,13 +197,15 @@ Feature: Collection moderation And I wait for AJAX to finish And I attach the file "banner.jpg" to "Banner" And I wait for AJAX to finish - And I select the radio button "Any registered user can create new content." + And I select the radio button "Any user can create content." # Regression test for a bug that caused the eLibrary creation setting to be # lost when adding an item to a multivalue field. Ref. ISAICP-3200. + # Note that the eLibrary slider has been replaced with the Content creation + # radio buttons, but we are keeping the coverage for now. When I press "Add another item" at the "Geographical coverage" field And I wait for AJAX to finish - Then the radio button "Any registered user can create new content." from field "eLibrary creation" should be selected + Then the radio button "Any user can create content." from field "Content creation" should be selected # Submit the form and approve it as a moderator. This should not cause the # eLibrary creation option to change. @@ -212,14 +216,14 @@ Feature: Collection moderation And I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Any registered user can create new content." from field "eLibrary creation" should be selected + Then the radio button "Any user can create content." from field "Content creation" should be selected # Also when saving and reopening the edit form the eLibrary creation option # should remain unchanged. When I press "Publish" And I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Any registered user can create new content." from field "eLibrary creation" should be selected + Then the radio button "Any user can create content." from field "Content creation" should be selected # Clean up the entities that were created. Then I delete the "Spectres in fog" collection @@ -227,9 +231,11 @@ Feature: Collection moderation And I delete the "A secretary in the fog" contact information @terms @javascript - Scenario: Changing eLibrary creation value - regression #1 + Scenario: Changing Content creation value - regression #1 # Regression test for a bug that happens when a change on the eLibrary # creation setting happens after an ajax callback. + # Note that the eLibrary slider has been replaced with the Content creation + # radio buttons, but we are keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I fill in the following: @@ -249,7 +255,7 @@ Feature: Collection moderation And I wait for AJAX to finish And I attach the file "banner.jpg" to "Banner" And I wait for AJAX to finish - And I select the radio button "Any registered user can create new content." + And I select the radio button "Any user can create content." # Save the collection. When I press "Propose" @@ -258,7 +264,7 @@ Feature: Collection moderation When I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Any registered user can create new content." from field "eLibrary creation" should be selected + Then the radio button "Any user can create content." from field "Content creation" should be selected # Clean up the entities that were created. Then I delete the "Domestic bovins" collection @@ -266,9 +272,12 @@ Feature: Collection moderation And I delete the "Domestic secretary" contact information @terms @javascript - Scenario: Changing eLibrary creation value - regression #2 + Scenario: Changing Content creation value - regression #2 # Regression test for a bug that causes the wrong eLibrary creation value # to be saved after the "Closed collection" checkbox is checked. + # Note that the "Closed collection" option no longer exists and that the + # eLibrary slider has been replaced with the Content creation radio + # buttons, but we are keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I fill in the following: @@ -288,10 +297,7 @@ Feature: Collection moderation And I wait for AJAX to finish And I attach the file "banner.jpg" to "Banner" And I wait for AJAX to finish - - When I check "Closed collection" - And I wait for AJAX to finish - And I select the radio button "Only collection facilitators can create new content." + And I select the radio button "Only facilitators can create content." # Save the collection. When I press "Propose" @@ -300,7 +306,7 @@ Feature: Collection moderation When I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Only collection facilitators can create new content." from field "eLibrary creation" should be selected + Then the radio button "Only facilitators can create content." from field "Content creation" should be selected # Clean up the entities that were created. Then I delete the "Theft of Body" collection @@ -308,11 +314,13 @@ Feature: Collection moderation And I delete the "Secretary of thieves" contact information @terms @javascript - Scenario: Changing eLibrary creation value - regression #3 + Scenario: Changing Content creation value - regression #3 # Regression test for a bug that happens when an "Add more" button on a # multi-value widget is clicked and then the "Closed collection" checkbox # is checked. # @see collection_form_rdf_entity_form_alter() + # Note that the "Closed collection" option no longer exists but we are + # keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I fill in the following: @@ -334,10 +342,7 @@ Feature: Collection moderation And I wait for AJAX to finish When I press "Add another item" at the "Geographical coverage" field And I wait for AJAX to finish - - When I check "Closed collection" - And I wait for AJAX to finish - And I select the radio button "Only collection facilitators can create new content." + And I select the radio button "Only facilitators can create content." # Save the collection. When I press "Propose" @@ -346,7 +351,7 @@ Feature: Collection moderation When I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Only collection facilitators can create new content." from field "eLibrary creation" should be selected + Then the radio button "Only facilitators can create content." from field "Content creation" should be selected # Clean up the entities that were created. Then I delete the "Silken Emperor" collection @@ -354,10 +359,12 @@ Feature: Collection moderation And I delete the "Secretary of Silk" contact information @terms @javascript - Scenario: Changing eLibrary creation value - regression #4 + Scenario: Changing Content creation value - regression #4 # Regression test for a bug that happens when the "Closed collection" checkbox # is checked and then an "Add more" button on a multi-value widget is clicked. # @see collection_form_rdf_entity_form_alter() + # Note that the "Closed collection" option no longer exists but we are + # keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I fill in the following: @@ -377,10 +384,7 @@ Feature: Collection moderation And I wait for AJAX to finish And I attach the file "banner.jpg" to "Banner" And I wait for AJAX to finish - - When I check "Closed collection" - And I wait for AJAX to finish - And I select the radio button "Only collection facilitators can create new content." + And I select the radio button "Only facilitators can create content." When I press "Add another item" at the "Geographical coverage" field And I wait for AJAX to finish @@ -392,7 +396,7 @@ Feature: Collection moderation When I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - Then the radio button "Only collection facilitators can create new content." from field "eLibrary creation" should be selected + Then the radio button "Only facilitators can create content." from field "Content creation" should be selected # Clean up the entities that were created. Then I delete the "The blue ships" collection diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature index de927e8d24..8a5e610050 100644 --- a/tests/features/collection/homepage.feature +++ b/tests/features/collection/homepage.feature @@ -155,7 +155,7 @@ Feature: Collection homepage And I press "Save as draft" And I click "View draft" in the "Entity actions" region Then I should see the text "Moderated" - And I should see the text "Open collection" + And I should see the text "Only members can create content." And I should see the text "Bilbo Baggins" And I should see the text "Employment and Support Allowance" And I should see the heading "Middle earth nightly" @@ -164,6 +164,11 @@ Feature: Collection homepage And I should not see the "Breaking: Gandalf supposedly plans his retirement" tile And I should not see the "Big hobbit feast - fireworks at midnight" tile + # In an earlier implementation the "Content creation" option was split in + # two options. We should no longer see the deprecated "open/closed" option. + And I should not see the text "Open collection" + And I should not see the text "Closed collection" + Scenario: The collection homepage should be cacheable for anonymous users. Given I am an anonymous user When I go to the homepage of the "Middle earth daily" collection diff --git a/tests/features/collection/propose.feature b/tests/features/collection/propose.feature index 8eae166add..37e6de8aa6 100644 --- a/tests/features/collection/propose.feature +++ b/tests/features/collection/propose.feature @@ -46,8 +46,7 @@ Feature: Proposing a collection | Name | Contact person | | E-mail | contact_person@example.com | When I select "HR" from "Policy domain" - And I check "Closed collection" - And I select the radio button "Only members can create new content." + And I select the radio button "Only members can create content." And I check "Moderated" # The owner field should have a help text. And I should see the text "The Owner is the organisation that owns this entity and is the only responsible for it." @@ -114,45 +113,8 @@ Feature: Proposing a collection And I attach the file "banner1.jpg" to "Banner" And I wait for AJAX to finish Then I should see the link "banner1.jpg" - And I should see the text "Only members can create new content." - And I should see the text "Any registered user can create new content." - - @javascript - Scenario: eLibrary creation options should adapt to the state of the 'closed collection' option - Given I am logged in as a user with the "authenticated" role - When I go to the propose collection form - And I click the "Additional fields" tab - - # Initially the collection is open, check if the eLibrary options are OK. - Then the radio button "Only members can create new content." from field "eLibrary creation" should be selected - And the "Any registered user can create new content." radio button should not be selected - And I should not see the text "Only collection facilitators can create new content." - - When I select the radio button "Any registered user can create new content." - Then the radio button "Any registered user can create new content." from field "eLibrary creation" should be selected - And the "Only members can create new content." radio button should not be selected - - # When toggling to closed, the option 'any registered user' should disappear - # and the option for facilitators should appear. - When I check "Closed collection" - And I wait for AJAX to finish - Then the radio button "Only members can create new content." from field "eLibrary creation" should be selected - And the "Only collection facilitators can create new content." radio button should not be selected - And I should not see the text "Any registered user can create new content." - When I select the radio button "Only collection facilitators can create new content." - Then the radio button "Only collection facilitators can create new content." from field "eLibrary creation" should be selected - And the "Only members can create new content." radio button should not be selected - - # This is a regression test for a bug in which the both the previous option - # and the default option were selected after cycling the collection - # checkbox status open-closed-open-closed. - # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2589 - When I uncheck "Closed collection" - And I wait for AJAX to finish - And I check "Closed collection" - And I wait for AJAX to finish - Then the radio button "Only members can create new content." from field "eLibrary creation" should be selected - And the "Only collection facilitators can create new content." radio button should not be selected + And I should see the text "Only members can create content." + And I should see the text "Any user can create content." @javascript Scenario: Propose collection form fields should be organized in tabs. @@ -160,14 +122,14 @@ Feature: Proposing a collection When I go to the propose collection form Then the following fields should be visible "Title, Description, Policy domain" And the following field widgets should be visible "Owner" - And the following fields should not be visible "Closed collection, Moderated, Abstract, eLibrary creation, Geographical coverage" + And the following fields should not be visible "Moderated, Abstract, Content creation, Geographical coverage" And the following fields should not be present "Affiliates" And the following field widgets should be visible "Contact information" When I click "Additional fields" tab Then the following fields should not be visible "Title, Description, Policy domain" And the following field widgets should not be visible "Owner" - And the following fields should be visible "Closed collection, eLibrary creation, Moderated, Abstract, Geographical coverage" + And the following fields should be visible "Content creation, Moderated, Abstract, Geographical coverage" And the following fields should not be present "Affiliates" And the following field widgets should not be visible "Contact information" diff --git a/tests/features/joinup_document/document.moderation.feature b/tests/features/joinup_document/document.moderation.feature index 09c2c5da3e..2a880d9593 100644 --- a/tests/features/joinup_document/document.moderation.feature +++ b/tests/features/joinup_document/document.moderation.feature @@ -21,7 +21,7 @@ Feature: Document moderation | description | The wolverine is a Marvel hero. | | logo | logo.png | | banner | banner.jpg | - | elibrary creation | registered users | + | content creation | registered users | | moderation | no | | state | validated | | owner | thisisanowner | @@ -69,9 +69,7 @@ Feature: Document moderation And I open the header local tasks menu And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab - And I check "Closed collection" - And I wait for AJAX to finish - And I select the radio button "Only members can create new content." + And I select the radio button "Only members can create content." And I press "Publish" # I should now have the possibility to add documents. When I open the plus button menu From 883a6c0f5ca674816aa92280c59eee3f42f23427 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 21:29:45 +0200 Subject: [PATCH 162/957] ISAICP-5671: Remove unused method. --- .../src/ExistingSite/NodeWorkflowTestBase.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php index adda4a925d..6e5dd7588f 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php @@ -1032,20 +1032,6 @@ protected function getEntityType(): string { return 'node'; } - /** - * Returns an array of the available eLibrary states. - * - * @return int[] - * An array of the available eLibrary states. - */ - protected function getElibraryStates(): array { - return [ - ContentCreationOptions::FACILITATORS, - ContentCreationOptions::MEMBERS, - ContentCreationOptions::REGISTERED_USERS, - ]; - } - /** * Asserts that two workflow state arrays are equal. * From e7c9aa2942c99decb19302e5b7755f619d4dd85f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 21:50:16 +0200 Subject: [PATCH 163/957] ISAICP-5671: Use clear identifiers rather than numeric values for the content creation options. --- ...up_community_content.permission_scheme.yml | 18 ++++++------- ...up_community_content.permission_scheme.yml | 27 +++++++------------ 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/config/sync/joinup_community_content.permission_scheme.yml b/config/sync/joinup_community_content.permission_scheme.yml index 267cc06f4b..17c1cf97df 100644 --- a/config/sync/joinup_community_content.permission_scheme.yml +++ b/config/sync/joinup_community_content.permission_scheme.yml @@ -144,7 +144,7 @@ view: - authenticated create: 'node:pre_moderated': - - + only_facilitators: save_as_draft: roles: - moderator @@ -163,7 +163,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + only_members: save_as_draft: roles: - moderator @@ -184,7 +184,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + any_user: save_as_draft: roles: - authenticated @@ -198,7 +198,7 @@ create: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator 'node:post_moderated': - - + only_facilitators: save_as_draft: roles: - moderator @@ -211,7 +211,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + only_members: save_as_draft: roles: - moderator @@ -226,7 +226,7 @@ create: - rdf_entity-collection-member - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + any_user: save_as_draft: roles: - authenticated @@ -234,7 +234,7 @@ create: roles: - authenticated 'node:discussion:post_moderated': - - + only_facilitators: save_as_draft: roles: - moderator @@ -247,7 +247,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + only_members: save_as_draft: roles: - moderator @@ -262,7 +262,7 @@ create: - rdf_entity-collection-member - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - - + any_user: save_as_draft: roles: - authenticated diff --git a/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml b/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml index b246569387..df22150dee 100644 --- a/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml +++ b/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml @@ -146,8 +146,7 @@ view: # Create operation permission scheme. create: 'node:pre_moderated': - # eLibrary value: Only collection facilitators can create new content. - 0: + only_facilitators: save_as_draft: roles: - moderator @@ -166,8 +165,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Only members can create new content. - 1: + only_members: save_as_draft: roles: - moderator @@ -188,8 +186,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Any registered user can create new content. - 2: + any_user: save_as_draft: roles: - authenticated @@ -203,8 +200,7 @@ create: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator 'node:post_moderated': - # eLibrary value: Only collection facilitators can create new content. - 0: + only_facilitators: save_as_draft: roles: - moderator @@ -217,8 +213,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Only members can create new content. - 1: + only_members: save_as_draft: roles: - moderator @@ -233,8 +228,7 @@ create: - rdf_entity-collection-member - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Any registered user can create new content. - 2: + any_user: save_as_draft: roles: - authenticated @@ -242,8 +236,7 @@ create: roles: - authenticated 'node:discussion:post_moderated': - # eLibrary value: Only collection facilitators can create new content. - 0: + only_facilitators: save_as_draft: roles: - moderator @@ -256,8 +249,7 @@ create: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Only members can create new content. - 1: + only_members: save_as_draft: roles: - moderator @@ -272,8 +264,7 @@ create: - rdf_entity-collection-member - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - # eLibrary value: Any registered user can create new content. - 2: + any_user: save_as_draft: roles: - authenticated From e195af9138db5530ba5ddd091baaa44ec9813bc5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 21:52:27 +0200 Subject: [PATCH 164/957] ISAICP-5671: Closed collections and eLibrary creation options have been replaced by Content creation options. --- .../custom/collection/collection.behat.inc | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 66a1809363..5b9f5b658b 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -58,11 +58,10 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont 'abstract' => 'field_ar_abstract', 'access url' => 'field_ar_access_url', 'banner' => 'field_ar_banner', - 'closed' => 'field_ar_closed', 'contact information' => 'field_ar_contact_information', + 'content creation' => 'field_ar_content_creation', 'creation date' => 'created', 'description' => 'field_ar_description', - 'elibrary creation' => 'field_ar_elibrary_creation', 'logo' => 'field_ar_logo', 'moderation' => 'field_ar_moderation', 'modification date' => 'changed', @@ -169,9 +168,9 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * * Table format: * @codingStandardsIgnoreStart - * | title | abstract | access url | closed | creation date | description | elibrary creation | featured | logo | moderation | modification date | owner | state | - * | Dog owner collection | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | yes|no | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators|members|registered users | yes | | yes | | | | - * | Cats collection 4 ever! | Cats are cool! | http://mashable.com/category/cats/ | yes|no | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | facilitators|members|registered users | no | | no | | | draft|proposed|validated|archival request|deletion request|archived | + * | title | abstract | access url | creation date | description | content creation | featured | logo | moderation | modification date | owner | state | + * | Dog owner collection | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators|members|registered users | yes | | yes | | | | + * | Cats collection 4 ever! | Cats are cool! | http://mashable.com/category/cats/ | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | facilitators|members|registered users | no | | no | | | draft|proposed|validated|archival request|deletion request|archived | * @codingStandardsIgnoreEnd * * Only the title field is required. @@ -247,12 +246,11 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont protected function convertValueAliases(array $fields): array { $mapped_values = [ 'field_ar_moderation' => ['no' => 0, 'yes' => 1], - 'field_ar_elibrary_creation' => [ - 'facilitators' => 0, - 'members' => 1, - 'registered users' => 2, + 'field_ar_content_creation' => [ + 'facilitators' => 'only_facilitators', + 'members' => 'only_members', + 'registered users' => 'any_user', ], - 'field_ar_closed' => ['no' => 0, 'yes' => 1], 'field_ar_state' => [ 'draft' => 'draft', 'proposed' => 'proposed', @@ -325,15 +323,14 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * * @codingStandardsIgnoreStart * Table format: - * | title | Open Data Initiative | - * | author | Mightily Oats | - * | logo | logo.png | - * | featured | yes|no | - * | moderation | yes|no | - * | closed | yes|no | - * | create elibrary | facilitators|members|registered users | - * | metadata url | https://ec.europa.eu/my/url | - * | state | draft|proposed|validated|archival request|deletion request|archived | + * | title | Open Data Initiative | + * | author | Mightily Oats | + * | logo | logo.png | + * | featured | yes|no | + * | moderation | yes|no | + * | content creation | facilitators|members|registered users | + * | metadata url | https://ec.europa.eu/my/url | + * | state | draft|proposed|validated|archival request|deletion request|archived | * @codingStandardsIgnoreEnd * * Only the title field is required. From bc8083379fa9f57d8b24fd8a70c011139240b996 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 22:00:24 +0200 Subject: [PATCH 165/957] ISAICP-5671: Remove obsolete form trickery now that the Closed collection and eLibrary creation options have been replaced with a unified Content creation option. --- .../custom/collection/collection.module | 106 ------------------ 1 file changed, 106 deletions(-) diff --git a/web/modules/custom/collection/collection.module b/web/modules/custom/collection/collection.module index 7bf6a845c9..e2f2f4b087 100644 --- a/web/modules/custom/collection/collection.module +++ b/web/modules/custom/collection/collection.module @@ -17,8 +17,6 @@ use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\Session\AccountInterface; -use Drupal\field\Entity\FieldStorageConfig; -use Drupal\joinup_group\ContentCreationOptions; use Drupal\node\NodeInterface; use Drupal\og\Entity\OgRole; use Drupal\og\Og; @@ -75,110 +73,6 @@ function collection_form_block_form_alter(&$form, FormStateInterface $form_state $form['visibility']['collection']['negate']['#access'] = FALSE; } -/** - * Implements hook_form_BASE_FORM_ID_alter(). - * - * Alters the RDF entity form for collections: - * - Changes the available options for the eLibrary creation field depending on - * whether a collection is closed or open: - * - Open collection: eLibrary content can be created either only by - * collection members, or by all registered users. - * - Closed collection: eLibrary content can be created either only by - * collection facilitators, or by members of the collection. - * When the collection changes between closed and open we will use AJAX to - * update the eLibrary creation field to contain the correct options. - */ -function collection_form_rdf_entity_form_alter(&$form, FormStateInterface $form_state, $form_id) { - // Only alter collection forms. - if ($form_state->getFormObject()->getEntity()->bundle() !== 'collection') { - return; - } - - // Retrieve the entity from the form. - $entity = $form_state->getFormObject()->getEntity(); - - // Get the current values for the 'Closed collection' and 'eLibrary creation' - // fields. If the form has not yet been submitted, use the defaults from the - // loaded or newly created entity. - // We are accessing directly the raw, unvalidated user input because when - // "#limit_validation_errors" is set on the triggering element (for example - // when an "add_more" button is clicked) the full form state values are not - // present. - // @see \Drupal\Core\Form\FormValidator::handleErrorsWithLimitedValidation() - // @todo Maybe check the triggering element and use the default values instead? - $closed = !$form_state->isProcessingInput() ? $entity->field_ar_closed->value : (int) $form_state->getUserInput()['field_ar_closed']['value']; - $elibrary = !$form_state->isProcessingInput() ? $entity->field_ar_elibrary_creation->value : (int) $form_state->getUserInput()['field_ar_elibrary_creation']; - - // Define the allowed options. - $allowed_options = [ - // In open collections content can be made by members (option 1) and - // authenticated users (option 2). - 0 => [ - ContentCreationOptions::MEMBERS => ContentCreationOptions::MEMBERS, - ContentCreationOptions::REGISTERED_USERS => ContentCreationOptions::REGISTERED_USERS, - ], - // In closed collections content can be made by facilitators (option 0) and - // members (option 1). - 1 => [ - ContentCreationOptions::FACILITATORS => ContentCreationOptions::FACILITATORS, - ContentCreationOptions::MEMBERS => ContentCreationOptions::MEMBERS, - ], - ]; - // Take the options as defined in the field storage, and filter them using the - // allowed options. - $elibrary_creation_options = array_intersect_key(FieldStorageConfig::load('rdf_entity.field_ar_elibrary_creation')->getSetting('allowed_values'), $allowed_options[$closed]); - - // According to specification, the 'member' option (option 1) should always - // appear as the first option, at the left. - if (array_key_exists(ContentCreationOptions::MEMBERS, $elibrary_creation_options)) { - // Since this is a numerically ordered array we cannot use array_unshift(). - $member_options = $elibrary_creation_options[ContentCreationOptions::MEMBERS]; - unset($elibrary_creation_options[ContentCreationOptions::MEMBERS]); - $elibrary_creation_options = [ContentCreationOptions::MEMBERS => $member_options] + $elibrary_creation_options; - } - - // Define the option that should be taken in case the originally selected - // option is no longer available. - // This can be hardcoded as `$default = 1` but using a transition table makes - // it easier to maintain and understand. - $option_transitions = [ - // If the option 'Only collection facilitators' was selected before, then - // take the option 'Only members'. - ContentCreationOptions::FACILITATORS => ContentCreationOptions::MEMBERS, - // If the option 'Any registered user' was selected before, then take the - // option 'Only members'. - ContentCreationOptions::REGISTERED_USERS => ContentCreationOptions::MEMBERS, - ]; - - $elibrary_creation_default_value = array_key_exists($elibrary, $elibrary_creation_options) ? $elibrary : $option_transitions[$elibrary]; - - // Provide an identifier on the wrapper for the eLibrary Creation field so we - // can target it with AJAX. - $form['field_ar_elibrary_creation']['#id'] = 'field-ar-elibrary-creation-wrapper'; - $form['field_ar_elibrary_creation']['widget']['#options'] = $elibrary_creation_options; - $form['field_ar_elibrary_creation']['widget']['#default_value'] = $elibrary_creation_default_value; - - $user_input = $form_state->getUserInput(); - $user_input['field_ar_elibrary_creation'] = $elibrary_creation_default_value; - $form_state->setUserInput($user_input); - - // Add an AJAX callback that refreshes the eLibrary field when the Closed - // collection field changes. - $form['field_ar_closed']['widget']['value']['#ajax'] = [ - 'callback' => 'collection_form_elibrary_creation_callback', - 'wrapper' => 'field-ar-elibrary-creation-wrapper', - ]; -} - -/** - * AJAX callback that returns the eLibrary creation field. - * - * @see collection_form_rdf_entity_form_alter() - */ -function collection_form_elibrary_creation_callback($form, FormStateInterface $form_state) { - return $form['field_ar_elibrary_creation']; -} - /** * Implements hook_entity_bundle_field_info_alter(). */ From 5f9469a8eb4b51603b7e1db01fa9daf09f606c47 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 22:00:41 +0200 Subject: [PATCH 166/957] ISAICP-5671: Remove duplicate option declaration. --- .../joinup_community_content.permission_scheme.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml b/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml index df22150dee..3d26cc8f8c 100644 --- a/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml +++ b/web/modules/custom/joinup_community_content/config/install/joinup_community_content.permission_scheme.yml @@ -339,16 +339,6 @@ update: og_roles: - rdf_entity-collection-facilitator - rdf_entity-solution-facilitator - update_proposed: - own: - roles: - - authenticated - any: - roles: - - moderator - og_roles: - - rdf_entity-collection-facilitator - - rdf_entity-solution-facilitator report: any: roles: From b51d0a94910b57560b52a0c4ecf41f711e4892e4 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 22:00:58 +0200 Subject: [PATCH 167/957] ISAICP-5671: Fix typo. --- .../src/Controller/CommunityContentController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php index d01ddfcc7b..ef29b3517d 100644 --- a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php +++ b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php @@ -32,7 +32,7 @@ abstract class CommunityContentController extends ControllerBase { * * @var \Drupal\joinup_core\NodeWorkflowAccessControlHandler */ - protected $workflowAccessControlHanlder; + protected $workflowAccessControlHandler; /** * Constructs an CommunityContentController. @@ -44,7 +44,7 @@ abstract class CommunityContentController extends ControllerBase { */ public function __construct(OgAccessInterface $og_access, NodeWorkflowAccessControlHandler $workflow_access_control_handler) { $this->ogAccess = $og_access; - $this->workflowAccessControlHanlder = $workflow_access_control_handler; + $this->workflowAccessControlHandler = $workflow_access_control_handler; } /** @@ -98,7 +98,7 @@ public function createAccess(RdfInterface $rdf_entity, AccountInterface $account } $content = $this->createContentEntity($rdf_entity); - return $this->workflowAccessControlHanlder->entityAccess($content, 'create', $account); + return $this->workflowAccessControlHandler->entityAccess($content, 'create', $account); } /** From a89824741b1932492b8f66395e8f8c7922aa5aa2 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 4 Mar 2020 22:04:33 +0200 Subject: [PATCH 168/957] ISAICP-5671: Remove dead code. Comments are disabled for all anonymous users. --- .../custom/collection/collection.module | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/web/modules/custom/collection/collection.module b/web/modules/custom/collection/collection.module index e2f2f4b087..d64e65da39 100644 --- a/web/modules/custom/collection/collection.module +++ b/web/modules/custom/collection/collection.module @@ -420,25 +420,6 @@ function collection_search_api_query_search_api_field_field_collection_content_a $query->addCondition('entity_bundle', 'custom_page', '<>'); } -/** - * Implements hook_node_access(). - * - * Disallow anonymous users to post comments on closed collections content. - */ -function collection_node_access(NodeInterface $node, $op, AccountInterface $account) { - if ($op !== 'post comments') { - return AccessResult::neutral(); - } - - /** @var \Drupal\rdf_entity\RdfInterface $parent */ - $parent = \Drupal::service('joinup_core.relations_manager')->getParent($node); - if (!$parent || $parent->bundle() !== 'collection') { - return AccessResult::neutral(); - } - - return AccessResult::forbiddenIf($parent->get('field_ar_closed')->value && $account->isAnonymous())->addCacheableDependency($parent); -} - /** * Implements hook_entity_bundle_field_info(). */ From cf183152da03b2b8d57ef4df13279fb5ad9bcd36 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 11:32:24 +0200 Subject: [PATCH 169/957] ISAICP-5671: Convert workflow related code to use the new content creation option instead of the old eLibrary creation option. --- web/modules/custom/joinup_core/README.md | 22 ++++++++-------- .../joinup_core/src/Guard/NodeGuard.php | 6 ++--- .../joinup_core/src/JoinupRelationManager.php | 10 +++---- .../src/JoinupRelationManagerInterface.php | 13 +++++----- .../src/NodeWorkflowAccessControlHandler.php | 24 ++++++++--------- .../src/ProxyClass/JoinupRelationManager.php | 4 +-- .../src/ExistingSite/NodeWorkflowTestBase.php | 26 +++++++++---------- 7 files changed, 51 insertions(+), 54 deletions(-) diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 1880188aa4..35f4d9aa23 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -176,18 +176,18 @@ perform the transition and the user is one of them, the transition is allowed; * if there are Og roles that are allowed to perform the transition and the user is one of them, the transition is allowed; -Note that in the above cases, the parent's eLibrary settings, in the case of a -new entity created, are already taken into account. The allowed roles are a -combination of the roles allowed by the workflow, the parent's moderation and -the parent's eLibrary settings. +Note that in the above cases, the parent's content creation settings, in the +case of a new entity created, are already taken into account. The allowed roles +are a combination of the roles allowed by the workflow, the parent's moderation +and the parent's content creation settings. ### The access handler The community content share a base access handler. The idea behind this is that joinup is a highly complex system when it comes to moderation. Access to transitions have a multi layered access system including the og membership -permissions, the global permissions, the group's settings regarding eLibrary and -moderation and workflow specific needs. +permissions, the global permissions, the group's settings regarding content +creation and moderation and workflow specific needs. The idea here is that there has to be a base for all the access control and this base will integrate with the rest. @@ -226,9 +226,9 @@ The access is given to the user if there are allowed transitions from the default one (`__new__`). **Important:** -A non saved entity must be passed as an argument as the eLibrary creation is -only taken into account for entities that have the `->isNew()` handle returning -`TRUE`. +A non saved entity must be passed as an argument as the content creation setting +is only taken into account for entities that have the `->isNew()` handle +returning `TRUE`. Note that the workflow guard class will take into account the Og membership and the parent's settings. @@ -296,7 +296,7 @@ The structure of the array is: ``` $access_array = [ 'parent_bundle' => [ - 'elibrary_status' => [ + 'content_creation_option' => [ 'user variable 1', 'user variable 2', ], @@ -339,7 +339,7 @@ Tests the transitions available for each case. The structure of the array is: ``` $workflow_array = [ 'parent_bundle' => [ - 'parent_e_library' => [ + 'parent_content_creation_option' => [ 'parent_moderation' => [ 'entity_state' => [ 'user variable' => [ diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php index 30d3720eb9..bbd46cc392 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php @@ -104,12 +104,12 @@ public function allowed(WorkflowTransition $transition, WorkflowInterface $workf public function allowedCreate(WorkflowTransition $transition, WorkflowInterface $workflow, EntityInterface $entity) { $permission_scheme = $this->permissionScheme->get('create'); $workflow_id = $workflow->getId(); - $e_library = (string) $this->relationManager->getParentELibraryCreationOption($entity); + $content_creation = (string) $this->relationManager->getParentContentCreationOption($entity); - if (!isset($permission_scheme[$workflow_id][$e_library][$transition->getId()])) { + if (!isset($permission_scheme[$workflow_id][$content_creation][$transition->getId()])) { return FALSE; } - return $this->workflowHelper->userHasRoles($entity, $this->currentUser, $permission_scheme[$workflow_id][$e_library][$transition->getId()]); + return $this->workflowHelper->userHasRoles($entity, $this->currentUser, $permission_scheme[$workflow_id][$content_creation][$transition->getId()]); } /** diff --git a/web/modules/custom/joinup_core/src/JoinupRelationManager.php b/web/modules/custom/joinup_core/src/JoinupRelationManager.php index 68a197ae5b..304a270050 100644 --- a/web/modules/custom/joinup_core/src/JoinupRelationManager.php +++ b/web/modules/custom/joinup_core/src/JoinupRelationManager.php @@ -109,16 +109,14 @@ public function getParentState(EntityInterface $entity): string { /** * {@inheritdoc} */ - // @codingStandardsIgnoreLine - public function getParentELibraryCreationOption(EntityInterface $entity): int { + public function getParentContentCreationOption(EntityInterface $entity): string { $parent = $this->getParent($entity); $field_array = [ - 'collection' => 'field_ar_elibrary_creation', - 'solution' => 'field_is_elibrary_creation', + 'collection' => 'field_ar_content_creation', + 'solution' => 'field_is_content_creation', ]; - $e_library = (int) $parent->{$field_array[$parent->bundle()]}->first()->value; - return $e_library; + return $parent->{$field_array[$parent->bundle()]}->first()->value; } /** diff --git a/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php b/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php index 1992f2eaa5..c68faca52b 100644 --- a/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php +++ b/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php @@ -51,19 +51,18 @@ public function getParentModeration(EntityInterface $entity): ?int; public function getParentState(EntityInterface $entity): string; /** - * Retrieves the eLibrary creation option of the parent. + * Retrieves the content creation option of the parent entity. * * @param \Drupal\Core\Entity\EntityInterface $entity * The group content entity. * * @return int - * The eLibrary creation option. Can be one of the following values: - * - \Drupal\joinup_core\ELibraryCreationOptions::FACILITATORS - * - \Drupal\joinup_core\ELibraryCreationOptions::MEMBERS - * - \Drupal\joinup_core\ELibraryCreationOptions::REGISTERED_USERS + * The content creation option. Can be one of the following values: + * - \Drupal\joinup_group\ContentCreationOptions::FACILITATORS + * - \Drupal\joinup_group\ContentCreationOptions::MEMBERS + * - \Drupal\joinup_group\ContentCreationOptions::REGISTERED_USERS */ - // @codingStandardsIgnoreLine - public function getParentELibraryCreationOption(EntityInterface $entity): int; + public function getParentContentCreationOption(EntityInterface $entity): string; /** * Retrieves all the members with any role in a certain group. diff --git a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php index c144112148..32d25b0710 100644 --- a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php @@ -266,9 +266,9 @@ protected function entityViewAccess(NodeInterface $entity, AccountInterface $acc protected function entityCreateAccess(NodeInterface $entity, AccountInterface $account): AccessResult { $create_scheme = $this->getPermissionScheme('create'); $workflow_id = $this->getEntityWorkflowId($entity); - $e_library = $this->getEntityElibrary($entity); + $content_creation = $this->getParentContentCreationOption($entity); - foreach ($create_scheme[$workflow_id][$e_library] as $ownership_data) { + foreach ($create_scheme[$workflow_id][$content_creation] as $ownership_data) { // There is no check whether the transition is allowed as only allowed // transitions are mapped in the permission scheme configuration object. if ($this->workflowHelper->userHasRoles($entity, $account, $ownership_data)) { @@ -367,33 +367,33 @@ protected function getEntityState(NodeInterface $entity): string { } /** - * Returns the value of the eLibrary settings of the parent of an entity. + * Returns the content creation option value of the parent of an entity. * * @param \Drupal\node\NodeInterface $entity * The group content entity. * * @return array - * The eLibrary value. + * The content creation option value. */ - protected function getEntityElibrary(NodeInterface $entity): string { + protected function getParentContentCreationOption(NodeInterface $entity): string { $parent = $this->relationManager->getParent($entity); - $e_library_name = $this->getParentElibraryName($parent); - return $parent->{$e_library_name}->value; + $field_name = $this->getParentContentCreationFieldName($parent); + return $parent->{$field_name}->value; } /** - * Returns the eLibrary creation field's machine name. + * Returns the content creation field's machine name. * * @param \Drupal\Core\Entity\EntityInterface $entity * The parent entity. * * @return string - * The machine name of the eLibrary creation field. + * The machine name of the content creation field. */ - protected function getParentElibraryName(EntityInterface $entity): string { + protected function getParentContentCreationFieldName(EntityInterface $entity): string { $field_array = [ - 'collection' => 'field_ar_elibrary_creation', - 'solution' => 'field_is_elibrary_creation', + 'collection' => 'field_ar_content_creation', + 'solution' => 'field_is_content_creation', ]; return $field_array[$entity->bundle()]; diff --git a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php b/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php index a6f26cee74..4deef8e56f 100644 --- a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php +++ b/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php @@ -102,9 +102,9 @@ public function getParentState(\Drupal\Core\Entity\EntityInterface $entity) : st /** * {@inheritdoc} */ - public function getParentELibraryCreationOption(\Drupal\Core\Entity\EntityInterface $entity) : int + public function getParentContentCreationOption(\Drupal\Core\Entity\EntityInterface $entity) : string { - return $this->lazyLoadItself()->getParentELibraryCreationOption($entity); + return $this->lazyLoadItself()->getParentContentCreationOption($entity); } /** diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php index 6e5dd7588f..e697a2ed3e 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php @@ -121,9 +121,9 @@ protected function createOperationTest(): void { $operation = 'create'; $test_roles = array_diff($this->getAvailableUsers(), ['userOwner']); foreach ($this->createAccessProvider() as $parent_bundle => $moderation_data) { - foreach ($moderation_data as $moderation => $elibrary_data) { - foreach ($elibrary_data as $elibrary => $allowed_roles) { - $parent = $this->createParent($parent_bundle, 'validated', $moderation, $elibrary); + foreach ($moderation_data as $moderation => $content_creation_data) { + foreach ($content_creation_data as $content_creation => $allowed_roles) { + $parent = $this->createParent($parent_bundle, 'validated', $moderation, $content_creation); $content = Node::create([ 'title' => $this->randomMachineName(), 'type' => $this->getEntityBundle(), @@ -133,12 +133,12 @@ protected function createOperationTest(): void { $non_allowed_roles = array_diff($test_roles, array_keys($allowed_roles)); foreach ($allowed_roles as $user_var => $expected_target_states) { - $message = "Parent bundle: {$parent_bundle}, Content bundle: {$this->getEntityBundle()}, Content state: -new entity-, Ownership: any, Moderation: {$moderation}, E-Library: {$elibrary}, User variable: {$user_var}, Operation: {$operation}"; + $message = "Parent bundle: {$parent_bundle}, Content bundle: {$this->getEntityBundle()}, Content state: -new entity-, Ownership: any, Moderation: {$moderation}, Content creation: {$content_creation}, User variable: {$user_var}, Operation: {$operation}"; $actual_target_states = $this->workflowHelper->getAvailableTargetStates($content, $this->{$user_var}); $this->assertWorkflowStatesEqual($expected_target_states, $actual_target_states, $message); } foreach ($non_allowed_roles as $user_var) { - $message = "Parent bundle: {$parent_bundle}, Content bundle: {$this->getEntityBundle()}, Content state: -new entity-, Ownership: any, Moderation: {$moderation}, E-Library: {$elibrary}, User variable: {$user_var}, Operation: {$operation}"; + $message = "Parent bundle: {$parent_bundle}, Content bundle: {$this->getEntityBundle()}, Content state: -new entity-, Ownership: any, Moderation: {$moderation}, Content creation: {$content_creation}, User variable: {$user_var}, Operation: {$operation}"; $access = $this->entityAccess->access($content, $operation, $this->{$user_var}); $this->assertFalse($access, $message); } @@ -286,7 +286,7 @@ protected function deleteOperationTest(): void { * $access_array = [ * 'parent bundle' => [ * 'moderation' => [ - * 'elibrary status' => [ + * 'content creation status' => [ * 'user variable' => [ * 'transition allowed', * 'transition allowed', @@ -974,8 +974,8 @@ protected function getAvailableUsers(): array { * The state of the entity. * @param string $moderation * Whether the parent is pre or post moderated. - * @param string $e_library - * The 'eLibrary_creation' value of the parent entity. + * @param string $content_creation + * The content creation value of the parent entity. * * @return \Drupal\rdf_entity\RdfInterface * The created parent entity. @@ -983,11 +983,11 @@ protected function getAvailableUsers(): array { * @throws \Drupal\Core\Entity\EntityStorageException * If entity creation fails. */ - protected function createParent($bundle, $state = 'validated', $moderation = NULL, $e_library = NULL): RdfInterface { - // Make sure the current user is set to anonymous when creating solutions + protected function createParent($bundle, $state = 'validated', $moderation = NULL, $content_creation = NULL): RdfInterface { + // Make sure the current user is set to anonymous when creating groups // through the API so we can assign the administrator manually. If a user is - // logged in during creation of the solution they will automatically become - // the administrator. + // logged in during creation of the group they will automatically become the + // administrator. $this->setCurrentUser($this->userAnonymous); $field_identifier = [ @@ -1000,7 +1000,7 @@ protected function createParent($bundle, $state = 'validated', $moderation = NUL 'rid' => $bundle, $field_identifier[$bundle] . 'state' => $state, $field_identifier[$bundle] . 'moderation' => $moderation, - $field_identifier[$bundle] . 'elibrary_creation' => $e_library === NULL ? ContentCreationOptions::REGISTERED_USERS : $e_library, + $field_identifier[$bundle] . 'content_creation' => $content_creation === NULL ? ContentCreationOptions::REGISTERED_USERS : $content_creation, ]; // It's not possible to create orphan solutions. From 8ebbbb09e6ddf06acab39ed2dd7b4aa5ac48c364 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 13:54:42 +0200 Subject: [PATCH 170/957] ISAICP-5671: The Great Search And Replace Operation of 2020. --- ..._entity.collection.field_ar_moderation.yml | 2 +- ...df_entity.solution.field_is_moderation.yml | 2 +- tests/features/adms_ap_compliance.feature | 8 +-- tests/features/asset_distribution/api.feature | 50 +++++++------- tests/features/asset_release/api.feature | 50 +++++++------- tests/features/collection/api.feature | 16 ++--- .../collection/collection.about.feature | 2 +- .../collection/collection.edit.feature | 4 +- .../collection/collection.moderation.feature | 29 ++++---- tests/features/collection/homepage.feature | 14 ++-- tests/features/collection/join-leave.feature | 6 +- tests/features/collection/propose.feature | 2 +- ...fication.post_moderated.discussion.feature | 4 +- ...tification.post_moderated.document.feature | 4 +- .../notification.post_moderated.event.feature | 4 +- .../notification.post_moderated.news.feature | 4 +- ...otification.pre_moderated.document.feature | 4 +- .../notification.pre_moderated.event.feature | 4 +- .../notification.pre_moderated.news.feature | 4 +- tests/features/custom_page/api.feature | 12 ++-- .../joinup_core/unpublished_entities.feature | 8 +-- .../discussion.moderation.feature | 20 +++--- tests/features/joinup_document/api.feature | 12 ++-- .../document.moderation.feature | 8 +-- tests/features/joinup_event/api.feature | 12 ++-- .../joinup_event/event.moderation.feature | 10 +-- tests/features/joinup_news/api.feature | 12 ++-- .../joinup_news/news_moderation.feature | 6 +- .../federated_entities.feature | 18 ++--- tests/features/solution/add_solution.feature | 2 +- tests/features/solution/api.feature | 68 +++++++++---------- tests/features/solution/homepage.feature | 18 ++--- .../features/solution/id_with_spaces.feature | 48 ++++++------- tests/features/solution/solution.edit.feature | 4 +- tests/features/video/api.feature | 12 ++-- .../files/single_solution_valid_adms.rdf | 2 +- tests/fixtures/files/valid_adms.rdf | 2 +- ..._entity.collection.field_ar_moderation.yml | 2 +- .../content/rdf_entity/collection/camss.json | 4 +- .../content/rdf_entity/collection/nifo.json | 4 +- .../collection/open-source-observatory.json | 4 +- .../content/rdf_entity/collection/semic.json | 4 +- .../collection/some_federated_collection.json | 4 +- .../rdf_entity/collection/tallinn.json | 4 +- .../solution/a_federated_solution.json | 4 +- .../solution/core-person-vocab.json | 4 +- .../solution/solution_blacklisted.json | 4 +- .../rdf_entity/solution/solution_draft.json | 4 +- .../solution/solution_needs_update.json | 4 +- .../solution/solution_proposed.json | 4 +- .../solution/solution_validated.json | 4 +- ...df_entity.solution.field_is_moderation.yml | 2 +- .../custom/solution/solution.behat.inc | 21 +++--- .../src/Plugin/Block/AddContentBlock.php | 2 +- 54 files changed, 285 insertions(+), 281 deletions(-) diff --git a/config/sync/field.field.rdf_entity.collection.field_ar_moderation.yml b/config/sync/field.field.rdf_entity.collection.field_ar_moderation.yml index 0216321755..43580be03a 100644 --- a/config/sync/field.field.rdf_entity.collection.field_ar_moderation.yml +++ b/config/sync/field.field.rdf_entity.collection.field_ar_moderation.yml @@ -12,7 +12,7 @@ field_name: field_ar_moderation entity_type: rdf_entity bundle: collection label: Moderation -description: 'If checked, eLibrary items (news, events, and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' +description: 'If checked, community content items (news, events, discussions and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' required: false translatable: false default_value: diff --git a/config/sync/field.field.rdf_entity.solution.field_is_moderation.yml b/config/sync/field.field.rdf_entity.solution.field_is_moderation.yml index 92a6abbb94..173773ec29 100644 --- a/config/sync/field.field.rdf_entity.solution.field_is_moderation.yml +++ b/config/sync/field.field.rdf_entity.solution.field_is_moderation.yml @@ -12,7 +12,7 @@ field_name: field_is_moderation entity_type: rdf_entity bundle: solution label: Moderation -description: 'If checked, eLibrary items (news, events, and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' +description: 'If checked, community content items (news, events, discussions and documents) are pre-moderated: they have to be validated by the moderators of the solution before they will be published.' required: false translatable: false default_value: diff --git a/tests/features/adms_ap_compliance.feature b/tests/features/adms_ap_compliance.feature index 4404f3dcc3..0869f50d99 100644 --- a/tests/features/adms_ap_compliance.feature +++ b/tests/features/adms_ap_compliance.feature @@ -30,7 +30,7 @@ Feature: Joinup should be ADMS-AP compliant. | creation date | 2016-07-13T13:00 | | modification date | 2017-06-30T11:27 | | closed | no | - | elibrary creation | facilitators | + | content creation | facilitators | | moderation | no | | policy domain | Demography | | spatial coverage | Belgium | @@ -38,9 +38,9 @@ Feature: Joinup should be ADMS-AP compliant. | featured | no | | pinned to front page | no | And the following solutions: - | title | collection | author | description | logo | banner | owner | contact information | creation date | modification date | documentation | elibrary creation | keywords | landing page | language | metrics page | moderation | policy domain | related solutions | solution type | source code repository | spatial coverage | status | translation | webdav creation | webdav url | wiki | state | featured | pinned to front page | pinned in | - | Early Omega | Morbid Scattered Microphone | Andre Munson |

content

| logo.png | banner.jpg | Teddy Bass | Jocelyn Bass | 2017-11-01T8:00 | 2017-12-01T8:43 | text.pdf | registered users | ADMS, validation | http://www.example.com/landing1 | Interlingua | http://www.example.org/metrics1 | no | EU and European Policies | | Service Delivery Model | http://www.example.org/source | Canada | Completed | | no | http://www.example.org/webdav | http://www.example.org/wiki | validated | no | no | | - | Snake Timely | Morbid Scattered Microphone | Branson Winthrop |

content

| logo.png | banner.jpg | Teddy Bass | Jocelyn Bass | 2015-03-03T8:00 | 2018-02-14T18:43 | text.pdf | registered users | | http://www.example.com/landing2 | English | http://www.example.org/metrics2 | yes | Demography | Early Omega | Business Information | http://www.example.org/source | Canada | Completed | | yes | http://www.example.org/webdav | http://www.example.org/wiki | validated | no | no | | + | title | collection | author | description | logo | banner | owner | contact information | creation date | modification date | documentation | content creation | keywords | landing page | language | metrics page | moderation | policy domain | related solutions | solution type | source code repository | spatial coverage | status | translation | webdav creation | webdav url | wiki | state | featured | pinned to front page | pinned in | + | Early Omega | Morbid Scattered Microphone | Andre Munson |

content

| logo.png | banner.jpg | Teddy Bass | Jocelyn Bass | 2017-11-01T8:00 | 2017-12-01T8:43 | text.pdf | registered users | ADMS, validation | http://www.example.com/landing1 | Interlingua | http://www.example.org/metrics1 | no | EU and European Policies | | Service Delivery Model | http://www.example.org/source | Canada | Completed | | no | http://www.example.org/webdav | http://www.example.org/wiki | validated | no | no | | + | Snake Timely | Morbid Scattered Microphone | Branson Winthrop |

content

| logo.png | banner.jpg | Teddy Bass | Jocelyn Bass | 2015-03-03T8:00 | 2018-02-14T18:43 | text.pdf | registered users | | http://www.example.com/landing2 | English | http://www.example.org/metrics2 | yes | Demography | Early Omega | Business Information | http://www.example.org/source | Canada | Completed | | yes | http://www.example.org/webdav | http://www.example.org/wiki | validated | no | no | | And the following releases: | title | documentation | release number | release notes | creation date | is version of | state | status | spatial coverage | keywords | language | | Omega3 | text.pdf | 3.0.0 | New 3.0 | 2017-11-11T11:11 | Early Omega | validated | Completed | Andorra | food | Athapascan languages | diff --git a/tests/features/asset_distribution/api.feature b/tests/features/asset_distribution/api.feature index 0185c9f7fb..3a709293a6 100644 --- a/tests/features/asset_distribution/api.feature +++ b/tests/features/asset_distribution/api.feature @@ -6,22 +6,22 @@ Feature: Distribution API Scenario: Programmatically create a distribution Given the following collection: - | title | Asset distribution collection API foo | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Asset distribution collection API foo | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | Asset distribution solution | - | collection | Asset distribution collection API foo | - | description | Asset distribution sample solution | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | title | Asset distribution solution | + | collection | Asset distribution collection API foo | + | description | Asset distribution sample solution | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | And the following release: | title | Asset distribution asset release | | description | Asset distribution sample solution | @@ -40,17 +40,17 @@ Feature: Distribution API Scenario: Programmatically create a distribution using only the mandatory fields Given the following collection: - | title | Asset distribution short API bar | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Asset distribution short API bar | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | AD first solution mandatory short | - | collection | Asset distribution short API bar | - | description | Another sample solution | - | elibrary creation | members | - | state | validated | + | title | AD first solution mandatory short | + | collection | Asset distribution short API bar | + | description | Another sample solution | + | content creation | members | + | state | validated | And the following release: | title | AD first release | | description | Asset distribution sample solution | diff --git a/tests/features/asset_release/api.feature b/tests/features/asset_release/api.feature index 6aa703afd6..b4887f233d 100644 --- a/tests/features/asset_release/api.feature +++ b/tests/features/asset_release/api.feature @@ -6,22 +6,22 @@ Feature: Release API Scenario: Programmatically create a solution Given the following collection: - | title | Solution API foo | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Solution API foo | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | My first solution | - | collection | Solution API foo | - | description | A sample solution | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | title | My first solution | + | collection | Solution API foo | + | description | A sample solution | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | And the following release: | title | My first release | | description | A sample release | @@ -33,17 +33,17 @@ Feature: Release API Scenario: Programmatically create a collection using only the mandatory fields Given the following collection: - | title | Solution API bar | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Solution API bar | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | My first solution mandatory | - | collection | Solution API bar | - | description | Another sample solution | - | elibrary creation | members | - | state | validated | + | title | My first solution mandatory | + | collection | Solution API bar | + | description | Another sample solution | + | content creation | members | + | state | validated | And the following release: | title | My first mandatory release | | description | A sample release | diff --git a/tests/features/collection/api.feature b/tests/features/collection/api.feature index 0aa9442a96..fc059a55d1 100644 --- a/tests/features/collection/api.feature +++ b/tests/features/collection/api.feature @@ -6,14 +6,14 @@ Feature: Collection API Scenario: Programmatically create a collection Given the following collection: - | title | Open Data Initiative | - | logo | logo.png | - | banner | banner.jpg | - | moderation | no | - | closed | no | - | elibrary creation | facilitators | - | policy domain | E-health | - | state | validated | + | title | Open Data Initiative | + | logo | logo.png | + | banner | banner.jpg | + | moderation | no | + | closed | no | + | content creation | facilitators | + | policy domain | E-health | + | state | validated | Then I should have 1 collection Scenario: Programmatically create a collection using only the name diff --git a/tests/features/collection/collection.about.feature b/tests/features/collection/collection.about.feature index cb55ed4751..48adb74e46 100644 --- a/tests/features/collection/collection.about.feature +++ b/tests/features/collection/collection.about.feature @@ -23,7 +23,7 @@ Feature: About page | policy domain | Statistics and Analysis | | spatial coverage | Belgium | | closed | no | - | elibrary creation | members | + | content creation | members | | moderation | no | | state | validated | diff --git a/tests/features/collection/collection.edit.feature b/tests/features/collection/collection.edit.feature index d87c723757..a382152166 100644 --- a/tests/features/collection/collection.edit.feature +++ b/tests/features/collection/collection.edit.feature @@ -13,8 +13,8 @@ Feature: Editing collections | name | Collection editorial | | email | collection.editorial@example.com | And collections: - | title | logo | banner | abstract | access url | closed | creation date | description | elibrary creation | moderation | policy domain | owner | contact information | state | - | Überwaldean Land Eels | logo.png | banner.jpg | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | yes | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators | yes | Supplier exchange | Organisation example | Collection editorial | draft | + | title | logo | banner | abstract | access url | closed | creation date | description | content creation | moderation | policy domain | owner | contact information | state | + | Überwaldean Land Eels | logo.png | banner.jpg | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | yes | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators | yes | Supplier exchange | Organisation example | Collection editorial | draft | When I am logged in as a facilitator of the "Überwaldean Land Eels" collection And I go to the homepage of the "Überwaldean Land Eels" collection And I click "Edit" in the "Entity actions" region diff --git a/tests/features/collection/collection.moderation.feature b/tests/features/collection/collection.moderation.feature index 7ba5ed6dee..a079da4a8c 100644 --- a/tests/features/collection/collection.moderation.feature +++ b/tests/features/collection/collection.moderation.feature @@ -174,10 +174,11 @@ Feature: Collection moderation @terms @javascript Scenario: Moderate an open collection # Regression test for a bug that caused the slider that controls the - # eLibrary creation setting to revert to default state when the form is + # content creation setting to revert to default state when the form is # resubmitted, as happens during moderation. Ref. ISAICP-3200. - # Note that the eLibrary slider has been replaced with the Content creation - # radio buttons, but we are keeping the coverage for now. + # Note that this is an issue that affected the legacy eLibrary slider which + # has been replaced with the Content creation radio buttons, but we are + # keeping the coverage for now. Given I am logged in as a user with the "authenticated" role # Propose a collection, filling in the required fields. When I go to the propose collection form @@ -199,16 +200,17 @@ Feature: Collection moderation And I wait for AJAX to finish And I select the radio button "Any user can create content." - # Regression test for a bug that caused the eLibrary creation setting to be + # Regression test for a bug that caused the content creation setting to be # lost when adding an item to a multivalue field. Ref. ISAICP-3200. - # Note that the eLibrary slider has been replaced with the Content creation - # radio buttons, but we are keeping the coverage for now. + # Note that this is an issue that affected the legacy eLibrary slider which + # has been replaced with the Content creation radio buttons, but we are + # keeping the coverage for now. When I press "Add another item" at the "Geographical coverage" field And I wait for AJAX to finish Then the radio button "Any user can create content." from field "Content creation" should be selected # Submit the form and approve it as a moderator. This should not cause the - # eLibrary creation option to change. + # content creation option to change. When I press "Propose" Then I should see the heading "Spectres in fog" When I am logged in as a user with the "moderator" role @@ -217,7 +219,7 @@ Feature: Collection moderation And I click "Edit" in the "Entity actions" region And I click the "Additional fields" tab Then the radio button "Any user can create content." from field "Content creation" should be selected - # Also when saving and reopening the edit form the eLibrary creation option + # Also when saving and reopening the edit form the content creation option # should remain unchanged. When I press "Publish" And I open the header local tasks menu @@ -232,10 +234,11 @@ Feature: Collection moderation @terms @javascript Scenario: Changing Content creation value - regression #1 - # Regression test for a bug that happens when a change on the eLibrary + # Regression test for a bug that happens when a change on the content # creation setting happens after an ajax callback. - # Note that the eLibrary slider has been replaced with the Content creation - # radio buttons, but we are keeping the coverage for now. + # Note that this is an issue that affected the legacy eLibrary slider which + # has been replaced with the Content creation radio buttons, but we are + # keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I fill in the following: @@ -273,10 +276,10 @@ Feature: Collection moderation @terms @javascript Scenario: Changing Content creation value - regression #2 - # Regression test for a bug that causes the wrong eLibrary creation value + # Regression test for a bug that causes the wrong content creation value # to be saved after the "Closed collection" checkbox is checked. # Note that the "Closed collection" option no longer exists and that the - # eLibrary slider has been replaced with the Content creation radio + # legacy eLibrary slider has been replaced with the Content creation radio # buttons, but we are keeping the coverage for now. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature index 8a5e610050..525e9cbb18 100644 --- a/tests/features/collection/homepage.feature +++ b/tests/features/collection/homepage.feature @@ -25,16 +25,16 @@ Feature: Collection homepage | contact information | Kalikatoura | | logo | logo.png | | moderation | yes | - | elibrary creation | members | + | content creation | members | | state | validated | | policy domain | Employment and Support Allowance | And the following solution: - | title | Bilbo's book | - | collection | Middle earth daily | - | description | Bilbo's autobiography | - | elibrary creation | members | - | creation date | 2014-10-17 8:32am | - | state | validated | + | title | Bilbo's book | + | collection | Middle earth daily | + | description | Bilbo's autobiography | + | content creation | members | + | creation date | 2014-10-17 8:32am | + | state | validated | And the following collection user memberships: | collection | user | roles | | Middle earth daily | Frodo | facilitator | diff --git a/tests/features/collection/join-leave.feature b/tests/features/collection/join-leave.feature index 332064dbd0..8641ff5566 100644 --- a/tests/features/collection/join-leave.feature +++ b/tests/features/collection/join-leave.feature @@ -6,9 +6,9 @@ Feature: Joining and leaving collections through the web interface Scenario: Joining and leaving a collection Given collections: - | title | abstract | access url | closed | creation date | description | elibrary creation | moderation | state | - | Überwaldean Land Eels | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | no | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators | yes | validated | - | Folk Dance and Song Society | Cats are cool! | http://mashable.com/category/cats/ | yes | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | members | no | validated | + | title | abstract | access url | closed | creation date | description | content creation | moderation | state | + | Überwaldean Land Eels | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | no | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators | yes | validated | + | Folk Dance and Song Society | Cats are cool! | http://mashable.com/category/cats/ | yes | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | members | no | validated | And users: | Username | | Madame Sharn | diff --git a/tests/features/collection/propose.feature b/tests/features/collection/propose.feature index 37e6de8aa6..ea469a0ca1 100644 --- a/tests/features/collection/propose.feature +++ b/tests/features/collection/propose.feature @@ -106,7 +106,7 @@ Feature: Proposing a collection # vanished after performing an AJAX request in a different element on the # page. # See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-2589 - Scenario: E-library options should not vanish after AJAX request. + Scenario: Content creation options should not vanish after AJAX request. Given I am logged in as a user with the "authenticated" role When I go to the propose collection form And I click the "Additional fields" tab diff --git a/tests/features/community_content/notification.post_moderated.discussion.feature b/tests/features/community_content/notification.post_moderated.discussion.feature index 58628f24b4..bd63d713e6 100644 --- a/tests/features/community_content/notification.post_moderated.discussion.feature +++ b/tests/features/community_content/notification.post_moderated.discussion.feature @@ -12,8 +12,8 @@ Feature: Notification test for the discussion transitions on a post moderated pa | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | immediate | | CC member | | notify_member@test.com | CC | Member | immediate | And collections: - | title | state | elibrary creation | moderation | - | CC post collection | validated | members | no | + | title | state | content creation | moderation | + | CC post collection | validated | members | no | And the following collection user memberships: | collection | user | roles | | CC post collection | CC owner | owner | diff --git a/tests/features/community_content/notification.post_moderated.document.feature b/tests/features/community_content/notification.post_moderated.document.feature index ee197f9a20..3458148a0a 100644 --- a/tests/features/community_content/notification.post_moderated.document.feature +++ b/tests/features/community_content/notification.post_moderated.document.feature @@ -12,8 +12,8 @@ Feature: Notification test for the document transitions on a post moderated pare | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC post collection | validated | members | no | + | title | state | content creation | moderation | + | CC post collection | validated | members | no | And the following collection user memberships: | collection | user | roles | | CC post collection | CC owner | owner | diff --git a/tests/features/community_content/notification.post_moderated.event.feature b/tests/features/community_content/notification.post_moderated.event.feature index bf42055ca6..4d5d8ad9cc 100644 --- a/tests/features/community_content/notification.post_moderated.event.feature +++ b/tests/features/community_content/notification.post_moderated.event.feature @@ -12,8 +12,8 @@ Feature: Notification test for the event transitions on a post moderated parent. | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC post collection | validated | members | no | + | title | state | content creation | moderation | + | CC post collection | validated | members | no | And the following collection user memberships: | collection | user | roles | | CC post collection | CC owner | owner | diff --git a/tests/features/community_content/notification.post_moderated.news.feature b/tests/features/community_content/notification.post_moderated.news.feature index b928b0a570..5a37ea7275 100644 --- a/tests/features/community_content/notification.post_moderated.news.feature +++ b/tests/features/community_content/notification.post_moderated.news.feature @@ -12,8 +12,8 @@ Feature: Notification test for the news transitions on a post moderated parent. | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC post collection | validated | members | no | + | title | state | content creation | moderation | + | CC post collection | validated | members | no | And the following collection user memberships: | collection | user | roles | | CC post collection | CC owner | owner | diff --git a/tests/features/community_content/notification.pre_moderated.document.feature b/tests/features/community_content/notification.pre_moderated.document.feature index 4be1be91d1..df3ade6d9d 100644 --- a/tests/features/community_content/notification.pre_moderated.document.feature +++ b/tests/features/community_content/notification.pre_moderated.document.feature @@ -12,8 +12,8 @@ Feature: Notification test for the document transitions on a pre moderated paren | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC pre collection | validated | members | yes | + | title | state | content creation | moderation | + | CC pre collection | validated | members | yes | And the following collection user memberships: | collection | user | roles | | CC pre collection | CC owner | owner | diff --git a/tests/features/community_content/notification.pre_moderated.event.feature b/tests/features/community_content/notification.pre_moderated.event.feature index 0771aaa329..af5138a340 100644 --- a/tests/features/community_content/notification.pre_moderated.event.feature +++ b/tests/features/community_content/notification.pre_moderated.event.feature @@ -12,8 +12,8 @@ Feature: Notification test for the event transitions on a pre moderated parent. | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC pre collection | validated | members | yes | + | title | state | content creation | moderation | + | CC pre collection | validated | members | yes | And the following collection user memberships: | collection | user | roles | | CC pre collection | CC owner | owner | diff --git a/tests/features/community_content/notification.pre_moderated.news.feature b/tests/features/community_content/notification.pre_moderated.news.feature index d58c49434a..497d4da000 100644 --- a/tests/features/community_content/notification.pre_moderated.news.feature +++ b/tests/features/community_content/notification.pre_moderated.news.feature @@ -12,8 +12,8 @@ Feature: Notification test for the news transitions on a pre moderated parent. | CC facilitator | | notify_facilitator@test.com | CC | Facilitator | | CC member | | notify_member@test.com | CC | Member | And collections: - | title | state | elibrary creation | moderation | - | CC pre collection | validated | members | yes | + | title | state | content creation | moderation | + | CC pre collection | validated | members | yes | And the following collection user memberships: | collection | user | roles | | CC pre collection | CC owner | owner | diff --git a/tests/features/custom_page/api.feature b/tests/features/custom_page/api.feature index b27965c106..9c52268ec6 100644 --- a/tests/features/custom_page/api.feature +++ b/tests/features/custom_page/api.feature @@ -9,12 +9,12 @@ Feature: Custom page API | name | | Rufus Drumknott | And the following collection: - | title | Le Foie Heureux | - | owner | Rufus Drumknott | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Le Foie Heureux | + | owner | Rufus Drumknott | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And custom_page content: | title | body | collection | | Dummy page | This is some dummy content like foo:bar. | Le Foie Heureux | diff --git a/tests/features/joinup_core/unpublished_entities.feature b/tests/features/joinup_core/unpublished_entities.feature index 2a26d99cd0..967bf5e0a7 100644 --- a/tests/features/joinup_core/unpublished_entities.feature +++ b/tests/features/joinup_core/unpublished_entities.feature @@ -18,10 +18,10 @@ Feature: Unpublished content of the website | Brenda Day | | | Phillip Shaw | | And the following collections: - | title | description | state | elibrary creation | moderation | abstract | policy domain | owner | contact information | - | Invisible Boyfriend | Invisible Boyfriend | validated | members | no | Trusted host | Supplier exchange | Owner something | Published contact | - | Grey Swords | Invisible Boyfriend | proposed | members | no | Trusted host | Supplier exchange | Owner something | Published contact | - | Nothing of Slaves | Invisible Boyfriend | draft | members | no | Trusted host | Supplier exchange | Owner something | Published contact | + | title | description | state | content creation | moderation | abstract | policy domain | owner | contact information | + | Invisible Boyfriend | Invisible Boyfriend | validated | members | no | Trusted host | Supplier exchange | Owner something | Published contact | + | Grey Swords | Invisible Boyfriend | proposed | members | no | Trusted host | Supplier exchange | Owner something | Published contact | + | Nothing of Slaves | Invisible Boyfriend | draft | members | no | Trusted host | Supplier exchange | Owner something | Published contact | And the following collection user memberships: | collection | user | roles | | Invisible Boyfriend | Ed Abbott | authenticated | diff --git a/tests/features/joinup_discussion/discussion.moderation.feature b/tests/features/joinup_discussion/discussion.moderation.feature index 69eb3d2758..154379fa4e 100644 --- a/tests/features/joinup_discussion/discussion.moderation.feature +++ b/tests/features/joinup_discussion/discussion.moderation.feature @@ -10,11 +10,11 @@ Feature: Discussion moderation | Gabe Rogers | | Brigham Salvage | And the following collection: - | title | DIY collection | - | description | Collection of "Do it yourself" projects. | - | logo | logo.png | - | elibrary creation | members | - | state | validated | + | title | DIY collection | + | description | Collection of "Do it yourself" projects. | + | logo | logo.png | + | content creation | members | + | state | validated | And the following collection user membership: | collection | user | roles | | DIY collection | Gabe Rogers | member | @@ -94,11 +94,11 @@ Feature: Discussion moderation | Lance Rustici | lance.rustici@example.com | | Denny Winslow | denny.winslow@example.com | And the following collection: - | title | Valentine's day survival kit | - | description | How to survive the most scary day of the year. | - | logo | logo.png | - | elibrary creation | members | - | state | validated | + | title | Valentine's day survival kit | + | description | How to survive the most scary day of the year. | + | logo | logo.png | + | content creation | members | + | state | validated | And the following collection user membership: | collection | user | roles | | Valentine's day survival kit | Vince Rome | member | diff --git a/tests/features/joinup_document/api.feature b/tests/features/joinup_document/api.feature index bbadbdf518..0d5c242979 100644 --- a/tests/features/joinup_document/api.feature +++ b/tests/features/joinup_document/api.feature @@ -9,12 +9,12 @@ Feature: Document API | name | | Joinup Derp | And the following collection: - | title | Joinup document name | - | owner | Joinup Derp | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Joinup document name | + | owner | Joinup Derp | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And document content: | title | document type | short title | body | collection | | JD title | Document | Short | Dummy description. | Joinup document name | diff --git a/tests/features/joinup_document/document.moderation.feature b/tests/features/joinup_document/document.moderation.feature index 2a880d9593..6532688b97 100644 --- a/tests/features/joinup_document/document.moderation.feature +++ b/tests/features/joinup_document/document.moderation.feature @@ -33,10 +33,10 @@ Feature: Document moderation | The Naked Ashes | Kirk Collier | facilitator | @javascript - Scenario: Available transitions change per eLibrary and moderation settings. - # For post-moderated collections with eLibrary set to allow all users to - # create content, authenticated users that are not members can create - # documents. + Scenario: Available transitions change to match content creation and moderation settings. + # For post-moderated collections with content creation set to allow all + # users to create content, authenticated users that are not members can + # create documents. When I am logged in as "Crab y Patties" And I go to the homepage of the "The Naked Ashes" collection And I click "Add document" in the plus button menu diff --git a/tests/features/joinup_event/api.feature b/tests/features/joinup_event/api.feature index ebc3721bbe..f1952d7e1e 100644 --- a/tests/features/joinup_event/api.feature +++ b/tests/features/joinup_event/api.feature @@ -9,12 +9,12 @@ Feature: Event API | name | type | | Event Owner | Company | And the following collection: - | title | Le Event Heureux | - | owner | Event Owner | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Le Event Heureux | + | owner | Event Owner | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And event content: | title | short title | body | collection | start date | end date | | Dummy Event | Short | This is some dummy content like foo:bar. | Le Event Heureux | 2016-03-15T11:12:12 | 2016-03-15T11:12:12 | diff --git a/tests/features/joinup_event/event.moderation.feature b/tests/features/joinup_event/event.moderation.feature index bc018360d0..cd15884e39 100644 --- a/tests/features/joinup_event/event.moderation.feature +++ b/tests/features/joinup_event/event.moderation.feature @@ -21,7 +21,7 @@ Feature: Event moderation | description | The Forgotten Female. | | logo | logo.png | | banner | banner.jpg | - | elibrary creation | registered users | + | content creation | registered users | | moderation | no | | state | validated | | owner | Alma Lee | @@ -33,10 +33,10 @@ Feature: Event moderation | Wet Lords | Patricia Lynch | facilitator | @javascript - Scenario: Available transitions change per eLibrary and moderation settings. - # For post-moderated collections with eLibrary set to allow all users to - # create content, authenticated users that are not members can create - # events. + Scenario: Available transitions change to match content creation and moderation settings. + # For post-moderated collections with content creation set to allow all + # users to create content, authenticated users that are not members can + # create events. When I am logged in as "Salvador Thomas" And I go to the homepage of the "Wet Lords" collection And I click "Add event" in the plus button menu diff --git a/tests/features/joinup_news/api.feature b/tests/features/joinup_news/api.feature index c8cd183f2a..96d3fc65a3 100644 --- a/tests/features/joinup_news/api.feature +++ b/tests/features/joinup_news/api.feature @@ -9,12 +9,12 @@ Feature: News API | name | | Rufus Drumknott | And the following collection: - | title | Le Foie Heureux | - | owner | Rufus Drumknott | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Le Foie Heureux | + | owner | Rufus Drumknott | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And news content: | title | body | collection | | Dummy News | This is some dummy content like foo:bar. | Le Foie Heureux | diff --git a/tests/features/joinup_news/news_moderation.feature b/tests/features/joinup_news/news_moderation.feature index 117919a346..cc99acbf53 100644 --- a/tests/features/joinup_news/news_moderation.feature +++ b/tests/features/joinup_news/news_moderation.feature @@ -30,9 +30,9 @@ Feature: News moderation. | Mirror Master | mirrormirroronthewall@example.com | | | Metallo | kryptoniteEverywhere@example.com | | Given collections: - | title | moderation | state | elibrary creation | - | Justice League | no | validated | members | - | Legion of Doom | yes | validated | members | + | title | moderation | state | content creation | + | Justice League | no | validated | members | + | Legion of Doom | yes | validated | members | And the following collection user memberships: | collection | user | roles | | Justice League | Superman | owner | diff --git a/tests/features/rdf_entity_provenance/federated_entities.feature b/tests/features/rdf_entity_provenance/federated_entities.feature index 05f8ef410c..1fd18e595e 100644 --- a/tests/features/rdf_entity_provenance/federated_entities.feature +++ b/tests/features/rdf_entity_provenance/federated_entities.feature @@ -20,7 +20,7 @@ Feature: In order to avoid users changing federated values | moderation | yes | | owner | John Federator | | contact information | John Federator's contact | - | elibrary creation | facilitators | + | content creation | facilitators | | state | validated | And the following solution: | title | A federated solution | @@ -29,7 +29,7 @@ Feature: In order to avoid users changing federated values | owner | John Federator | | contact information | John Federator's contact | | documentation | text.pdf | - | elibrary creation | registered users | + | content creation | registered users | | landing page | http://foo-example.com/landing | | webdav creation | no | | webdav url | http://joinup.eu/solution/foo/webdav | @@ -76,10 +76,10 @@ Feature: In order to avoid users changing federated values And the following fields should not be disabled "" Examples: - | label | type | fields disabled | fields not disabled | - | A federated collection | collection | Title, Description, Contact information, Owner | Abstract, Access URL, Policy domain, Moderated, eLibrary creation, Motivation, Logo, Banner, Closed collection | - | A federated solution | solution | Title, Description, Contact information, Owner, Keywords, Related solutions, Status, Languages, Landing page | Policy domain, Moderated, eLibrary creation, Motivation, Logo, Banner, Metrics pager | - | A federated release | release | Name, Release number, Keywords, Status, Language | Motivation | - | A federated distribution | distribution | Title, Description, Access URL, Format, Status, Licence | | - | John Federator | owner | Name | | - | John Federator's contact | contact | E-mail address, Name, Website URL | | + | label | type | fields disabled | fields not disabled | + | A federated collection | collection | Title, Description, Contact information, Owner | Abstract, Access URL, Policy domain, Moderated, Content creation, Motivation, Logo, Banner, Closed collection | + | A federated solution | solution | Title, Description, Contact information, Owner, Keywords, Related solutions, Status, Languages, Landing page | Policy domain, Moderated, Content creation, Motivation, Logo, Banner, Metrics pager | + | A federated release | release | Name, Release number, Keywords, Status, Language | Motivation | + | A federated distribution | distribution | Title, Description, Access URL, Format, Status, Licence | | + | John Federator | owner | Name | | + | John Federator's contact | contact | E-mail address, Name, Website URL | | diff --git a/tests/features/solution/add_solution.feature b/tests/features/solution/add_solution.feature index 92c5149f5e..7c66bb0b7e 100644 --- a/tests/features/solution/add_solution.feature +++ b/tests/features/solution/add_solution.feature @@ -53,7 +53,7 @@ Feature: "Add solution" visibility options. Then I should see the heading "Add Solution" And the following fields should be present "Title, Description, Upload a new file or enter a URL, Logo, Banner, Name, E-mail address, Website URL" And the following fields should not be present "Groups audience, Other groups, Current workflow state, Langcode, Translation, Motivation" - # Regression test for ensuring that obsolete eLibrary value is removed. + # Regression test for ensuring that obsolete content creation value is removed. # @see: https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3567 And I should not see the text "Only members can create new content" And I should see the text "Only solution facilitators can create new content" diff --git a/tests/features/solution/api.feature b/tests/features/solution/api.feature index 03fe1c7378..17ef875456 100644 --- a/tests/features/solution/api.feature +++ b/tests/features/solution/api.feature @@ -6,39 +6,39 @@ Feature: Solution API Scenario: Programmatically create a solution Given the following collection: - | title | Solution API foo | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Solution API foo | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | My first solution | - | collection | Solution API foo | - | description | A sample solution | - | logo | logo.png | - | banner | banner.jpg | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | title | My first solution | + | collection | Solution API foo | + | description | A sample solution | + | logo | logo.png | + | banner | banner.jpg | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | Then I should have 1 solution Scenario: Programmatically create a solution using only the mandatory fields Given the following collection: - | title | Solution API bar | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Solution API bar | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And the following solution: - | title | My first solution mandatory | - | collection | Solution API bar | - | description | Another sample solution | - | elibrary creation | members | - | state | validated | + | title | My first solution mandatory | + | collection | Solution API bar | + | description | Another sample solution | + | content creation | members | + | state | validated | Then I should have 1 solution Scenario: Programmatically create a solution that is affiliated with a collection @@ -62,13 +62,13 @@ Feature: Solution API | Username | | Solution API user | And the following collection: - | title | This is a klm collection | - | logo | logo.png | - | banner | banner.jpg | - | moderation | no | - | closed | no | - | elibrary creation | facilitators | - | state | validated | + | title | This is a klm collection | + | logo | logo.png | + | banner | banner.jpg | + | moderation | no | + | closed | no | + | content creation | facilitators | + | state | validated | And the following collection user memberships: | user | collection | roles | | Solution API user | This is a klm collection | facilitator | diff --git a/tests/features/solution/homepage.feature b/tests/features/solution/homepage.feature index ba1cb26ce9..29132be24a 100644 --- a/tests/features/solution/homepage.feature +++ b/tests/features/solution/homepage.feature @@ -43,15 +43,15 @@ Feature: Solution homepage @terms Scenario: Custom pages should not be visible on the solution homepage Given the following solution: - | title | Jira restarters | - | description | Rebooting solves all issues | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | title | Jira restarters | + | description | Rebooting solves all issues | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | And news content: | title | body | solution | policy domain | spatial coverage | state | | Jira will be down for maintenance | As always, during business hours | Jira restarters | Statistics and Analysis | Luxembourg | validated | diff --git a/tests/features/solution/id_with_spaces.feature b/tests/features/solution/id_with_spaces.feature index f9e3e22a95..af0fdecd7a 100644 --- a/tests/features/solution/id_with_spaces.feature +++ b/tests/features/solution/id_with_spaces.feature @@ -6,28 +6,28 @@ Feature: Solution API Scenario: Programmatically create a solution Given the following solution: - | uri | http://example.com/this%20has%20spaces | - | title | Solution with spaces | - | description | A sample solution | - | logo | logo.png | - | banner | banner.jpg | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | uri | http://example.com/this%20has%20spaces | + | title | Solution with spaces | + | description | A sample solution | + | logo | logo.png | + | banner | banner.jpg | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | And the following solution: - | uri | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | - | title | Solution with unicode | - | description | A sample solution | - | logo | logo.png | - | banner | banner.jpg | - | documentation | text.pdf | - | elibrary creation | registered users | - | landing page | http://foo-example.com/landing | - | webdav creation | no | - | webdav url | http://joinup.eu/solution/foo/webdav | - | wiki | http://example.wiki/foobar/wiki | - | state | validated | + | uri | http://www.it-planungsrat.de/DE/Projekte/Koordinierungsprojekte/OsiP/Online_Sicherheitspr%C3%BCfung.html | + | title | Solution with unicode | + | description | A sample solution | + | logo | logo.png | + | banner | banner.jpg | + | documentation | text.pdf | + | content creation | registered users | + | landing page | http://foo-example.com/landing | + | webdav creation | no | + | webdav url | http://joinup.eu/solution/foo/webdav | + | wiki | http://example.wiki/foobar/wiki | + | state | validated | diff --git a/tests/features/solution/solution.edit.feature b/tests/features/solution/solution.edit.feature index 8618d0b05a..03bbf6a375 100644 --- a/tests/features/solution/solution.edit.feature +++ b/tests/features/solution/solution.edit.feature @@ -61,10 +61,10 @@ Feature: Solution editing. When I go to the "Solution A" solution edit form Then I should see the heading "Edit Solution Solution A" Then the fields "Logo, Banner, Upload a new file or enter a URL, Geographical coverage, Keywords, Related Solutions, Status, Languages, Landing page, Metrics page" should be correctly ordered in the region "Management solution vertical tab" - Then the fields "Title, Description, Contact information, Policy domain, Owner, Solution type, Moderated, eLibrary creation" should be correctly ordered in the region "Main solution vertical tab" + Then the fields "Title, Description, Contact information, Policy domain, Owner, Solution type, Moderated, Content creation" should be correctly ordered in the region "Main solution vertical tab" And the following fields should not be present "Issue tracker, Wiki, Langcode, Translation" - And the following fieldsets should be present "Contact information, Owner, eLibrary creation" + And the following fieldsets should be present "Contact information, Owner, Content creation" # Logo and banner fields are required, so they are filled up during # the creation of the solution. Unfortunately, file fields with a file # already attached cannot be found by named xpath, so we look for the diff --git a/tests/features/video/api.feature b/tests/features/video/api.feature index 90c086376e..f980428437 100644 --- a/tests/features/video/api.feature +++ b/tests/features/video/api.feature @@ -11,12 +11,12 @@ Feature: Video API | name | | Video editor | And the following : - | title | Video library | - | owner | Video editor | - | logo | logo.png | - | moderation | yes | - | elibrary creation | facilitators | - | state | validated | + | title | Video library | + | owner | Video editor | + | logo | logo.png | + | moderation | yes | + | content creation | facilitators | + | state | validated | And video content: | title | body | field_video | og_audience | | Dummy Video | Dummy text. | https://www.youtube.com/watch?v=uLcS7uIlqPo | Video library | diff --git a/tests/fixtures/files/single_solution_valid_adms.rdf b/tests/fixtures/files/single_solution_valid_adms.rdf index ea360675ed..850dd4ec3b 100644 --- a/tests/fixtures/files/single_solution_valid_adms.rdf +++ b/tests/fixtures/files/single_solution_valid_adms.rdf @@ -4,7 +4,7 @@ After import, the following properties need to be taken care of: Solution: - Title. This is a federated property but there have been cases that it is missing. - - eLibrary creation + - Content creation - Logo - Banner - Moderation diff --git a/tests/fixtures/files/valid_adms.rdf b/tests/fixtures/files/valid_adms.rdf index 3440517743..80ef079375 100644 --- a/tests/fixtures/files/valid_adms.rdf +++ b/tests/fixtures/files/valid_adms.rdf @@ -4,7 +4,7 @@ After import, the following properties need to be taken care of: Solution: - Title. This is a federated property but there have been cases that it is missing. - - eLibrary creation + - Content creation - Logo - Banner - Moderation diff --git a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_moderation.yml b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_moderation.yml index 28dfe27f6c..bca6695a27 100644 --- a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_moderation.yml +++ b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_moderation.yml @@ -9,7 +9,7 @@ field_name: field_ar_moderation entity_type: rdf_entity bundle: collection label: Moderation -description: 'If checked, eLibrary items (news, events, and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' +description: 'If checked, community content items (news, events, discussions and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' required: false translatable: false default_value: diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/camss.json b/web/modules/custom/demo_content/content/rdf_entity/collection/camss.json index 56513bcaa1..e2607351ad 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/camss.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/camss.json @@ -145,9 +145,9 @@ "format": "content_editor" } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/nifo.json b/web/modules/custom/demo_content/content/rdf_entity/collection/nifo.json index 3ffaf8502b..6e7c010b70 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/nifo.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/nifo.json @@ -139,9 +139,9 @@ "format": "content_editor" } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/open-source-observatory.json b/web/modules/custom/demo_content/content/rdf_entity/collection/open-source-observatory.json index c2c251a802..ec8e337aad 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/open-source-observatory.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/open-source-observatory.json @@ -145,9 +145,9 @@ "format": "content_editor" } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/semic.json b/web/modules/custom/demo_content/content/rdf_entity/collection/semic.json index f55cb2d5ee..a07b2e4ef4 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/semic.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/semic.json @@ -266,9 +266,9 @@ "format": "content_editor" } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/some_federated_collection.json b/web/modules/custom/demo_content/content/rdf_entity/collection/some_federated_collection.json index e0e2a5d78d..4a615c963e 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/some_federated_collection.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/some_federated_collection.json @@ -210,9 +210,9 @@ "value": false } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": 0 + "value": "only_facilitators" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/collection/tallinn.json b/web/modules/custom/demo_content/content/rdf_entity/collection/tallinn.json index e0d41be6e4..75934eed4c 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/collection/tallinn.json +++ b/web/modules/custom/demo_content/content/rdf_entity/collection/tallinn.json @@ -328,9 +328,9 @@ "lang": "en" } ], - "field_ar_elibrary_creation": [ + "field_ar_content_creation": [ { - "value": 1 + "value": "only_members" } ], "field_ar_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/a_federated_solution.json b/web/modules/custom/demo_content/content/rdf_entity/solution/a_federated_solution.json index db36e180fe..2f6751fdc9 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/a_federated_solution.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/a_federated_solution.json @@ -224,9 +224,9 @@ "lang": "en" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": 2 + "value": "any_user" } ], "field_is_landing_page": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/core-person-vocab.json b/web/modules/custom/demo_content/content/rdf_entity/solution/core-person-vocab.json index ffdbdcba2e..5ad0c25795 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/core-person-vocab.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/core-person-vocab.json @@ -277,9 +277,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_is_landing_page": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_blacklisted.json b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_blacklisted.json index 1b6407e1e0..f5b77c6ed0 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_blacklisted.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_blacklisted.json @@ -223,9 +223,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "0" + "value": "only_facilitators" } ], "field_is_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_draft.json b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_draft.json index f79ceee425..ea2a93347e 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_draft.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_draft.json @@ -223,9 +223,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "0" + "value": "only_facilitators" } ], "field_is_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_needs_update.json b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_needs_update.json index e5bb33dea6..ea5040c8d5 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_needs_update.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_needs_update.json @@ -223,9 +223,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "0" + "value": "only_facilitators" } ], "field_is_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_proposed.json b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_proposed.json index 26c360ec8e..17e3b2d0f6 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_proposed.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_proposed.json @@ -223,9 +223,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "0" + "value": "only_facilitators" } ], "field_is_moderation": [ diff --git a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_validated.json b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_validated.json index 97d6bd1777..01d53db13e 100644 --- a/web/modules/custom/demo_content/content/rdf_entity/solution/solution_validated.json +++ b/web/modules/custom/demo_content/content/rdf_entity/solution/solution_validated.json @@ -223,9 +223,9 @@ "format": "content_editor" } ], - "field_is_elibrary_creation": [ + "field_is_content_creation": [ { - "value": "1" + "value": "only_members" } ], "field_is_moderation": [ diff --git a/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_moderation.yml b/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_moderation.yml index b3269d55af..d9e13e81d4 100644 --- a/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_moderation.yml +++ b/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_moderation.yml @@ -9,7 +9,7 @@ field_name: field_is_moderation entity_type: rdf_entity bundle: solution label: Moderation -description: 'If checked, eLibrary items (news, events, and documents) are pre-moderated: they have to be validated by the moderators of the collection before they will be published.' +description: 'If checked, community content items (news, events, discussions and documents) are pre-moderated: they have to be validated by the moderators of the solution before they will be published.' required: false translatable: false default_value: diff --git a/web/modules/custom/solution/solution.behat.inc b/web/modules/custom/solution/solution.behat.inc index 34d88587eb..32b317c388 100644 --- a/web/modules/custom/solution/solution.behat.inc +++ b/web/modules/custom/solution/solution.behat.inc @@ -25,6 +25,7 @@ use Drupal\joinup\Traits\SearchTrait; use Drupal\joinup\Traits\TraversingTrait; use Drupal\joinup\Traits\UtilityTrait; use Drupal\joinup\Traits\WorkflowTrait; +use Drupal\joinup_group\ContentCreationOptions; use Drupal\language\Entity\ConfigurableLanguage; use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\og\OgRoleInterface; @@ -126,12 +127,12 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex * * Table format: * @codingStandardsIgnoreStart - * | title | description | state | documentation | closed | creation date | elibrary creation | featured | moderation | modification date | landing page | webdav creation | webdav url | wiki | - * | Foo solution | This is a foo solution | draft|proposed|validated|deletion request|needs update|blacklisted | text.pdf | yes | 28-01-1995 12:05 | no | yes | yes | | http://foo-url-example.com | yes | http://joinup.eu/foo/webdav | http://foo-wiki-example.com | - * | Bar solution | This is a bar solution | validated | text.pdf | no | 28-01-1995 12:06 | yes | no | no | | http://bar-url-example.com | no | | http://bar-wiki-example.com | + * | title | description | state | documentation | closed | creation date | content creation | featured | moderation | modification date | landing page | webdav creation | webdav url | wiki | + * | Foo solution | This is a foo solution | draft|proposed|validated|deletion request|needs update|blacklisted | text.pdf | yes | 28-01-1995 12:05 | no | yes | yes | | http://foo-url-example.com | yes | http://joinup.eu/foo/webdav | http://foo-wiki-example.com | + * | Bar solution | This is a bar solution | validated | text.pdf | no | 28-01-1995 12:06 | yes | no | no | | http://bar-url-example.com | no | | http://bar-wiki-example.com | * @codingStandardsIgnoreEnd * - * Fields title, description, state and elibrary creation are mandatory. + * Fields title, description, state and content creation are mandatory. * * @param \Behat\Gherkin\Node\TableNode $solution_table * The solution data. @@ -177,7 +178,7 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex * | collection | Example collection | * | contact information | Grahame Paterson, Aulay MacFarlane | * | documentation | text.pdf | - * | elibrary creation | facilitators|members|registered users | + * | content creation | facilitators|members|registered users | * | featured | yes|no | * | landing page | http://example.com/foobar/landing | * | language | Greek, German | @@ -525,10 +526,10 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex 'affiliations requests' => 'field_is_affiliations_requests', 'banner' => 'field_is_banner', 'contact information' => 'field_is_contact_information', + 'content creation' => 'field_is_content_creation', 'creation date' => 'created', 'description' => 'field_is_description', 'documentation' => 'field_is_documentation', - 'elibrary creation' => 'field_is_elibrary_creation', 'keywords' => 'field_keywords', 'landing page' => 'field_is_landing_page', 'language' => 'field_is_language', @@ -575,10 +576,10 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex protected function convertValueAliases(array $fields) { $mapped_values = [ 'field_is_moderation' => ['no' => 0, 'yes' => 1], - 'field_is_elibrary_creation' => [ - 'facilitators' => 0, - 'members' => 1, - 'registered users' => 2, + 'field_is_content_creation' => [ + 'facilitators' => ContentCreationOptions::FACILITATORS, + 'members' => ContentCreationOptions::MEMBERS, + 'registered users' => ContentCreationOptions::REGISTERED_USERS, ], 'field_is_webdav_creation' => ['no' => 0, 'yes' => 1], 'field_is_state' => [ diff --git a/web/profiles/joinup/src/Plugin/Block/AddContentBlock.php b/web/profiles/joinup/src/Plugin/Block/AddContentBlock.php index 9e9c09c7b5..53ccfbacfb 100644 --- a/web/profiles/joinup/src/Plugin/Block/AddContentBlock.php +++ b/web/profiles/joinup/src/Plugin/Block/AddContentBlock.php @@ -216,7 +216,7 @@ public function build() { public function getCacheTags() { // We need to invalidate the cache whenever the parent group changes since // the available options in the add content block depend on certain settings - // of the parent collection, such as the workflow status and the eLibrary + // of the parent collection, such as the workflow status and the content // creation option. /** @var \Drupal\rdf_entity\RdfInterface $group */ $group = $this->getContext('og')->getContextValue(); From bc36cc8f511d67d45bac4a4b6a4d0c28df0d9a73 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 16:47:18 +0200 Subject: [PATCH 171/957] ISAICP-5671: Create the Content Creation field for solutions. --- ...rm_display.rdf_entity.solution.default.yml | 35 +++++---- ...view_display.rdf_entity.solution.about.yml | 20 ++--- ...ew_display.rdf_entity.solution.default.yml | 2 + ...splay.rdf_entity.solution.group_header.yml | 2 + ..._display.rdf_entity.solution.rdf_draft.yml | 71 +++++++++-------- ...rdf_entity.solution.view_mode_featured.yml | 2 + ...lay.rdf_entity.solution.view_mode_tile.yml | 2 + ...ity.solution.field_is_content_creation.yml | 23 ++++++ ...e.rdf_entity.field_is_content_creation.yml | 34 ++++++++ ...rm_display.rdf_entity.solution.default.yml | 37 +++++---- ...view_display.rdf_entity.solution.about.yml | 32 +++++--- ...ew_display.rdf_entity.solution.default.yml | 20 ++++- ...splay.rdf_entity.solution.group_header.yml | 11 ++- ..._display.rdf_entity.solution.rdf_draft.yml | 78 ++++++++++--------- ...rdf_entity.solution.view_mode_featured.yml | 13 +++- ...lay.rdf_entity.solution.view_mode_tile.yml | 13 +++- ...ity.solution.field_is_content_creation.yml | 22 ++++++ ...e.rdf_entity.field_is_content_creation.yml | 33 ++++++++ web/modules/custom/solution/solution.info.yml | 2 + 19 files changed, 321 insertions(+), 131 deletions(-) create mode 100644 config/sync/field.field.rdf_entity.solution.field_is_content_creation.yml create mode 100644 config/sync/field.storage.rdf_entity.field_is_content_creation.yml create mode 100644 web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_content_creation.yml create mode 100644 web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml diff --git a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml index db756d0b15..e8f9d6c32a 100644 --- a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -26,6 +27,7 @@ dependencies: - field.field.rdf_entity.solution.field_is_pinned_in - 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 @@ -77,7 +79,7 @@ third_party_settings: - field_is_owner - field_is_solution_type - field_is_moderation - - field_is_elibrary_creation + - field_is_content_creation - field_is_test_resource_type - field_is_actor - field_is_business_process @@ -128,7 +130,7 @@ mode: default content: current_workflow_state: type: current_workflow_state_widget - weight: 14 + weight: 15 region: content settings: title: 'Current workflow state' @@ -137,7 +139,7 @@ content: third_party_settings: { } field_is_actor: type: options_select - weight: 10 + weight: 11 region: content settings: { } third_party_settings: { } @@ -151,7 +153,7 @@ content: region: content field_is_business_process: type: entity_reference_autocomplete - weight: 11 + weight: 12 region: content settings: match_operator: CONTAINS @@ -173,8 +175,15 @@ content: collapsed: false allow_existing: false allow_duplicate: false + revision: false third_party_settings: { } region: content + field_is_content_creation: + weight: 9 + settings: { } + third_party_settings: { } + type: options_buttons + region: content field_is_description: weight: 2 settings: @@ -194,12 +203,6 @@ content: third_party_settings: { } type: file_url_generic region: content - field_is_elibrary_creation: - weight: 8 - settings: { } - third_party_settings: { } - type: options_buttons - region: content field_is_landing_page: weight: 13 settings: @@ -251,11 +254,12 @@ content: collapsible: false collapsed: false allow_duplicate: false + revision: false third_party_settings: { } region: content field_is_product_type: type: entity_reference_autocomplete - weight: 12 + weight: 13 region: content settings: match_operator: CONTAINS @@ -288,20 +292,20 @@ content: region: content field_is_standardization_level: type: options_select - weight: 13 + weight: 14 region: content settings: { } third_party_settings: { } field_is_state: type: state_machine_buttons - weight: 15 + weight: 16 settings: use_transition_label: 1 third_party_settings: { } region: content field_is_test_resource_type: type: options_select - weight: 9 + weight: 10 region: content settings: { } third_party_settings: { } @@ -344,7 +348,7 @@ content: third_party_settings: { } region: content transition_motivation: - weight: 16 + weight: 17 region: content settings: { } third_party_settings: { } @@ -353,6 +357,7 @@ hidden: field_is_affiliations_requests: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml index d2ab1be9a7..1a8b976adb 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -75,7 +76,7 @@ third_party_settings: label: Categorisation group_moderation: children: - - field_is_elibrary_creation + - field_is_content_creation - field_is_moderation parent_name: '' weight: 5 @@ -196,6 +197,13 @@ content: template_suggestion: two_columns type: entity_reference_entity_view region: content + field_is_content_creation: + type: list_default + weight: 20 + region: content + label: hidden + settings: { } + third_party_settings: { } field_is_description: type: text_default weight: 0 @@ -213,15 +221,6 @@ content: third_party_settings: joinup: template_suggestion: fieldset - field_is_elibrary_creation: - type: list_default - weight: 19 - region: content - label: hidden - settings: { } - third_party_settings: - joinup: - template_suggestion: fieldset field_is_landing_page: type: link_separate weight: 0 @@ -347,6 +346,7 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml index 442bc91f8a..7b5b069648 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -143,6 +144,7 @@ hidden: field_is_banner: true field_is_business_process: true field_is_contact_information: true + field_is_content_creation: true field_is_distribution: true field_is_documentation: true field_is_elibrary_creation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml index af937793f1..8fb9734931 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -109,6 +110,7 @@ hidden: field_is_business_process: true field_is_contact_information: true field_is_content: true + field_is_content_creation: true field_is_description: true field_is_distribution: true field_is_documentation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml index 097e191b25..4386e493f5 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -26,6 +27,7 @@ dependencies: - field.field.rdf_entity.solution.field_is_pinned_in - 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 @@ -56,7 +58,7 @@ bundle: solution mode: rdf_draft content: field_is_actor: - weight: 31 + weight: 23 label: above settings: link: true @@ -64,7 +66,7 @@ content: type: entity_reference_label region: content field_is_business_process: - weight: 32 + weight: 24 label: above settings: link: true @@ -72,37 +74,37 @@ content: type: entity_reference_label region: content field_is_contact_information: - weight: 6 + weight: 2 label: above settings: link: true third_party_settings: { } type: entity_reference_label region: content + field_is_content_creation: + type: list_default + weight: 11 + region: content + label: above + settings: { } + third_party_settings: { } field_is_description: - weight: 2 + weight: 1 label: hidden settings: { } third_party_settings: { } type: text_default region: content field_is_documentation: - weight: 37 + weight: 27 label: above settings: mode: link third_party_settings: { } type: file_url_default region: content - field_is_elibrary_creation: - weight: 16 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_is_included_asset: - weight: 11 + weight: 6 label: above settings: link: true @@ -110,7 +112,7 @@ content: type: entity_reference_label region: content field_is_issue_tracker: - weight: 22 + weight: 17 label: above settings: trim_length: 80 @@ -122,7 +124,7 @@ content: type: link region: content field_is_landing_page: - weight: 20 + weight: 15 label: above settings: trim_length: 80 @@ -134,7 +136,7 @@ content: type: link region: content field_is_language: - weight: 15 + weight: 10 label: above settings: link: true @@ -142,7 +144,7 @@ content: type: entity_reference_label region: content field_is_metrics_page: - weight: 21 + weight: 16 label: above settings: trim_length: 80 @@ -154,7 +156,7 @@ content: type: link region: content field_is_moderation: - weight: 17 + weight: 12 label: above settings: format: default @@ -164,7 +166,7 @@ content: type: boolean region: content field_is_owner: - weight: 7 + weight: 3 label: above settings: link: true @@ -172,7 +174,7 @@ content: type: entity_reference_label region: content field_is_product_type: - weight: 33 + weight: 25 label: above settings: link: true @@ -180,7 +182,7 @@ content: type: entity_reference_label region: content field_is_solution_type: - weight: 10 + weight: 5 label: above settings: link: true @@ -188,7 +190,7 @@ content: type: entity_reference_label region: content field_is_source_code_repository: - weight: 24 + weight: 19 label: above settings: trim_length: 80 @@ -200,7 +202,7 @@ content: type: link region: content field_is_standardization_level: - weight: 34 + weight: 26 label: above settings: link: true @@ -208,7 +210,7 @@ content: type: entity_reference_label region: content field_is_test_resource_type: - weight: 30 + weight: 22 label: above settings: link: true @@ -216,7 +218,7 @@ content: type: entity_reference_label region: content field_is_translation: - weight: 12 + weight: 7 label: above settings: link: true @@ -224,7 +226,7 @@ content: type: entity_reference_label region: content field_is_version: - weight: 29 + weight: 21 label: above settings: link_to_entity: false @@ -232,7 +234,7 @@ content: type: string region: content field_is_webdav_creation: - weight: 18 + weight: 13 label: above settings: format: default @@ -242,7 +244,7 @@ content: type: boolean region: content field_is_webdav_url: - weight: 19 + weight: 14 label: above settings: trim_length: 80 @@ -254,7 +256,7 @@ content: type: link region: content field_is_wiki: - weight: 23 + weight: 18 label: above settings: trim_length: 80 @@ -266,7 +268,7 @@ content: type: link region: content field_keywords: - weight: 13 + weight: 8 label: above settings: link_to_entity: false @@ -274,7 +276,7 @@ content: type: string region: content field_policy_domain: - weight: 26 + weight: 20 label: above settings: link: true @@ -282,7 +284,7 @@ content: type: entity_reference_label region: content field_spatial_coverage: - weight: 9 + weight: 4 label: above settings: link: true @@ -290,7 +292,7 @@ content: type: entity_reference_label region: content field_status: - weight: 14 + weight: 9 label: above settings: link: true @@ -300,7 +302,7 @@ content: label: label: hidden type: string - weight: 1 + weight: 0 settings: link_to_entity: false third_party_settings: { } @@ -314,6 +316,7 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_logo: true field_is_pinned_in: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml index 7041d1a0d4..f333b9841e 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -108,6 +109,7 @@ hidden: 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_elibrary_creation: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml index c76f8afd37..9fab6bb9d4 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml @@ -10,6 +10,7 @@ dependencies: - 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 @@ -108,6 +109,7 @@ hidden: 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_elibrary_creation: true diff --git a/config/sync/field.field.rdf_entity.solution.field_is_content_creation.yml b/config/sync/field.field.rdf_entity.solution.field_is_content_creation.yml new file mode 100644 index 0000000000..7a451ab36f --- /dev/null +++ b/config/sync/field.field.rdf_entity.solution.field_is_content_creation.yml @@ -0,0 +1,23 @@ +uuid: b8b0395f-22f6-494a-8e93-063d16a61461 +langcode: en +status: true +dependencies: + config: + - field.storage.rdf_entity.field_is_content_creation + - rdf_entity.rdfentity.solution + module: + - options +id: rdf_entity.solution.field_is_content_creation +field_name: field_is_content_creation +entity_type: rdf_entity +bundle: solution +label: 'Content creation' +description: 'Choose which users can create content (news, events, discussions and documents) in the solution.' +required: true +translatable: false +default_value: + - + value: only_facilitators +default_value_callback: '' +settings: { } +field_type: list_string diff --git a/config/sync/field.storage.rdf_entity.field_is_content_creation.yml b/config/sync/field.storage.rdf_entity.field_is_content_creation.yml new file mode 100644 index 0000000000..f507d9d2c0 --- /dev/null +++ b/config/sync/field.storage.rdf_entity.field_is_content_creation.yml @@ -0,0 +1,34 @@ +uuid: 63386ed8-0326-4575-b2b8-de96bbea3bcd +langcode: en +status: true +dependencies: + module: + - options + - rdf_entity + - sparql_entity_storage +third_party_settings: + sparql_entity_storage: + mapping: + value: + predicate: 'http://joinup.eu/collection/content_creation' + format: literal +id: rdf_entity.field_is_content_creation +field_name: field_is_content_creation +entity_type: rdf_entity +type: list_string +settings: + allowed_values: + - + value: any_user + label: 'Any user can create content.' + - + value: only_facilitators + label: 'Only facilitators can create content.' + allowed_values_function: '' +module: options +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml b/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml index 7ed3cd32ff..6678b411ff 100644 --- a/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml +++ b/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -76,7 +78,7 @@ third_party_settings: - field_is_owner - field_is_solution_type - field_is_moderation - - field_is_elibrary_creation + - field_is_content_creation - field_is_test_resource_type - field_is_actor - field_is_business_process @@ -127,7 +129,7 @@ mode: default content: current_workflow_state: type: current_workflow_state_widget - weight: 14 + weight: 15 region: content settings: title: 'Current workflow state' @@ -136,7 +138,7 @@ content: third_party_settings: { } field_is_actor: type: options_select - weight: 10 + weight: 11 region: content settings: { } third_party_settings: { } @@ -150,7 +152,7 @@ content: region: content field_is_business_process: type: entity_reference_autocomplete - weight: 11 + weight: 12 region: content settings: match_operator: CONTAINS @@ -172,8 +174,15 @@ content: collapsed: false allow_existing: false allow_duplicate: false + revision: false third_party_settings: { } region: content + field_is_content_creation: + weight: 9 + settings: { } + third_party_settings: { } + type: options_buttons + region: content field_is_description: weight: 2 settings: @@ -193,12 +202,6 @@ content: third_party_settings: { } type: file_url_generic region: content - field_is_elibrary_creation: - weight: 8 - settings: { } - third_party_settings: { } - type: options_buttons - region: content field_is_landing_page: weight: 13 settings: @@ -250,11 +253,12 @@ content: collapsible: false collapsed: false allow_duplicate: false + revision: false third_party_settings: { } region: content field_is_product_type: type: entity_reference_autocomplete - weight: 12 + weight: 13 region: content settings: match_operator: CONTAINS @@ -287,20 +291,20 @@ content: region: content field_is_standardization_level: type: options_select - weight: 13 + weight: 14 region: content settings: { } third_party_settings: { } field_is_state: type: state_machine_buttons - weight: 15 + weight: 16 settings: use_transition_label: 1 third_party_settings: { } region: content field_is_test_resource_type: type: options_select - weight: 9 + weight: 10 region: content settings: { } third_party_settings: { } @@ -343,7 +347,7 @@ content: third_party_settings: { } region: content transition_motivation: - weight: 16 + weight: 17 region: content settings: { } third_party_settings: { } @@ -352,6 +356,7 @@ hidden: field_is_affiliations_requests: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml index 2ac2eb3200..0b0d5731b2 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -46,6 +48,7 @@ dependencies: module: - field_group - file_url + - joinup - link - options - text @@ -72,7 +75,7 @@ third_party_settings: label: Categorisation group_moderation: children: - - field_is_elibrary_creation + - field_is_content_creation - field_is_moderation parent_name: '' weight: 5 @@ -193,6 +196,13 @@ content: template_suggestion: two_columns type: entity_reference_entity_view region: content + field_is_content_creation: + type: list_default + weight: 20 + region: content + label: hidden + settings: { } + third_party_settings: { } field_is_description: type: text_default weight: 0 @@ -210,15 +220,6 @@ content: third_party_settings: joinup: template_suggestion: fieldset - field_is_elibrary_creation: - type: list_default - weight: 19 - region: content - label: hidden - settings: { } - third_party_settings: - joinup: - template_suggestion: fieldset field_is_landing_page: type: link_separate weight: 0 @@ -330,6 +331,11 @@ content: third_party_settings: joinup: template_suggestion: fieldset + share_link: + weight: 7 + region: content + settings: { } + third_party_settings: { } hidden: changed: true collections: true @@ -339,13 +345,15 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true field_is_logo: true field_is_pinned_in: true - field_is_show_eira_related: true field_is_related_solutions: true + field_is_shared_in: true + field_is_show_eira_related: true field_is_source_code_repository: true field_is_state: true field_is_translation: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml index aa99c8f158..f117506c70 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml @@ -8,6 +8,7 @@ dependencies: - 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 @@ -23,8 +24,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -44,6 +46,7 @@ dependencies: - rdf_entity.rdfentity.solution module: - field_group + - joinup - search_api_field - smart_trim - user @@ -99,6 +102,17 @@ content: third_party_settings: joinup: template_suggestion: p_wrapper + field_is_shared_in: + type: entity_reference_entity_view + weight: 5 + region: content + label: above + settings: + view_mode: view_mode_tile + link: false + third_party_settings: + joinup: + template_suggestion: entity_reference__listing_tile rdf_entity_field_is_content_inline_facets: weight: 2 region: content @@ -129,6 +143,7 @@ hidden: field_is_banner: true field_is_business_process: true field_is_contact_information: true + field_is_content_creation: true field_is_distribution: true field_is_documentation: true field_is_elibrary_creation: true @@ -143,8 +158,8 @@ hidden: field_is_owner: true field_is_pinned_in: true field_is_product_type: true - field_is_show_eira_related: true field_is_related_solutions: true + field_is_show_eira_related: true field_is_solution_type: true field_is_source_code_repository: true field_is_standardization_level: true @@ -165,3 +180,4 @@ hidden: langcode: true og_group: true releases_overview: true + share_link: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml index 492e77bd71..4a18ee2ce0 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -47,6 +49,7 @@ dependencies: - rdf_entity.rdfentity.solution module: - image + - joinup - joinup_core - user id: rdf_entity.solution.group_header @@ -106,6 +109,7 @@ hidden: field_is_business_process: true field_is_contact_information: true field_is_content: true + field_is_content_creation: true field_is_description: true field_is_distribution: true field_is_documentation: true @@ -120,8 +124,9 @@ hidden: field_is_owner: true field_is_pinned_in: true field_is_product_type: true - field_is_show_eira_related: 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 @@ -142,4 +147,6 @@ hidden: og_group: true rdf_entity_field_is_content_inline_facets: true rdf_entity_field_is_content_top: true + read_more: true related_solutions: true + share_link: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml index dac9acd295..67af8a12ef 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -55,7 +57,7 @@ bundle: solution mode: rdf_draft content: field_is_actor: - weight: 31 + weight: 23 label: above settings: link: true @@ -63,7 +65,7 @@ content: type: entity_reference_label region: content field_is_business_process: - weight: 32 + weight: 24 label: above settings: link: true @@ -71,37 +73,37 @@ content: type: entity_reference_label region: content field_is_contact_information: - weight: 6 + weight: 2 label: above settings: link: true third_party_settings: { } type: entity_reference_label region: content + field_is_content_creation: + type: list_default + weight: 11 + region: content + label: above + settings: { } + third_party_settings: { } field_is_description: - weight: 2 + weight: 1 label: hidden settings: { } third_party_settings: { } type: text_default region: content field_is_documentation: - weight: 37 + weight: 27 label: above settings: mode: link third_party_settings: { } type: file_url_default region: content - field_is_elibrary_creation: - weight: 16 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_is_included_asset: - weight: 11 + weight: 6 label: above settings: link: true @@ -109,7 +111,7 @@ content: type: entity_reference_label region: content field_is_issue_tracker: - weight: 22 + weight: 17 label: above settings: trim_length: 80 @@ -121,7 +123,7 @@ content: type: link region: content field_is_landing_page: - weight: 20 + weight: 15 label: above settings: trim_length: 80 @@ -133,7 +135,7 @@ content: type: link region: content field_is_language: - weight: 15 + weight: 10 label: above settings: link: true @@ -141,7 +143,7 @@ content: type: entity_reference_label region: content field_is_metrics_page: - weight: 21 + weight: 16 label: above settings: trim_length: 80 @@ -153,7 +155,7 @@ content: type: link region: content field_is_moderation: - weight: 17 + weight: 12 label: above settings: format: default @@ -163,7 +165,7 @@ content: type: boolean region: content field_is_owner: - weight: 7 + weight: 3 label: above settings: link: true @@ -171,7 +173,7 @@ content: type: entity_reference_label region: content field_is_product_type: - weight: 33 + weight: 25 label: above settings: link: true @@ -179,7 +181,7 @@ content: type: entity_reference_label region: content field_is_solution_type: - weight: 10 + weight: 5 label: above settings: link: true @@ -187,7 +189,7 @@ content: type: entity_reference_label region: content field_is_source_code_repository: - weight: 24 + weight: 19 label: above settings: trim_length: 80 @@ -199,7 +201,7 @@ content: type: link region: content field_is_standardization_level: - weight: 34 + weight: 26 label: above settings: link: true @@ -207,7 +209,7 @@ content: type: entity_reference_label region: content field_is_test_resource_type: - weight: 30 + weight: 22 label: above settings: link: true @@ -215,7 +217,7 @@ content: type: entity_reference_label region: content field_is_translation: - weight: 12 + weight: 7 label: above settings: link: true @@ -223,7 +225,7 @@ content: type: entity_reference_label region: content field_is_version: - weight: 29 + weight: 21 label: above settings: link_to_entity: false @@ -231,7 +233,7 @@ content: type: string region: content field_is_webdav_creation: - weight: 18 + weight: 13 label: above settings: format: default @@ -241,7 +243,7 @@ content: type: boolean region: content field_is_webdav_url: - weight: 19 + weight: 14 label: above settings: trim_length: 80 @@ -253,7 +255,7 @@ content: type: link region: content field_is_wiki: - weight: 23 + weight: 18 label: above settings: trim_length: 80 @@ -265,7 +267,7 @@ content: type: link region: content field_keywords: - weight: 13 + weight: 8 label: above settings: link_to_entity: false @@ -273,7 +275,7 @@ content: type: string region: content field_policy_domain: - weight: 26 + weight: 20 label: above settings: link: true @@ -281,7 +283,7 @@ content: type: entity_reference_label region: content field_spatial_coverage: - weight: 9 + weight: 4 label: above settings: link: true @@ -289,7 +291,7 @@ content: type: entity_reference_label region: content field_status: - weight: 14 + weight: 9 label: above settings: link: true @@ -299,7 +301,7 @@ content: label: label: hidden type: string - weight: 1 + weight: 0 settings: link_to_entity: false third_party_settings: { } @@ -313,11 +315,13 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true + field_is_elibrary_creation: true field_is_has_version: true field_is_logo: true field_is_pinned_in: true - field_is_show_eira_related: true field_is_related_solutions: true + field_is_shared_in: true + field_is_show_eira_related: true field_is_state: true field_site_featured: true field_site_pinned: true @@ -325,5 +329,7 @@ hidden: 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 diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml index bf3c69e1c4..2f8c00b4d9 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -46,6 +48,7 @@ dependencies: - rdf_entity.rdfentity.solution module: - image + - joinup - smart_trim - user id: rdf_entity.solution.view_mode_featured @@ -71,6 +74,8 @@ content: text: false more_class: more-link summary_handler: full + wrap_output: false + wrap_class: trimmed third_party_settings: joinup: template_suggestion: '' @@ -103,6 +108,7 @@ hidden: 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_elibrary_creation: true @@ -116,8 +122,9 @@ hidden: field_is_owner: true field_is_pinned_in: true field_is_product_type: true - field_is_show_eira_related: 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 @@ -138,5 +145,7 @@ hidden: 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 diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml index 78a0df3518..d0dd9c94f5 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml @@ -9,6 +9,7 @@ dependencies: - 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 @@ -24,8 +25,9 @@ dependencies: - field.field.rdf_entity.solution.field_is_owner - field.field.rdf_entity.solution.field_is_pinned_in - field.field.rdf_entity.solution.field_is_product_type - - field.field.rdf_entity.solution.field_is_show_eira_related - 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 @@ -46,6 +48,7 @@ dependencies: - rdf_entity.rdfentity.solution module: - image + - joinup - smart_trim - user id: rdf_entity.solution.view_mode_tile @@ -71,6 +74,8 @@ content: text: false more_class: more-link summary_handler: full + wrap_output: false + wrap_class: trimmed third_party_settings: joinup: template_suggestion: '' @@ -103,6 +108,7 @@ hidden: 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_elibrary_creation: true @@ -116,8 +122,9 @@ hidden: field_is_owner: true field_is_pinned_in: true field_is_product_type: true - field_is_show_eira_related: 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 @@ -138,5 +145,7 @@ hidden: 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 diff --git a/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_content_creation.yml b/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_content_creation.yml new file mode 100644 index 0000000000..c60c6602a4 --- /dev/null +++ b/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_content_creation.yml @@ -0,0 +1,22 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.rdf_entity.field_is_content_creation + - rdf_entity.rdfentity.solution + module: + - options +id: rdf_entity.solution.field_is_content_creation +field_name: field_is_content_creation +entity_type: rdf_entity +bundle: solution +label: 'Content creation' +description: 'Choose which users can create content (news, events, discussions and documents) in the solution.' +required: true +translatable: false +default_value: + - + value: only_facilitators +default_value_callback: '' +settings: { } +field_type: list_string diff --git a/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml b/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml new file mode 100644 index 0000000000..cc7d34fd40 --- /dev/null +++ b/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml @@ -0,0 +1,33 @@ +langcode: en +status: true +dependencies: + module: + - options + - rdf_entity + - sparql_entity_storage +third_party_settings: + sparql_entity_storage: + mapping: + value: + predicate: 'http://joinup.eu/collection/content_creation' + format: literal +id: rdf_entity.field_is_content_creation +field_name: field_is_content_creation +entity_type: rdf_entity +type: list_string +settings: + allowed_values: + - + value: any_user + label: 'Any user can create content.' + - + value: only_facilitators + label: 'Only facilitators can create content.' + allowed_values_function: '' +module: options +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/web/modules/custom/solution/solution.info.yml b/web/modules/custom/solution/solution.info.yml index d698a53cb3..30027ea549 100644 --- a/web/modules/custom/solution/solution.info.yml +++ b/web/modules/custom/solution/solution.info.yml @@ -43,6 +43,7 @@ config_devel: - 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 @@ -84,6 +85,7 @@ config_devel: - field.storage.rdf_entity.field_is_business_process - field.storage.rdf_entity.field_is_contact_information - field.storage.rdf_entity.field_is_content + - field.storage.rdf_entity.field_is_content_creation - field.storage.rdf_entity.field_is_description - field.storage.rdf_entity.field_is_distribution - field.storage.rdf_entity.field_is_documentation From 53cd5fcf393097f907d0d5296fbc68d3f113917e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 20:58:37 +0200 Subject: [PATCH 172/957] ISAICP-5671: Add an update hook to convert the eLibrary creation data to the new Content creation option. --- .../joinup_group/joinup_group.post_update.php | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 web/modules/custom/joinup_group/joinup_group.post_update.php diff --git a/web/modules/custom/joinup_group/joinup_group.post_update.php b/web/modules/custom/joinup_group/joinup_group.post_update.php new file mode 100644 index 0000000000..2a0d473ea5 --- /dev/null +++ b/web/modules/custom/joinup_group/joinup_group.post_update.php @@ -0,0 +1,62 @@ + [ + 'source' => 'field_ar_elibrary_creation', + 'destination' => 'field_ar_content_creation', + ], + 'solution' => [ + 'source' => 'field_is_elibrary_creation', + 'destination' => 'field_is_content_creation', + ], + ]; + + $elibrary_to_content_creation_mapping = [ + 0 => ContentCreationOptions::FACILITATORS, + 1 => ContentCreationOptions::MEMBERS, + 2 => ContentCreationOptions::REGISTERED_USERS, + ]; + + $storage = \Drupal::entityTypeManager()->getStorage('rdf_entity'); + + if (!isset($sandbox['entity_ids'])) { + $bundles = ['collection', 'solution']; + $sandbox['entity_ids'] = \Drupal::entityQuery('rdf_entity') + ->condition('rid', $bundles, 'IN') + ->execute(); + $sandbox['current'] = 0; + $sandbox['max'] = count($sandbox['entity_ids']); + } + + $slice = array_slice($sandbox['entity_ids'], $sandbox['current'], 50); + + /** @var \Drupal\rdf_entity\RdfInterface $entity */ + foreach ($storage->loadMultiple($slice) as $entity) { + $bundle = $entity->bundle(); + + $original_value = $entity->get($field_mapping[$bundle]['source'])->value; + $updated_value = $elibrary_to_content_creation_mapping[$original_value]; + + $entity->set($field_mapping[$bundle]['destination'], $updated_value); + $entity->skip_notification = TRUE; + $entity->save(); + + $sandbox['current']++; + } + + $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['current'] / $sandbox['max']); + return "Processed {$sandbox['current']} out of {$sandbox['max']}."; +} From 5e3c18c2602313508a97e6c67a06abf1e2aae0e0 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 21:40:40 +0200 Subject: [PATCH 173/957] ISAICP-5671: Restore the 'Closed collection' field, it is still used to control the way users join collections. --- ..._display.rdf_entity.collection.default.yml | 15 +++++++++---- ..._display.rdf_entity.collection.propose.yml | 13 ++++++++--- ...ew_display.rdf_entity.collection.about.yml | 22 +++++++++++++++---- ...isplay.rdf_entity.collection.rdf_draft.yml | 15 ++++++++++--- ...view_display.rdf_entity.solution.about.yml | 4 +++- tests/features/collection/homepage.feature | 6 +---- .../custom/collection/collection.behat.inc | 9 +++++--- ..._display.rdf_entity.collection.default.yml | 15 +++++++++---- ...ew_display.rdf_entity.collection.about.yml | 22 +++++++++++++++---- ...isplay.rdf_entity.collection.rdf_draft.yml | 15 ++++++++++--- ...view_display.rdf_entity.solution.about.yml | 4 +++- 11 files changed, 105 insertions(+), 35 deletions(-) diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml index 0c4b7eccc2..be928643f0 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml @@ -77,6 +77,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage + - field_ar_closed - field_ar_content_creation - field_ar_moderation - field_newsletter @@ -132,6 +133,13 @@ content: third_party_settings: { } type: image_image region: content + field_ar_closed: + type: boolean_checkbox + weight: 15 + region: content + settings: + display_label: false + third_party_settings: { } field_ar_contact_information: weight: 5 settings: @@ -150,7 +158,7 @@ content: type: inline_entity_form_complex region: content field_ar_content_creation: - weight: 17 + weight: 16 settings: { } third_party_settings: { } type: options_buttons @@ -175,7 +183,7 @@ content: type: image_image region: content field_ar_moderation: - weight: 18 + weight: 17 settings: display_label: false third_party_settings: { } @@ -213,7 +221,7 @@ content: type: search_api_field_default region: content field_newsletter: - weight: 19 + weight: 18 settings: { } third_party_settings: { } type: oe_newsroom_newsletter_default @@ -250,7 +258,6 @@ content: hidden: created: true field_ar_affiliates: true - field_ar_closed: true field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml index 6f8a497741..9533956e85 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml @@ -75,6 +75,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage + - field_ar_closed - field_ar_content_creation - field_ar_moderation parent_name: group_general @@ -122,6 +123,13 @@ content: preview_image_style: thumbnail third_party_settings: { } region: content + field_ar_closed: + type: boolean_checkbox + weight: 14 + region: content + settings: + display_label: false + third_party_settings: { } field_ar_contact_information: weight: 4 settings: @@ -141,7 +149,7 @@ content: region: content field_ar_content_creation: type: options_buttons - weight: 16 + weight: 15 region: content settings: { } third_party_settings: { } @@ -165,7 +173,7 @@ content: type: image_image region: content field_ar_moderation: - weight: 17 + weight: 16 settings: display_label: false third_party_settings: { } @@ -240,7 +248,6 @@ hidden: created: true current_workflow_state: true field_ar_affiliates: true - field_ar_closed: true field_ar_elibrary_creation: true field_collection_content: true field_newsletter: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml index 2ccf6841b4..66f597af9f 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml @@ -35,6 +35,7 @@ third_party_settings: field_group: group_moderation: children: + - field_ar_closed - field_ar_content_creation - field_ar_moderation parent_name: '' @@ -95,6 +96,18 @@ content: template_suggestion: fieldset type: link region: content + field_ar_closed: + type: boolean + weight: 0 + region: content + label: hidden + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: + joinup: + template_suggestion: fieldset field_ar_contact_information: weight: 5 label: above @@ -108,11 +121,13 @@ content: region: content field_ar_content_creation: type: list_default - weight: 8 + weight: 1 region: content label: hidden settings: { } - third_party_settings: { } + third_party_settings: + joinup: + template_suggestion: fieldset field_ar_description: weight: 1 label: hidden @@ -121,7 +136,7 @@ content: type: text_default region: content field_ar_moderation: - weight: 9 + weight: 2 label: hidden settings: format: default @@ -148,7 +163,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_closed: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index c04a210edf..b20c159709 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -53,6 +53,16 @@ content: third_party_settings: { } type: link region: content + field_ar_closed: + type: boolean + weight: 8 + region: content + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } field_ar_contact_information: weight: 3 label: above @@ -63,7 +73,7 @@ content: region: content field_ar_content_creation: type: list_default - weight: 8 + weight: 9 region: content label: above settings: { } @@ -76,7 +86,7 @@ content: type: text_default region: content field_ar_moderation: - weight: 9 + weight: 10 label: above settings: format: default @@ -122,7 +132,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_closed: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml index 1a8b976adb..5471618aa0 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml @@ -203,7 +203,9 @@ content: region: content label: hidden settings: { } - third_party_settings: { } + third_party_settings: + joinup: + template_suggestion: fieldset field_is_description: type: text_default weight: 0 diff --git a/tests/features/collection/homepage.feature b/tests/features/collection/homepage.feature index 525e9cbb18..449896175e 100644 --- a/tests/features/collection/homepage.feature +++ b/tests/features/collection/homepage.feature @@ -155,6 +155,7 @@ Feature: Collection homepage And I press "Save as draft" And I click "View draft" in the "Entity actions" region Then I should see the text "Moderated" + And I should see the text "Open collection" And I should see the text "Only members can create content." And I should see the text "Bilbo Baggins" And I should see the text "Employment and Support Allowance" @@ -164,11 +165,6 @@ Feature: Collection homepage And I should not see the "Breaking: Gandalf supposedly plans his retirement" tile And I should not see the "Big hobbit feast - fireworks at midnight" tile - # In an earlier implementation the "Content creation" option was split in - # two options. We should no longer see the deprecated "open/closed" option. - And I should not see the text "Open collection" - And I should not see the text "Closed collection" - Scenario: The collection homepage should be cacheable for anonymous users. Given I am an anonymous user When I go to the homepage of the "Middle earth daily" collection diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 5b9f5b658b..190f39e468 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -58,6 +58,7 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont 'abstract' => 'field_ar_abstract', 'access url' => 'field_ar_access_url', 'banner' => 'field_ar_banner', + 'closed' => 'field_ar_closed', 'contact information' => 'field_ar_contact_information', 'content creation' => 'field_ar_content_creation', 'creation date' => 'created', @@ -168,9 +169,9 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * * Table format: * @codingStandardsIgnoreStart - * | title | abstract | access url | creation date | description | content creation | featured | logo | moderation | modification date | owner | state | - * | Dog owner collection | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators|members|registered users | yes | | yes | | | | - * | Cats collection 4 ever! | Cats are cool! | http://mashable.com/category/cats/ | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | facilitators|members|registered users | no | | no | | | draft|proposed|validated|archival request|deletion request|archived | + * | title | abstract | access url | closed | creation date | description | content creation | featured | logo | moderation | modification date | owner | state | + * | Dog owner collection | Read up on all about dogs | http://dogtime.com/dog-breeds/profiles | yes|no | 28-01-1995 12:05 | The Afghan Hound is elegance personified. | facilitators|members|registered users | yes | | yes | | | | + * | Cats collection 4 ever! | Cats are cool! | http://mashable.com/category/cats/ | yes|no | 28-01-1995 12:06 | The domestic cat (Felis catus or Felis silvestris catus) is a small usually furry domesticated carnivorous mammal. | facilitators|members|registered users | no | | no | | | draft|proposed|validated|archival request|deletion request|archived | * @codingStandardsIgnoreEnd * * Only the title field is required. @@ -251,6 +252,7 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont 'members' => 'only_members', 'registered users' => 'any_user', ], + 'field_ar_closed' => ['no' => 0, 'yes' => 1], 'field_ar_state' => [ 'draft' => 'draft', 'proposed' => 'proposed', @@ -328,6 +330,7 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * | logo | logo.png | * | featured | yes|no | * | moderation | yes|no | + * | closed | yes|no | * | content creation | facilitators|members|registered users | * | metadata url | https://ec.europa.eu/my/url | * | state | draft|proposed|validated|archival request|deletion request|archived | diff --git a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml index 496bbb57b8..a393d19248 100644 --- a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml +++ b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml @@ -76,6 +76,7 @@ third_party_settings: - field_ar_logo - field_ar_banner - field_spatial_coverage + - field_ar_closed - field_ar_content_creation - field_ar_moderation - field_newsletter @@ -131,6 +132,13 @@ content: third_party_settings: { } type: image_image region: content + field_ar_closed: + type: boolean_checkbox + weight: 15 + region: content + settings: + display_label: false + third_party_settings: { } field_ar_contact_information: weight: 5 settings: @@ -149,7 +157,7 @@ content: type: inline_entity_form_complex region: content field_ar_content_creation: - weight: 17 + weight: 16 settings: { } third_party_settings: { } type: options_buttons @@ -174,7 +182,7 @@ content: type: image_image region: content field_ar_moderation: - weight: 18 + weight: 17 settings: display_label: false third_party_settings: { } @@ -212,7 +220,7 @@ content: type: search_api_field_default region: content field_newsletter: - weight: 19 + weight: 18 settings: { } third_party_settings: { } type: oe_newsroom_newsletter_default @@ -249,7 +257,6 @@ content: hidden: created: true field_ar_affiliates: true - field_ar_closed: true field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml index 4c2596eb48..c4e62ed828 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml @@ -34,6 +34,7 @@ third_party_settings: field_group: group_moderation: children: + - field_ar_closed - field_ar_content_creation - field_ar_moderation parent_name: '' @@ -94,6 +95,18 @@ content: template_suggestion: fieldset type: link region: content + field_ar_closed: + type: boolean + weight: 0 + region: content + label: hidden + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: + joinup: + template_suggestion: fieldset field_ar_contact_information: weight: 5 label: above @@ -107,11 +120,13 @@ content: region: content field_ar_content_creation: type: list_default - weight: 8 + weight: 1 region: content label: hidden settings: { } - third_party_settings: { } + third_party_settings: + joinup: + template_suggestion: fieldset field_ar_description: weight: 1 label: hidden @@ -120,7 +135,7 @@ content: type: text_default region: content field_ar_moderation: - weight: 9 + weight: 2 label: hidden settings: format: default @@ -147,7 +162,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_closed: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index 248ef52b4e..712174be85 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -52,6 +52,16 @@ content: third_party_settings: { } type: link region: content + field_ar_closed: + type: boolean + weight: 8 + region: content + label: above + settings: + format: default + format_custom_false: '' + format_custom_true: '' + third_party_settings: { } field_ar_contact_information: weight: 3 label: above @@ -62,7 +72,7 @@ content: region: content field_ar_content_creation: type: list_default - weight: 8 + weight: 9 region: content label: above settings: { } @@ -75,7 +85,7 @@ content: type: text_default region: content field_ar_moderation: - weight: 9 + weight: 10 label: above settings: format: default @@ -121,7 +131,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_closed: true field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml index 0b0d5731b2..c98c4756ee 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml @@ -202,7 +202,9 @@ content: region: content label: hidden settings: { } - third_party_settings: { } + third_party_settings: + joinup: + template_suggestion: fieldset field_is_description: type: text_default weight: 0 From 3ed2e0c3556849cf9a76ef83ff2cd61a74c72f3d Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 5 Mar 2020 23:40:24 +0200 Subject: [PATCH 174/957] ISAICP-5671: User facing text has been simplified. --- tests/features/joinup_event/event.moderation.feature | 2 +- tests/features/solution/add_solution.feature | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/features/joinup_event/event.moderation.feature b/tests/features/joinup_event/event.moderation.feature index cd15884e39..d89004f327 100644 --- a/tests/features/joinup_event/event.moderation.feature +++ b/tests/features/joinup_event/event.moderation.feature @@ -71,7 +71,7 @@ Feature: Event moderation And I click the "Additional fields" tab And I check "Closed collection" And I wait for AJAX to finish - And I select the radio button "Only members can create new content." + And I select the radio button "Only members can create content." And I press "Publish" # I should now have the possibility to add events. When I open the plus button menu diff --git a/tests/features/solution/add_solution.feature b/tests/features/solution/add_solution.feature index 7c66bb0b7e..347f01cc6d 100644 --- a/tests/features/solution/add_solution.feature +++ b/tests/features/solution/add_solution.feature @@ -55,8 +55,8 @@ Feature: "Add solution" visibility options. And the following fields should not be present "Groups audience, Other groups, Current workflow state, Langcode, Translation, Motivation" # Regression test for ensuring that obsolete content creation value is removed. # @see: https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3567 - And I should not see the text "Only members can create new content" - And I should see the text "Only solution facilitators can create new content" + And I should not see the text "Only members can create content" + And I should see the text "Only facilitators can create content" # Regression test to endure that the language terms "Multilingual Code" are not present. And the available options in the "Language" select should not include the "Multilingual Code" And I should see the description "For best result the image must be larger than 2400x345 pixels." for the "Banner" field From 6e651304e4e17169e5acf2ebe3bfa26a716734ae Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 6 Mar 2020 09:47:54 +0200 Subject: [PATCH 175/957] ISAICP-5671: Some solutions have lost their collection affiliation and can not be updated. --- .../joinup_group/joinup_group.post_update.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.post_update.php b/web/modules/custom/joinup_group/joinup_group.post_update.php index 2a0d473ea5..fd3d8a334a 100644 --- a/web/modules/custom/joinup_group/joinup_group.post_update.php +++ b/web/modules/custom/joinup_group/joinup_group.post_update.php @@ -39,6 +39,7 @@ function joinup_group_post_update_migrate_elibrary(array &$sandbox) { ->execute(); $sandbox['current'] = 0; $sandbox['max'] = count($sandbox['entity_ids']); + $sandbox['errors'] = 0; } $slice = array_slice($sandbox['entity_ids'], $sandbox['current'], 50); @@ -52,11 +53,19 @@ function joinup_group_post_update_migrate_elibrary(array &$sandbox) { $entity->set($field_mapping[$bundle]['destination'], $updated_value); $entity->skip_notification = TRUE; - $entity->save(); + try { + $entity->save(); + } + catch (\Exception $e) { + // Some solutions have lost their collection affiliation and can not be + // updated. Skip these and keep track of the number of errors. + // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-5870 + $sandbox['errors']++; + } $sandbox['current']++; } $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['current'] / $sandbox['max']); - return "Processed {$sandbox['current']} out of {$sandbox['max']}."; + return "Processed {$sandbox['current']} out of {$sandbox['max']}. Errors: {$sandbox['errors']}"; } From 697e4eabce4d908bb93df39378a033a3976fec32 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 6 Mar 2020 10:44:45 +0200 Subject: [PATCH 176/957] ISAICP-5671: Update help text for the Closed collection checkbox to match the new reduced functionality. --- .../sync/field.field.rdf_entity.collection.field_ar_closed.yml | 2 +- .../field.field.rdf_entity.collection.field_ar_closed.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/field.field.rdf_entity.collection.field_ar_closed.yml b/config/sync/field.field.rdf_entity.collection.field_ar_closed.yml index 3b8a27bc67..80df96406c 100644 --- a/config/sync/field.field.rdf_entity.collection.field_ar_closed.yml +++ b/config/sync/field.field.rdf_entity.collection.field_ar_closed.yml @@ -12,7 +12,7 @@ field_name: field_ar_closed entity_type: rdf_entity bundle: collection label: Closed -description: 'If a collection is closed, users need to request membership to create content (except comments and discussions).' +description: 'If a collection is closed, new users can only join the collection after being approved by a facilitator.' required: false translatable: false default_value: diff --git a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_closed.yml b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_closed.yml index b733c1246d..b52731e575 100644 --- a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_closed.yml +++ b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_closed.yml @@ -9,7 +9,7 @@ field_name: field_ar_closed entity_type: rdf_entity bundle: collection label: Closed -description: 'If a collection is closed, users need to request membership to create content (except comments and discussions).' +description: 'If a collection is closed, new users can only join the collection after being approved by a facilitator.' required: false translatable: false default_value: From 6ccb2601179d973968a02f5254e6f0f310eaef88 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 9 Mar 2020 10:54:19 +0200 Subject: [PATCH 177/957] ISAICP-5785: The Joinup core module exports a block which requires the Site Alerts module to be enabled. --- web/modules/custom/joinup_core/joinup_core.info.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/modules/custom/joinup_core/joinup_core.info.yml b/web/modules/custom/joinup_core/joinup_core.info.yml index 64544e5b06..406050fd52 100644 --- a/web/modules/custom/joinup_core/joinup_core.info.yml +++ b/web/modules/custom/joinup_core/joinup_core.info.yml @@ -25,6 +25,7 @@ dependencies: - 'redirect:redirect' - 'search_api:search_api' - 'search_api_solr:search_api_solr' + - 'site_alert:site_alert' - 'state_machine:state_machine' config_devel: From 51f65a731e034bf829a913de47d66fa87002685d Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 18 Feb 2020 11:48:51 +0200 Subject: [PATCH 178/957] ISAICP-5584: Stop hacking the views query. Implement proper argument handler. --- .../custom/joinup_group/joinup_group.module | 21 +------------- .../joinup_group/joinup_group.views.inc | 19 +++++++++++++ .../DecodeRdfEntityIdArgumentTrait.php | 22 +++++++++++++++ .../views/argument/SearchApiGroupArgument.php | 20 +++++++++++++ .../views/argument/StringGroupArgument.php | 20 +++++++++++++ .../views/argument_validator/RdfEntityId.php | 28 ------------------- .../custom/joinup_rss/joinup_rss.module | 24 ---------------- 7 files changed, 82 insertions(+), 72 deletions(-) create mode 100644 web/modules/custom/joinup_group/joinup_group.views.inc create mode 100644 web/modules/custom/joinup_group/src/Plugin/views/argument/DecodeRdfEntityIdArgumentTrait.php create mode 100644 web/modules/custom/joinup_group/src/Plugin/views/argument/SearchApiGroupArgument.php create mode 100644 web/modules/custom/joinup_group/src/Plugin/views/argument/StringGroupArgument.php delete mode 100644 web/modules/custom/joinup_group/src/Plugin/views/argument_validator/RdfEntityId.php diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module index 211c87c087..587b01e073 100644 --- a/web/modules/custom/joinup_group/joinup_group.module +++ b/web/modules/custom/joinup_group/joinup_group.module @@ -23,7 +23,6 @@ use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\og_menu\Entity\OgMenuInstance; use Drupal\rdf_entity\RdfInterface; use Drupal\search_api\Plugin\search_api\datasource\ContentEntity; -use Drupal\sparql_entity_storage\UriEncoder; use Drupal\views\Plugin\views\query\QueryPluginBase; use Drupal\views\Plugin\views\query\Sql; use Drupal\views\ViewExecutable; @@ -319,28 +318,10 @@ function joinup_group_form_views_exposed_form_alter(&$form, FormStateInterface $ * Implements hook_views_query_alter(). */ function joinup_group_views_query_alter(ViewExecutable $view, QueryPluginBase $query): void { - // RDF Entity ID is encoded when is used in the URL, thus we will receive an - // encoded ID as contextual filter. We cannot decode it upstream because the - // path display plugin, \Drupal\views\Plugin\views\display\PathPluginBase, is - // using the arguments to build the page route and will fail. For this reason, - // we have to decode just before the query is about to run. - // @see \Drupal\views\Plugin\views\display\PathPluginBase - // @see \Drupal\joinup_group\Plugin\views\argument_default\RdfEntity - $displays = ['manage', 'csv_export']; - if ($view->id() === 'group_content_management' && in_array($view->current_display, $displays)) { - foreach ($query->where as &$group) { - foreach ($group['conditions'] as &$condition) { - if ($condition['field'] === 'node__og_audience.og_audience_target_id') { - $condition['value'] = UriEncoder::decodeUrl($condition['value']); - break 2; - } - } - } - } // In the member administration bulk operation view we are formatting the // username column as full names, but Views still sorts by username. Make sure // we sort by first name + last name instead of by username. - elseif ($view->id() === 'og_members_overview' && $query instanceof Sql) { + if ($view->id() === 'og_members_overview' && $query instanceof Sql) { // Skip if we're not ordering by username. if (empty($query->orderby[0]['field'])) { return; diff --git a/web/modules/custom/joinup_group/joinup_group.views.inc b/web/modules/custom/joinup_group/joinup_group.views.inc new file mode 100644 index 0000000000..482c001375 --- /dev/null +++ b/web/modules/custom/joinup_group/joinup_group.views.inc @@ -0,0 +1,19 @@ +id() !== 'group_feed') { - return; - } - - foreach ($query->getWhere() as &$group) { - foreach ($group['conditions'] as &$condition) { - if ($condition[0] === 'entity_groups') { - $condition[1] = UriEncoder::decodeUrl($condition[1]); - return; - } - } - } -} /** * Implements hook_preprocess_views_view_rss__group_feed__rss_feed(). From d5ed05ac093addcc2d0a8c10e09e6028a30d5775 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 26 Feb 2020 11:30:58 +0200 Subject: [PATCH 179/957] ISAICP-5584: Allow a bulk operation confirm page to receive the view route parameters. --- composer.json | 3 ++- composer.lock | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index f1376468b2..8add4f253f 100644 --- a/composer.json +++ b/composer.json @@ -222,7 +222,8 @@ "Make it easier to trigger a tour @see https://www.drupal.org/project/drupal/issues/3012027": "https://www.drupal.org/files/issues/2018-11-07/3012027-2.patch", "Cache tags are not invalidated on revision delete @see https://www.drupal.org/project/drupal/issues/2945928": "https://www.drupal.org/files/issues/entity-cache_revision_deletion-2945928-2.patch", "Config import creates 'Undefined index: uuid' notice @see https://www.drupal.org/project/drupal/issues/2863785": "https://www.drupal.org/files/issues/config_import_creates-2863785-2.patch", - "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch" + "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch", + "Pass current route parameters to the confirmation form route @see https://www.drupal.org/project/drupal/issues/2901412": "https://www.drupal.org/files/issues/2020-02-25/2901412-13.patch" }, "drupal/externalauth": { "Clean up linkExistingAccount method so it doesn't needless prefix username with provider name @see https://www.drupal.org/project/externalauth/issues/3104478": "https://www.drupal.org/files/issues/2020-01-08/3104478-3.patch" diff --git a/composer.lock b/composer.lock index 028cd9868a..9112b3d961 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": "73aa3bf8f180b39bb2cbba330e2ad304", + "content-hash": "2ace26ab757e1ff3738001a5be082934", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -3381,7 +3381,8 @@ "Make it easier to trigger a tour @see https://www.drupal.org/project/drupal/issues/3012027": "https://www.drupal.org/files/issues/2018-11-07/3012027-2.patch", "Cache tags are not invalidated on revision delete @see https://www.drupal.org/project/drupal/issues/2945928": "https://www.drupal.org/files/issues/entity-cache_revision_deletion-2945928-2.patch", "Config import creates 'Undefined index: uuid' notice @see https://www.drupal.org/project/drupal/issues/2863785": "https://www.drupal.org/files/issues/config_import_creates-2863785-2.patch", - "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch" + "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch", + "Pass current route parameters to the confirmation form route @see https://www.drupal.org/project/drupal/issues/2901412": "https://www.drupal.org/files/issues/2020-02-25/2901412-13.patch" } }, "autoload": { From 3d093745443750046f3d7035edfd59fc7e54f29c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:17:48 +0100 Subject: [PATCH 180/957] ISAICP-5584: Allow bulk form on Search API views. --- composer.json | 3 ++- composer.lock | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 8add4f253f..7d1aa62bf6 100644 --- a/composer.json +++ b/composer.json @@ -264,7 +264,8 @@ "drupal/search_api": { "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch", - "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch" + "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch", + "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-03-09/3117171-5.patch" }, "drupal/social_media_links": { "Missing config schema for field, widget and formatter @see https://www.drupal.org/node/2898680": "https://www.drupal.org/files/issues/2898680-6.patch", diff --git a/composer.lock b/composer.lock index 9112b3d961..14ded7abd1 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": "2ace26ab757e1ff3738001a5be082934", + "content-hash": "1e57796f06d931b16f4c0ec0fdbd96f9", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -6200,7 +6200,8 @@ "patches_applied": { "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch", - "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch" + "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch", + "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-03-09/3117171-5.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", From bd6c215a39cbef3940b09642faf2be92f548e8de Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:20:10 +0100 Subject: [PATCH 181/957] ISAICP-5584: Fix unrelated config diffs. --- config/sync/core.entity_form_display.user.user.default.yml | 5 +++++ ...e.entity_form_display.user.user.subscription_settings.yml | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/config/sync/core.entity_form_display.user.user.default.yml b/config/sync/core.entity_form_display.user.user.default.yml index 64e19f042f..523325ddd8 100644 --- a/config/sync/core.entity_form_display.user.user.default.yml +++ b/config/sync/core.entity_form_display.user.user.default.yml @@ -101,6 +101,11 @@ content: region: content settings: { } third_party_settings: { } + legal_legal_notice: + weight: -4 + settings: { } + third_party_settings: { } + region: content path: type: path weight: 9 diff --git a/config/sync/core.entity_form_display.user.user.subscription_settings.yml b/config/sync/core.entity_form_display.user.user.subscription_settings.yml index b27dd5ed1d..4de19ba068 100644 --- a/config/sync/core.entity_form_display.user.user.subscription_settings.yml +++ b/config/sync/core.entity_form_display.user.user.subscription_settings.yml @@ -29,6 +29,11 @@ content: settings: { } third_party_settings: { } region: content + legal_legal_notice: + weight: -4 + settings: { } + third_party_settings: { } + region: content hidden: account: true field_last_password_reset: true From 643be57e2d51829d44ce3f380e1391818ea5bca7 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 14:20:55 +0100 Subject: [PATCH 182/957] ISAICP-5584: Provide test coverage. --- .../solution/manage_solutions.feature | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/features/solution/manage_solutions.feature diff --git a/tests/features/solution/manage_solutions.feature b/tests/features/solution/manage_solutions.feature new file mode 100644 index 0000000000..1db96cb225 --- /dev/null +++ b/tests/features/solution/manage_solutions.feature @@ -0,0 +1,72 @@ +@api @group-a +Feature: As a moderator I want to be able to move solutions to other collection. + + Scenario: Test moving solution to other collection. + + Given the following collections: + | uri | title | state | + | http://example.com/source | Source | validated | + | http://example.com/destination | Destination | validated | + + And solutions: + | title | collection | state | + | Solution 1 | Source | validated | + | Solution 2 | Source | validated | + | Solution 3 | Source | validated | + | Solution 4 | Source | validated | + + Given I am an anonymous user + When I go to the homepage of the "Source" collection + Then I should not see the link "Manage solutions" + When I go to "/rdf_entity/http_e_f_fexample_ccom_fsource/change-collection" + Then I should see the heading "Sign in to continue" + + Given I am logged in as an "authenticated" + When I go to the homepage of the "Source" collection + Then I should not see the link "Manage solutions" + When I go to "/rdf_entity/http_e_f_fexample_ccom_fsource/change-collection" + Then I should get an access denied error + + Given I am logged in as a moderator + + # The 'Manage solutions' link shows only on collections. + When I go to the homepage of the "Solution 1" solution + Then I should not see the link "Manage solutions" + + When I go to the homepage of the "Source" collection + Then I should see the link "Manage solutions" + When I click "Manage solutions" + Then I should see the heading "Manage solutions" + + Then I select the "Solution 1" row + And I select the "Solution 4" row + And I select "Move to other collection" from "Action" + + When I press "Apply to selected items" + Then I should see the heading "Select a destination collection" + And I should see the following lines of text: + | The following solutions from Source collection will be moved to a new collection: | + | Solution 1 | + | Solution 4 | + + # Try to move to the source collection. + When I fill in "Select the destination collection" with "Source" + And I press "Move solutions" + Then I should see the error message "The destination collection cannot be the same as the source collection." + + When I fill in "Select the destination collection" with "Destination" + And I press "Move solutions" + Then I should see the following success messages: + | success messages | + | Solution Solution 1 has been moved to Destination. | + | Solution Solution 4 has been moved to Destination. | + + When I go to the homepage of the "Destination" collection + Then I should see the following tiles in the correct order: + | Solution 1 | + | Solution 4 | + + When I go to the homepage of the "Source" collection + Then I should see the following tiles in the correct order: + | Solution 2 | + | Solution 3 | From d0449e8231ac987ecd497b8e9a18e672bb812fe4 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:22:43 +0100 Subject: [PATCH 183/957] ISAICP-5584: Add a group access checker. --- .../joinup_group/joinup_group.services.yml | 5 + .../src/Access/JoinupGroupAccessCheck.php | 101 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index 8211376ced..340dccac21 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -18,3 +18,8 @@ services: arguments: ['@current_user', '@tempstore.private'] tags: - name: event_subscriber + joinup_group.group.access_check: + class: Drupal\joinup_group\Access\JoinupGroupAccessCheck + arguments: ['@entity_type.manager'] + tags: + - { name: access_check, applies_to: _joinup_group } diff --git a/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php b/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php new file mode 100644 index 0000000000..e2d3d207c6 --- /dev/null +++ b/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php @@ -0,0 +1,101 @@ +entityTypeManager = $entity_type_manager; + } + + /** + * Checks access based on _joinup_group route requirement. + * + * @param \Symfony\Component\Routing\Route $route + * The route to check against. + * @param \Drupal\Core\Routing\RouteMatchInterface $route_match + * The route match object. + * + * @return \Drupal\Core\Access\AccessResultInterface + * The access result. + * + * @throws \Exception + * If the '_joinup_group' route requirement value is not one of 'TRUE', + * 'FALSE', 'collection' or 'solution'. + */ + public function access(Route $route, RouteMatchInterface $route_match): AccessResultInterface { + $bundles = ['collection' => 'collection', 'solution' => 'solution']; + $requirement = $route->getRequirement('_joinup_group'); + if (!in_array($requirement, ['TRUE', 'FALSE'], TRUE) && !isset($bundles[$requirement])) { + throw new \Exception("The '_joinup_group' route requirement should have one of the following values: 'TRUE', 'FALSE', 'collection' or 'solution' but '{$requirement}' was given."); + } + + $rdf_entity = $route_match->getParameter('rdf_entity'); + + // If the route wasn't configured to upcast the parameter, try to load an + // RDF entity given its ID. + if (!$rdf_entity instanceof RdfInterface) { + if ($rdf_entity) { + $id = UriEncoder::decodeUrl($rdf_entity); + $rdf_entity = $this->entityTypeManager->getStorage('rdf_entity')->load($id); + } + if (!$rdf_entity) { + // If the {rdf_entity} route parameter is missed or is not an RDF + // entity, don't make any opinion, let other access checks decide. + return AccessResult::neutral('No {rdf_entity} param or not a valid RDF entity'); + } + } + $bundle = $rdf_entity->bundle(); + + $allow_access = + ($requirement === 'TRUE' && isset($bundles[$bundle])) || + ($requirement === 'FALSE' && !isset($bundles[$bundle])) || + (isset($bundles[$requirement]) && $bundle === $bundles[$requirement]); + + return $allow_access ? AccessResult::allowed() : AccessResult::forbidden(); + } + +} From 52242c083fb01e765541ca0a4af0344617913294 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:25:31 +0100 Subject: [PATCH 184/957] ISAICP-5584: Create the 'manage solutions' permsion and grant the moderators with this permission. --- config/sync/user.role.moderator.yml | 1 + .../custom/joinup_user/config/install/user.role.moderator.yml | 2 ++ web/modules/custom/solution/solution.permissions.yml | 3 +++ 3 files changed, 6 insertions(+) diff --git a/config/sync/user.role.moderator.yml b/config/sync/user.role.moderator.yml index 2a2bb66b81..5ba5a541b6 100644 --- a/config/sync/user.role.moderator.yml +++ b/config/sync/user.role.moderator.yml @@ -52,6 +52,7 @@ permissions: - 'feature entity' - 'filter membership overview' - 'manage newsroom newsletter subscriptions' + - 'manage solutions' - 'moderate entity parents' - 'pin entity' - 'reset joinup_collection pipeline' diff --git a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml index de0fe0e32a..e53a800e3d 100644 --- a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml +++ b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml @@ -51,9 +51,11 @@ permissions: - 'feature entity' - 'filter membership overview' - 'manage newsroom newsletter subscriptions' + - 'manage solutions' - 'moderate entity parents' - 'pin entity' - 'reset joinup_collection pipeline' + - 'reset nio pipeline' - 'reset spain pipeline' - 'unfeature entity' - 'unpin entity' diff --git a/web/modules/custom/solution/solution.permissions.yml b/web/modules/custom/solution/solution.permissions.yml index 17f3589328..7f339aec8b 100644 --- a/web/modules/custom/solution/solution.permissions.yml +++ b/web/modules/custom/solution/solution.permissions.yml @@ -1,2 +1,5 @@ message notification on validate: title: 'Receive notification that a solution has been moved to "Validated" state.' +manage solutions: + title: 'Manage solutions' + restrict access: true From 2c0da5314e89f5aa61cc73e5c45fa2df0b082bec Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:29:21 +0100 Subject: [PATCH 185/957] ISAICP-5584: Fix the argument in Group Content Management view. --- .../views.view.group_content_management.yml | 92 ++----------------- 1 file changed, 7 insertions(+), 85 deletions(-) diff --git a/config/sync/views.view.group_content_management.yml b/config/sync/views.view.group_content_management.yml index 88aef201ae..1ba3098c09 100644 --- a/config/sync/views.view.group_content_management.yml +++ b/config/sync/views.view.group_content_management.yml @@ -17,6 +17,7 @@ dependencies: - user.role.moderator module: - csv_serialization + - joinup_group - node - rest - serialization @@ -711,15 +712,16 @@ display: relationship: none group_type: group admin_label: '' - default_action: default + default_action: 'not found' exception: value: all title_enable: false title: All title_enable: false title: '' - default_argument_type: rdf_entity - default_argument_options: { } + default_argument_type: fixed + default_argument_options: + argument: '' default_argument_skip_url: false summary_options: base_path: '' @@ -1228,52 +1230,12 @@ display: plugin_id: entity_link defaults: fields: false - arguments: false + arguments: true displays: manage: manage default: '0' path: rdf_entity/%rdf_entity/manage-content/csv filename: content.csv - arguments: - og_audience_target_id: - id: og_audience_target_id - table: node__og_audience - field: og_audience_target_id - relationship: none - group_type: group - admin_label: '' - default_action: ignore - exception: - value: all - title_enable: false - title: All - title_enable: false - title: '' - default_argument_type: fixed - default_argument_options: - argument: '' - default_argument_skip_url: false - summary_options: - base_path: '' - count: true - items_per_page: 25 - override: false - summary: - sort_order: asc - number_of_records: 0 - format: default_summary - specify_validation: false - validate: - type: none - fail: 'not found' - validate_options: { } - glossary: false - limit: 0 - case: none - path_case: none - transform_dash: false - break_phrase: false - plugin_id: string display_description: '' pager: type: none @@ -1308,48 +1270,8 @@ display: weight: 100 context: '0' menu_name: main - arguments: - og_audience_target_id: - id: og_audience_target_id - table: node__og_audience - field: og_audience_target_id - relationship: none - group_type: group - admin_label: '' - default_action: ignore - exception: - value: all - title_enable: false - title: All - title_enable: false - title: '' - default_argument_type: fixed - default_argument_options: - argument: '' - default_argument_skip_url: false - summary_options: - base_path: '' - count: true - items_per_page: 25 - override: false - summary: - sort_order: asc - number_of_records: 0 - format: default_summary - specify_validation: false - validate: - type: none - fail: 'not found' - validate_options: { } - glossary: false - limit: 0 - case: none - path_case: none - transform_dash: false - break_phrase: false - plugin_id: string defaults: - arguments: false + arguments: true fields: false fields: views_bulk_operations_bulk_form: From 75888247fe5095be8fc91dec53edd3261e4e75e0 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:33:32 +0100 Subject: [PATCH 186/957] ISAICP-5584: Create an action to move solutions. --- .../sync/system.action.change_collection.yml | 12 +++ .../system.action.change_collection.yml | 11 +++ .../config/schema/solution.schema.yml | 4 + web/modules/custom/solution/solution.info.yml | 1 + .../Plugin/Action/ChangeCollectionAction.php | 91 +++++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 config/sync/system.action.change_collection.yml create mode 100644 web/modules/custom/solution/config/install/system.action.change_collection.yml create mode 100644 web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php diff --git a/config/sync/system.action.change_collection.yml b/config/sync/system.action.change_collection.yml new file mode 100644 index 0000000000..ae72fe0f91 --- /dev/null +++ b/config/sync/system.action.change_collection.yml @@ -0,0 +1,12 @@ +uuid: 74e2ac15-06ca-47d1-841e-478961393fd2 +langcode: en +status: true +dependencies: + module: + - solution +id: change_collection +label: 'Move to other collection' +type: rdf_entity +plugin: change_collection +weight: 0 +configuration: { } diff --git a/web/modules/custom/solution/config/install/system.action.change_collection.yml b/web/modules/custom/solution/config/install/system.action.change_collection.yml new file mode 100644 index 0000000000..9caa8056fb --- /dev/null +++ b/web/modules/custom/solution/config/install/system.action.change_collection.yml @@ -0,0 +1,11 @@ +langcode: en +status: true +dependencies: + module: + - solution +id: change_collection +label: 'Move to other collection' +type: rdf_entity +plugin: change_collection +weight: 0 +configuration: { } diff --git a/web/modules/custom/solution/config/schema/solution.schema.yml b/web/modules/custom/solution/config/schema/solution.schema.yml index b1b7a324d0..d3d3521aad 100644 --- a/web/modules/custom/solution/config/schema/solution.schema.yml +++ b/web/modules/custom/solution/config/schema/solution.schema.yml @@ -14,3 +14,7 @@ solution.settings: sequence: type: string label: 'Role' + +action.configuration.change_collection: + type: mapping + label: 'Change collection action configuration' diff --git a/web/modules/custom/solution/solution.info.yml b/web/modules/custom/solution/solution.info.yml index d698a53cb3..20abda6525 100644 --- a/web/modules/custom/solution/solution.info.yml +++ b/web/modules/custom/solution/solution.info.yml @@ -119,3 +119,4 @@ config_devel: - rdf_entity.rdfentity.solution - solution.settings - sparql_entity_storage.mapping.rdf_entity.solution + - system.action.change_collection diff --git a/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php new file mode 100644 index 0000000000..4640f7a472 --- /dev/null +++ b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php @@ -0,0 +1,91 @@ +tempStore = $private_tempStore_factory->get('change_collection'); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('tempstore.private') + ); + } + + /** + * {@inheritdoc} + */ + public function access($solution, AccountInterface $account = NULL, $return_as_object = FALSE) { + // The access is limited at the view level. + return $return_as_object ? AccessResult::allowed() : TRUE; + } + + /** + * {@inheritdoc} + */ + public function executeMultiple(array $solutions): void { + $solution_ids = array_map(function (RdfInterface $solution): string { + if ($solution->bundle() !== 'solution') { + throw new \LogicException("The 'change_collection' action can be applied only to solutions. Got '{$solution->bundle()}' for ID '{$solution->id()}'."); + } + return $solution->id(); + }, $solutions); + $this->tempStore->set('solutions', $solution_ids); + } + + /** + * {@inheritdoc} + */ + public function execute(RdfInterface $solution = NULL): void { + $this->executeMultiple([$solution]); + } + +} From f1f4ecb52c1af383d91ba77a77a761bd1d5c0bb5 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 12:35:14 +0100 Subject: [PATCH 187/957] ISAICP-5584: Create Views access plugin that allows managing solutions. --- .../views/access/ManageSolutionsAccess.php | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 web/modules/custom/solution/src/Plugin/views/access/ManageSolutionsAccess.php diff --git a/web/modules/custom/solution/src/Plugin/views/access/ManageSolutionsAccess.php b/web/modules/custom/solution/src/Plugin/views/access/ManageSolutionsAccess.php new file mode 100644 index 0000000000..418a63eaac --- /dev/null +++ b/web/modules/custom/solution/src/Plugin/views/access/ManageSolutionsAccess.php @@ -0,0 +1,130 @@ +routeMatch = $route_match; + $this->entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('current_route_match'), + $container->get('entity_type.manager') + ); + } + + /** + * {@inheritdoc} + */ + public function alterRouteDefinition(Route $route): void { + $route + ->setRequirement('_permission', 'manage solutions') + ->setRequirement('_joinup_group', 'collection'); + } + + /** + * {@inheritdoc} + */ + public function access(AccountInterface $account): bool { + if (!$account->hasPermission('manage solutions')) { + return FALSE; + } + + if ($id = $this->routeMatch->getRawParameter('rdf_entity')) { + $ids = $this->entityTypeManager->getStorage('rdf_entity')->getQuery() + ->condition('rid', 'collection') + ->condition('id', UriEncoder::decodeUrl($id)) + ->execute(); + if ($ids) { + return TRUE; + } + } + + return FALSE; + } + + /** + * {@inheritdoc} + */ + public function getCacheMaxAge() { + return Cache::PERMANENT; + } + + /** + * {@inheritdoc} + */ + public function getCacheContexts() { + return [ + 'user.permissions', + ]; + } + + /** + * {@inheritdoc} + */ + public function getCacheTags() { + return []; + } + +} From f71496294b0df2330895d6ef652d37c28ebf385e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 13:45:23 +0100 Subject: [PATCH 188/957] ISAICP-5584: Add a view to manage solutions. --- ...views.view.manage_collection_solutions.yml | 532 ++++++++++++++++ .../SyncFieldsFromParentSolutionTest.php | 1 + ...views.view.manage_collection_solutions.yml | 572 ++++++++++++++++++ web/modules/custom/solution/solution.info.yml | 1 + .../src/Kernel/SolutionAffiliationTest.php | 1 + .../src/Kernel/SolutionValidationTest.php | 1 + 6 files changed, 1108 insertions(+) create mode 100644 config/sync/views.view.manage_collection_solutions.yml create mode 100644 web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml diff --git a/config/sync/views.view.manage_collection_solutions.yml b/config/sync/views.view.manage_collection_solutions.yml new file mode 100644 index 0000000000..3a383e0c23 --- /dev/null +++ b/config/sync/views.view.manage_collection_solutions.yml @@ -0,0 +1,532 @@ +uuid: 7c42c34d-2943-430f-80ef-777fbba1d8da +langcode: en +status: true +dependencies: + config: + - rdf_entity.rdfentity.collection + - search_api.index.published + module: + - joinup_group + - search_api + - solution +id: manage_collection_solutions +label: 'Manage collection solutions' +module: views +description: 'Allows management of solutions within a collection.' +tag: '' +base_table: search_api_index_published +base_field: search_api_id +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: manage_solutions + options: { } + cache: + type: tag + options: { } + query: + type: views_query + options: + bypass_access: false + skip_access: false + preserve_facet_query_args: false + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + pager: + type: full + options: + items_per_page: 10 + offset: 0 + id: 0 + total_pages: null + tags: + previous: ‹‹ + next: ›› + first: '« First' + last: 'Last »' + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + quantity: 9 + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + override: true + sticky: false + caption: '' + summary: '' + description: '' + columns: + rdf_created: rdf_created + rdf_changed: rdf_changed + label: label + info: + rdf_created: + sortable: true + default_sort_order: desc + align: '' + separator: '' + empty_column: false + responsive: '' + rdf_changed: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + label: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + default: rdf_created + empty_table: false + row: + type: fields + fields: + search_api_bulk_form: + id: search_api_bulk_form + table: search_api_index_published + field: search_api_bulk_form + relationship: none + group_type: group + admin_label: '' + label: '' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + action_title: Action + include_exclude: include + selected_actions: + - change_collection + link_to_item: 0 + use_highlighting: 0 + plugin_id: search_api_bulk_form + label: + id: label + table: search_api_index_published + field: label + relationship: none + group_type: group + admin_label: '' + label: Title + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api + fallback_options: + link_to_item: true + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + rdf_created: + id: rdf_created + table: search_api_index_published + field: rdf_created + relationship: none + group_type: group + admin_label: '' + label: 'Created on' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: medium + custom_date_format: '' + timezone: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api_date + fallback_options: + date_format: short + custom_date_format: '' + timezone: '' + link_to_item: false + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + rdf_changed: + id: rdf_changed + table: search_api_index_published + field: rdf_changed + relationship: none + group_type: group + admin_label: '' + label: 'Last update' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: medium + custom_date_format: '' + timezone: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api_date + fallback_options: + date_format: short + custom_date_format: '' + timezone: '' + link_to_item: false + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + filters: + entity_bundle: + id: entity_bundle + table: search_api_index_published + field: entity_bundle + relationship: none + group_type: group + admin_label: '' + operator: '=' + value: + min: '' + max: '' + value: solution + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + placeholder: '' + min_placeholder: '' + max_placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + plugin_id: search_api_string + sorts: { } + title: 'Manage solutions' + header: { } + footer: { } + empty: + area: + id: area + table: views + field: area + relationship: none + group_type: group + admin_label: '' + empty: true + tokenize: false + content: + value: 'This collection contains no solutions yet.' + format: content_editor + plugin_id: text + relationships: { } + arguments: + entity_groups: + id: entity_groups + table: search_api_index_published + field: entity_groups + relationship: none + group_type: group + admin_label: '' + default_action: 'not found' + exception: + value: all + title_enable: false + title: All + title_enable: false + title: '' + default_argument_type: fixed + default_argument_options: + argument: '' + default_argument_skip_url: false + summary_options: { } + summary: + sort_order: asc + number_of_records: 0 + format: default_summary + specify_validation: true + validate: + type: 'entity:rdf_entity' + fail: 'not found' + validate_options: + bundles: + collection: collection + operation: view + multiple: 0 + access: false + break_phrase: false + not: 0 + plugin_id: collection + display_extenders: { } + filter_groups: + operator: AND + groups: { } + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: + - 'config:search_api.index.published' + - 'search_api_list:published' + manage_solutions: + display_plugin: page + id: manage_solutions + display_title: Page + position: 1 + display_options: + display_extenders: { } + path: rdf_entity/%rdf_entity/manage-solutions + menu: + type: tab + title: 'Manage solutions' + description: 'Manage solutions within this collection.' + expanded: false + parent: '' + weight: 120 + context: '0' + menu_name: main + always_use_admin_theme: true + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: + - 'config:search_api.index.published' + - 'search_api_list:published' diff --git a/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php b/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php index f20ba1e920..4dd63eb940 100644 --- a/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php +++ b/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php @@ -62,6 +62,7 @@ class SyncFieldsFromParentSolutionTest extends KernelTestBase { 'text', 'tour', 'user', + 'views', 'workflow_state_permission', ]; diff --git a/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml b/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml new file mode 100644 index 0000000000..4338d33e3e --- /dev/null +++ b/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml @@ -0,0 +1,572 @@ +langcode: en +status: true +dependencies: + config: + - rdf_entity.rdfentity.collection + - search_api.index.published + - user.role.administrator + - user.role.moderator + module: + - joinup_group + - search_api + - user + - views_bulk_operations +id: manage_collection_solutions +label: 'Manage collection solutions' +module: views +description: 'Allows management of solutions within a collection.' +tag: '' +base_table: search_api_index_published +base_field: search_api_id +display: + default: + display_plugin: default + id: default + display_title: Master + position: 0 + display_options: + access: + type: role + options: + role: + moderator: moderator + administrator: administrator + cache: + type: tag + options: { } + query: + type: views_query + options: + bypass_access: false + skip_access: false + preserve_facet_query_args: false + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + pager: + type: full + options: + items_per_page: 30 + offset: 0 + id: 0 + total_pages: null + tags: + previous: ‹‹ + next: ›› + first: '« First' + last: 'Last »' + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + quantity: 9 + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + override: true + sticky: false + caption: '' + summary: '' + description: '' + columns: + rdf_created: rdf_created + rdf_changed: rdf_changed + label: label + info: + rdf_created: + sortable: true + default_sort_order: desc + align: '' + separator: '' + empty_column: false + responsive: '' + rdf_changed: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + label: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + default: rdf_created + empty_table: false + row: + type: fields + fields: + views_bulk_operations_bulk_form: + id: views_bulk_operations_bulk_form + table: views + field: views_bulk_operations_bulk_form + relationship: none + group_type: group + admin_label: '' + label: 'Views bulk operations' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + batch: true + batch_size: 10 + form_step: true + buttons: false + clear_on_exposed: false + action_title: Action + selected_actions: + comment_delete_action: 0 + 'flag_action:subscribe_discussions_flag': 0 + 'flag_action:subscribe_discussions_unflag': 0 + joinup_change_group: 0 + node_unpromote_action: 0 + node_unpublish_action: 0 + node_publish_action: 0 + node_unpublish_by_keyword_action: 0 + node_assign_owner_action: 0 + node_promote_action: 0 + node_save_action: 0 + node_make_sticky_action: 0 + node_make_unsticky_action: 0 + simplenews_send_action: 0 + simplenews_stop_action: 0 + joinup_change_collection: joinup_change_collection + user_unblock_user_action: 0 + user_block_user_action: 0 + user_remove_role_action: 0 + user_add_role_action: 0 + vbo_cancel_user_action: 0 + views_bulk_operations_delete_entity: 0 + pathauto_update_alias: 0 + 'entity:save_action:node': 0 + 'entity:save_action:rdf_entity': 0 + 'entity:save_action:user': 0 + 'entity:unpublish_action:node': 0 + 'entity:unpublish_action:rdf_entity': 0 + 'entity:publish_action:node': 0 + 'entity:publish_action:rdf_entity': 0 + 'entity:delete_action:node': 0 + preconfiguration: + joinup_change_collection: + label_override: '' + plugin_id: views_bulk_operations_bulk_form + label: + id: label + table: search_api_index_published + field: label + relationship: none + group_type: group + admin_label: '' + label: Title + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api + fallback_options: + link_to_item: true + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + rdf_created: + id: rdf_created + table: search_api_index_published + field: rdf_created + relationship: none + group_type: group + admin_label: '' + label: 'Created on' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: medium + custom_date_format: '' + timezone: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api_date + fallback_options: + date_format: short + custom_date_format: '' + timezone: '' + link_to_item: false + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + rdf_changed: + id: rdf_changed + table: search_api_index_published + field: rdf_changed + relationship: none + group_type: group + admin_label: '' + label: 'Last update' + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: medium + custom_date_format: '' + timezone: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_rendering: false + fallback_handler: search_api_date + fallback_options: + date_format: short + custom_date_format: '' + timezone: '' + link_to_item: false + use_highlighting: false + multi_type: separator + multi_separator: ', ' + plugin_id: search_api_field + filters: + entity_bundle: + id: entity_bundle + table: search_api_index_published + field: entity_bundle + relationship: none + group_type: group + admin_label: '' + operator: '=' + value: + min: '' + max: '' + value: solution + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + placeholder: '' + min_placeholder: '' + max_placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + plugin_id: search_api_string + sorts: { } + title: 'Manage solutions' + header: { } + footer: { } + empty: + area: + id: area + table: views + field: area + relationship: none + group_type: group + admin_label: '' + empty: true + tokenize: false + content: + value: 'This collection contains no solutions yet.' + format: content_editor + plugin_id: text + relationships: { } + arguments: + entity_groups: + id: entity_groups + table: search_api_index_published + field: entity_groups + relationship: none + group_type: group + admin_label: '' + default_action: 'not found' + exception: + value: all + title_enable: false + title: All + title_enable: false + title: '' + default_argument_type: fixed + default_argument_options: + argument: '' + default_argument_skip_url: false + summary_options: { } + summary: + sort_order: asc + number_of_records: 0 + format: default_summary + specify_validation: true + validate: + type: 'entity:rdf_entity' + fail: 'not found' + validate_options: + bundles: + collection: collection + operation: view + multiple: 0 + access: false + break_phrase: false + not: 0 + plugin_id: collection + display_extenders: { } + filter_groups: + operator: AND + groups: { } + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.roles + tags: + - 'config:search_api.index.published' + - 'search_api_list:published' + manage_solutions: + display_plugin: page + id: manage_solutions + display_title: Page + position: 1 + display_options: + display_extenders: { } + path: rdf_entity/%rdf_entity/manage-solutions + menu: + type: tab + title: 'Manage solutions' + description: 'Manage solutions within this collection.' + expanded: false + parent: '' + weight: 120 + context: '0' + menu_name: main + always_use_admin_theme: true + cache_metadata: + max-age: 0 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.roles + tags: + - 'config:search_api.index.published' + - 'search_api_list:published' diff --git a/web/modules/custom/solution/solution.info.yml b/web/modules/custom/solution/solution.info.yml index 20abda6525..1e0156a82f 100644 --- a/web/modules/custom/solution/solution.info.yml +++ b/web/modules/custom/solution/solution.info.yml @@ -120,3 +120,4 @@ config_devel: - solution.settings - sparql_entity_storage.mapping.rdf_entity.solution - system.action.change_collection + - views.view.manage_collection_solutions diff --git a/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php b/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php index b93aea15d6..624e797bbd 100644 --- a/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php +++ b/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php @@ -61,6 +61,7 @@ class SolutionAffiliationTest extends KernelTestBase { 'text', 'tour', 'user', + 'views', 'workflow_state_permission', ]; diff --git a/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php b/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php index 7ad6109233..75c7cf7c43 100644 --- a/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php +++ b/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php @@ -34,6 +34,7 @@ class SolutionValidationTest extends RdfEntityValidationTestBase { 'search_api_field', 'smart_trim', 'solution', + 'views', ]; /** From e9e6407c6c40c5e69e25663e01af5d2878dcdf6c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 5 Mar 2020 13:50:21 +0100 Subject: [PATCH 189/957] ISAICP-5584: Add a form to select the destinatiuon collection and perform the move. --- .../custom/solution/solution.routing.yml | 13 ++ .../src/Form/ChangeCollectionForm.php | 221 ++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 web/modules/custom/solution/src/Form/ChangeCollectionForm.php diff --git a/web/modules/custom/solution/solution.routing.yml b/web/modules/custom/solution/solution.routing.yml index e7e60f0a95..544770f669 100644 --- a/web/modules/custom/solution/solution.routing.yml +++ b/web/modules/custom/solution/solution.routing.yml @@ -34,3 +34,16 @@ solution.unshare_form: parameters: rdf_entity: type: entity:rdf_entity + +solution.change_collection: + path: '/rdf_entity/{rdf_entity}/change-collection' + defaults: + _form: Drupal\solution\Form\ChangeCollectionForm + _title: 'Select a destination collection' + requirements: + _permission: 'manage solutions' + _joinup_group: 'collection' + options: + parameters: + rdf_entity: + type: entity:rdf_entity diff --git a/web/modules/custom/solution/src/Form/ChangeCollectionForm.php b/web/modules/custom/solution/src/Form/ChangeCollectionForm.php new file mode 100644 index 0000000000..7ae59cc1ee --- /dev/null +++ b/web/modules/custom/solution/src/Form/ChangeCollectionForm.php @@ -0,0 +1,221 @@ +tempStore = $private_temp_store_factory->get('change_collection'); + $this->entityTypeManager = $entity_type_manager; + $this->selectionPluginManager = $selection_plugin_manager; + $this->logger = $logger_factory->get('joinup'); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container): self { + return new static( + $container->get('tempstore.private'), + $container->get('entity_type.manager'), + $container->get('plugin.manager.entity_reference_selection'), + $container->get('logger.factory') + ); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state): array { + $source_collection = $this->getRouteMatch()->getParameter('rdf_entity'); + + $form['source_collection'] = [ + '#type' => 'value', + '#value' => $source_collection, + ]; + + $form['solutions'] = [ + '#theme' => 'item_list', + '#title' => $this->t('The following solutions from %source collection will be moved to a new collection:', [ + '%source' => $source_collection->label(), + ]), + '#items' => array_map(function (RdfInterface $solution): string { + return $solution->label(); + }, $this->getSolutions()), + '#empty' => $this->t('No solution was selected.'), + ]; + + /** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginBase $selection */ + $selection = $this->selectionPluginManager->createInstance('default:rdf_entity', [ + 'target_type' => 'rdf_entity', + 'target_bundles' => ['collection'], + ]); + $selection_settings = $selection->getConfiguration() + [ + 'match_operator' => 'CONTAINS', + ]; + + $form['destination_collection'] = [ + '#title' => $this->t('Select the destination collection'), + '#type' => 'entity_autocomplete', + '#target_type' => 'rdf_entity', + '#selection_handler' => 'default:rdf_entity', + '#selection_settings' => $selection_settings, + '#maxlength' => 2048, + '#required' => TRUE, + ]; + + $form['actions'] = [ + '#type' => 'actions', + 'submit' => [ + '#type' => 'submit', + '#value' => $this->t('Move solutions'), + ], + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, FormStateInterface $form_state): void { + parent::validateForm($form, $form_state); + if ($form_state->getValue('source_collection')->id() === $form_state->getValue('destination_collection')) { + $form_state->setErrorByName('destination_collection', $this->t('The destination collection cannot be the same as the source collection.')); + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state): void { + /** @var \Drupal\rdf_entity\RdfInterface $source_collection */ + $source_collection = $form_state->getValue('source_collection'); + $destination_collection_id = $form_state->getValue('destination_collection'); + + if (!$destination_collection = $this->getRdfEntityStorage()->load($destination_collection_id)) { + throw new \RuntimeException("Cannot load RDF entity with ID $destination_collection_id"); + } + + foreach ($this->getSolutions() as $solution) { + $messenger_arguments = [ + '%solution' => $solution->toLink()->toString(), + '%destination_collection' => $destination_collection->toLink()->toString(), + ]; + $logger_arguments = [ + '@solution' => $solution->label(), + '@destination_collection' => $destination_collection->label(), + '@source_collection' => $source_collection->label(), + ]; + + try { + // Prevent notification dispatching. + // @see joinup_notification_dispatch_notification() + $solution->skip_notification = TRUE; + $solution->set('collection', $destination_collection_id)->save(); + $this->messenger()->addStatus($this->t('Solution %solution has been moved to %destination_collection.', $messenger_arguments)); + $this->logger->info("Solution '@solution' moved from '@source_collection' to '@destination_collection' collection.", $logger_arguments); + } + catch (\Exception $e) { + $this->messenger()->addError($this->t("Error while trying to change the collection for %solution solution.", $messenger_arguments)); + $this->logger->info("Error while trying to move solution '@solution' from '@source_collection' to '@destination_collection' collection.", $logger_arguments); + } + } + } + + /** + * {@inheritdoc} + */ + public function getFormId(): string { + return 'change_collection'; + } + + /** + * Returns a list of entities to be moved to the new collection. + * + * @return \Drupal\rdf_entity\RdfInterface[] + * A list of entities to be moved to the new collection. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * Thrown if the entity type doesn't exist. + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + * Thrown when an entity with a non-existing storage is passed. + */ + protected function getSolutions(): array { + $solution_ids = $this->tempStore->get('solutions'); + return $solution_ids ? $this->getRdfEntityStorage()->loadMultiple($solution_ids) : []; + } + + /** + * Returns the RDF entity storage. + * + * @return \Drupal\sparql_entity_storage\SparqlEntityStorageInterface + * The RDF entity storage. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * Thrown if the entity type doesn't exist. + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + * Thrown when an entity with a non-existing storage is passed. + */ + protected function getRdfEntityStorage(): SparqlEntityStorageInterface { + /** @var \Drupal\sparql_entity_storage\SparqlEntityStorageInterface $rdf_entity_storage */ + $rdf_entity_storage = $this->entityTypeManager->getStorage('rdf_entity'); + return $rdf_entity_storage; + } + +} From e37c4ac4c4ccedc081aa8bf28c92a0e7cfce51a2 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 10 Mar 2020 08:57:43 +0200 Subject: [PATCH 190/957] ISAICP-5785: Bring phpunit.xml.dist up to date with the latest changes in core. --- phpunit.xml.dist | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 12f791cf3a..35ac48f57c 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -11,15 +11,8 @@ beStrictAboutOutputDuringTests="true" beStrictAboutChangesToGlobalState="true" checkForUnintentionallyCoveredCode="false" + printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter" verbose="true"> - @@ -35,12 +28,21 @@ + + + + - + + + From c417ff4bbb4f63f677f75474941733fe5921ea58 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 12:16:20 +0200 Subject: [PATCH 191/957] ISAICP-5671: Helper service to create a graph store. --- .../joinup_sparql/joinup_sparql.services.yml | 2 ++ .../src/JoinupSparqlGraphStoreHelper.php | 26 +++++++++++++++++++ .../JoinupSparqlGraphStoreHelperInterface.php | 22 ++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelper.php create mode 100644 web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelperInterface.php diff --git a/web/modules/custom/joinup_sparql/joinup_sparql.services.yml b/web/modules/custom/joinup_sparql/joinup_sparql.services.yml index d023be468f..d2704f961f 100644 --- a/web/modules/custom/joinup_sparql/joinup_sparql.services.yml +++ b/web/modules/custom/joinup_sparql/joinup_sparql.services.yml @@ -7,3 +7,5 @@ services: class: Drupal\joinup_sparql\JoinupAcceptHeaderMiddleware tags: - { name: http_middleware, priority: 401 } + joinup_sparql.graph_store.helper: + class: Drupal\joinup_sparql\JoinupSparqlGraphStoreHelper diff --git a/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelper.php b/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelper.php new file mode 100644 index 0000000000..62c2ef111a --- /dev/null +++ b/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelper.php @@ -0,0 +1,26 @@ +traitCreateGraphStore(); + } + +} diff --git a/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelperInterface.php b/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelperInterface.php new file mode 100644 index 0000000000..f54692579d --- /dev/null +++ b/web/modules/custom/joinup_sparql/src/JoinupSparqlGraphStoreHelperInterface.php @@ -0,0 +1,22 @@ + Date: Tue, 10 Mar 2020 12:18:41 +0200 Subject: [PATCH 192/957] ISAICP-5671: Make the update path super-fast. --- .../joinup_group/joinup_group.post_update.php | 89 ++++++++++--------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.post_update.php b/web/modules/custom/joinup_group/joinup_group.post_update.php index fd3d8a334a..2461849de1 100644 --- a/web/modules/custom/joinup_group/joinup_group.post_update.php +++ b/web/modules/custom/joinup_group/joinup_group.post_update.php @@ -8,64 +8,71 @@ declare(strict_types = 1); use Drupal\joinup_group\ContentCreationOptions; +use EasyRdf\Graph; /** * Migrate eLibrary data to the new Content creation field. */ -function joinup_group_post_update_migrate_elibrary(array &$sandbox) { - $field_mapping = [ - 'collection' => [ - 'source' => 'field_ar_elibrary_creation', - 'destination' => 'field_ar_content_creation', - ], - 'solution' => [ - 'source' => 'field_is_elibrary_creation', - 'destination' => 'field_is_content_creation', - ], +function joinup_group_post_update_migrate_elibrar1y(): void { + $predicate_mapping = [ + 'http://joinup.eu/collection/elibrary_creation' => 'http://joinup.eu/collection/content_creation', + 'http://joinup.eu/solution/elibrary_creation' => 'http://joinup.eu/solution/content_creation', ]; - $elibrary_to_content_creation_mapping = [ 0 => ContentCreationOptions::FACILITATORS, 1 => ContentCreationOptions::MEMBERS, 2 => ContentCreationOptions::REGISTERED_USERS, ]; - $storage = \Drupal::entityTypeManager()->getStorage('rdf_entity'); + /** @var \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $sparql */ + $sparql = \Drupal::service('sparql.endpoint'); - if (!isset($sandbox['entity_ids'])) { - $bundles = ['collection', 'solution']; - $sandbox['entity_ids'] = \Drupal::entityQuery('rdf_entity') - ->condition('rid', $bundles, 'IN') - ->execute(); - $sandbox['current'] = 0; - $sandbox['max'] = count($sandbox['entity_ids']); - $sandbox['errors'] = 0; + // Get all elibrary triples regardless of their graph. + $query = <<< Query +SELECT ?graph ?entity_id ?predicate ?value +WHERE { + GRAPH ?graph { + ?entity_id ?predicate ?value . + VALUES ?predicate { } . } +} +Query; + $results = $sparql->query($query); - $slice = array_slice($sandbox['entity_ids'], $sandbox['current'], 50); + $graphs = []; - /** @var \Drupal\rdf_entity\RdfInterface $entity */ - foreach ($storage->loadMultiple($slice) as $entity) { - $bundle = $entity->bundle(); + foreach ($results->getArrayCopy() as $result) { + $graph_uri = (string) $result->graph; + // Instead of running a huge INSERT query that will most probably fail, we + // are using graph objects to store triples for each graph, then we insert + // the graphs into the graph store. + if (!isset($graphs[$graph_uri])) { + $graphs[$graph_uri] = new Graph($graph_uri); + } + $graphs[$graph_uri]->add( + $result->entity_id->getUri(), + $predicate_mapping[$result->predicate->getUri()], + $elibrary_to_content_creation_mapping[$result->value->getValue()] + ); + } - $original_value = $entity->get($field_mapping[$bundle]['source'])->value; - $updated_value = $elibrary_to_content_creation_mapping[$original_value]; + /** @var \Drupal\joinup_sparql\JoinupSparqlGraphStoreHelperInterface $graph_store_helper */ + $graph_store_helper = \Drupal::service('joinup_sparql.graph_store.helper'); + $graph_store = $graph_store_helper->createGraphStore(); - $entity->set($field_mapping[$bundle]['destination'], $updated_value); - $entity->skip_notification = TRUE; - try { - $entity->save(); - } - catch (\Exception $e) { - // Some solutions have lost their collection affiliation and can not be - // updated. Skip these and keep track of the number of errors. - // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-5870 - $sandbox['errors']++; - } + foreach ($graphs as $graph_uri => $graph) { + // Delete the legacy elibrary creation triples. + $query = "WITH <{$graph_uri}> +DELETE { ?s ?p ?o . } +WHERE { + ?s ?p ?o . + VALUES ?p { } . +}"; + $sparql->query($query); - $sandbox['current']++; + // Insert the new content creation triples. We're using here the graph store + // in order to handle a big list of triples. A SPARQL query would have been + // crashed. + $graph_store->insert($graph); } - - $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['current'] / $sandbox['max']); - return "Processed {$sandbox['current']} out of {$sandbox['max']}. Errors: {$sandbox['errors']}"; } From e64dc077dcadc01017faf7dbd79412c47dfc4db8 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 12:20:42 +0200 Subject: [PATCH 193/957] ISAICP-5671: Fix a wrong predicate mapping. --- .../sync/field.storage.rdf_entity.field_is_content_creation.yml | 2 +- .../field.storage.rdf_entity.field_is_content_creation.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/field.storage.rdf_entity.field_is_content_creation.yml b/config/sync/field.storage.rdf_entity.field_is_content_creation.yml index f507d9d2c0..9ac6123569 100644 --- a/config/sync/field.storage.rdf_entity.field_is_content_creation.yml +++ b/config/sync/field.storage.rdf_entity.field_is_content_creation.yml @@ -10,7 +10,7 @@ third_party_settings: sparql_entity_storage: mapping: value: - predicate: 'http://joinup.eu/collection/content_creation' + predicate: 'http://joinup.eu/solution/content_creation' format: literal id: rdf_entity.field_is_content_creation field_name: field_is_content_creation diff --git a/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml b/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml index cc7d34fd40..0d547ff89a 100644 --- a/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml +++ b/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_content_creation.yml @@ -9,7 +9,7 @@ third_party_settings: sparql_entity_storage: mapping: value: - predicate: 'http://joinup.eu/collection/content_creation' + predicate: 'http://joinup.eu/solution/content_creation' format: literal id: rdf_entity.field_is_content_creation field_name: field_is_content_creation From 40b616c4a653d1b8ab446f512fcc337d0da43b44 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 12:23:38 +0200 Subject: [PATCH 194/957] ISAICP-5671: Remove field_ar_elibrary_creation & field_is_elibrary_creation fields. --- ..._display.rdf_entity.collection.default.yml | 2 -- ..._display.rdf_entity.collection.propose.yml | 2 -- ...rm_display.rdf_entity.solution.default.yml | 2 -- ...ew_display.rdf_entity.collection.about.yml | 2 -- ..._display.rdf_entity.collection.compact.yml | 2 -- ..._display.rdf_entity.collection.default.yml | 2 -- ...ntity.collection.digest_message_header.yml | 2 -- ...lay.rdf_entity.collection.group_header.yml | 2 -- ...isplay.rdf_entity.collection.rdf_draft.yml | 2 -- ...f_entity.collection.view_mode_featured.yml | 2 -- ...y.rdf_entity.collection.view_mode_tile.yml | 2 -- ...view_display.rdf_entity.solution.about.yml | 2 -- ...ew_display.rdf_entity.solution.default.yml | 2 -- ...splay.rdf_entity.solution.group_header.yml | 2 -- ..._display.rdf_entity.solution.rdf_draft.yml | 2 -- ...rdf_entity.solution.view_mode_featured.yml | 2 -- ...lay.rdf_entity.solution.view_mode_tile.yml | 2 -- ....collection.field_ar_elibrary_creation.yml | 25 ------------- ...ty.solution.field_is_elibrary_creation.yml | 25 ------------- ....rdf_entity.field_ar_elibrary_creation.yml | 36 ------------------- ....rdf_entity.field_is_elibrary_creation.yml | 33 ----------------- .../custom/collection/collection.info.yml | 2 -- ..._display.rdf_entity.collection.default.yml | 2 -- ...ew_display.rdf_entity.collection.about.yml | 2 -- ..._display.rdf_entity.collection.compact.yml | 2 -- ..._display.rdf_entity.collection.default.yml | 2 -- ...lay.rdf_entity.collection.group_header.yml | 2 -- ...isplay.rdf_entity.collection.rdf_draft.yml | 2 -- ...f_entity.collection.view_mode_featured.yml | 2 -- ...y.rdf_entity.collection.view_mode_tile.yml | 2 -- ....collection.field_ar_elibrary_creation.yml | 22 ------------ ....rdf_entity.field_ar_elibrary_creation.yml | 35 ------------------ ...ntity.collection.digest_message_header.yml | 2 -- ...rm_display.rdf_entity.solution.default.yml | 2 -- ...view_display.rdf_entity.solution.about.yml | 2 -- ...ew_display.rdf_entity.solution.default.yml | 2 -- ...splay.rdf_entity.solution.group_header.yml | 2 -- ..._display.rdf_entity.solution.rdf_draft.yml | 2 -- ...rdf_entity.solution.view_mode_featured.yml | 2 -- ...lay.rdf_entity.solution.view_mode_tile.yml | 2 -- ...ty.solution.field_is_elibrary_creation.yml | 22 ------------ ....rdf_entity.field_is_elibrary_creation.yml | 33 ----------------- web/modules/custom/solution/solution.info.yml | 2 -- ..._display.rdf_entity.collection.propose.yml | 8 ----- 44 files changed, 309 deletions(-) delete mode 100644 config/sync/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml delete mode 100644 config/sync/field.field.rdf_entity.solution.field_is_elibrary_creation.yml delete mode 100644 config/sync/field.storage.rdf_entity.field_ar_elibrary_creation.yml delete mode 100644 config/sync/field.storage.rdf_entity.field_is_elibrary_creation.yml delete mode 100644 web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml delete mode 100644 web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_elibrary_creation.yml delete mode 100644 web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_elibrary_creation.yml delete mode 100644 web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_elibrary_creation.yml diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml index be928643f0..acc2470263 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.default.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -258,7 +257,6 @@ content: hidden: created: true field_ar_affiliates: true - field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true langcode: true diff --git a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml index 9533956e85..384ee44fea 100644 --- a/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml +++ b/config/sync/core.entity_form_display.rdf_entity.collection.propose.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -248,7 +247,6 @@ hidden: created: true current_workflow_state: true field_ar_affiliates: true - field_ar_elibrary_creation: true field_collection_content: true field_newsletter: true field_site_featured: true diff --git a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml index e8f9d6c32a..9b09acac4e 100644 --- a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -357,7 +356,6 @@ hidden: field_is_affiliations_requests: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml index 66f597af9f..bf4927629d 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.about.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -163,7 +162,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml index 182d9af26c..a3555543db 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.compact.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -66,7 +65,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml index e22b00984c..4e2178dce6 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.default.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.default.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -136,7 +135,6 @@ hidden: field_ar_closed: true field_ar_contact_information: true field_ar_content_creation: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true field_ar_owner: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml index 804d70fbe4..a91f65c89e 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.digest_message_header.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -53,7 +52,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true field_ar_owner: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml index 3a08523b7e..660b8d5146 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.group_header.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -105,7 +104,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index b20c159709..113b0ecdf3 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -132,7 +131,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml index 3ee5cb2980..d491cd0a35 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -87,7 +86,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml index dd21694069..1d45930a8d 100644 --- a/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml +++ b/config/sync/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -87,7 +86,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml index 5471618aa0..42fa561b8b 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.about.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.about.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -348,7 +347,6 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml index 7b5b069648..6be0438904 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.default.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.default.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -147,7 +146,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml index 8fb9734931..dd42d47255 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.group_header.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -114,7 +113,6 @@ hidden: field_is_description: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml index 4386e493f5..509980cb4e 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.rdf_draft.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -316,7 +315,6 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_logo: true field_is_pinned_in: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml index f333b9841e..ffee0efb7d 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -112,7 +111,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml index 9fab6bb9d4..6ba9b34159 100644 --- a/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml +++ b/config/sync/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml @@ -14,7 +14,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -112,7 +111,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/config/sync/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml b/config/sync/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml deleted file mode 100644 index 64f51d7a07..0000000000 --- a/config/sync/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml +++ /dev/null @@ -1,25 +0,0 @@ -uuid: c04c2197-d886-4a94-9dd1-0667f292e890 -langcode: en -status: true -dependencies: - config: - - field.storage.rdf_entity.field_ar_elibrary_creation - - rdf_entity.rdfentity.collection - module: - - options -_core: - default_config_hash: IoZGfUZCM7tt_84KzF4FTim_ftIk9zkLp70qvro59Bg -id: rdf_entity.collection.field_ar_elibrary_creation -field_name: field_ar_elibrary_creation -entity_type: rdf_entity -bundle: collection -label: 'eLibrary creation' -description: 'Specify the type of user that can create eLibrary content (news, events, and documents).' -required: true -translatable: false -default_value: - - - value: 1 -default_value_callback: '' -settings: { } -field_type: list_integer diff --git a/config/sync/field.field.rdf_entity.solution.field_is_elibrary_creation.yml b/config/sync/field.field.rdf_entity.solution.field_is_elibrary_creation.yml deleted file mode 100644 index 51477fe403..0000000000 --- a/config/sync/field.field.rdf_entity.solution.field_is_elibrary_creation.yml +++ /dev/null @@ -1,25 +0,0 @@ -uuid: 3fe65ff5-88da-492a-b404-a2d4dbd1f7db -langcode: en -status: true -dependencies: - config: - - field.storage.rdf_entity.field_is_elibrary_creation - - rdf_entity.rdfentity.solution - module: - - options -_core: - default_config_hash: Y7oZ9FTXMqxYZTieo7q13_CZcRryrWu_I-69t8HzGgo -id: rdf_entity.solution.field_is_elibrary_creation -field_name: field_is_elibrary_creation -entity_type: rdf_entity -bundle: solution -label: 'eLibrary creation' -description: 'Specify the type of user that can create eLibrary content (news, events, and documents).' -required: true -translatable: false -default_value: - - - value: 0 -default_value_callback: '' -settings: { } -field_type: list_integer diff --git a/config/sync/field.storage.rdf_entity.field_ar_elibrary_creation.yml b/config/sync/field.storage.rdf_entity.field_ar_elibrary_creation.yml deleted file mode 100644 index 4f71e0bf1e..0000000000 --- a/config/sync/field.storage.rdf_entity.field_ar_elibrary_creation.yml +++ /dev/null @@ -1,36 +0,0 @@ -uuid: 3ab3f9a6-8e88-4e19-bff1-c55abd2cd0a1 -langcode: en -status: true -dependencies: - module: - - options - - rdf_entity -third_party_settings: - sparql_entity_storage: - mapping: - value: - predicate: 'http://joinup.eu/collection/elibrary_creation' - format: 'xsd:integer' -id: rdf_entity.field_ar_elibrary_creation -field_name: field_ar_elibrary_creation -entity_type: rdf_entity -type: list_integer -settings: - allowed_values: - - - value: 0 - label: 'Only collection facilitators can create new content.' - - - value: 1 - label: 'Only members can create new content.' - - - value: 2 - label: 'Any registered user can create new content.' - allowed_values_function: '' -module: options -locked: false -cardinality: 1 -translatable: false -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/config/sync/field.storage.rdf_entity.field_is_elibrary_creation.yml b/config/sync/field.storage.rdf_entity.field_is_elibrary_creation.yml deleted file mode 100644 index 5ce72bd452..0000000000 --- a/config/sync/field.storage.rdf_entity.field_is_elibrary_creation.yml +++ /dev/null @@ -1,33 +0,0 @@ -uuid: fd63c438-a3c6-4821-939d-137b768815d5 -langcode: en -status: true -dependencies: - module: - - options - - rdf_entity -third_party_settings: - sparql_entity_storage: - mapping: - value: - predicate: 'http://joinup.eu/solution/elibrary_creation' - format: 'xsd:integer' -id: rdf_entity.field_is_elibrary_creation -field_name: field_is_elibrary_creation -entity_type: rdf_entity -type: list_integer -settings: - allowed_values: - - - value: 0 - label: 'Only solution facilitators can create new content' - - - value: 2 - label: 'Any registered user can create new content' - allowed_values_function: '' -module: options -locked: false -cardinality: 1 -translatable: false -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/web/modules/custom/collection/collection.info.yml b/web/modules/custom/collection/collection.info.yml index 1dd115922a..983e67cda8 100644 --- a/web/modules/custom/collection/collection.info.yml +++ b/web/modules/custom/collection/collection.info.yml @@ -50,7 +50,6 @@ config_devel: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -69,7 +68,6 @@ config_devel: - field.storage.rdf_entity.field_ar_contact_information - field.storage.rdf_entity.field_ar_content_creation - field.storage.rdf_entity.field_ar_description - - field.storage.rdf_entity.field_ar_elibrary_creation - field.storage.rdf_entity.field_ar_logo - field.storage.rdf_entity.field_ar_moderation - field.storage.rdf_entity.field_ar_owner diff --git a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml index a393d19248..c0c13fcad1 100644 --- a/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml +++ b/web/modules/custom/collection/config/install/core.entity_form_display.rdf_entity.collection.default.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -257,7 +256,6 @@ content: hidden: created: true field_ar_affiliates: true - field_ar_elibrary_creation: true field_site_featured: true field_site_pinned: true langcode: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml index c4e62ed828..f2d89911a2 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.about.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -162,7 +161,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml index 8f7ad7421b..8578783297 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.compact.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -65,7 +64,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml index 311faf0094..e00b5fca8c 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.default.yml @@ -10,7 +10,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -135,7 +134,6 @@ hidden: field_ar_closed: true field_ar_contact_information: true field_ar_content_creation: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true field_ar_owner: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml index 17af8ed124..57d9613910 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.group_header.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -104,7 +103,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml index 712174be85..5c001c86d1 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.rdf_draft.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -131,7 +130,6 @@ hidden: created: true field_ar_affiliates: true field_ar_banner: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_state: true field_collection_content: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml index ce5e2ad1f8..69ba67f242 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_featured.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -86,7 +85,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml index f7d71e54af..7f2de042bd 100644 --- a/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml +++ b/web/modules/custom/collection/config/install/core.entity_view_display.rdf_entity.collection.view_mode_tile.yml @@ -11,7 +11,6 @@ dependencies: - 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_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -86,7 +85,6 @@ hidden: field_ar_contact_information: true field_ar_content_creation: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_moderation: true field_ar_owner: true field_ar_state: true diff --git a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml b/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml deleted file mode 100644 index 4c2e434d6e..0000000000 --- a/web/modules/custom/collection/config/install/field.field.rdf_entity.collection.field_ar_elibrary_creation.yml +++ /dev/null @@ -1,22 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.rdf_entity.field_ar_elibrary_creation - - rdf_entity.rdfentity.collection - module: - - options -id: rdf_entity.collection.field_ar_elibrary_creation -field_name: field_ar_elibrary_creation -entity_type: rdf_entity -bundle: collection -label: 'eLibrary creation' -description: 'Specify the type of user that can create eLibrary content (news, events, and documents).' -required: true -translatable: false -default_value: - - - value: 1 -default_value_callback: '' -settings: { } -field_type: list_integer diff --git a/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_elibrary_creation.yml b/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_elibrary_creation.yml deleted file mode 100644 index 656a8a3391..0000000000 --- a/web/modules/custom/collection/config/install/field.storage.rdf_entity.field_ar_elibrary_creation.yml +++ /dev/null @@ -1,35 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - options - - rdf_entity -third_party_settings: - sparql_entity_storage: - mapping: - value: - predicate: 'http://joinup.eu/collection/elibrary_creation' - format: 'xsd:integer' -id: rdf_entity.field_ar_elibrary_creation -field_name: field_ar_elibrary_creation -entity_type: rdf_entity -type: list_integer -settings: - allowed_values: - - - value: 0 - label: 'Only collection facilitators can create new content.' - - - value: 1 - label: 'Only members can create new content.' - - - value: 2 - label: 'Any registered user can create new content.' - allowed_values_function: '' -module: options -locked: false -cardinality: 1 -translatable: false -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/web/modules/custom/joinup_subscription/config/install/core.entity_view_display.rdf_entity.collection.digest_message_header.yml b/web/modules/custom/joinup_subscription/config/install/core.entity_view_display.rdf_entity.collection.digest_message_header.yml index 474008b9f0..edb035cd0d 100644 --- a/web/modules/custom/joinup_subscription/config/install/core.entity_view_display.rdf_entity.collection.digest_message_header.yml +++ b/web/modules/custom/joinup_subscription/config/install/core.entity_view_display.rdf_entity.collection.digest_message_header.yml @@ -10,7 +10,6 @@ dependencies: - field.field.rdf_entity.collection.field_ar_closed - field.field.rdf_entity.collection.field_ar_contact_information - field.field.rdf_entity.collection.field_ar_description - - field.field.rdf_entity.collection.field_ar_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -50,7 +49,6 @@ hidden: field_ar_closed: true field_ar_contact_information: true field_ar_description: true - field_ar_elibrary_creation: true field_ar_logo: true field_ar_moderation: true field_ar_owner: true diff --git a/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml b/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml index 6678b411ff..9ed2711997 100644 --- a/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml +++ b/web/modules/custom/solution/config/install/core.entity_form_display.rdf_entity.solution.default.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -356,7 +355,6 @@ hidden: field_is_affiliations_requests: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml index c98c4756ee..b8ba9aa465 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.about.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -347,7 +346,6 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml index f117506c70..60ecf338bd 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.default.yml @@ -12,7 +12,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -146,7 +145,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml index 4a18ee2ce0..57896a7cbe 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.group_header.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -113,7 +112,6 @@ hidden: field_is_description: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml index 67af8a12ef..5eb696c25d 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.rdf_draft.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -315,7 +314,6 @@ hidden: field_is_banner: true field_is_content: true field_is_distribution: true - field_is_elibrary_creation: true field_is_has_version: true field_is_logo: true field_is_pinned_in: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml index 2f8c00b4d9..ea488ad10d 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_featured.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -111,7 +110,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml index d0dd9c94f5..0c21d575d0 100644 --- a/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml +++ b/web/modules/custom/solution/config/install/core.entity_view_display.rdf_entity.solution.view_mode_tile.yml @@ -13,7 +13,6 @@ dependencies: - 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_elibrary_creation - 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 @@ -111,7 +110,6 @@ hidden: field_is_content_creation: true field_is_distribution: true field_is_documentation: true - field_is_elibrary_creation: true field_is_has_version: true field_is_included_asset: true field_is_issue_tracker: true diff --git a/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_elibrary_creation.yml b/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_elibrary_creation.yml deleted file mode 100644 index ce8240c7dd..0000000000 --- a/web/modules/custom/solution/config/install/field.field.rdf_entity.solution.field_is_elibrary_creation.yml +++ /dev/null @@ -1,22 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.rdf_entity.field_is_elibrary_creation - - rdf_entity.rdfentity.solution - module: - - options -id: rdf_entity.solution.field_is_elibrary_creation -field_name: field_is_elibrary_creation -entity_type: rdf_entity -bundle: solution -label: 'eLibrary creation' -description: 'Specify the type of user that can create eLibrary content (news, events, and documents).' -required: true -translatable: false -default_value: - - - value: 0 -default_value_callback: '' -settings: { } -field_type: list_integer diff --git a/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_elibrary_creation.yml b/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_elibrary_creation.yml deleted file mode 100644 index b532f13189..0000000000 --- a/web/modules/custom/solution/config/install/field.storage.rdf_entity.field_is_elibrary_creation.yml +++ /dev/null @@ -1,33 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - options - - rdf_entity -third_party_settings: - sparql_entity_storage: - mapping: - value: - predicate: 'http://joinup.eu/solution/elibrary_creation' - format: 'xsd:integer' -id: rdf_entity.field_is_elibrary_creation -field_name: field_is_elibrary_creation -entity_type: rdf_entity -type: list_integer -settings: - allowed_values: - - - value: 0 - label: 'Only solution facilitators can create new content' - - - # Keep the value to 2 to be generically handled along with the collection's corresponding field. - value: 2 - label: 'Any registered user can create new content' - allowed_values_function: '' -module: options -locked: false -cardinality: 1 -translatable: false -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/web/modules/custom/solution/solution.info.yml b/web/modules/custom/solution/solution.info.yml index 30027ea549..12775dd327 100644 --- a/web/modules/custom/solution/solution.info.yml +++ b/web/modules/custom/solution/solution.info.yml @@ -47,7 +47,6 @@ config_devel: - 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_elibrary_creation - 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 @@ -89,7 +88,6 @@ config_devel: - field.storage.rdf_entity.field_is_description - field.storage.rdf_entity.field_is_distribution - field.storage.rdf_entity.field_is_documentation - - field.storage.rdf_entity.field_is_elibrary_creation - field.storage.rdf_entity.field_is_has_version - field.storage.rdf_entity.field_is_included_asset - field.storage.rdf_entity.field_is_issue_tracker diff --git a/web/profiles/joinup/config/install/core.entity_form_display.rdf_entity.collection.propose.yml b/web/profiles/joinup/config/install/core.entity_form_display.rdf_entity.collection.propose.yml index 3ababffdf3..828f9d1ba2 100644 --- a/web/profiles/joinup/config/install/core.entity_form_display.rdf_entity.collection.propose.yml +++ b/web/profiles/joinup/config/install/core.entity_form_display.rdf_entity.collection.propose.yml @@ -11,7 +11,6 @@ dependencies: - field.field.rdf_entity.collection.field_ar_closed - field.field.rdf_entity.collection.field_ar_contact_information - field.field.rdf_entity.collection.field_ar_description - - field.field.rdf_entity.collection.field_ar_elibrary_creation - field.field.rdf_entity.collection.field_ar_logo - field.field.rdf_entity.collection.field_ar_moderation - field.field.rdf_entity.collection.field_ar_owner @@ -74,7 +73,6 @@ third_party_settings: - field_ar_banner - field_spatial_coverage - field_ar_closed - - field_ar_elibrary_creation - field_ar_moderation parent_name: group_general weight: 6 @@ -153,12 +151,6 @@ content: hide_guidelines: '1' type: text_textarea region: content - field_ar_elibrary_creation: - weight: 17 - settings: { } - third_party_settings: { } - type: options_select - region: content field_ar_logo: weight: 11 settings: From 582c5e651918352cf98a0f49fa2c7785d4bc5fbb Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 12:25:11 +0200 Subject: [PATCH 195/957] ISAICP-5671: Remove references to non-existing field_isr_elibrary_creation field. --- ...ntity_view_display.rdf_entity.asset_release.compact.yml | 7 ------- ...ntity_view_display.rdf_entity.asset_release.default.yml | 7 ------- ...display.rdf_entity.asset_release.view_mode_featured.yml | 7 ------- ...iew_display.rdf_entity.asset_release.view_mode_tile.yml | 7 ------- ...ntity_view_display.rdf_entity.asset_release.compact.yml | 7 ------- ...ntity_view_display.rdf_entity.asset_release.default.yml | 7 ------- ...display.rdf_entity.asset_release.view_mode_featured.yml | 7 ------- ...iew_display.rdf_entity.asset_release.view_mode_tile.yml | 7 ------- 8 files changed, 56 deletions(-) diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.compact.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.compact.yml index 5d970224d2..ab4f905d86 100644 --- a/config/sync/core.entity_view_display.rdf_entity.asset_release.compact.yml +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.compact.yml @@ -68,13 +68,6 @@ content: link: false third_party_settings: { } region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.default.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.default.yml index d729b7d87d..5d70007c85 100644 --- a/config/sync/core.entity_view_display.rdf_entity.asset_release.default.yml +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.default.yml @@ -94,13 +94,6 @@ content: third_party_settings: joinup: template_suggestion: '' - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml index 22a7309e57..89f23c94f1 100644 --- a/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml @@ -71,13 +71,6 @@ content: third_party_settings: { } type: entity_reference_label region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml b/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml index 23f5851a57..449347719f 100644 --- a/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml +++ b/config/sync/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml @@ -72,13 +72,6 @@ content: third_party_settings: { } type: entity_reference_label region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.compact.yml b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.compact.yml index b26928f0ac..df74ba4dc0 100644 --- a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.compact.yml +++ b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.compact.yml @@ -65,13 +65,6 @@ content: link: false third_party_settings: { } region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.default.yml b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.default.yml index 35c733f6c4..d25d0199aa 100644 --- a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.default.yml +++ b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.default.yml @@ -90,13 +90,6 @@ content: third_party_settings: joinup: template_suggestion: '' - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml index 3b2009ee47..a20c74c567 100644 --- a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml +++ b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_featured.yml @@ -67,13 +67,6 @@ content: third_party_settings: { } type: entity_reference_label region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above diff --git a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml index 364259de68..0099e8fde8 100644 --- a/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml +++ b/web/modules/custom/asset_release/config/install/core.entity_view_display.rdf_entity.asset_release.view_mode_tile.yml @@ -68,13 +68,6 @@ content: third_party_settings: { } type: entity_reference_label region: content - field_isr_elibrary_creation: - weight: 13 - label: above - settings: { } - third_party_settings: { } - type: list_default - region: content field_isr_issue_tracker: weight: 19 label: above From ddfca3205b2c3baa1b633778a32961a4960c7023 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 14:04:07 +0200 Subject: [PATCH 196/957] ISAICP-5671: Fix a label leftover. --- .../config/schema/joinup_community_content.schema.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_community_content/config/schema/joinup_community_content.schema.yml b/web/modules/custom/joinup_community_content/config/schema/joinup_community_content.schema.yml index 13145a3c9b..ce4fc4011c 100644 --- a/web/modules/custom/joinup_community_content/config/schema/joinup_community_content.schema.yml +++ b/web/modules/custom/joinup_community_content/config/schema/joinup_community_content.schema.yml @@ -18,7 +18,7 @@ joinup_community_content.permission_scheme: label: 'Workflow id' type: sequence sequence: - label: 'eLibrary value' + label: 'Content creation value' type: sequence sequence: label: 'Transition id' From 8583557d538283990a90c0e0331c96358cb36534 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 14:29:35 +0200 Subject: [PATCH 197/957] ISAICP-5671: Typo. --- web/modules/custom/joinup_group/joinup_group.post_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_group/joinup_group.post_update.php b/web/modules/custom/joinup_group/joinup_group.post_update.php index 2461849de1..34c877570f 100644 --- a/web/modules/custom/joinup_group/joinup_group.post_update.php +++ b/web/modules/custom/joinup_group/joinup_group.post_update.php @@ -13,7 +13,7 @@ /** * Migrate eLibrary data to the new Content creation field. */ -function joinup_group_post_update_migrate_elibrar1y(): void { +function joinup_group_post_update_migrate_elibrary(): void { $predicate_mapping = [ 'http://joinup.eu/collection/elibrary_creation' => 'http://joinup.eu/collection/content_creation', 'http://joinup.eu/solution/elibrary_creation' => 'http://joinup.eu/solution/content_creation', From 9d07916dd0185d01882169255848732023665376 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 10 Mar 2020 16:30:51 +0200 Subject: [PATCH 198/957] ISAICP-5837: Remove command to generate missing path aliases from deploy script. --- scripts/update_production.sh | 4 ---- scripts/update_uat.sh | 4 ---- 2 files changed, 8 deletions(-) diff --git a/scripts/update_production.sh b/scripts/update_production.sh index 2b6b3d57cb..6b6e7dade1 100755 --- a/scripts/update_production.sh +++ b/scripts/update_production.sh @@ -44,10 +44,6 @@ touch disable-config-readonly ./vendor/bin/drush updatedb --yes && ./vendor/bin/drush search-api:reset-tracker --yes && -# Todo: Remove this in release 1.58. -# See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-5837 -./vendor/bin/drush pag create rdf_entity - echo "Rebuilding node access records." && ./vendor/bin/drush php:eval "if(node_access_needs_rebuild()) { node_access_rebuild(); }" diff --git a/scripts/update_uat.sh b/scripts/update_uat.sh index f27aeea31b..772adc0ca0 100755 --- a/scripts/update_uat.sh +++ b/scripts/update_uat.sh @@ -18,10 +18,6 @@ touch disable-config-readonly ./vendor/bin/drush updatedb --yes ./vendor/bin/drush pm:enable stage_file_proxy --yes -# Todo: Remove this in release 1.58. -# See https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-5837 -./vendor/bin/drush pag create rdf_entity - echo "Rebuilding node access records." ./vendor/bin/drush php:eval "if(node_access_needs_rebuild()) { node_access_rebuild(); }" From 3b2202c3ce142969f48d8932eef7ee961e2399a7 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 11 Mar 2020 10:12:05 +0200 Subject: [PATCH 199/957] ISAICP-5671: Minor cleanups. --- web/modules/custom/joinup_group/joinup_group.post_update.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.post_update.php b/web/modules/custom/joinup_group/joinup_group.post_update.php index 34c877570f..0d8105279f 100644 --- a/web/modules/custom/joinup_group/joinup_group.post_update.php +++ b/web/modules/custom/joinup_group/joinup_group.post_update.php @@ -66,12 +66,12 @@ function joinup_group_post_update_migrate_elibrary(): void { DELETE { ?s ?p ?o . } WHERE { ?s ?p ?o . - VALUES ?p { } . + VALUES ?p { } . }"; $sparql->query($query); // Insert the new content creation triples. We're using here the graph store - // in order to handle a big list of triples. A SPARQL query would have been + // in order to handle a big list of triples. A SPARQL query would have // crashed. $graph_store->insert($graph); } From bdac3dae71ce1ffc77cdd5640cdba3e6b92e7f8a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 11 Mar 2020 17:23:46 +0200 Subject: [PATCH 200/957] Depending on the initial computed field value being auto-created is deprecated. Fixes deprecation warning: Automatically creating the first item for computed fields is deprecated in Drupal 8.5.x and will be removed before Drupal 9.0.0. Use \Drupal\Core\TypedData\ComputedItemListTrait instead. --- .../Field/FieldType/CurrentWorkflowState.php | 3 +++ .../CurrentWorkflowStateFieldItemList.php | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php index 9e13768a28..cb56ad34f8 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php @@ -1,5 +1,7 @@ list[0] = $this->createItem(0, ''); + } + +} From d9f45c7245fe329c0bd67e8279891a28678517ef Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 11 Mar 2020 21:57:19 +0200 Subject: [PATCH 201/957] ISAICP-5791: Fix the 'EU Login' link on the Limited Access page. --- .../eulogin/src/Controller/LimitedAccessController.php | 7 ++++++- .../eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php index a306b02438..623779dc7a 100644 --- a/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php +++ b/web/modules/custom/eulogin/src/Controller/LimitedAccessController.php @@ -5,6 +5,7 @@ namespace Drupal\joinup_eulogin\Controller; use Drupal\Core\Controller\ControllerBase; +use Drupal\Core\Url; /** * Provides a controller for the joinup_eulogin.page.limited_access route. @@ -18,12 +19,16 @@ class LimitedAccessController extends ControllerBase { * The page content as a render array. */ public function page(): array { + $this->getRedirectDestination()->set(Url::fromRoute('cas.login')->toString()); return [ [ '#theme' => 'status_messages', '#message_list' => [ 'warning' => [ - $this->t('

Dear @name

Your account access is limited.
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.

', ['@name' => $this->currentUser()->getDisplayName()]), + $this->t('

Dear @name

Your account access is limited.
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.

', [ + '@name' => $this->currentUser()->getDisplayName(), + ':eulogin_url' => Url::fromRoute('user.logout', [], ['query' => $this->getRedirectDestination()->getAsArray()])->toString(), + ]), ], ], ], diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 3fcbd1020d..1495b28b18 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -156,6 +156,8 @@ protected function assertLimitedAccess($url): void { $assert->pageTextContains("Dear {$this->account->getDisplayName()}"); $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'); } /** From 8bbbaec403562d0c433a1d7898b041b4c9143a05 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 12 Mar 2020 10:43:04 +0200 Subject: [PATCH 202/957] ISAICP-5584: Update documentation. --- tests/features/solution/manage_solutions.feature | 15 ++++++++------- .../argument/DecodeRdfEntityIdArgumentTrait.php | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/features/solution/manage_solutions.feature b/tests/features/solution/manage_solutions.feature index 1db96cb225..720c6c3320 100644 --- a/tests/features/solution/manage_solutions.feature +++ b/tests/features/solution/manage_solutions.feature @@ -1,7 +1,7 @@ @api @group-a Feature: As a moderator I want to be able to move solutions to other collection. - Scenario: Test moving solution to other collection. + Scenario: Moderators can move a solution to a different collection. Given the following collections: | uri | title | state | @@ -9,12 +9,13 @@ Feature: As a moderator I want to be able to move solutions to other collection. | http://example.com/destination | Destination | validated | And solutions: - | title | collection | state | - | Solution 1 | Source | validated | - | Solution 2 | Source | validated | - | Solution 3 | Source | validated | - | Solution 4 | Source | validated | + | title | collection | state | + | Solution 1 | Source | validated | + | Solution 2 | Source | validated | + | Solution 3 | Source | validated | + | Solution 4 | Source | validated | + # Only moderators should be able to access this feature. Given I am an anonymous user When I go to the homepage of the "Source" collection Then I should not see the link "Manage solutions" @@ -49,7 +50,7 @@ Feature: As a moderator I want to be able to move solutions to other collection. | Solution 1 | | Solution 4 | - # Try to move to the source collection. + # Trying to move solutions to the same collection should result in an error. When I fill in "Select the destination collection" with "Source" And I press "Move solutions" Then I should see the error message "The destination collection cannot be the same as the source collection." diff --git a/web/modules/custom/joinup_group/src/Plugin/views/argument/DecodeRdfEntityIdArgumentTrait.php b/web/modules/custom/joinup_group/src/Plugin/views/argument/DecodeRdfEntityIdArgumentTrait.php index efe60b934b..fce43dba09 100644 --- a/web/modules/custom/joinup_group/src/Plugin/views/argument/DecodeRdfEntityIdArgumentTrait.php +++ b/web/modules/custom/joinup_group/src/Plugin/views/argument/DecodeRdfEntityIdArgumentTrait.php @@ -7,7 +7,7 @@ use Drupal\sparql_entity_storage\UriEncoder; /** - * Reusable code for group argument views handlers. + * Reusable Views argument setter for arguments based on Sparql URIs. */ trait DecodeRdfEntityIdArgumentTrait { From 0fab6a7084b22c94f18dfc72c14ad4a8583126df Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 12 Mar 2020 12:55:42 +0200 Subject: [PATCH 203/957] ISAICP-5584: Fix mixup of snake case and camel case in variable name. --- .../solution/src/Plugin/Action/ChangeCollectionAction.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php index 4640f7a472..a2f0d29ffc 100644 --- a/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php +++ b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php @@ -40,12 +40,12 @@ class ChangeCollectionAction extends ActionBase implements ContainerFactoryPlugi * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. - * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $private_tempStore_factory + * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $private_tempstore_factory * The private tempstore factory. */ - public function __construct(array $configuration, string $plugin_id, $plugin_definition, PrivateTempStoreFactory $private_tempStore_factory) { + public function __construct(array $configuration, string $plugin_id, $plugin_definition, PrivateTempStoreFactory $private_tempstore_factory) { parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->tempStore = $private_tempStore_factory->get('change_collection'); + $this->tempStore = $private_tempstore_factory->get('change_collection'); } /** From da4ee1c60151d11f365dff1293e693752af3461c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 12 Mar 2020 15:17:37 +0200 Subject: [PATCH 204/957] ISAICP-5882: Fatal error when saving a document with an orphaned file reference. --- .../custom/joinup_licence/joinup_licence.module | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/web/modules/custom/joinup_licence/joinup_licence.module b/web/modules/custom/joinup_licence/joinup_licence.module index 686b50310b..515bc85e14 100644 --- a/web/modules/custom/joinup_licence/joinup_licence.module +++ b/web/modules/custom/joinup_licence/joinup_licence.module @@ -184,6 +184,9 @@ function joinup_licence_theme($existing, $type, $theme, $path) { * * Adds extension and file size to the available variables when rendering a * document node. + * + * @todo Why is this in joinup_licence? What does this have to do with licences? + * @todo Update documentation, this is not retrieving extensions nor file sizes. */ function joinup_licence_preprocess_node(&$variables) { /** @var \Drupal\node\NodeInterface $node */ @@ -200,12 +203,19 @@ function joinup_licence_preprocess_node(&$variables) { $variables['created'] = \Drupal::service('date.formatter')->format($node->getCreatedTime(), 'date_only'); } + // @todo Consider moving the below logic into joinup_document. if ($node->bundle() !== 'document' || $node->get('field_file')->isEmpty()) { return; } /** @var \Drupal\file\FileInterface $file */ $file = $node->get('field_file')->first()->entity; + + // The document could reference an orphaned file entity. + if (empty($file)) { + return; + } + $is_remote = \Drupal::service('file_url.handler')->isRemote($file); if (!$is_remote) { From b47fd642bdebd7260cda49cc5d5c7317c1193c24 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 13 Mar 2020 17:02:31 +0200 Subject: [PATCH 205/957] Use the default solr url to download solr. --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index 4039bee58e..68886474a3 100644 --- a/build.properties +++ b/build.properties @@ -135,7 +135,7 @@ solr.version = 7.7.1 solr.tarball.filename = solr-${solr.version}.tgz # Download URL. -solr.download.url = http://www-eu.apache.org/dist/lucene/solr/${solr.version}/${solr.tarball.filename} +solr.download.url = http://archive.apache.org/dist/lucene/solr/${solr.version}/${solr.tarball.filename} # Installation path. solr.vendor.dir = ${project.basedir}/vendor/apache From e5ffe639b02b33e03ebb5978202d4049ec516d33 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 13 Mar 2020 19:17:22 +0200 Subject: [PATCH 206/957] ISAICP-5584: Fixing QA remarks. --- ...views.view.manage_collection_solutions.yml | 16 +++- .../src/Access/JoinupGroupAccessCheck.php | 25 +++--- .../joinup_group/src/JoinupGroupHelper.php | 12 ++- ...views.view.manage_collection_solutions.yml | 89 +++++++------------ .../src/Form/ChangeCollectionForm.php | 2 +- 5 files changed, 68 insertions(+), 76 deletions(-) diff --git a/config/sync/views.view.manage_collection_solutions.yml b/config/sync/views.view.manage_collection_solutions.yml index 3a383e0c23..f1d5add5ba 100644 --- a/config/sync/views.view.manage_collection_solutions.yml +++ b/config/sync/views.view.manage_collection_solutions.yml @@ -48,7 +48,7 @@ display: pager: type: full options: - items_per_page: 10 + items_per_page: 20 offset: 0 id: 0 total_pages: null @@ -428,7 +428,19 @@ display: default_group_multiple: { } group_items: { } plugin_id: search_api_string - sorts: { } + sorts: + label: + id: label + table: search_api_index_published + field: label + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + plugin_id: search_api title: 'Manage solutions' header: { } footer: { } diff --git a/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php b/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php index e2d3d207c6..afb91b5166 100644 --- a/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php +++ b/web/modules/custom/joinup_group/src/Access/JoinupGroupAccessCheck.php @@ -9,6 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Routing\Access\AccessInterface; use Drupal\Core\Routing\RouteMatchInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\rdf_entity\RdfInterface; use Drupal\sparql_entity_storage\UriEncoder; use Symfony\Component\Routing\Route; @@ -16,7 +17,7 @@ /** * Provides a route access checker for _joinup_group route requirement. * - * Routes using the _is_joinup_group access check requirement should have paths + * Routes using the _joinup_group access check requirement should have paths * containing the {rdf_entity} route parameter. The route requirement should * provide one of the following values: * - 'TRUE': Access is granted if the {rdf_entity} route parameter is an RDF @@ -28,9 +29,6 @@ * - 'FALSE': Access is granted if the {rdf_entity} route parameter is an RDF * entity whose bundle is neither 'collection', nor 'solution'. * - For any other value, an exception is thrown. - * - * If the {rdf_entity} route parameter is missed or is not an RDF entity the - * access checker will make no decision. */ class JoinupGroupAccessCheck implements AccessInterface { @@ -63,13 +61,14 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager) { * The access result. * * @throws \Exception - * If the '_joinup_group' route requirement value is not one of 'TRUE', - * 'FALSE', 'collection' or 'solution'. + * Thrown in one of the following circumstances: + * - The '_joinup_group' route requirement value is not one of 'TRUE', + * 'FALSE', 'collection' or 'solution'. + * - The {rdf_entity} route parameter is missed or is not an RDF entity. */ public function access(Route $route, RouteMatchInterface $route_match): AccessResultInterface { - $bundles = ['collection' => 'collection', 'solution' => 'solution']; $requirement = $route->getRequirement('_joinup_group'); - if (!in_array($requirement, ['TRUE', 'FALSE'], TRUE) && !isset($bundles[$requirement])) { + if (!in_array($requirement, ['TRUE', 'FALSE'], TRUE) && !isset(JoinupGroupHelper::GROUP_BUNDLES[$requirement])) { throw new \Exception("The '_joinup_group' route requirement should have one of the following values: 'TRUE', 'FALSE', 'collection' or 'solution' but '{$requirement}' was given."); } @@ -84,16 +83,16 @@ public function access(Route $route, RouteMatchInterface $route_match): AccessRe } if (!$rdf_entity) { // If the {rdf_entity} route parameter is missed or is not an RDF - // entity, don't make any opinion, let other access checks decide. - return AccessResult::neutral('No {rdf_entity} param or not a valid RDF entity'); + // entity, looks like we have a bug. + throw new \Exception("The {rdf_entity} route parameter is missed or is not an RDF entity."); } } $bundle = $rdf_entity->bundle(); $allow_access = - ($requirement === 'TRUE' && isset($bundles[$bundle])) || - ($requirement === 'FALSE' && !isset($bundles[$bundle])) || - (isset($bundles[$requirement]) && $bundle === $bundles[$requirement]); + ($requirement === 'TRUE' && isset(JoinupGroupHelper::GROUP_BUNDLES[$bundle])) || + ($requirement === 'FALSE' && !isset(JoinupGroupHelper::GROUP_BUNDLES[$bundle])) || + (isset(JoinupGroupHelper::GROUP_BUNDLES[$requirement]) && $bundle === JoinupGroupHelper::GROUP_BUNDLES[$requirement]); return $allow_access ? AccessResult::allowed() : AccessResult::forbidden(); } diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index 7339838555..a7114a68d7 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -12,6 +12,16 @@ */ class JoinupGroupHelper { + /** + * Group bundles. + * + * @var string[] + */ + const GROUP_BUNDLES = [ + 'collection' => 'collection', + 'solution' => 'solution', + ]; + /** * Returns whether the entity is one of the rdf groups. * @@ -23,7 +33,7 @@ class JoinupGroupHelper { * otherwise. */ public static function isGroup(EntityInterface $entity): bool { - return self::isCollection($entity) || self::isSolution($entity); + return isset(self::GROUP_BUNDLES[$entity->bundle()]); } /** diff --git a/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml b/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml index 4338d33e3e..8617e5f832 100644 --- a/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml +++ b/web/modules/custom/solution/config/install/views.view.manage_collection_solutions.yml @@ -4,13 +4,10 @@ dependencies: config: - rdf_entity.rdfentity.collection - search_api.index.published - - user.role.administrator - - user.role.moderator module: - joinup_group - search_api - - user - - views_bulk_operations + - solution id: manage_collection_solutions label: 'Manage collection solutions' module: views @@ -26,11 +23,8 @@ display: position: 0 display_options: access: - type: role - options: - role: - moderator: moderator - administrator: administrator + type: manage_solutions + options: { } cache: type: tag options: { } @@ -53,7 +47,7 @@ display: pager: type: full options: - items_per_page: 30 + items_per_page: 20 offset: 0 id: 0 total_pages: null @@ -113,14 +107,14 @@ display: row: type: fields fields: - views_bulk_operations_bulk_form: - id: views_bulk_operations_bulk_form - table: views - field: views_bulk_operations_bulk_form + search_api_bulk_form: + id: search_api_bulk_form + table: search_api_index_published + field: search_api_bulk_form relationship: none group_type: group admin_label: '' - label: 'Views bulk operations' + label: '' exclude: false alter: alter_text: false @@ -153,7 +147,7 @@ display: element_class: '' element_label_type: '' element_label_class: '' - element_label_colon: true + element_label_colon: false element_wrapper_type: '' element_wrapper_class: '' element_default_classes: true @@ -161,48 +155,13 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - batch: true - batch_size: 10 - form_step: true - buttons: false - clear_on_exposed: false action_title: Action + include_exclude: include selected_actions: - comment_delete_action: 0 - 'flag_action:subscribe_discussions_flag': 0 - 'flag_action:subscribe_discussions_unflag': 0 - joinup_change_group: 0 - node_unpromote_action: 0 - node_unpublish_action: 0 - node_publish_action: 0 - node_unpublish_by_keyword_action: 0 - node_assign_owner_action: 0 - node_promote_action: 0 - node_save_action: 0 - node_make_sticky_action: 0 - node_make_unsticky_action: 0 - simplenews_send_action: 0 - simplenews_stop_action: 0 - joinup_change_collection: joinup_change_collection - user_unblock_user_action: 0 - user_block_user_action: 0 - user_remove_role_action: 0 - user_add_role_action: 0 - vbo_cancel_user_action: 0 - views_bulk_operations_delete_entity: 0 - pathauto_update_alias: 0 - 'entity:save_action:node': 0 - 'entity:save_action:rdf_entity': 0 - 'entity:save_action:user': 0 - 'entity:unpublish_action:node': 0 - 'entity:unpublish_action:rdf_entity': 0 - 'entity:publish_action:node': 0 - 'entity:publish_action:rdf_entity': 0 - 'entity:delete_action:node': 0 - preconfiguration: - joinup_change_collection: - label_override: '' - plugin_id: views_bulk_operations_bulk_form + - change_collection + link_to_item: 0 + use_highlighting: 0 + plugin_id: search_api_bulk_form label: id: label table: search_api_index_published @@ -468,7 +427,19 @@ display: default_group_multiple: { } group_items: { } plugin_id: search_api_string - sorts: { } + sorts: + label: + id: label + table: search_api_index_published + field: label + relationship: none + group_type: group + admin_label: '' + order: ASC + exposed: false + expose: + label: '' + plugin_id: search_api title: 'Manage solutions' header: { } footer: { } @@ -536,7 +507,7 @@ display: - url - url.query_args - 'user.node_grants:view' - - user.roles + - user.permissions tags: - 'config:search_api.index.published' - 'search_api_list:published' @@ -566,7 +537,7 @@ display: - url - url.query_args - 'user.node_grants:view' - - user.roles + - user.permissions tags: - 'config:search_api.index.published' - 'search_api_list:published' diff --git a/web/modules/custom/solution/src/Form/ChangeCollectionForm.php b/web/modules/custom/solution/src/Form/ChangeCollectionForm.php index 7ae59cc1ee..19b3186267 100644 --- a/web/modules/custom/solution/src/Form/ChangeCollectionForm.php +++ b/web/modules/custom/solution/src/Form/ChangeCollectionForm.php @@ -173,7 +173,7 @@ public function submitForm(array &$form, FormStateInterface $form_state): void { } catch (\Exception $e) { $this->messenger()->addError($this->t("Error while trying to change the collection for %solution solution.", $messenger_arguments)); - $this->logger->info("Error while trying to move solution '@solution' from '@source_collection' to '@destination_collection' collection.", $logger_arguments); + $this->logger->error("Error while trying to move solution '@solution' from '@source_collection' to '@destination_collection' collection.", $logger_arguments); } } } From 7ba9518e490f674d0ce29e8ccc734db38bccc354 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 13 Mar 2020 19:35:28 +0200 Subject: [PATCH 207/957] FRONT-809: Add a test for the datetime presentation on community content. --- .../overview.datetime.feature | 30 +++++++++++++++++++ .../joinup_community_content.behat.inc | 25 +++++++++++++++- web/profiles/joinup/joinup.behat.inc | 7 +++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/features/community_content/overview.datetime.feature diff --git a/tests/features/community_content/overview.datetime.feature b/tests/features/community_content/overview.datetime.feature new file mode 100644 index 0000000000..9bae11127f --- /dev/null +++ b/tests/features/community_content/overview.datetime.feature @@ -0,0 +1,30 @@ +@api +Feature: + As an owner of the website + In order for my visitor to have more precise information on the actions taken on content + I want to have publication and update dates presented in the overview of my content. + + Scenario Outline: Last update date shown for specific content bundles. + Given the following collection: + | title | Some collection | + | state | validated | + Given content: + | title | created | publication date | changed | collection | state | + | Some content | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 14:00:00 +0100 | Wed, 25 Dec 2019 15:00:00 +0100 | Some collection | validated | + + When I go to the "Some content" + Then I should see the text "Published on: 25/12/2019" + # The last update is not visible if the date is the same even if the time is different. + And I should not see the text "Last update: 25/12/2019" + + # Avoid having to fill in different mandatory fields for different bundles by directly updating the entity. + Given the changed date of the "Some content" is "Wed, 26 Dec 2019 14:00:00 +0100" + When I go to the "Some content" + Then I should see the text "Published on: 25/12/2019" + And I should see the text "Last update: 26/12/2019" + + Examples: + | type | + | discussion | + | document | + | news | diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc index 5db479b198..03d3ca6ea1 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc @@ -18,8 +18,8 @@ use PHPUnit\Framework\Assert; */ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { - use TraversingTrait; use NodeTrait; + use TraversingTrait; /** * Asserts that a tile is not marked as shared from another collection. @@ -191,4 +191,27 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D $this->visitPath($path); } + /** + * Update one of the date properties of a node and clear the cache. + * + * @param string $field_name + * The date field/property name. + * @param string $title + * The node label. + * @param string $bundle + * The node label. + * @param string $new_date + * The new date property. + * + * @Given the :field_name date of the :title :bundle is :new_date + */ + public function updateNodeDateProperty(string $field_name, string $title, string $bundle, string $new_date): void { + $node = $this->getNodeByTitle($title, $bundle); + if (!($time = strtotime($new_date))) { + throw new Exception("{$new_date} could not be converted to string."); + } + $node->set($field_name, $time); + $node->save(); + } + } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index b6b7db69d2..63a626e5c1 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -639,6 +639,10 @@ class JoinupSubContext extends DrupalSubContextBase { ]); } + if (property_exists($node, 'published_at') && !is_numeric($node->published_at)) { + $node->published_at = strtotime($node->published_at); + } + // Replace the human-readable values for multiple fields. self::convertObjectPropertyValues($node, 'pinned', [ 'yes' => 1, @@ -674,6 +678,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'discussion' => [ 'content' => 'body', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'document' => [ 'document type' => 'field_type', @@ -683,6 +688,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'short title' => 'field_short_title', 'spatial coverage' => 'field_document_spatial_coverage', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'event' => [ 'keywords' => 'field_keywords', @@ -700,6 +706,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'keywords' => 'field_keywords', 'spatial coverage' => 'field_news_spatial_coverage', 'state' => 'field_state', + 'publication date' => 'published_at', ], 'shared' => [ 'collection' => OgGroupAudienceHelperInterface::DEFAULT_FIELD, From b3cb37cf145ba26f83a04f74f01121fbb95ec6ef Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 13 Mar 2020 23:23:51 +0200 Subject: [PATCH 208/957] FRONT-809: Fix all issues with publication dates so that tests are working fine. Update the tests. --- .../overview.datetime.feature | 12 +++--- .../joinup_community_content.behat.inc | 7 ++++ .../joinup_document/joinup_document.behat.inc | 40 +++++++++++++------ web/profiles/joinup/joinup.behat.inc | 1 + web/themes/joinup/joinup_theme.theme | 17 +++++--- .../page-title--node--discussion.html.twig | 4 +- .../page-title--node--document.html.twig | 2 +- .../content/page-title--node--news.html.twig | 4 +- 8 files changed, 59 insertions(+), 28 deletions(-) diff --git a/tests/features/community_content/overview.datetime.feature b/tests/features/community_content/overview.datetime.feature index 9bae11127f..3ef00f9fb7 100644 --- a/tests/features/community_content/overview.datetime.feature +++ b/tests/features/community_content/overview.datetime.feature @@ -9,7 +9,7 @@ Feature: | title | Some collection | | state | validated | Given content: - | title | created | publication date | changed | collection | state | + | title | created | | changed | collection | state | | Some content | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 25 Dec 2019 14:00:00 +0100 | Wed, 25 Dec 2019 15:00:00 +0100 | Some collection | validated | When I go to the "Some content" @@ -18,13 +18,13 @@ Feature: And I should not see the text "Last update: 25/12/2019" # Avoid having to fill in different mandatory fields for different bundles by directly updating the entity. - Given the changed date of the "Some content" is "Wed, 26 Dec 2019 14:00:00 +0100" + Given the changed date of the "Some content" is "Thu, 26 Dec 2019 14:00:00 +0100" When I go to the "Some content" Then I should see the text "Published on: 25/12/2019" And I should see the text "Last update: 26/12/2019" Examples: - | type | - | discussion | - | document | - | news | + | type | publication field name | + | discussion | publication date | + | document | document publication date | + | news | publication date | diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc index 03d3ca6ea1..d987a1b203 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc @@ -194,6 +194,9 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D /** * Update one of the date properties of a node and clear the cache. * + * A full format is "Thu, 26 Dec 2019 14:00:00 +0100" or without the day name. + * The above includes also "+0100" which represents the timezone. + * * @param string $field_name * The date field/property name. * @param string $title @@ -212,6 +215,10 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D } $node->set($field_name, $time); $node->save(); + + // Since this is a direct node update, the cache tags have to be invalidated + // manually for the pages to be updated. + \Drupal::service('cache_tags.invalidator')->invalidateTags($node->getCacheTagsToInvalidate()); } } diff --git a/web/modules/custom/joinup_document/joinup_document.behat.inc b/web/modules/custom/joinup_document/joinup_document.behat.inc index a93fa08391..416ca82045 100644 --- a/web/modules/custom/joinup_document/joinup_document.behat.inc +++ b/web/modules/custom/joinup_document/joinup_document.behat.inc @@ -49,21 +49,37 @@ class JoinupDocumentSubContext extends DrupalSubContextBase implements DrupalSub public static function massageDocumentFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope) { $node = $scope->getEntity(); - if ($node->type !== 'document' || empty($node->file)) { + if ($node->type !== 'document') { return; } - $type = isset($node->{'file type'}) ? $node->{'file type'} : 'remote'; - if ($type !== 'remote') { - // If the file is local we want to copy it from the fixtures into the file - // system and register it in the DocumentSubContext so it can be cleaned - // up after the scenario ends. Perform a small dance to get access to the - // context class from inside this static callback. - /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ - $environment = $scope->getEnvironment(); - /** @var \DocumentSubContext $context */ - $context = $environment->getContext(self::class); - $node->file = $context->createFile($node->file)->id(); + if (!empty($node->file)) { + $type = isset($node->{'file type'}) ? $node->{'file type'} : 'remote'; + if ($type !== 'remote') { + // If the file is local we want to copy it from the fixtures into the + // file system and register it in the DocumentSubContext so it can be + // cleaned up after the scenario ends. Perform a small dance to get + // access to the context class from inside this static callback. + /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ + $environment = $scope->getEnvironment(); + /** @var \DocumentSubContext $context */ + $context = $environment->getContext(self::class); + $node->file = $context->createFile($node->file)->id(); + } + } + + if (isset($node->{'document publication date'})) { + $time = $node->{'document publication date'}; + if (!is_numeric($time)) { + $time = strtotime($time); + if (empty($time)) { + throw new Exception("{$node->{'document publication date'}} could not be converted to timestamp."); + } + } + + /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */ + $date_formatter = \Drupal::service('date.formatter'); + $node->{'document publication date'} = $date_formatter->format($time, 'custom', 'Y-m-d H:i:s'); } unset($node->{'file type'}); diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 63a626e5c1..8007e8a297 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -688,6 +688,7 @@ class JoinupSubContext extends DrupalSubContextBase { 'short title' => 'field_short_title', 'spatial coverage' => 'field_document_spatial_coverage', 'state' => 'field_state', + 'document publication date' => 'field_document_publication_date', 'publication date' => 'published_at', ], 'event' => [ diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 67a0c58e8d..33d11bba9c 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1054,16 +1054,23 @@ function joinup_theme_preprocess_page_title__node__document(&$variables) { /** @var \Drupal\node\NodeInterface $node */ $node = $variables['entity']; - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('node'); - $field_document_publication_date = $viewBuilder->viewField($node->field_document_publication_date, 'default'); + /** @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */ + $date_formatter = \Drupal::service('date.formatter'); + $field_document_publication_date = $view_builder->viewField($node->field_document_publication_date, 'default'); $variables['additional_content']['field_document_publication_date'] = $field_document_publication_date; + $publication_date_value = $node->field_document_publication_date->value; + // The raw value allowed to properly display the field above with any class + // or configuration applied but still have the value to compare to the changed + // date in the twig. + $variables['additional_content']['field_document_publication_date_raw'] = $date_formatter->format(strtotime($publication_date_value), 'custom', 'd/m/Y'); - $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $updateDate = $date_formatter->format($node->getChangedTime(), 'custom', 'd/m/Y'); $variables['additional_content']['updated'] = $updateDate; /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $field_short_title = $viewBuilder->viewField($node->field_short_title, 'default'); + $field_short_title = $view_builder->viewField($node->field_short_title, 'default'); $variables['additional_content']['field_short_title'] = $field_short_title; $author_inline = _joinup_theme_get_author($node); diff --git a/web/themes/joinup/templates/content/page-title--node--discussion.html.twig b/web/themes/joinup/templates/content/page-title--node--discussion.html.twig index 877198e24e..ca0a19d518 100644 --- a/web/themes/joinup/templates/content/page-title--node--discussion.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--discussion.html.twig @@ -24,11 +24,11 @@
{{ 'Published on'|t }}: {{ additional_content.published }}
- {% if additional_content.published != additional_content.updated %} + {% if additional_content.published != additional_content.updated %}
{{ 'Last update'|t }}: {{ additional_content.updated }}
- {% endif %} + {% endif %}
{% endif %} diff --git a/web/themes/joinup/templates/content/page-title--node--document.html.twig b/web/themes/joinup/templates/content/page-title--node--document.html.twig index e07095a734..4f5bb47ee4 100644 --- a/web/themes/joinup/templates/content/page-title--node--document.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--document.html.twig @@ -31,7 +31,7 @@
{{ 'Published on'|t }}: {{ additional_content.field_document_publication_date }}
- {% if additional_content.published != additional_content.updated %} + {% if additional_content.field_document_publication_date_raw != additional_content.updated %}
{{ 'Last update'|t }}: {{ additional_content.updated }}
diff --git a/web/themes/joinup/templates/content/page-title--node--news.html.twig b/web/themes/joinup/templates/content/page-title--node--news.html.twig index e5717005f9..a1d67850f3 100644 --- a/web/themes/joinup/templates/content/page-title--node--news.html.twig +++ b/web/themes/joinup/templates/content/page-title--node--news.html.twig @@ -29,11 +29,11 @@
{{ 'Published on'|t }}: {{ additional_content.published }}
- {% if additional_content.published != additional_content.updated %} + {% if additional_content.published != additional_content.updated %}
{{ 'Last update'|t }}: {{ additional_content.updated }}
- {% endif %} + {% endif %} {% endif %} From 824d352780ae0b6075166c0574dfcf95d377aaf2 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sat, 14 Mar 2020 00:04:07 +0200 Subject: [PATCH 209/957] ISAICP-5411: Use the latest patch of the schema_metatag issue. --- composer.json | 2 +- composer.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index f1532215df..4a42a4456a 100644 --- a/composer.json +++ b/composer.json @@ -263,7 +263,7 @@ "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...bd61c32c6f877f2c0376ec9aa213b89b6bcb19b8.diff" }, "drupal/schema_metatag": { - "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-03/social_media_posting.patch" + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch" }, "drupal/search_api": { "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", diff --git a/composer.lock b/composer.lock index d3dc7404ce..0be156d505 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "5208302bd3d30e571ebeebdada49ccc1", + "content-hash": "8f272ee071f115467906885539d3e323", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -6257,7 +6257,7 @@ } }, "patches_applied": { - "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-03/social_media_posting.patch" + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -10292,7 +10292,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-03-02T18:32:28+00:00" }, { "name": "stack/builder", From faa03e29c32891a3df83f2ba4ec43efa01d2df05 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 11:21:47 +0200 Subject: [PATCH 210/957] ISAICP-5791: Test that redirects to limited access page is not cached. --- .../src/ExistingSite/JoinupEuLoginTest.php | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 1495b28b18..8beac8af43 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -95,13 +95,6 @@ public function testLimitedAccess(): void { $page->pressButton('Log in'); $assert->pageTextContains('You have just used your one-time login link. It is no longer necessary to use this link to log in. Please change your password.'); - // Try to navigate to pages that are not accessible . - $this->assertLimitedAccess(''); - $this->assertLimitedAccess('/collections'); - $this->assertLimitedAccess('/solutions'); - $this->assertLimitedAccess('/keep-up-to-date'); - $this->assertLimitedAccess('/search'); - // Check that the user is still able to contact the support. $this->assertAccess('/contact', 'Contact'); // Check that the user is still able to access its profile page. @@ -120,11 +113,36 @@ public function testLimitedAccess(): void { $assert->pageTextContains('The changes have been saved.'); $this->assertNotSame($original_hashed_pass, User::load($this->account->id())->getPassword()); + // Try to navigate to pages that are not accessible . + $this->assertLimitedAccess(''); + $this->assertLimitedAccess('/collections'); + $this->assertLimitedAccess('/solutions'); + $this->assertLimitedAccess('/keep-up-to-date'); + $this->assertLimitedAccess('/search'); + + // Check that the link to EU Login works. + $this->clickLink('EU Login'); + $assert->pageTextContains('Sign in to continue'); + + // Check that the redirect to limited access page has not been cached. + $this->drupalGet(''); + $assert->statusCodeEquals(200); + $this->drupalGet('/collections'); + $assert->statusCodeEquals(200); + $this->drupalGet('/solutions'); + $assert->statusCodeEquals(200); + $this->drupalGet('/keep-up-to-date'); + $assert->statusCodeEquals(200); + $this->drupalGet('/search'); + $assert->statusCodeEquals(200); + // Create a EU Login user and link it to the local user. $authname = $this->randomMachineName(); - $this->createCasUser($authname, "{$authname}@example.com", $this->randomString(), [], $this->account); + $eulogin_pass = user_password(); + $this->createCasUser($authname, "{$authname}@example.com", $eulogin_pass, [], $this->account); // The access is allowed. + $this->casLogin("{$authname}@example.com", $eulogin_pass); $this->assertAccess(''); $this->assertAccess('/collections'); $this->assertAccess('/solutions'); From 3181ecf32ff8ba84ba8253a693f5a05774a146b9 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 13:38:55 +0200 Subject: [PATCH 211/957] ISAICP-5791: Add missed return type. --- .../custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 8beac8af43..9a78c288fb 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -206,7 +206,7 @@ protected function assertAccess($url, ?string $expected_text_string = NULL): voi * @return string * The reset URL. */ - protected function extractPasswordResetUrlFromMail() { + protected function extractPasswordResetUrlFromMail(): string { $mails = $this->getMails(); $mail = end($mails); preg_match('#(/user/reset/[^"].+)"#', (string) $mail['body'], $urls); From 6ad54d5067f3539b82383e1c633a986a0dc50302 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 13:40:26 +0200 Subject: [PATCH 212/957] ISAICP-5791: Make 'user.is_eulogin' cache context aware of anonymous user. --- .../Cache/Context/EuLoginUserCacheContext.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php index 14e7a16618..3975e101cc 100644 --- a/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php +++ b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php @@ -11,7 +11,12 @@ use Drupal\Core\Session\AccountInterface; /** - * Varies the cache by whether the current user has a EU Login linked account. + * Varies the cache by whether the current user has an EU Login linked account. + * + * The cache context returns: + * - 'y': the current user has an EU Login linked account. + * - 'n': the current user is not linked to an EU Login account. + * - '0': the current user is anonymous. * * Cache context ID: 'user.is_eulogin'. */ @@ -49,20 +54,22 @@ public static function getLabel() { */ public function getContext() { if ($this->user->isAnonymous()) { - return 0; + return '0'; } /** @var \Drupal\user\UserInterface $account */ $account = $this->entityTypeManager->getStorage('user')->load($this->user->id()); - return !$account->get('eulogin_authname')->isEmpty() ? '1' : '0'; + return !$account->get('eulogin_authname')->isEmpty() ? 'y' : 'n'; } /** * {@inheritdoc} */ - public function getCacheableMetadata() { - return new CacheableMetadata(); + public function getCacheableMetadata(): CacheableMetadata { + $cache_metadata = new CacheableMetadata(); + $cache_metadata->addCacheTags(["user:{$this->user->id()}"]); + return $cache_metadata; } } From d23e0833de9a598cab97f49fdb7d046674f91e8d Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 13:42:31 +0200 Subject: [PATCH 213/957] ISAICP-5791: Prevent random test failures caused by non-compliant passwords. --- .../src/ExistingSite/JoinupEuLoginTest.php | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 9a78c288fb..c109a55883 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -31,11 +31,13 @@ public function testPasswordImpersonation(): void { // Create an EU Login user. $authname = $this->randomMachineName(); $email = "{$authname}@example.com"; - $eulogin_pass = $this->randomString(); + $eulogin_pass = user_password(); $this->createCasUser($authname, $email, $eulogin_pass); // Create a local user. - $local_account = $this->createUser(); + $local_account = $this->createUser([], NULL, FALSE, [ + 'pass' => $this->generateRandomPassword(), + ]); // Store the hashed password in a variable for later comparison. $original_hashed_pass = $local_account->getPassword(); @@ -104,7 +106,8 @@ public function testLimitedAccess(): void { // Set a new password. $page->fillField('Current password', $this->account->passRaw); - $page->fillField('Password', $new_pass = $this->randomString()); + $new_pass = $this->generateRandomPassword(); + $page->fillField('Password', $new_pass); $page->fillField('Confirm password', $new_pass); $page->pressButton('Save'); @@ -213,4 +216,40 @@ protected function extractPasswordResetUrlFromMail(): string { return $urls[1]; } + /** + * Generates a random password with respect to site's password policies. + * + * Unfortunately, the Password Policy module lacks a random password generator + * that would have generate passwords satisfying the site's password policies. + * It also lacks a password validator service, usable at API level, that would + * has allowed us to generate such a password. According to Joinup site + * policies we need a password longer than 8 characters with, at least, three + * character types, out of four (lowercase letters, uppercase letters, digits, + * special characters). But user_password() doesn't return special characters, + * so we will append a random string, that already contains special + * characters, and borrow the 'character_types' validation, to ensure the + * password compliance. Not enforcing this leads to random test failures. + * + * @see user_password() + * @see \Drupal\password_policy_character_types\Plugin\PasswordConstraint\CharacterTypes::validate() + */ + protected function generateRandomPassword(): string { + // Borrowed from CharacterTypes::validate(). + $valid_password = function (string $password): bool { + $character_sets = count(array_filter([ + preg_match('/[a-z]/', $password), + preg_match('/[A-Z]/', $password), + preg_match('/[0-9]/', $password), + preg_match('/[^a-zA-Z0-9]/', $password), + ])); + return $character_sets >= 3; + }; + + do { + $password = user_password() . $this->randomString(6); + } while (!$valid_password($password)); + + return $password; + } + } From 470629d5f8a06fc0e94d6591bd787478bf996862 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:13:43 +0200 Subject: [PATCH 214/957] ISAICP-5844: Fix some typos from the previous ticket. --- .../eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index c109a55883..a22d499ca1 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -46,7 +46,7 @@ public function testPasswordImpersonation(): void { $page = $this->getSession()->getPage(); - // Select the option tha allows pairing with the local account. + // Select the option that allows pairing with the local account. $page->selectFieldOption('account_exist', 'yes'); // Use the local credentials to pair the account. @@ -116,7 +116,7 @@ public function testLimitedAccess(): void { $assert->pageTextContains('The changes have been saved.'); $this->assertNotSame($original_hashed_pass, User::load($this->account->id())->getPassword()); - // Try to navigate to pages that are not accessible . + // Try to navigate to pages that are not accessible. $this->assertLimitedAccess(''); $this->assertLimitedAccess('/collections'); $this->assertLimitedAccess('/solutions'); From 2bb6e3e0d9f83648ece43af83dfbbb5f17ebe05c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:19:28 +0200 Subject: [PATCH 215/957] ISAICP-5844: Use our dedicated assertion. --- .../tests/src/ExistingSite/JoinupEuLoginTest.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index a22d499ca1..52fa22a80a 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -128,16 +128,11 @@ public function testLimitedAccess(): void { $assert->pageTextContains('Sign in to continue'); // Check that the redirect to limited access page has not been cached. - $this->drupalGet(''); - $assert->statusCodeEquals(200); - $this->drupalGet('/collections'); - $assert->statusCodeEquals(200); - $this->drupalGet('/solutions'); - $assert->statusCodeEquals(200); - $this->drupalGet('/keep-up-to-date'); - $assert->statusCodeEquals(200); - $this->drupalGet('/search'); - $assert->statusCodeEquals(200); + $this->assertAccess(''); + $this->assertAccess('/collections'); + $this->assertAccess('/solutions'); + $this->assertAccess('/keep-up-to-date'); + $this->assertAccess('/search'); // Create a EU Login user and link it to the local user. $authname = $this->randomMachineName(); From 7e0192dcc75d2d5edbfe1a627db2df9643003cf9 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:14:40 +0200 Subject: [PATCH 216/957] ISAICP-5844: Apply #3119811 that allows form validation using an event subscriber. --- composer.json | 3 +++ composer.lock | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f1376468b2..51960bf858 100644 --- a/composer.json +++ b/composer.json @@ -202,6 +202,9 @@ "drupal/cas": { "Allow a pre-login subscriber to set the reason for cancelling the login @see https://www.drupal.org/project/cas/issues/3111073": "https://www.drupal.org/files/issues/2020-02-04/3111073-2.patch" }, + "drupal/cas_account_link": { + "Allow subscribing to form validation @see https://www.drupal.org/project/cas_account_link/issues/3119811": "https://www.drupal.org/files/issues/2020-03-14/3119811-2.patch" + }, "drupal/config_devel": { "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch" }, diff --git a/composer.lock b/composer.lock index 028cd9868a..3ccc31dc0b 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": "73aa3bf8f180b39bb2cbba330e2ad304", + "content-hash": "ff3136109930bd3a9f9e70193837975a", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -2723,6 +2723,9 @@ "status": "not-covered", "message": "Project has not opted into security advisory coverage!" } + }, + "patches_applied": { + "Allow subscribing to form validation @see https://www.drupal.org/project/cas_account_link/issues/3119811": "https://www.drupal.org/files/issues/2020-03-14/3119811-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -16278,5 +16281,6 @@ }, "platform-overrides": { "php": "7.1.9" - } + }, + "plugin-api-version": "1.1.0" } From a0b6e7543faabf35eb296187803bb2b403cf9d1c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:21:16 +0200 Subject: [PATCH 217/957] ISAICP-5844: Add permission allowing full access for non-Eu Login users. --- web/modules/custom/eulogin/joinup_eulogin.permissions.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 web/modules/custom/eulogin/joinup_eulogin.permissions.yml diff --git a/web/modules/custom/eulogin/joinup_eulogin.permissions.yml b/web/modules/custom/eulogin/joinup_eulogin.permissions.yml new file mode 100644 index 0000000000..52c0fb73ed --- /dev/null +++ b/web/modules/custom/eulogin/joinup_eulogin.permissions.yml @@ -0,0 +1,4 @@ +unlimited access: + title: 'Unlimited access' + description: 'Allows unlimited access for user not linked to an EU Login account.' + restrict access: true From 4cdb7e31533b7f68bf1f10256bf7109446fbff12 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:27:37 +0200 Subject: [PATCH 218/957] ISAICP-5844: Test that a user granted with 'unlimited access' perm cannot be linked. --- .../src/ExistingSite/JoinupEuLoginTest.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 52fa22a80a..3a3ec79aae 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -154,6 +154,28 @@ public function testLimitedAccess(): void { $state->set('joinup_eulogin.disable_limited_access', TRUE); } + /** + * Tests that accounts with unlimited access cannot be linked with EU Login. + */ + public function testUnlimitedAccessAccounts(): void { + $local_account = $this->createUser(['unlimited access']); + $authname = $this->randomMachineName(); + $pass = $this->randomString(); + $this->createCasUser($authname, "{$authname}@example.com", $pass); + $this->casLogin("{$authname}@example.com", $pass); + + $page = $this->getSession()->getPage(); + + // Select the option that allows pairing with the local account. + $page->selectFieldOption('account_exist', 'yes'); + + // Use the local credentials to pair the account. + $page->fillField('Email or username', $local_account->getAccountName()); + $page->fillField('Password', $local_account->pass_raw); + $page->pressButton('Sign in'); + $this->assertSession()->pageTextContains("Linking the local {$local_account->getDisplayName()} user with an EU Login account is not allowed."); + } + /** * Asserts that navigating to a URL will end on the 'Limited access' page. * From bff27ccbed755213ae38ff6c8a4a8bb73ff32ebf Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:22:58 +0200 Subject: [PATCH 219/957] ISAICP-5844: Don't allow linking accounts granted with 'unlimited access' perm. --- .../eulogin/joinup_eulogin.services.yml | 1 + ...pEuLoginCasAccountLinkEventsSubscriber.php | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/web/modules/custom/eulogin/joinup_eulogin.services.yml b/web/modules/custom/eulogin/joinup_eulogin.services.yml index 08ff94d385..31a9f66055 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.services.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.services.yml @@ -6,6 +6,7 @@ services: - { name: 'event_subscriber' } joinup_eulogin.cas_account_link.subscriber: class: Drupal\joinup_eulogin\Event\Subscriber\JoinupEuLoginCasAccountLinkEventsSubscriber + arguments: ['@entity_type.manager'] tags: - { name: 'event_subscriber' } joinup_eulogin.route.subscriber: diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php index 81de00ab93..0d78a1e485 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php @@ -7,6 +7,8 @@ use Drupal\cas_account_link\Event\CasAccountLinkEvents; use Drupal\cas_account_link\Event\Events\CasAccountLinkEmailCollisionEvent; use Drupal\cas_account_link\Event\Events\CasAccountLinkPostLinkEvent; +use Drupal\cas_account_link\Event\Events\CasAccountLinkValidateEvent; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Url; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -18,6 +20,23 @@ class JoinupEuLoginCasAccountLinkEventsSubscriber implements EventSubscriberInte use StringTranslationTrait; + /** + * The entity type manager service. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * Constructs a new event subscriber instance. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. + */ + public function __construct(EntityTypeManagerInterface $entity_type_manager) { + $this->entityTypeManager = $entity_type_manager; + } + /** * {@inheritdoc} */ @@ -28,6 +47,7 @@ public static function getSubscribedEvents(): array { ['setRandomPassword'], ['setMessageAndRedirect'], ], + CasAccountLinkEvents::VALIDATE => 'preventLinkingUnlimitedAccessAccounts', ]; } @@ -99,4 +119,31 @@ public function setMessageAndRedirect(CasAccountLinkPostLinkEvent $event): void } } + /** + * Disallow linking accounts granted with 'unlimited access' permission. + * + * @param \Drupal\cas_account_link\Event\Events\CasAccountLinkValidateEvent $event + * The CAS Account Link validate event object. + * + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + * Thrown if the 'user' entity type doesn't exist. + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * Thrown if the storage handler couldn't be loaded. + */ + public function preventLinkingUnlimitedAccessAccounts(CasAccountLinkValidateEvent $event): void { + $form_state = $event->getFormState(); + if ($form_state->getValue('account_exist') === 'no') { + return; + } + + /** @var \Drupal\user\UserInterface $account */ + $account = $this->entityTypeManager->getStorage('user')->load($form_state->get('uid')); + + if ($account->hasPermission('unlimited access')) { + $form_state->setErrorByName('login][name', $this->t('Linking the local %username user with an EU Login account is not allowed.', [ + '%username' => $account->getDisplayName(), + ])); + } + } + } From 98268f4d458c96a0d81af67113e03f7dd35024d9 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:18:04 +0200 Subject: [PATCH 220/957] ISAICP-5844: Use the DTT login trait. --- .../custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 3a3ec79aae..2ba4f70765 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -7,6 +7,7 @@ use Drupal\Tests\cas\Traits\CasTestTrait; use Drupal\Tests\joinup_core\ExistingSite\JoinupExistingSiteTestBase; use Drupal\user\Entity\User; +use weitzman\LoginTrait\LoginTrait; /** * Tests the EU Login. @@ -16,6 +17,7 @@ class JoinupEuLoginTest extends JoinupExistingSiteTestBase { use CasTestTrait; + use LoginTrait; /** * Testing account. From 06422f1acd0edf7ac5b04994cd6882ca0ec4467c Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:28:18 +0200 Subject: [PATCH 221/957] ISAICP-5844: Test that users granted 'unlimited access' have full access. --- .../src/ExistingSite/JoinupEuLoginTest.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 2ba4f70765..8c5cee8006 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -136,6 +136,23 @@ public function testLimitedAccess(): void { $this->assertAccess('/keep-up-to-date'); $this->assertAccess('/search'); + // Grant the user with 'unlimited access' permission. + $this->account->addRole($rid = $this->createRole(['unlimited access'])); + $this->account->save(); + + $this->drupalLogin($this->account); + + // Try to navigate to pages that are not accessible to regular users. + $this->assertAccess(''); + $this->assertAccess('/collections'); + $this->assertAccess('/solutions'); + $this->assertAccess('/keep-up-to-date'); + $this->assertAccess('/search'); + + // Remove the role from account. + $this->account->removeRole($rid); + $this->account->save(); + // Create a EU Login user and link it to the local user. $authname = $this->randomMachineName(); $eulogin_pass = user_password(); From d3257de8b1546f2358a1fc476cb99d2ef0fe9d12 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:23:57 +0200 Subject: [PATCH 222/957] ISAICP-5844: Users granted with 'unlimited access' perm should not be limited. --- .../src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index bef5db9d4e..126c0a5fa1 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -206,7 +206,9 @@ protected function userHasUnlimitedAccess(): bool { // - is anonymous. return $this->currentUser->isAnonymous() // - or is an EU Login linked user. - || $this->authmap->get($this->currentUser->id(), 'cas'); + || $this->authmap->get($this->currentUser->id(), 'cas') + // - or is granted with 'unlimited access' permission. + || $this->currentUser->hasPermission('unlimited access'); } /** From ebcb5cf01928eb38698c37203603746628e86d41 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 17:24:29 +0200 Subject: [PATCH 223/957] ISAICP-5844: Vary the redirect cache also by user permissions. --- .../src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index 126c0a5fa1..abc12f8164 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -146,7 +146,10 @@ public function redirectWhenNoAccess(GetResponseEvent $event): void { // The browser caches the redirect. Make sure the cache is not leaking // between user with different EU Login link status. - $cache_metadata = (new CacheableMetadata())->addCacheContexts(['user.is_eulogin']); + $cache_metadata = (new CacheableMetadata())->addCacheContexts([ + 'user.is_eulogin', + 'user.permissions', + ]); // Redirect to 'Limited access' page. $response = new LocalRedirectResponse(Url::fromRoute('joinup_eulogin.page.limited_access')->toString()); $event->setResponse($response->addCacheableDependency($cache_metadata)); From a63fc0848538c3d823be314f176133987c2fa069 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 18:04:26 +0200 Subject: [PATCH 224/957] ISAICP-5844: Deal with locked config storage. --- .../eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php | 7 ++++++- .../tests/src/ExistingSite/JoinupExistingSiteTestBase.php | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index 8c5cee8006..cbc8f425a5 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -137,7 +137,10 @@ public function testLimitedAccess(): void { $this->assertAccess('/search'); // Grant the user with 'unlimited access' permission. - $this->account->addRole($rid = $this->createRole(['unlimited access'])); + $this->bypassReadOnlyConfig(); + $rid = $this->createRole(['unlimited access']); + $this->restoreReadOnlyConfig(); + $this->account->addRole($rid); $this->account->save(); $this->drupalLogin($this->account); @@ -177,7 +180,9 @@ public function testLimitedAccess(): void { * Tests that accounts with unlimited access cannot be linked with EU Login. */ public function testUnlimitedAccessAccounts(): void { + $this->bypassReadOnlyConfig(); $local_account = $this->createUser(['unlimited access']); + $this->restoreReadOnlyConfig(); $authname = $this->randomMachineName(); $pass = $this->randomString(); $this->createCasUser($authname, "{$authname}@example.com", $pass); diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 96034681ba..99ef4a7181 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -84,7 +84,10 @@ public function tearDown(): void { // Restore the mail settings. $this->restoreMailSettings(); + // The parent method might cleanup config entities. + $this->bypassReadOnlyConfig(); parent::tearDown(); + $this->restoreReadOnlyConfig(); /** @var \Drupal\Component\Plugin\PluginManagerInterface $delete_orphans_manager */ $delete_orphans_manager = \Drupal::service('plugin.manager.og.delete_orphans'); From 2589940929704a8a15e3cd6852e76adf69e802d2 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 14 Mar 2020 21:26:35 +0200 Subject: [PATCH 225/957] FRONT-885: Improve coding standards and fix some docs. --- README.md | 6 +- resources/mac/README.md | 374 +++++++++++++++++++++------------------- 2 files changed, 203 insertions(+), 177 deletions(-) diff --git a/README.md b/README.md index e80fd60d58..6efed30ac8 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,13 @@ There are two ways to run Joinup. With `docker` and `docker-compose` and buildin To start with docker, please, check the separated [README file](resources/docker/README.md). -### Mac without docker installation -To start on a mac and want to do this without docker, please, check the separated [README file](resources/mac/README.md). - ### Local installation To run Joinup locally, below is a list of requirements and instructions. +#### On macOS without Docker installation +To start on macOS without Docker, please, check the separated [README file](resources/mac/README.md). + #### Requirements * A regular LAMP stack running PHP 7.1.0 or higher * Virtuoso 7 (Triplestore database) diff --git a/resources/mac/README.md b/resources/mac/README.md index 46c5a85452..7bab0cb3ec 100644 --- a/resources/mac/README.md +++ b/resources/mac/README.md @@ -1,191 +1,217 @@ -# Joinup on mac without docker -Here you will find the steps to run the joinup project on your mac without docker. +# Joinup on macOS without Docker + +Here you will find the steps to run the Joinup project on your mac without +Docker. ## Prerequisites -Brew, Composer, Drush -Apache and PHP -[Install Apache & Multiple php versions](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions) -Mysql & Apache Virtual Hosts & DnsMasq -[Install mysql & Apache Virtual Hosts & Dnsmasq](https://getgrav.org/blog/macos-catalina-apache-mysql-vhost-apc) -Redis -[Install and config Redis](https://medium.com/@petehouston/install-and-config-redis-on-mac-os-x-via-homebrew-eb8df9a4f298) + +- Brew, Composer, Drush, Apache and PHP: [Install Apache & Multiple php +versions](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions) +- MySql & Apache Virtual Hosts & DnsMasq: [Install mysql & Apache Virtual Hosts +& Dnsmasq](https://getgrav.org/blog/macos-catalina-apache-mysql-vhost-apc) +- Redis: [Install and config +Redis](https://medium.com/@petehouston/install-and-config-redis-on-mac-os-x-via-homebrew-eb8df9a4f298) ## Installation -1 - Uncomment these lines on http.conf file **/usr/local/etc/httpd/httpd.conf** -``` -LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so -Include /usr/local/etc/httpd/extra/httpd-vhosts.conf -```` +1. Uncomment these lines on http.conf file **/usr/local/etc/httpd/httpd.conf** + + ``` + LoadModule vhost_alias_module lib/httpd/modules/mod_vhost_alias.so + Include /usr/local/etc/httpd/extra/httpd-vhosts.conf + ``` -2 - Add virtual-host **/usr/local/etc/httpd/extra/http-vhosts.conf** -``` - - ServerName joinup.test - DocumentRoot "/Users/.../.../joinup-dev/web" - - AllowOverride all - Require all granted - - - ``` -**Please make user ur pathes to the project will match or this won't work** - -3 - Add new host in **/private/etc/hosts** -``` -127.0.0.1 joinup.test -``` -4 - Restart Apache -```` -$ sudo apachectl -k restart -```` -5 - **Only if** you have xdebug installed and Check php.ini file for the configuaration. -```` -[xdebug] -;zend_extension=“xdebug.so” -xdebug.remote_enable=1 -xdebug.remote_autostart=0 -xdebug.max_nesting_level=256 -;xdebug.collect_params=3 -;xdebug.profiler_enabled=1 -;xdebug.profiler_output_dir=/tmp/ -;xdebug.profiler_enable_trigger=1 -```` - - -## Setting up the project -1 - Clone the respository of this project -```` -$ git clone https://github.com/ec-europa/joinup-dev.git -```` - -2 - Create file **build.properties.local** in the project with content -``` -# The location of the Composer binary. -composer.bin = /usr/local/bin/composer - -# Database settings. -drupal.db.name = joinup -drupal.db.user = root -drupal.db.password = - -# Admin user. -drupal.admin.username = admin -drupal.admin.password = admin - -# The base URL to use in Behat tests. -behat.base_url = http://joinup.test/ -drupal.base_url = http://joinup.test/ - -# Paths -isql.bin = /usr/local/bin/isql -sparql.dsn = localhost -sparql.user = dba -sparql.password = dba - -# Migration. -migration.db.name = joinup6 -migration.db.user = joinup6 -migration.db.password = joinup6 - -# Piwik configuration -piwik.db.password = password -piwik.port = 80 -piwik.website_id = 1 -piwik.url.http = http://piwik.test/ - -# The credentials of the S3 bucket containing the databases. -# Production db dumps. -#exports.sql.source = joinupv2.0/dumps/prod/joinup-full-20180220.sql - -# Virtuoso -virtuoso.binary = /usr/local/bin/virtuoso-t - -# Solr -solr.download.url = https://archive.apache.org/dist/lucene/solr/7.7.1/solr-7.7.1.tgz - -# ASDA settings -asda.username = '' -asda.password = '' -exports.virtuoso.source = '' -exports.sql.source = '' -exports.solr.filename = '' -exports.solr.source = '' -exports.s3.bucket = '' -exports.s3.key = '' -exports.s3.secret = '' -``` +2. Add virtual-host **/usr/local/etc/httpd/extra/http-vhosts.conf** + + ``` + + ServerName joinup.test + # Replace with your project path. + DocumentRoot "/Users/.../.../joinup-dev/web" + # Replace with your project path. + + AllowOverride all + Require all granted + + + ``` + +3. Add new host in **/private/etc/hosts** + + ``` + 127.0.0.1 joinup.test + ``` + +4. Restart Apache + + ```bash + $ sudo apachectl -k restart + ``` + +5. **Only if** you have XDebug installed check php.ini file for the config: + + ``` + [xdebug] + ;zend_extension=“xdebug.so” + xdebug.remote_enable=1 + xdebug.remote_autostart=0 + xdebug.max_nesting_level=256 + ;xdebug.collect_params=3 + ;xdebug.profiler_enabled=1 + ;xdebug.profiler_output_dir=/tmp/ + ;xdebug.profiler_enable_trigger=1 + ``` + +## Setting up the project + +1. Clone the respository of this project + + ```bash + $ git clone https://github.com/ec-europa/Joinup-dev.git + ``` + +2. Create file **build.properties.local** in the project with content + ``` + # The location of the Composer binary. + composer.bin = /usr/local/bin/composer + + # Database settings. + drupal.db.name = Joinup + drupal.db.user = root + drupal.db.password = + + # Admin user. + drupal.admin.username = admin + drupal.admin.password = admin + + # The base URL to use in Behat tests. + behat.base_url = http://joinup.test/ + drupal.base_url = http://joinup.test/ + + # Paths + isql.bin = /usr/local/bin/isql + sparql.dsn = localhost + sparql.user = dba + sparql.password = dba + + # Piwik configuration + piwik.db.password = password + piwik.port = 80 + piwik.website_id = 1 + piwik.url.http = http://piwik.test/ + + # The credentials of the S3 bucket containing the databases. + # Production db dumps. + #exports.sql.source = joinupv2.0/dumps/prod/Joinup-full-20180220.sql + + # Virtuoso + virtuoso.binary = /usr/local/bin/virtuoso-t + + # Solr + solr.download.url = https://archive.apache.org/dist/lucene/solr/7.7.1/solr-7.7.1.tgz + + # ASDA settings + asda.username = '' + asda.password = '' + exports.virtuoso.source = '' + exports.sql.source = '' + exports.solr.filename = '' + exports.solr.source = '' + exports.s3.bucket = '' + exports.s3.key = '' + exports.s3.secret = '' + ``` + **! Important: For the ASDA settings please contact your local developer !** -2 - Run composer -```` -$ composer install -```` +3. Run composer -3 - Run build dev -``` -$ ./vendor/bin/phing build-dev -``` + ```bash + $ composer install + ``` -4 - Install and/or relink -``` -$ brew unlink unixodbc -$ brew install virtuoso -$ brew unlink virtuoso -$ brew link unixodbc -$ brew link --overwrite virtuoso -``` +4. Run `build-dev` -5 - Setup viriuoso -``` -$ ./vendor/bin/phing virtuoso-setup -$ ./vendor/bin/phing virtuoso-start -$ ./vendor/bin/phing setup-virtuoso-permissions -``` + ```bash + $ ./vendor/bin/phing build-dev + ``` -6 - Run install dev -``` -$ ./vendor/bin/phing install-dev -``` +5. Install and/or relink -7 - Setup solar and check if it's running -``` -$ ./vendor/bin/phing setup-apache-solr -``` -[Check Virtuoso](http://localhost:8890/sparql) -[Check Solr](http://localhost:8983/solr/#/) + ```bash + $ brew unlink unixodbc + $ brew install virtuoso + $ brew unlink virtuoso + $ brew link unixodbc + $ brew link --overwrite virtuoso + ``` -8 - Download production Databases -```` - $ ./vendor/bin/phing download-databases -```` +6. Setup Virtuoso -9 - Rebuild environment -``` -$ ./vendor/bin/phing install-dev -``` + ```bash + $ ./vendor/bin/phing virtuoso-setup + $ ./vendor/bin/phing virtuoso-start + $ ./vendor/bin/phing setup-virtuoso-permissions + ``` + + [Check Virtuoso](http://localhost:8890/sparql) + +7. Run `install-dev` + + ```bash + $ ./vendor/bin/phing install-dev + ``` + +8. Setup Solr and check if it's running + + ```bash + $ ./vendor/bin/phing setup-apache-solr + ``` + + [Check Solr](http://localhost:8983/solr/#/) + +9. Download production Databases + + ```bash + $ ./vendor/bin/phing download-databases + ``` + +10. Rebuild environment + + ```bash + $ ./vendor/bin/phing rebuild-environment + ``` + +11. Enable developers settings + + ```bash + $ ./vendor/bin/phing setup-dev + ``` + + **WARNING** If you get an error: "Your site configuration active store is + currently locked.”, comment this line in **/web/sites/default/settings.php**: + ```php + $settings['config_readonly'] = !file_exists(getcwd() . '/../disable-config-readonly'); + ``` + +12. Unblock the admin user + + ```bash + $ drush user:unblock + ``` + +13. Login with the admin user + + ```bash + $ drush uli + ``` -10 - Enable developers settings -``` - $ ./vendor/bin/phing setup-dev -``` -**WARNING** If you get an error: -*“ Your site configuration active store is currently locked.”* -Comment this line in **/web/sites/default/settings.php** -$settings['config_readonly'] = !file_exists(getcwd() . '/../disable-config-readonly'); - -11 - Unblock the admin user -```` -drush user:unblock -```` - -12 - Create a new admin user -```` -drush uli -```` ## Switching between branches -This is needed when you need to when you switch a branch to keep your content up to date -```` -./vendor/bin/phing build-dev -./vendor/bin/phing rebuild-environment -```` + +This is needed when you'll have to switch a branch and keep your content up to +date: + +```bash +$ ./vendor/bin/phing build-dev +$ ./vendor/bin/phing rebuild-environment +``` From 8a407e5064a104525ca3d6e44f420299096f620f Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 15 Mar 2020 18:50:26 +0200 Subject: [PATCH 226/957] FRONT-809: Fix QA remarks. --- .../joinup_community_content.behat.inc | 19 +++++++------------ web/themes/joinup/joinup_theme.theme | 6 +++--- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc index d987a1b203..059aaae026 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc @@ -192,10 +192,7 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D } /** - * Update one of the date properties of a node and clear the cache. - * - * A full format is "Thu, 26 Dec 2019 14:00:00 +0100" or without the day name. - * The above includes also "+0100" which represents the timezone. + * Update one of the date properties of a node. * * @param string $field_name * The date field/property name. @@ -204,21 +201,19 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D * @param string $bundle * The node label. * @param string $new_date - * The new date property. + * The new date property. The format should be acceptable by the strtotime + * function. A full format example is "Thu, 26 Dec 2019 14:00:00 +0100". + * The above includes also "+0100" which represents the timezone. * * @Given the :field_name date of the :title :bundle is :new_date */ public function updateNodeDateProperty(string $field_name, string $title, string $bundle, string $new_date): void { - $node = $this->getNodeByTitle($title, $bundle); if (!($time = strtotime($new_date))) { throw new Exception("{$new_date} could not be converted to string."); } - $node->set($field_name, $time); - $node->save(); - - // Since this is a direct node update, the cache tags have to be invalidated - // manually for the pages to be updated. - \Drupal::service('cache_tags.invalidator')->invalidateTags($node->getCacheTagsToInvalidate()); + $this->getNodeByTitle($title, $bundle) + ->set($field_name, $time) + ->save(); } } diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 33d11bba9c..85b0e4816f 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1063,11 +1063,11 @@ function joinup_theme_preprocess_page_title__node__document(&$variables) { $publication_date_value = $node->field_document_publication_date->value; // The raw value allowed to properly display the field above with any class // or configuration applied but still have the value to compare to the changed - // date in the twig. + // date in the Twig template. $variables['additional_content']['field_document_publication_date_raw'] = $date_formatter->format(strtotime($publication_date_value), 'custom', 'd/m/Y'); - $updateDate = $date_formatter->format($node->getChangedTime(), 'custom', 'd/m/Y'); - $variables['additional_content']['updated'] = $updateDate; + $update_date = $date_formatter->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $update_date; /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ $field_short_title = $view_builder->viewField($node->field_short_title, 'default'); From 45bab1569895d594a94fbc8ade6633f05dd1059f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 16 Mar 2020 00:01:51 +0200 Subject: [PATCH 227/957] ISAICP-5609: Move from end-of-life Ruby SASS to SCSSPHP. --- .dockerignore | 3 +- .gitignore | 3 +- README.md | 8 - build.continuousphp.xml | 5 - build.docker.overrides.xml | 8 +- build.project.xml | 23 +- build.properties | 25 +- composer.json | 1 + composer.lock | 66 +- resources/docker/README.md | 1 - scripts/rpmbuild/make_joinup_build_uat.sh | 2 +- .../templates/link-icon.html.twig | 2 +- web/themes/joinup/README.md | 2 +- web/themes/joinup/prototype/README.md | 1 - web/themes/joinup/prototype/sass/.gitignore | 1 - .../joinup/prototype/sass/_drupal-hacks.sass | 471 ------------- .../joinup/prototype/sass/_mdl-hacks.sass | 113 --- web/themes/joinup/prototype/sass/_mixins.sass | 189 ----- web/themes/joinup/prototype/sass/app.sass | 97 --- .../prototype/sass/base/_blockquote.sass | 29 - .../joinup/prototype/sass/base/_checkbox.sass | 48 -- .../sass/base/_cookie_consent_kit.sass | 7 - .../prototype/sass/base/_fontfaces.sass | 114 --- .../joinup/prototype/sass/base/_heading.sass | 26 - .../joinup/prototype/sass/base/_input.sass | 96 --- .../joinup/prototype/sass/base/_link.sass | 12 - .../prototype/sass/base/_ordered_list.sass | 31 - .../joinup/prototype/sass/base/_radio.sass | 37 - .../joinup/prototype/sass/base/_shared.sass | 70 -- .../joinup/prototype/sass/base/_table.sass | 33 - .../prototype/sass/base/_unordered_list.sass | 21 - .../sass/components/_action-link.sass | 46 -- .../prototype/sass/components/_alert.sass | 72 -- .../prototype/sass/components/_block.sass | 31 - .../prototype/sass/components/_button.sass | 124 ---- .../prototype/sass/components/_chip.sass | 56 -- .../prototype/sass/components/_chipfield.sass | 54 -- .../sass/components/_circle-menu.sass | 52 -- .../prototype/sass/components/_comment.sass | 80 --- .../prototype/sass/components/_details.sass | 91 --- .../prototype/sass/components/_ec-menu.sass | 33 - .../sass/components/_editor-area.sass | 21 - .../prototype/sass/components/_etiquette.sass | 41 -- .../sass/components/_featured-lg.sass | 101 --- .../prototype/sass/components/_featured.sass | 217 ------ .../prototype/sass/components/_fieldset.sass | 150 ---- .../prototype/sass/components/_filters.sass | 114 --- .../sass/components/_footer-ec-menu.sass | 39 -- .../sass/components/_footer-social-media.sass | 71 -- .../sass/components/_form-table.sass | 113 --- .../prototype/sass/components/_form.sass | 279 -------- .../sass/components/_header-menu.sass | 57 -- .../prototype/sass/components/_icon-card.sass | 47 -- .../prototype/sass/components/_icon.sass | 309 -------- .../prototype/sass/components/_icons-bar.sass | 29 - .../sass/components/_image-caption.sass | 27 - .../sass/components/_inline-social-media.sass | 34 - .../sass/components/_invite-form.sass | 10 - .../prototype/sass/components/_licence.sass | 290 -------- .../prototype/sass/components/_listing.sass | 491 ------------- .../prototype/sass/components/_load-more.sass | 37 - .../sass/components/_login-menu.sass | 39 -- .../sass/components/_navigation-bottom.sass | 56 -- .../prototype/sass/components/_page.sass | 73 -- .../prototype/sass/components/_pager.sass | 102 --- .../sass/components/_search-bar.sass | 174 ----- .../prototype/sass/components/_share-box.sass | 98 --- .../sass/components/_sidebar-menu.sass | 107 --- .../prototype/sass/components/_tab.sass | 158 ----- .../prototype/sass/components/_tallinn.sass | 45 -- .../prototype/sass/components/_timeline.sass | 170 ----- .../sass/components/_vertical-menu.sass | 36 - .../sass/components/_vertical-tabs.sass | 74 -- .../joinup/prototype/sass/layouts/_grid.sass | 0 .../prototype/sass/layouts/_layout.sass | 22 - .../layouts/sections/_section--featured.sass | 20 - .../layouts/sections/_section--footer.sass | 26 - .../layouts/sections/_section--header.sass | 21 - .../sections/_section--sidebar-left.sass | 44 -- .../prototype/sass/variables/_variables.sass | 96 --- .../joinup/prototype/scss/_drupal-hacks.scss | 659 ++++++++++++++++++ .../joinup/prototype/scss/_mdl-hacks.scss | 166 +++++ web/themes/joinup/prototype/scss/_mixins.scss | 242 +++++++ web/themes/joinup/prototype/scss/app.scss | 97 +++ .../prototype/scss/base/_blockquote.scss | 34 + .../base/_body.sass => scss/base/_body.scss} | 7 +- .../joinup/prototype/scss/base/_checkbox.scss | 60 ++ .../scss/base/_cookie_consent_kit.scss | 8 + .../prototype/scss/base/_fontfaces.scss | 132 ++++ .../joinup/prototype/scss/base/_heading.scss | 32 + .../joinup/prototype/scss/base/_input.scss | 134 ++++ .../joinup/prototype/scss/base/_link.scss | 14 + .../prototype/scss/base/_ordered_list.scss | 43 ++ .../base/_paragraph.scss} | 0 .../joinup/prototype/scss/base/_radio.scss | 46 ++ .../joinup/prototype/scss/base/_shared.scss | 97 +++ .../joinup/prototype/scss/base/_table.scss | 48 ++ .../prototype/scss/base/_unordered_list.scss | 28 + .../{sass => scss}/base/html/blockquote.html | 0 .../{sass => scss}/base/html/checkbox.html | 0 .../{sass => scss}/base/html/heading.html | 0 .../{sass => scss}/base/html/input.html | 0 .../{sass => scss}/base/html/link.html | 0 .../base/html/ordered-list.html | 0 .../{sass => scss}/base/html/paragraph.html | 0 .../{sass => scss}/base/html/radio.html | 0 .../{sass => scss}/base/html/table.html | 0 .../base/html/unordered-list.html | 0 .../scss/components/_action-link.scss | 59 ++ .../prototype/scss/components/_alert.scss | 92 +++ .../components/_announcement.scss} | 14 +- .../components/_avatar.scss} | 26 +- .../components/_background.scss} | 9 +- .../prototype/scss/components/_block.scss | 38 + .../prototype/scss/components/_button.scss | 156 +++++ .../prototype/scss/components/_chip.scss | 62 ++ .../prototype/scss/components/_chipfield.scss | 74 ++ .../scss/components/_circle-menu.scss | 73 ++ .../prototype/scss/components/_comment.scss | 104 +++ .../prototype/scss/components/_details.scss | 127 ++++ .../components/_draggable.scss} | 17 +- .../prototype/scss/components/_ec-menu.scss | 39 ++ .../scss/components/_editor-area.scss | 26 + .../prototype/scss/components/_etiquette.scss | 48 ++ .../scss/components/_featured-lg.scss | 140 ++++ .../prototype/scss/components/_featured.scss | 309 ++++++++ .../prototype/scss/components/_fieldset.scss | 225 ++++++ .../components/_file-upload.scss} | 32 +- .../prototype/scss/components/_filters.scss | 150 ++++ .../scss/components/_footer-ec-menu.scss | 45 ++ .../scss/components/_footer-social-media.scss | 90 +++ .../components/_footer.scss} | 2 +- .../scss/components/_form-table.scss | 163 +++++ .../prototype/scss/components/_form.scss | 411 +++++++++++ .../components/_header-logo.scss} | 20 +- .../scss/components/_header-menu.scss | 66 ++ .../components/_header.scss} | 2 +- .../prototype/scss/components/_icon-card.scss | 58 ++ .../prototype/scss/components/_icon.scss | 381 ++++++++++ .../prototype/scss/components/_icons-bar.scss | 34 + .../scss/components/_image-caption.scss | 43 ++ .../scss/components/_inline-social-media.scss | 43 ++ .../scss/components/_invite-form.scss | 13 + .../prototype/scss/components/_licence.scss | 443 ++++++++++++ .../prototype/scss/components/_listing.scss | 648 +++++++++++++++++ .../prototype/scss/components/_load-more.scss | 47 ++ .../scss/components/_login-menu.scss | 49 ++ .../scss/components/_navigation-bottom.scss | 87 +++ .../prototype/scss/components/_page.scss | 101 +++ .../prototype/scss/components/_pager.scss | 135 ++++ .../scss/components/_search-bar.scss | 239 +++++++ .../prototype/scss/components/_share-box.scss | 137 ++++ .../scss/components/_sidebar-menu.scss | 154 ++++ .../prototype/scss/components/_tab.scss | 223 ++++++ .../prototype/scss/components/_tallinn.scss | 55 ++ .../prototype/scss/components/_timeline.scss | 247 +++++++ .../scss/components/_vertical-menu.scss | 43 ++ .../scss/components/_vertical-tabs.scss | 98 +++ .../components/html/!example.html | 0 .../{sass => scss}/components/html/alert.html | 0 .../components/html/button.html | 0 .../components/html/circle-menu.html | 0 .../components/html/draggable.html | 0 .../components/html/etiquette.html | 0 .../components/html/file-upload.html | 0 .../components/html/filters.html | 0 .../components/html/footer-ec-menu.html | 0 .../components/html/footer-social-media.html | 0 .../components/html/header-logo.html | 0 .../components/html/header-menu.html | 0 .../components/html/icon-card.html | 0 .../{sass => scss}/components/html/icon.html | 0 .../components/html/inline-social-media.html | 0 .../html/listing-item--default-col-12.html | 0 .../html/listing-item--default-col-6.html | 0 .../listing-item--distribution-col-12.html | 0 .../listing-item--distribution-col-6.html | 0 .../html/listing-item--documentation.html | 0 .../html/listing-item--event-col-12.html | 0 .../html/listing-item--event-col-6.html | 0 .../html/listing-item--load-more.html | 0 .../html/listing-item--news-col-12.html | 0 .../html/listing-item--news-col-6.html | 0 .../html/listing-item--newsletter.html | 0 .../html/listing-item--video-col-12.html | 0 .../html/listing-item--video-col-6.html | 0 .../components/html/listing.html | 0 .../{sass => scss}/components/html/pager.html | 0 .../components/html/search-bar.html | 0 .../{sass => scss}/components/html/tab.html | 0 .../components/html/timeline.html | 0 .../joinup/prototype/scss/layouts/_grid.scss | 1 + .../prototype/scss/layouts/_layout.scss | 26 + .../layouts/sections/_section--content.scss} | 6 +- .../layouts/sections/_section--featured.scss | 26 + .../layouts/sections/_section--footer.scss | 39 ++ .../layouts/sections/_section--header.scss | 28 + .../sections/_section--sidebar-left.scss | 70 ++ .../layouts/sections/_section.scss} | 5 +- .../prototype/scss/variables/_variables.scss | 95 +++ 200 files changed, 8075 insertions(+), 5987 deletions(-) delete mode 100755 web/themes/joinup/prototype/sass/.gitignore delete mode 100644 web/themes/joinup/prototype/sass/_drupal-hacks.sass delete mode 100644 web/themes/joinup/prototype/sass/_mdl-hacks.sass delete mode 100644 web/themes/joinup/prototype/sass/_mixins.sass delete mode 100644 web/themes/joinup/prototype/sass/app.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_blockquote.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_checkbox.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_cookie_consent_kit.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_fontfaces.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_heading.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_input.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_link.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_ordered_list.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_radio.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_shared.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_table.sass delete mode 100644 web/themes/joinup/prototype/sass/base/_unordered_list.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_action-link.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_alert.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_block.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_button.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_chip.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_chipfield.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_circle-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_comment.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_details.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_ec-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_editor-area.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_etiquette.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_featured-lg.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_featured.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_fieldset.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_filters.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_footer-ec-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_footer-social-media.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_form-table.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_form.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_header-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_icon-card.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_icon.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_icons-bar.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_image-caption.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_inline-social-media.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_invite-form.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_licence.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_listing.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_load-more.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_login-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_navigation-bottom.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_page.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_pager.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_search-bar.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_share-box.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_sidebar-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_tab.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_tallinn.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_timeline.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_vertical-menu.sass delete mode 100644 web/themes/joinup/prototype/sass/components/_vertical-tabs.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/_grid.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/_layout.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/sections/_section--featured.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/sections/_section--header.sass delete mode 100644 web/themes/joinup/prototype/sass/layouts/sections/_section--sidebar-left.sass delete mode 100644 web/themes/joinup/prototype/sass/variables/_variables.sass create mode 100644 web/themes/joinup/prototype/scss/_drupal-hacks.scss create mode 100644 web/themes/joinup/prototype/scss/_mdl-hacks.scss create mode 100644 web/themes/joinup/prototype/scss/_mixins.scss create mode 100644 web/themes/joinup/prototype/scss/app.scss create mode 100644 web/themes/joinup/prototype/scss/base/_blockquote.scss rename web/themes/joinup/prototype/{sass/base/_body.sass => scss/base/_body.scss} (50%) create mode 100644 web/themes/joinup/prototype/scss/base/_checkbox.scss create mode 100644 web/themes/joinup/prototype/scss/base/_cookie_consent_kit.scss create mode 100644 web/themes/joinup/prototype/scss/base/_fontfaces.scss create mode 100644 web/themes/joinup/prototype/scss/base/_heading.scss create mode 100644 web/themes/joinup/prototype/scss/base/_input.scss create mode 100644 web/themes/joinup/prototype/scss/base/_link.scss create mode 100644 web/themes/joinup/prototype/scss/base/_ordered_list.scss rename web/themes/joinup/prototype/{sass/base/_paragraph.sass => scss/base/_paragraph.scss} (100%) create mode 100644 web/themes/joinup/prototype/scss/base/_radio.scss create mode 100644 web/themes/joinup/prototype/scss/base/_shared.scss create mode 100644 web/themes/joinup/prototype/scss/base/_table.scss create mode 100644 web/themes/joinup/prototype/scss/base/_unordered_list.scss rename web/themes/joinup/prototype/{sass => scss}/base/html/blockquote.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/checkbox.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/heading.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/input.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/link.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/ordered-list.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/paragraph.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/radio.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/table.html (100%) rename web/themes/joinup/prototype/{sass => scss}/base/html/unordered-list.html (100%) create mode 100644 web/themes/joinup/prototype/scss/components/_action-link.scss create mode 100644 web/themes/joinup/prototype/scss/components/_alert.scss rename web/themes/joinup/prototype/{sass/components/_announcement.sass => scss/components/_announcement.scss} (58%) rename web/themes/joinup/prototype/{sass/components/_avatar.sass => scss/components/_avatar.scss} (60%) rename web/themes/joinup/prototype/{sass/components/_background.sass => scss/components/_background.scss} (72%) create mode 100644 web/themes/joinup/prototype/scss/components/_block.scss create mode 100644 web/themes/joinup/prototype/scss/components/_button.scss create mode 100644 web/themes/joinup/prototype/scss/components/_chip.scss create mode 100644 web/themes/joinup/prototype/scss/components/_chipfield.scss create mode 100644 web/themes/joinup/prototype/scss/components/_circle-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_comment.scss create mode 100644 web/themes/joinup/prototype/scss/components/_details.scss rename web/themes/joinup/prototype/{sass/components/_draggable.sass => scss/components/_draggable.scss} (76%) create mode 100644 web/themes/joinup/prototype/scss/components/_ec-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_editor-area.scss create mode 100644 web/themes/joinup/prototype/scss/components/_etiquette.scss create mode 100644 web/themes/joinup/prototype/scss/components/_featured-lg.scss create mode 100644 web/themes/joinup/prototype/scss/components/_featured.scss create mode 100644 web/themes/joinup/prototype/scss/components/_fieldset.scss rename web/themes/joinup/prototype/{sass/components/_file-upload.sass => scss/components/_file-upload.scss} (55%) create mode 100644 web/themes/joinup/prototype/scss/components/_filters.scss create mode 100644 web/themes/joinup/prototype/scss/components/_footer-ec-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_footer-social-media.scss rename web/themes/joinup/prototype/{sass/components/_footer.sass => scss/components/_footer.scss} (87%) create mode 100644 web/themes/joinup/prototype/scss/components/_form-table.scss create mode 100644 web/themes/joinup/prototype/scss/components/_form.scss rename web/themes/joinup/prototype/{sass/components/_header-logo.sass => scss/components/_header-logo.scss} (70%) create mode 100644 web/themes/joinup/prototype/scss/components/_header-menu.scss rename web/themes/joinup/prototype/{sass/components/_header.sass => scss/components/_header.scss} (87%) create mode 100644 web/themes/joinup/prototype/scss/components/_icon-card.scss create mode 100644 web/themes/joinup/prototype/scss/components/_icon.scss create mode 100644 web/themes/joinup/prototype/scss/components/_icons-bar.scss create mode 100644 web/themes/joinup/prototype/scss/components/_image-caption.scss create mode 100644 web/themes/joinup/prototype/scss/components/_inline-social-media.scss create mode 100644 web/themes/joinup/prototype/scss/components/_invite-form.scss create mode 100644 web/themes/joinup/prototype/scss/components/_licence.scss create mode 100644 web/themes/joinup/prototype/scss/components/_listing.scss create mode 100644 web/themes/joinup/prototype/scss/components/_load-more.scss create mode 100644 web/themes/joinup/prototype/scss/components/_login-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_navigation-bottom.scss create mode 100644 web/themes/joinup/prototype/scss/components/_page.scss create mode 100644 web/themes/joinup/prototype/scss/components/_pager.scss create mode 100644 web/themes/joinup/prototype/scss/components/_search-bar.scss create mode 100644 web/themes/joinup/prototype/scss/components/_share-box.scss create mode 100644 web/themes/joinup/prototype/scss/components/_sidebar-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_tab.scss create mode 100644 web/themes/joinup/prototype/scss/components/_tallinn.scss create mode 100644 web/themes/joinup/prototype/scss/components/_timeline.scss create mode 100644 web/themes/joinup/prototype/scss/components/_vertical-menu.scss create mode 100644 web/themes/joinup/prototype/scss/components/_vertical-tabs.scss rename web/themes/joinup/prototype/{sass => scss}/components/html/!example.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/alert.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/button.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/circle-menu.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/draggable.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/etiquette.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/file-upload.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/filters.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/footer-ec-menu.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/footer-social-media.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/header-logo.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/header-menu.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/icon-card.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/icon.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/inline-social-media.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--default-col-12.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--default-col-6.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--distribution-col-12.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--distribution-col-6.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--documentation.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--event-col-12.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--event-col-6.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--load-more.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--news-col-12.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--news-col-6.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--newsletter.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--video-col-12.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing-item--video-col-6.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/listing.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/pager.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/search-bar.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/tab.html (100%) rename web/themes/joinup/prototype/{sass => scss}/components/html/timeline.html (100%) create mode 100644 web/themes/joinup/prototype/scss/layouts/_grid.scss create mode 100644 web/themes/joinup/prototype/scss/layouts/_layout.scss rename web/themes/joinup/prototype/{sass/layouts/sections/_section--content.sass => scss/layouts/sections/_section--content.scss} (88%) create mode 100644 web/themes/joinup/prototype/scss/layouts/sections/_section--featured.scss create mode 100644 web/themes/joinup/prototype/scss/layouts/sections/_section--footer.scss create mode 100644 web/themes/joinup/prototype/scss/layouts/sections/_section--header.scss create mode 100644 web/themes/joinup/prototype/scss/layouts/sections/_section--sidebar-left.scss rename web/themes/joinup/prototype/{sass/layouts/sections/_section.sass => scss/layouts/sections/_section.scss} (85%) create mode 100644 web/themes/joinup/prototype/scss/variables/_variables.scss diff --git a/.dockerignore b/.dockerignore index 09181a5f0a..6656ef2926 100644 --- a/.dockerignore +++ b/.dockerignore @@ -30,8 +30,7 @@ tests/behat.yml web/phpunit.xml web/sites/default/services.yml -# Ignore compiled CSS and SASS cache. -.sass-cache/ +# Ignore compiled CSS. web/themes/joinup/css web/themes/joinup/prototype/css/*.css # Ignore theme libraries diff --git a/.gitignore b/.gitignore index 3920761f3b..bbe9e2bf8c 100644 --- a/.gitignore +++ b/.gitignore @@ -30,8 +30,7 @@ /web/phpunit.xml /web/sites/default/services.yml -# Ignore compiled CSS and SASS cache. -.sass-cache/ +# Ignore compiled CSS. /web/themes/joinup/css /web/themes/joinup/prototype/css/*.css # Ignore theme libraries diff --git a/README.md b/README.md index 6efed30ac8..c885b236c8 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,6 @@ To start on macOS without Docker, please, check the separated [README file](reso #### Requirements * A regular LAMP stack running PHP 7.1.0 or higher * Virtuoso 7 (Triplestore database) -* SASS compiler * Apache Solr #### Dependency management and builds @@ -88,13 +87,6 @@ run the Behat test, please refer directly to the documention of DirsAllowed = /var/www/joinup/resources/fixtures, /usr/share/virtuoso-opensource-7/vad ``` -* Install the official [SASS compiler](https://github.com/sass/sass). This - depends on Ruby being installed on your system. - - ``` - $ gem install sass - ``` - * Install [Selenium](https://github.com/SeleniumHQ/docker-selenium/blob/master/README.md). The simplest way of doing this is using Docker to install and run it with a single command. This will download all necessary files and start the browser diff --git a/build.continuousphp.xml b/build.continuousphp.xml index 66aba043f2..760bcf84f6 100644 --- a/build.continuousphp.xml +++ b/build.continuousphp.xml @@ -72,11 +72,6 @@ sudo rsync -avz /opt/solr/search_api_solr/solr-conf/6.x/ /opt/solr/server/solr/d
- - diff --git a/build.docker.overrides.xml b/build.docker.overrides.xml index efb8bdec15..9f54a12bab 100644 --- a/build.docker.overrides.xml +++ b/build.docker.overrides.xml @@ -2,15 +2,15 @@ - + - + - - - - - + + + + + + + @@ -542,12 +539,12 @@ + depends="install-composer-dependencies-dist, compile-scss" /> + depends="install-composer-dependencies, setup-behat, setup-php-codesniffer, setup-phpunit, setup-drush, compile-scss" /> =5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3", + "squizlabs/php_codesniffer": "~2.5", + "twbs/bootstrap": "~4.3", + "zurb/foundation": "~6.5" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "time": "2020-02-20T16:44:03+00:00" + }, { "name": "seld/jsonlint", "version": "1.7.2", @@ -16278,5 +16339,6 @@ }, "platform-overrides": { "php": "7.1.9" - } + }, + "plugin-api-version": "1.1.0" } diff --git a/resources/docker/README.md b/resources/docker/README.md index 60b9d569ac..3a8be089fc 100644 --- a/resources/docker/README.md +++ b/resources/docker/README.md @@ -9,7 +9,6 @@ To run Joinup in containers, we are using the following images: * [php:7.1.24-apache-jessie](https://hub.docker.com/_/php/) which is extended with configuration based on the [docker for drupal](https://github.com/docker-library/drupal) and the [fpfis/httpd-php](https://github.com/fpfis/httpd-php) images. -* [pablofelix/sass](https://hub.docker.com/r/pablofelix/sass/) * [percona/percona-server:5.6](https://hub.docker.com/r/percona/percona-server/) * [tenforce/virtuoso](https://hub.docker.com/r/tenforce/virtuoso/) * [selenium/standalone-chrome-debug](https://hub.docker.com/r/selenium/standalone-chrome-debug/) diff --git a/scripts/rpmbuild/make_joinup_build_uat.sh b/scripts/rpmbuild/make_joinup_build_uat.sh index 0a329a4947..824b5458b3 100755 --- a/scripts/rpmbuild/make_joinup_build_uat.sh +++ b/scripts/rpmbuild/make_joinup_build_uat.sh @@ -34,7 +34,7 @@ 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/phing compile-sass || exit 1 +./vendor/bin/phing compile-scss || exit 1 # Collect the source files for the package. diff --git a/web/modules/custom/joinup_community_content/templates/link-icon.html.twig b/web/modules/custom/joinup_community_content/templates/link-icon.html.twig index 80ffd76618..cab89057dd 100644 --- a/web/modules/custom/joinup_community_content/templates/link-icon.html.twig +++ b/web/modules/custom/joinup_community_content/templates/link-icon.html.twig @@ -6,7 +6,7 @@ * Available variables: * - attributes: An array of attributes to apply to the link. * - icon: The name of the icon. This should be one of the icons listed in the - * `_icon.sass` file. + * `_icon.scss` file. * - title: The link title. * - url: The link URL. * diff --git a/web/themes/joinup/README.md b/web/themes/joinup/README.md index 08c86b577f..756c078e8b 100644 --- a/web/themes/joinup/README.md +++ b/web/themes/joinup/README.md @@ -28,7 +28,7 @@ $ npm install ## Available tools -`gulp` command will be available to compile scripts/sass/styleguide/prototype +`gulp` command will be available to compile scripts/styleguide/prototype files. Just run `gulp` without any parameters to compile and start the "watch" mode to compile files on change. A list of all the tasks is available with `gulp --tasks`. diff --git a/web/themes/joinup/prototype/README.md b/web/themes/joinup/prototype/README.md index 05d6fe5e3c..89b2de2e38 100644 --- a/web/themes/joinup/prototype/README.md +++ b/web/themes/joinup/prototype/README.md @@ -1,6 +1,5 @@ ## Technologies included * **[SMACSS](https://smacss.com/)** - modular stylesheet approach that splits everything into components -* **[SASS](http://sass-lang.com/)** - keeps your stylesheets's syntax clean and tidy * **[BEM](http://getbem.com/)** - stylish structure for each SASS component * **[GULP](http://gulpjs.com/)** - to automate various tasks and compile your work on file save * **[Mustache](https://mustache.github.io/)** - to render static html prototypes as a result of graphic project's implementation that can be shown to client, tested and implemented later to CMS, or deployed to production server diff --git a/web/themes/joinup/prototype/sass/.gitignore b/web/themes/joinup/prototype/sass/.gitignore deleted file mode 100755 index 3c3629e647..0000000000 --- a/web/themes/joinup/prototype/sass/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/web/themes/joinup/prototype/sass/_drupal-hacks.sass b/web/themes/joinup/prototype/sass/_drupal-hacks.sass deleted file mode 100644 index 471f07b3cc..0000000000 --- a/web/themes/joinup/prototype/sass/_drupal-hacks.sass +++ /dev/null @@ -1,471 +0,0 @@ -.draggable - .field-multiple-drag - width: 45px - padding-right: 0 - -.tabledrag-toggle-weight-wrapper - display: none - -// @todo Remove this hack as part of ISAICP-3021. -// @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3021 -.joinup-nodrag - a.tabledrag-handle, - .field-multiple-drag - display: none !important - -#edit-field-ar-owner-actions.container-inline - width: 100% - display: block - div - display: inline-block - -textarea - max-width: 100% - -.messages - background-image: none - -// Fix wrapper width in forms with vertical tabs. -.field-group-tabs-wrapper - width: 100% - -// Inline entity from styles. -.ief-entity-table - margin-bottom: 20px - .form-table__cell - height: 70px - padding: 0 15px - .ief-entity-operations - margin-bottom: 0 - -// Styles for multiple field table. -.field--widget-inline-entity-form-complex - .form-type-select - display: inline-block - vertical-align: middle - margin-right: 30px - select - height: 25px - width: auto - font-size: 14px - color: $color-grey-medium - .button__no-bg-wrapper - margin-right: 30px - -.ief-entity-table>.form-table__body>.form-table__row:nth-child(2)>.form-table__cell - padding-top: 15px - -#block-navigation - p - padding-top: 10px - padding-right: 35px - -// Contextual region changes -// Default icon is replaced -.contextual - +z-index(navigation) - button.trigger - font-family: 'WAAT Icons' - font-size: 0 - font-weight: normal - font-style: normal - font-variant: normal - line-height: 100% - position: relative !important - display: inline-block - width: 30px !important - height: 30px !important - padding: 0 - text-indent: 0 - text-transform: none - color: $color-base - border: none !important - border-radius: 30px !important - background: none - speak: none - -webkit-font-smoothing: antialiased - -moz-osx-font-smoothing: grayscale - &:hover, - &:focus - background: $color-grey-light - &:before - content: '\e8ab' - +icon-size(15px) - -// Contextual links behaviour in tiles. -.listing__card - .contextual - button.trigger.visually-hidden - // Restore the default absolute positioning applied by .visually-hidden class. - position: absolute !important - - -// Move contextual button to the left -// on pinned tiles. -.listing__card - .contextual - right: auto - left: 6px - top: 6px !important - .trigger - right: auto - left: 0 - float: left - .contextual-links - right: auto - left: 0 - border-radius: 0 4px 4px 4px - -// Change contextual button color -// on dark backgrounds -.section--featured, -.section--header, -.section--footer - .contextual - button.trigger - color: #fff - &:hover, - &:focus - background-image: none - background: $color-grey-medium - -ul.contextual-links - +z-index(highlight+2) - position: relative - padding-left: 0 - margin: 0 - li - text-indent: 0 - &::before - display: none - -.contextual-region.focus - outline: none - outline-offset: 0 - -// Fix contextual button on collection and solution pages. -.canonical-entity-page--rdf-entity--solution, -.canonical-entity-page--rdf-entity--collection - article.contextual-region - &>.contextual - top: -36px - - -// Fixes dropdown button for main menu. -// It is needed only for admin. -#block-joinup-theme-main-menu - .contextual - +z-index(dropdown) - -// Fix password policy table -#password-policy-status - margin-bottom: $form-margin - table - th:first-child, td:first-child - display: none - -.form-type-password-confirm - margin-bottom: $form-margin - input.password-confirm - margin-bottom: $form-margin - -.is-only-placeholder - background: repeating-linear-gradient(-45deg, red, red 25px, rgba(255,255,255,1) 25px, rgba(255,255,255,1) 50px) - -.block-local-tasks-block - +hidden-print - -.block-facet--links-inline - display: inline-block - -form .description - @extend .form__description - -// Fix facets in search header -.block-facets - position: relative - -// jQuery ui hacks -.ui-dialog - width: calc(100% - 30px) !important - max-width: 840px - margin-left: 15px - margin-right: 15px - padding: 20px - +z-index(modal) - +breakpoint(sm) - width: auto !important - .ui-dialog-buttonpane - border: none - padding: 0 !important - margin: 0 - display: flex - justify-content: flex-end - .button - margin: 0 - font-weight: $font-weight-medium - - .ui-widget-content - padding: 0 - color: $color-base - - .ui-dialog-content - padding: 0 - font-weight: $font-weight-thin - color: $color-grey-medium - font-size: $font-size-small - .form-actions, .button - margin: 0 - .form__actions_inner - display: block - - .ui-dialog-title - float: none - padding-right: 30px - white-space: normal - margin: 0 - font-size: $font-size-h2 - - .ui-dialog-titlebar-close - height: 15px !important - width: 15px !important - background: none !important - border: none !important - top: 10px - right: 0 - .ui-icon - @extend .icon - color: $color-blue-dark - background: none - border: none !important - text-indent: 0 - font-size: 0 - padding: 0 - &:before - +icon-size(15px) - content: '\e617' - - .ui-dialog-buttonset - float: none !important - margin-top: $form-margin - +breakpoint(sm) - display: flex - justify-content: space-between - .button - width: 100% - margin-bottom: 10px - +breakpoint(sm) - width: auto - margin-right: 15px - margin-bottom: 0 - &:last-of-type - margin-bottom: 0 - +breakpoint(sm) - margin-right: 0 - - .ui-widget-header - font-size: $font-size-h3 - margin-bottom: $field-margin - padding: 0 - background: none - color: $color-blue-dark - border: none - font-weight: $font-weight-medium - -// Hide select formats in a comment field for anonymous users -// Remove margin for textarea -.comment-form-anonymous - margin-bottom: 0 - .filter-wrapper - display: none - -// Prevent overlapping contextal button and local tasks button. -.section--featured .contextual - top: 50px - -#block-joinup-theme-local-tasks - position: absolute - top: 10px - right: 10px - +z-index(dropdown) - a - text-decoration: none - .icon - +icon-size(15px) - color: #fff - &:first-child - .icon - color: $color-base - -// Remove border for iframes -article - iframe - border: none - -// Style tour popup nub -.joyride-tip-guide - .joyride-nub - border: solid 14px $color-grey-border - &:after - content: " " - display: block - border: 14px solid #fff - width: 0 - height: 0 - +z-index(modal) - position: absolute - &.top - border-top-color: transparent - border-left-color: transparent - border-right-color: transparent - &:after - border-top-color: transparent - border-left-color: transparent - border-right-color: transparent - top: -13px - left: -14px - &.bottom - border-bottom-color: transparent - border-left-color: transparent - border-right-color: transparent - &:after - border-bottom-color: transparent - border-left-color: transparent - border-right-color: transparent - bottom: -13px - left: -14px - &.right - border-top-color: transparent - border-right-color: transparent - border-bottom-color: transparent - &:after - border-top-color: transparent - border-right-color: transparent - border-bottom-color: transparent - top: -14px - right: -13px - &.left - border-top-color: transparent - border-left-color: transparent - border-bottom-color: transparent - &:after - border-top-color: transparent - border-left-color: transparent - border-bottom-color: transparent - top: -14px - left: -13px - &.top-right - border-top-color: transparent - border-left-color: transparent - border-right-color: transparent - &:after - border-top-color: transparent - border-left-color: transparent - border-right-color: transparent - top: -13px - right: -14px - -// Style tour popup content -.joyride-tip-guide - border-radius: 3px - border: 1px solid $color-grey-border - -.joyride-content-wrapper - padding: 20px 25px 70px 20px - .button - position: absolute - bottom: 20px - left: 20px - padding: 5px 10px - .tour-progress, .button - font-size: 12px - .joyride-close-tip - @extend .icon - top: 10px - right: 10px - text-decoration: none - color: $color-blue-dark - text-indent: 0 - font-size: 0 - &:before - +icon-size(15px) - content: '\e617' - .tour-tip-label - margin: 0 0 10px 0 - font-size: $font-size-h3 - &:empty - margin-bottom: 0 - .tour-tip-body - margin-bottom: 0 - font-weight: $font-weight-thin - color: $color-grey-medium - font-size: $font-size-small - -// Style the support menu. -.support-menu - .support-button - width: 40px - height: 40px - color: #fff - font-size: 25px - margin-right: 15px - +z-index(navigation) - .icon - +centered - a.support-menu__link - color: $color-blue-default - text-decoration: none - white-space: nowrap - -// Fix the feed icon styling. -.feed-icon - background: url(../../../../core/misc/feed.svg) no-repeat - overflow: hidden - text-indent: -9999px - display: block - width: 16px - height: 16px - - -// Internet Explorer fix. -details - display: block - -details .details-title - padding-bottom: 15px - text-decoration: none - @extend .form__label - -// Fixes on tallinn edit form. -.node-tallinn-report-edit-form - .vertical-tabs__pane > .form__description - margin-bottom: $form-margin - font-size: $font-size-small - .vertical-tabs__pane > summary - display: block - font-size: $font-size-h2 - pointer-events: none - &::-webkit-details-marker - display: none - -// Wrapper for map on event page. -.custom-map-wrapper - background: #fff - .wtfooter - margin-left: 10px - -// List with buttons. -.links--buttons - padding: 0 - margin: 0 - list-style: none - text-align: center - li - display: inline-block - margin: 0 5px - -// Fix margin for attachments in forms. -.form-managed-file - .mdl-textfield - margin-top: $table-margin - diff --git a/web/themes/joinup/prototype/sass/_mdl-hacks.sass b/web/themes/joinup/prototype/sass/_mdl-hacks.sass deleted file mode 100644 index c2376e08bb..0000000000 --- a/web/themes/joinup/prototype/sass/_mdl-hacks.sass +++ /dev/null @@ -1,113 +0,0 @@ -.mdl-card - width: 100% !important - -.mdl-cell--12-col-tablet - +breakpoint(mobile, tablet) - width: 100% - -.mdl-layout__header-row - height: 64px !important - +breakpoint(tablet) - padding: 0 20px - &.mdl-layout__header-row--maintenance - padding: 0 20px - -.mdl-menu - .mdl-menu__item - height: auto - padding: 0 - a - display: block - padding: 16px - white-space: normal - -.mdl-layout__drawer - +z-index(max+1) - -.mdl-layout__obfuscator - +z-index(max) - -.mdl-layout__drawer-button - top: 4px - +hidden-print - +breakpoint(tablet) - display: none - .material-icons - font-size: 40px - color: #fff - +centered - -.mdl-textfield--floating-label - .field-prefix - display: none - -.mdl-spinner - position: fixed - top: 48.5% - left: 49% - +z-index(max) - -.mdl-grid--center - justify-content: center - -.join-collection-form, -#block-joinup-theme-local-tasks - .mdl-menu__item a - white-space: nowrap - color: $color-blue-default - .mdl-menu__container - margin-top: $field-margin - -// Fix for iOS overflow issue caused by not respecting % height value -.mdl-layout__container - height: auto - -.mdl-layout - min-height: 100vh - -// Fix for Internet Explorer unstretched content section (once empty) and footer overflow issues caused by not respecting the min-height value -@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) - .mdl-layout__container - height: 100vh - .section--header, - .section--footer - flex-shrink: 0 - .section--featured, - .section--content - flex-grow: 1 - flex-shrink: 0 - body.has-cookie-consent-banner - .mdl-layout__container - height: auto - -.filter - .mdl-menu__container - max-height: 400px - margin-top: 5px - &.is-upgraded - // Align drop down menu to the left on smaller devices. - +breakpoint(sm-mobile, mobile) - left: 0 !important - .mdl-menu - position: relative - .mdl-menu - overflow-x: hidden - overflow-y: auto - max-height: 400px - -// Hide visually the original checkbox input to allow the browser validation message to appear properly. -.mdl-checkbox.is-upgraded .mdl-checkbox__input - position: absolute - top: 20px - left: 8px - width: 1px - height: 1px - margin: 0 - padding: 0 - border: 0 - clip: rect(1px, 1px, 1px, 1px) - clip-path: inset(100%) - overflow: hidden - outline: 0 - -webkit-appearance: none - appearance: none diff --git a/web/themes/joinup/prototype/sass/_mixins.sass b/web/themes/joinup/prototype/sass/_mixins.sass deleted file mode 100644 index b7d7921254..0000000000 --- a/web/themes/joinup/prototype/sass/_mixins.sass +++ /dev/null @@ -1,189 +0,0 @@ -// Breakpoints -=breakpoint($min: null, $max: null) - // Declare breakpoint value variables - $min-width: null !default - $max-width: null !default - - // Always interpret min value since it is cardinal. - @if $min == lg or $min == lg-desktop - $min-width: $screen-lg-min - @else if $min == md or $min == desktop - $min-width: $screen-md-min - @else if $min == sm or $min == tablet - $min-width: $screen-sm-min - @else if $min == xs or $min == mobile - $min-width: $screen-xs-min - @else if $min == xxs or $min == sm-mobile - $min-width: $screen-xxs-min - - // Interpret also max value if defined. - @if $max - @if $max == md or $max == desktop - $max-width: $screen-md-max - @else if $max == sm or $max == tablet - $max-width: $screen-sm-max - @else if $max == xs or $max == mobile - $max-width: $screen-xs-max - @else if $max == xxs or $max == sm-mobile - $max-width: $screen-xxs-max - - // Render min and max breakpoint if both are defined - @media (min-width: $min-width) and (max-width: $max-width) - @content - - @else - // Else render only min breakpoint. - @media (min-width: $min-width) - @content - -// Border radius -=border-radius($radius) - -webkit-border-radius: $radius - -moz-border-radius: $radius - border-radius: $radius - -// WAAT icon size -=icon-size($size) - width: $size - height: $size - line-height: $size - font-size: $size - -// Centering -=centered($horizontal: true, $vertical: true) - position: absolute - @if ($horizontal and $vertical) - top: 50% - left: 50% - -webkit-transform: translate(-50%, -50%) - -moz-transform: translate(-50%, -50%) - -ms-transform: translate(-50%, -50%) - transform: translate(-50%, -50%) - @else if ($horizontal) - left: 50% - -webkit-transform: translate(-50%, 0) - -moz-transform: translate(-50%, 0) - -ms-transform: translate(-50%, 0) - transform: translate(-50%, 0) - @else if ($vertical) - top: 50% - -webkit-transform: translate(0, -50%) - -moz-transform: translate(0, -50%) - -ms-transform: translate(0, -50%) - transform: translate(0, -50%) - -// Hidden print -=hidden-print() - @media print - display: none !important - -// Flexbox -// Defines a block flex container; enables a flex context for all its direct children. -=flex - display: -webkit-box - display: -webkit-flex - display: -moz-flex - display: -ms-flexbox - display: flex - -// Inline flex -// Defines an inline flex container; enables a flex context for all its direct children. -=inline-flex - display: -webkit-inline-box - display: -webkit-inline-flex - display: -moz-inline-flex - display: -ms-inline-flexbox - display: inline-flex - -// Flex flow direction -// Defines the main axis around which the items are placed in the flex container. -=flex-direction($value: row) - -webkit-flex-direction: $value - -moz-flex-direction: $value - -ms-flex-direction: $value - flex-direction: $value - @if $value == row - -webkit-box-direction: normal - -webkit-box-orient: horizontal - @else if $value == column - -webkit-box-direction: normal - -webkit-box-orient: vertical - -// Flex wrap -// Defines whether flex items will be wrap. -=flex-wrap($value: nowrap) - -webkit-flex-wrap: $value - -moz-flex-wrap: $value - flex-wrap: $value - @if $value == nowrap - -ms-flex-wrap: none - @else - -ms-flex-wrap: $value - -// Justify content -// Defines the alignment along the main axis. -=justify-content($value: flex-start) - -webkit-justify-content: $value - -moz-justify-content: $value - justify-content: $value - @if $value == flex-start - -webkit-box-pack: start - -ms-flex-pack: start - @else if $value == flex-end - -webkit-box-pack: end - -ms-flex-pack: end - @else if $value == space-between - -webkit-box-pack: justify - -ms-flex-pack: justify - @else if $value == space-around - -ms-flex-pack: distribute - @else - -webkit-box-pack: $value - -ms-flex-pack: $value - -// Align items -// Defines the default behaviour of the flex items along the cross axis on the current line. -=align-items($value: stretch) - -webkit-align-items: $value - -moz-align-items: $value - align-items: $value - @if $value == flex-start - -webkit-box-align: start - -ms-flex-align: start - @else if $value == flex-end - -webkit-box-align: end - -ms-flex-align: end - @else - -webkit-box-align: $value - -ms-flex-align: $value - -// Z-indexes map-get -$z-index: (auto: auto, zero: 0, highlight: 1, highlight+1: 2, highlight+2: 3, navigation: 10, dropdown: 15, header: 16, modal: 20, max: 999, max+1: 1000) !default - -@function z-index($key) - @if map-has-key($z-index, $key) - @return map-get($z-index, $key) - - @warn "The key '#{$key}' is not in the map '$z-index'" - @return null - -=z-index($key) - z-index: z-index($key) - -// Maximum number of rows -// Defines maximum number of rows allowed in a field -=number-rows($number, $row-height, $fixed: false) - max-height: $number * $row-height - line-height: $row-height - overflow: hidden - @if ($fixed) - +breakpoint(tablet) - height: $number * $row-height - -// Calculates height for text container in tiles -=calc-space($number, $row-height, $margin, $number-small: 0, $row-height-small: 0, $margin-small: 0) - max-height: $number * $row-height + $number-small * $row-height-small + $margin + $margin-small - &.listing__text-container--tags - max-height: ($number - 1) * $row-height + $number-small * $row-height-small + $margin + $margin-small - - diff --git a/web/themes/joinup/prototype/sass/app.sass b/web/themes/joinup/prototype/sass/app.sass deleted file mode 100644 index 92eafddef4..0000000000 --- a/web/themes/joinup/prototype/sass/app.sass +++ /dev/null @@ -1,97 +0,0 @@ -// Font declarations -@import "base/fontfaces" - -// Variables -@import "variables/variables" - -// Importing mixins -@import "mixins" - -// Base -// -// Basic html elements -// -// Styleguide 1 -@import "base/body" -@import "base/paragraph" -@import "base/heading" -@import "base/blockquote" -@import "base/link" -@import "base/ordered_list" -@import "base/unordered_list" -@import "base/table" -@import "base/radio" -@import "base/checkbox" -@import "base/cookie_consent_kit" -@import "base/input" -@import "base/shared" - -// Components -// -// Joinup components -// -// Styleguide 2 -@import "components/search-bar" -@import "components/header" -@import "components/header-logo" -@import "components/header-menu" -@import "components/login-menu" -@import "components/icons-bar" -@import "components/sidebar-menu" -@import "components/listing" -@import "components/featured" -@import "components/featured-lg" -@import "components/icon" -@import "components/background" -@import "components/button" -@import "components/form" -@import "components/editor-area" -@import "components/tab" -@import "components/alert" -@import "components/tallinn" -@import "components/form-table" -@import "components/file-upload" -@import "components/draggable" -@import "components/vertical-tabs" -@import "components/circle-menu" -@import "components/filters" -@import "components/details" -@import "components/action-link" -@import "components/etiquette" -@import "components/timeline" -@import "components/announcement" -@import "components/avatar" -@import "components/comment" -@import "components/load-more" -@import "components/fieldset" -@import "components/pager" -@import "components/share-box" -@import "components/footer" -@import "components/footer-ec-menu" -@import "components/footer-social-media" -@import "components/vertical-menu" -@import "components/page" -@import "components/block" -@import "components/icon-card" -@import "components/inline-social-media" -@import "components/chip" -@import "components/chipfield" -@import "components/invite-form" -@import "components/navigation-bottom" -@import "components/image-caption" -@import "components/licence" - -// Sections -@import "layouts/sections/section" -@import "layouts/sections/section--footer" -@import "layouts/sections/section--header" -@import "layouts/sections/section--content" -@import "layouts/sections/section--featured" -@import "layouts/sections/section--sidebar-left" - -// Layouts -@import "layouts/layout" -@import "layouts/grid" - -@import "mdl-hacks" -@import "drupal-hacks" diff --git a/web/themes/joinup/prototype/sass/base/_blockquote.sass b/web/themes/joinup/prototype/sass/base/_blockquote.sass deleted file mode 100644 index ecc2bc1c90..0000000000 --- a/web/themes/joinup/prototype/sass/base/_blockquote.sass +++ /dev/null @@ -1,29 +0,0 @@ -// Blockquote -// -// Markup: html/blockquote.html -// -// Styleguide 1.4 - -blockquote - position: relative - clear: both - overflow: hidden - margin: 24px -60px - padding: 40px 80px - color: #fff - background-color: $color-blue-medium - &:before, - &:after - display: none - -.blockquote__paragraph - font-size: $font-size-base - font-weight: $font-weight - font-style: italic - line-height: 1.8 - -.blockquote__author - font-size: $font-size-base - 2px - font-style: normal - margin-top: 24px - text-align: right diff --git a/web/themes/joinup/prototype/sass/base/_checkbox.sass b/web/themes/joinup/prototype/sass/base/_checkbox.sass deleted file mode 100644 index 3d3f8e951c..0000000000 --- a/web/themes/joinup/prototype/sass/base/_checkbox.sass +++ /dev/null @@ -1,48 +0,0 @@ -// Checkbox -// -// Markup: html/checkbox.html -// -// Styleguide 1.10 - -// Component -// -------------------------------------------------- -.checkbox - display: block - margin: 15px 0 - -.mdl-checkbox - height: auto - min-height: 24px - -// Elements -// -------------------------------------------------- -.mdl-checkbox__ripple-container - .mdl-ripple - background-color: $color-blue-medium - -.mdl-checkbox__label - font-size: $font-size-xsmall - font-weight: $font-weight-thin - display: block - color: lighten($color-grey-medium, 10%) - -// Modifiers -// -------------------------------------------------- -.checkbox--inline - display: inline-block - width: auto - margin-right: 15px - vertical-align: middle - &:last-of-type - margin-right: 0 - -// Dependiencies -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.mdl-checkbox.is-checked - .mdl-checkbox__box-outline - border-color: $color-blue-medium - .mdl-checkbox__tick-outline - background-color: $color-blue-medium diff --git a/web/themes/joinup/prototype/sass/base/_cookie_consent_kit.sass b/web/themes/joinup/prototype/sass/base/_cookie_consent_kit.sass deleted file mode 100644 index 6a93659287..0000000000 --- a/web/themes/joinup/prototype/sass/base/_cookie_consent_kit.sass +++ /dev/null @@ -1,7 +0,0 @@ -// Cookie Consent Kit -// -// Styleguide 1.4 - -#cookie-consent-banner - max-width: 100% - border: none !important diff --git a/web/themes/joinup/prototype/sass/base/_fontfaces.sass b/web/themes/joinup/prototype/sass/base/_fontfaces.sass deleted file mode 100644 index 91c76e93fc..0000000000 --- a/web/themes/joinup/prototype/sass/base/_fontfaces.sass +++ /dev/null @@ -1,114 +0,0 @@ -// Typography -// - -// open-sans-300 - latin -@font-face - font-family: 'Open Sans' - font-style: normal - font-weight: 300 - src: url('../fonts/open-sans/open-sans-v14-latin-300.eot') - // IE9 Compat Modes - src: local("Open Sans Light"), local("OpenSans-Light"), url('../fonts/open-sans/open-sans-v14-latin-300.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-300.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-300.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-300.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-300.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-regular - latin -@font-face - font-family: 'Open Sans' - font-style: normal - font-weight: 400 - src: url('../fonts/open-sans/open-sans-v14-latin-regular.eot') - // IE9 Compat Modes - src: local("Open Sans Regular"), local("OpenSans-Regular"), url('../fonts/open-sans/open-sans-v14-latin-regular.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-regular.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-regular.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-regular.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-regular.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-300italic - latin -@font-face - font-family: 'Open Sans' - font-style: italic - font-weight: 300 - src: url('../fonts/open-sans/open-sans-v14-latin-300italic.eot') - // IE9 Compat Modes - src: local("Open Sans Light Italic"), local("OpenSans-LightItalic"), url('../fonts/open-sans/open-sans-v14-latin-300italic.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-300italic.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-300italic.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-300italic.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-300italic.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-600 - latin -@font-face - font-family: 'Open Sans' - font-style: normal - font-weight: 600 - src: url('../fonts/open-sans/open-sans-v14-latin-600.eot') - // IE9 Compat Modes - src: local("Open Sans SemiBold"), local("OpenSans-SemiBold"), url('../fonts/open-sans/open-sans-v14-latin-600.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-600.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-600.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-600.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-600.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-600italic - latin -@font-face - font-family: 'Open Sans' - font-style: italic - font-weight: 600 - src: url('../fonts/open-sans/open-sans-v14-latin-600italic.eot') - // IE9 Compat Modes - src: local("Open Sans SemiBold Italic"), local("OpenSans-SemiBoldItalic"), url('../fonts/open-sans/open-sans-v14-latin-600italic.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-600italic.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-600italic.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-600italic.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-600italic.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-italic - latin -@font-face - font-family: 'Open Sans' - font-style: italic - font-weight: 400 - src: url('../fonts/open-sans/open-sans-v14-latin-italic.eot') - // IE9 Compat Modes - src: local("Open Sans Italic"), local("OpenSans-Italic"), url('../fonts/open-sans/open-sans-v14-latin-italic.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-italic.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-italic.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-italic.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-italic.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-700italic - latin -@font-face - font-family: 'Open Sans' - font-style: italic - font-weight: 700 - src: url('../fonts/open-sans/open-sans-v14-latin-700italic.eot') - // IE9 Compat Modes - src: local("Open Sans Bold Italic"), local("OpenSans-BoldItalic"), url('../fonts/open-sans/open-sans-v14-latin-700italic.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-700italic.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-700italic.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-700italic.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-700italic.svg#OpenSans') format("svg") -// Legacy iOS - - -// open-sans-700 - latin -@font-face - font-family: 'Open Sans' - font-style: normal - font-weight: 700 - src: url('../fonts/open-sans/open-sans-v14-latin-700.eot') - // IE9 Compat Modes - src: local("Open Sans Bold"), local("OpenSans-Bold"), url('../fonts/open-sans/open-sans-v14-latin-700.eot?#iefix') format("embedded-opentype"), url('../fonts/open-sans/open-sans-v14-latin-700.woff2') format("woff2"), url('../fonts/open-sans/open-sans-v14-latin-700.woff') format("woff"), url('../fonts/open-sans/open-sans-v14-latin-700.ttf') format("truetype"), url('../fonts/open-sans/open-sans-v14-latin-700.svg#OpenSans') format("svg") -// Legacy iOS - -// Material icons // -// fallback // -@font-face - font-family: 'Material Icons' - font-style: normal - font-weight: 400 - src: url('../fonts/material-icons/MaterialIcons-Regular.eot') - src: local('Material Icons'), local('MaterialIcons-Regular'), url('../fonts/material-icons/MaterialIcons-Regular.woff2') format("woff2"), url('../fonts/material-icons/MaterialIcons-Regular.woff') format('woff'), url('../fonts/material-icons/MaterialIcons-Regular.ttf') format('truetype') - -.material-icons - font-family: 'Material Icons' - font-weight: normal - font-style: normal - font-size: 24px - line-height: 1 - letter-spacing: normal - text-transform: none - display: inline-block - white-space: nowrap - word-wrap: normal - direction: ltr - -moz-font-feature-settings: 'liga' - -moz-osx-font-smoothing: grayscale - diff --git a/web/themes/joinup/prototype/sass/base/_heading.sass b/web/themes/joinup/prototype/sass/base/_heading.sass deleted file mode 100644 index 56b715a725..0000000000 --- a/web/themes/joinup/prototype/sass/base/_heading.sass +++ /dev/null @@ -1,26 +0,0 @@ -// Heading -// -// Markup: html/heading.html -// -// Styleguide 1.3 - -h1, -h2, -h3, -h4 - font-weight: $font-weight-medium - -h1 - font-size: $font-size-h1 - -h2 - font-size: $font-size-h2 - -h3 - font-size: $font-size-h3 - -h4 - font-size: $font-size-h4 - -h5 - font-size: $font-size-h5 \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/base/_input.sass b/web/themes/joinup/prototype/sass/base/_input.sass deleted file mode 100644 index 1440f58efe..0000000000 --- a/web/themes/joinup/prototype/sass/base/_input.sass +++ /dev/null @@ -1,96 +0,0 @@ -// Input -// -// Markup: html/input.html -// -// Styleguide 1.11 - -// Component -// -------------------------------------------------- -// .mdl-textfield - -// Elements -// -------------------------------------------------- -.mdl-textfield__input - height: 42px - padding-top: 0 - padding-bottom: 0 - border-width: 1px - border-color: $color-grey-input - border-radius: 0 - -.mdl-textfield__label-container - position: relative - -.mdl-textfield__label - font-size: $font-size-medium - top: 10px - color: $color-grey-input - &:after - bottom: 0 - -.textfield__helptext - font-size: $font-size-xsmall - font-weight: $font-weight-thin - display: block - margin-top: 6px - color: lighten($color-grey-medium, 10%) - -// Modifiers -// -------------------------------------------------- -.textfield--full-width - width: 100% - -.mdl-textfield--with-prefix - +breakpoint(sm) - display: flex - align-items: center - .mdl-textfield__prefix - margin-bottom: 20px - +breakpoint(sm) - min-width: 230px - margin-bottom: 0 - .mdl-textfield__label-container - +breakpoint(sm) - width: 100% - -// Dependiencies -// -------------------------------------------------- -.form-table - &.field-multiple-table - .mdl-textfield - padding-top: 0 - padding-bottom: 0 - &.responsive-enabled - .mdl-textfield - padding-top: 0 - padding-bottom: 0 - -// States -// -------------------------------------------------- -.mdl-textfield - &.is-invalid - .mdl-textfield__input - border-width: 1px - border-color: $color-grey-input - .mdl-textfield__label - font-size: $font-size-medium - color: $color-grey-input - &:after - background-color: #a0a1a2 - &.is-focused, - &.is-dirty - .mdl-textfield__label - font-size: $font-size-small - top: -16px - color: $color-blue-medium - &:after - bottom: 0 - background-color: $color-blue-medium - -.mdl-textfield--textarea - &.is-focused, - &.is-dirty - .mdl-textfield__input - height: auto - padding-top: 12px - padding-bottom: 12px diff --git a/web/themes/joinup/prototype/sass/base/_link.sass b/web/themes/joinup/prototype/sass/base/_link.sass deleted file mode 100644 index 0dc0d07a57..0000000000 --- a/web/themes/joinup/prototype/sass/base/_link.sass +++ /dev/null @@ -1,12 +0,0 @@ -// Link -// -// Markup: html/link.html -// -// Styleguide 1.5 - -a - color: #ee8917 - word-wrap: break-word - - &[href]:after - content: none !important diff --git a/web/themes/joinup/prototype/sass/base/_ordered_list.sass b/web/themes/joinup/prototype/sass/base/_ordered_list.sass deleted file mode 100644 index 8c74a21405..0000000000 --- a/web/themes/joinup/prototype/sass/base/_ordered_list.sass +++ /dev/null @@ -1,31 +0,0 @@ -// Ordered list -// -// Markup: html/ordered-list.html -// -// Styleguide 1.6 - -article - ol - padding-left: 15px - list-style-type: none - counter-reset: step-counter - li - margin-bottom: 4px - &:before - margin-right: 5px - counter-increment: step-counter - content: counters(step-counter, ".") "." - - // Indent - li - &:before - width: 4px - height: 4px - - ol, ul - padding-left: 15px - counter-reset: step-counter - li - &:before - width: 2px - height: 2px diff --git a/web/themes/joinup/prototype/sass/base/_radio.sass b/web/themes/joinup/prototype/sass/base/_radio.sass deleted file mode 100644 index a6e5729979..0000000000 --- a/web/themes/joinup/prototype/sass/base/_radio.sass +++ /dev/null @@ -1,37 +0,0 @@ -// Radio -// -// Markup: html/radio.html -// -// Styleguide 1.9 - -// Component -// -------------------------------------------------- -.radio - display: block - margin: 15px 0 - -// Elements -// -------------------------------------------------- -.mdl-radio__inner-circle - background: $color-blue-medium - -// Modifiers -// -------------------------------------------------- -.radio--inline - display: inline-block - vertical-align: middle - margin-right: 15px - &:last-of-type - margin-right: 0 - -// Dependiencies -// -------------------------------------------------- -.mdl-radio__ripple-container - .mdl-ripple - background: $color-blue-medium - -// States -// -------------------------------------------------- -.mdl-radio.is-checked - .mdl-radio__outer-circle - border-color: $color-blue-medium diff --git a/web/themes/joinup/prototype/sass/base/_shared.sass b/web/themes/joinup/prototype/sass/base/_shared.sass deleted file mode 100644 index 128a013bed..0000000000 --- a/web/themes/joinup/prototype/sass/base/_shared.sass +++ /dev/null @@ -1,70 +0,0 @@ -.bold, .bold a - font-weight: $font-weight-bold - -.italic - font-style: italic - -.underline - text-decoration: underline - -.uppercase - text-transform: uppercase - -.gray - color: $color-grey-medium - -.blue - color: $color-blue-slider - -.color-base, .color-base a - color: $color-base - -.left - text-align: left - -.center - text-align: center - -.right - text-align: right - -.small - font-size: $font-size-small - -.truncated - text-overflow: ellipsis - white-space: nowrap - overflow: hidden - width: 100% - -.hide--phone - +breakpoint(sm-mobile, mobile) - display: none !important - -.hide--tablet - +breakpoint(mobile, tablet) - display: none !important - -.hide--desktop - +breakpoint(tablet, desktop) - display: none !important - -.row - margin-left: -16px - margin-right: -16px - -hr - margin: 0 - -// Abstract classes -.white-box - padding: 20px - background-color: #fff - +breakpoint(tablet) - padding: 40px 30px - +breakpoint(desktop) - padding: 40px 60px - -.button-inline - justify-content: space-between - margin: 15px 15px 0 0 diff --git a/web/themes/joinup/prototype/sass/base/_table.sass b/web/themes/joinup/prototype/sass/base/_table.sass deleted file mode 100644 index fe57a55e52..0000000000 --- a/web/themes/joinup/prototype/sass/base/_table.sass +++ /dev/null @@ -1,33 +0,0 @@ -// Table -// -// Markup: html/table.html -// -// Styleguide 1.8 - -table:not(.licence-comparer) - width: 100% - border-spacing: 0 - - thead - th - background-color: #fff - text-align: left - border-bottom: 1px solid $color-grey-light - - tbody - tr - &:nth-child(odd) - background-color: #fff - &:nth-child(even) - background-color: $color-grey-lighter - td - &.no - color: $color-grey-medium - - thead, - tbody - th, - td - padding: 15px - &.no - text-align: center \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/base/_unordered_list.sass b/web/themes/joinup/prototype/sass/base/_unordered_list.sass deleted file mode 100644 index a8f609628d..0000000000 --- a/web/themes/joinup/prototype/sass/base/_unordered_list.sass +++ /dev/null @@ -1,21 +0,0 @@ -// Unordered list -// -// Markup: html/unordered-list.html -// -// Styleguide 1.7 - -article, .navigation-bottom - ul - padding-left: 15px - list-style-type: none - li - padding-left: 15px - margin-bottom: 4px - text-indent: -12px - &:before - padding-right: 6px - content: "\002022" - color: $color-base - - ul, ol - padding-left: 15px diff --git a/web/themes/joinup/prototype/sass/components/_action-link.sass b/web/themes/joinup/prototype/sass/components/_action-link.sass deleted file mode 100644 index 50663b057f..0000000000 --- a/web/themes/joinup/prototype/sass/components/_action-link.sass +++ /dev/null @@ -1,46 +0,0 @@ -// Action link -// -// Action link component - -// Component -// -------------------------------------------------- -.action-link, .action-link__wrapper a - font-size: $font-size-xsmall - font-weight: $font-weight-medium - margin-right: 10px - text-decoration: none - text-transform: uppercase - color: $color-base - &:last-of-type - margin-right: 0 - -// Elements -// -------------------------------------------------- -.action-link__icon, -.action-link__title - display: inline-block - vertical-align: middle - -.action-link__icon - margin-right: 6px - +icon-size(16px) - -// Modifiers -// -------------------------------------------------- -.action-link__wrapper--normal-case a - font-weight: $font-weight-medium - text-transform: none - -// Dependiencies -// -------------------------------------------------- -.listing - .action-link__wrapper - margin-top: 20px - -.timeline__listing - > .action-link__wrapper - margin: 30px 20px 10px 20px - -.timeline__listing-item - > .action-link__wrapper - margin-top: 10px diff --git a/web/themes/joinup/prototype/sass/components/_alert.sass b/web/themes/joinup/prototype/sass/components/_alert.sass deleted file mode 100644 index 4fee706539..0000000000 --- a/web/themes/joinup/prototype/sass/components/_alert.sass +++ /dev/null @@ -1,72 +0,0 @@ -// Alert -// -// Alert messages. -// -// Markup: html/alert.html -// -// .alert--error - #eb5b5c -// .alert--warning - #ee8917 -// .alert--info - #2875cf -// .alert--success - #98c04c -// -// Styleguide 2.1 - -// Component -// -------------------------------------------------- -.alert - position: relative - margin-bottom: 40px - padding: 20px 60px - +border-radius(4px) - -// Elements -// -------------------------------------------------- -.alert__icon - left: 15px - color: #fff - +icon-size(30px) - +centered($horizontal: false, $vertical: true) - -.alert__message, .alert__message a - color: #fff - -.alert__close - position: absolute - top: 0 - right: 0 - opacity: .4 - color: #000 - +icon-size(30px) - -// Modifiers -// -------------------------------------------------- -.alert--error - background-color: $color-error - -.alert--warning - background-color: $color-warning - -.alert--info - background-color: $color-info - -.alert--success, -.alert--status - background-color: $color-success - -// Drupal hacks -.form-managed-file - .messages - color: #fff - position: relative - margin-bottom: 20px - padding: 20px 60px - +border-radius(4px) - .messages--error - background-color: $color-error - -// Dependencies -.listing__item - .alert - padding: 10px - .icon - display: none diff --git a/web/themes/joinup/prototype/sass/components/_block.sass b/web/themes/joinup/prototype/sass/components/_block.sass deleted file mode 100644 index 56454c8211..0000000000 --- a/web/themes/joinup/prototype/sass/components/_block.sass +++ /dev/null @@ -1,31 +0,0 @@ -// Block -// - -// Component -// -------------------------------------------------- -//.block - -// Elements -// -------------------------------------------------- -.block__title - margin: 30px 0 - - -// Modifiers -// -------------------------------------------------- -.block--separated - margin-top: 40px - border-top: 1px solid $color-grey-light - -.block-facet--checkbox - h2 - margin-top: 8px - margin-bottom: $tile-margin - .item-list__checkbox - list-style: none - margin-top: 0 - padding: 0 - .mdl-checkbox__label - color: $color-base - font-size: $font-size-small - font-weight: $font-weight \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/components/_button.sass b/web/themes/joinup/prototype/sass/components/_button.sass deleted file mode 100644 index 94e174db29..0000000000 --- a/web/themes/joinup/prototype/sass/components/_button.sass +++ /dev/null @@ -1,124 +0,0 @@ -// Button -// -// Markup: html/button.html -// -// .button - #32afff -// .button--blue - #2875cf -// .button--transparent - Transparent -// .button--full-width - Full-width -// -// Styleguide 2.2 - -// Component -// -------------------------------------------------- -.button - font-weight: $font-weight-medium - font-weight: $font-weight-bold - line-height: normal - height: auto - padding: 15px 30px - text-decoration: none - letter-spacing: 2px - text-transform: uppercase - color: #fff - border-width: 3px !important - border-style: solid - border-color: $color-blue-lighter - background-color: $color-blue-lighter !important - background-image: none !important - white-space: nowrap - +hidden-print - +border-radius(4px) - -// Elements -// -------------------------------------------------- -.button__no-bg-wrapper - position: relative - display: inline-block - height: 22px - cursor: pointer - vertical-align: middle - .icon - +z-index(highlight) - +icon-size(10px) - +centered($horizontal: false, $vertical: true) - -.button__no-bg - font-weight: $font-weight-bold - position: relative - display: inline-block - cursor: pointer - vertical-align: middle - letter-spacing: 2px - text-transform: uppercase - border: none - background-color: transparent !important - +z-index(highlight+1) - -.button__container - margin: 10px 0 - -// Modifiers -// -------------------------------------------------- -.button--blue - color: #fff - border-color: $color-blue-medium !important - background-color: $color-blue-medium !important - -.button--blue.is-disabled - color: $color-grey-input - border-color: $color-grey-light !important - background-color: $color-grey-light !important - -.button--blue-light - border-color: $color-blue-lighter !important - background-color: $color-blue-lighter !important - -.button--transparent - color: $color-grey-medium !important - border-color: $color-grey-medium - background-color: transparent !important - -.button--blue-important - border-color: $color-blue-medium - background-color: $color-blue-medium !important - &:hover - border-color: $color-blue-medium - -.button--full-width - width: 100% - -.button--icon - .icon - margin-right: 5px - -.button__no-bg-wrapper--circle - .icon - padding: 3px - color: $color-blue-medium - border: 2px solid $color-blue-medium - border-radius: 50% - .button__no-bg - line-height: 20px - padding: 0 0 0 30px - color: $color-blue-medium - &:hover - .icon - color: $color-blue-lighter - border-color: $color-blue-lighter - .button__no-bg - color: $color-blue-lighter - -.button__no-bg-wrapper--grey - .icon - color: $color-grey-input - .button__no-bg - padding: 0 0 0 20px - color: $color-grey-input - -// Dependiencies -// -------------------------------------------------- -.adms-validator-form - .button - margin-top: $form-margin - diff --git a/web/themes/joinup/prototype/sass/components/_chip.sass b/web/themes/joinup/prototype/sass/components/_chip.sass deleted file mode 100644 index e22135e986..0000000000 --- a/web/themes/joinup/prototype/sass/components/_chip.sass +++ /dev/null @@ -1,56 +0,0 @@ -// Chip -// -// Markup: todo. -// - -// Component -// -------------------------------------------------- -.mdl-chip - height: 32px - line-height: 32px - padding: 0 12px - border: 0 - border-radius: 16px - background-color: #dedede - display: inline-block - color: rgba(0,0,0,.87) - margin: 2px 0 - font-size: 0 - white-space: nowrap - -.mdl-chip__text - font-size: 13px - vertical-align: middle - display: inline-block - -.mdl-chip__action - height: 24px - width: 24px - border-radius: 12px - background: #767676 none !important - opacity: .54 - cursor: pointer - padding: 0 - margin: 0 0 0 4px - font-size: 13px - text-decoration: none - color: rgba(0,0,0,.87) - border: none - outline: none - display: inline-block - vertical-align: middle - overflow: hidden - text-align: center - - &:focus, - &:active - background-color: #4e4e4e !important - - .icon - font-size: 13px - color: #fff - position: relative - left: 1px - -.mdl-chip--deletable - padding-right: 4px diff --git a/web/themes/joinup/prototype/sass/components/_chipfield.sass b/web/themes/joinup/prototype/sass/components/_chipfield.sass deleted file mode 100644 index 34a85304ed..0000000000 --- a/web/themes/joinup/prototype/sass/components/_chipfield.sass +++ /dev/null @@ -1,54 +0,0 @@ -// Chipfield -// -// Markup: todo. -// - -// Component -// -------------------------------------------------- -.mdl-chipfield - //cursor: text - //padding-bottom: 0 - //margin-bottom: 20px - //border-bottom: 1px solid lightgrey - .inputs - margin-left: 5px - //float: left - width: 100% - display: inline-block - //position: relative - .mdl-chip - position: absolute - top: 15px - left: 55px - +z-index(navigation) - //float: left - //margin-top: 15px - //margin-right: 5px - .mdl-textfield__input - // ~ same height as the chips + 2*4 for the padding - //height: 38px - //border-bottom: none - .mdl-textfield__label - top: 8px - // hide stuff from MaterialTextField - .mdl-textfield__label:after - display: none - // search results - .results - width: 100% - max-height: 200px - overflow-y: auto - list-style: none - position: absolute - background-color: white - z-index: 10 - padding: 0 - margin-top: 1px - .results li - cursor: pointer - padding: 10px 5px 10px 10px - &:hover, &.is-selected - background-color: rgb(238, 238, 238) - - - diff --git a/web/themes/joinup/prototype/sass/components/_circle-menu.sass b/web/themes/joinup/prototype/sass/components/_circle-menu.sass deleted file mode 100644 index 432e515a0f..0000000000 --- a/web/themes/joinup/prototype/sass/components/_circle-menu.sass +++ /dev/null @@ -1,52 +0,0 @@ -// Circle menu -// -// Markup: html/circle-menu.html -// -// Styleguide 2.3 - -// Component -// -------------------------------------------------- -// .circle-menu - -// Elements -// -------------------------------------------------- -.circle-menu__button - background-color: $color-orange !important - .icon - +centered - -// Modifiers -// -------------------------------------------------- -.circle-menu--tablet - display: none - +breakpoint(mobile) - display: block - -.circle-menu--mobile - +breakpoint(mobile) - display: none - -.circle-menu__link - min-width: 130px - -// Dependiencies -// -------------------------------------------------- -.circle-menu--tablet - .mdl-menu__container - margin-top: 10px - -.circle-menu--mobile - .mdl-menu__container - margin-bottom: 10px - -.circle-menu__button - .icon - color: #fff - +icon-size(28px) - .mdl-ripple - background-color: #fff - -.featured__menu-wrapper - .circle-menu--tablet - .mdl-menu__container - margin-top: -15px diff --git a/web/themes/joinup/prototype/sass/components/_comment.sass b/web/themes/joinup/prototype/sass/components/_comment.sass deleted file mode 100644 index c3ccf43983..0000000000 --- a/web/themes/joinup/prototype/sass/components/_comment.sass +++ /dev/null @@ -1,80 +0,0 @@ -// Component -// -------------------------------------------------- - -// Elements -// -------------------------------------------------- -.comment-item - position: relative - margin-top: 0 - margin-bottom: 0 - border-top: 2px solid $color-grey-bg - width: 100% - &:first-of-type - border-top: none - -.comment-item__field - margin-bottom: 15px - &:last-of-type - margin-bottom: 0 - -.comment-item__blockquote - font-weight: $font-weight-thin - font-style: italic - padding-left: 26px - color: darken($color-grey-light, 8%) - border-left: 4px solid lighten($color-grey-light, 4%) - -.comment-item__stats - text-align: right - -.comment-item__text - @extend .listing__text - -.comment-item__icon - @extend .listing__icon - -.comment-form - +hidden-print - margin-top: 70px - margin-bottom: 0 - padding-top: 50px - padding-right: 20px - padding-bottom: 50px - padding-left: 20px - background-color: #fff - .form__actions - width: 100% - text-align: right - .button - margin: 0 - +breakpoint(tablet) - padding-right: 60px - padding-left: 60px - -// Modifiers -// -------------------------------------------------- -.comment-item--default - padding: 7px - background-color: #fff - -.comment-item--load-more - min-height: 70px - border: 5px solid darken($color-grey-light, 1%) - background-color: $color-grey-bg - -.comment-form--unavailable - margin-top: 20px - padding-top: 40px - padding-bottom: 40px - margin-left: 0 - margin-right: 0 - width: 100% - -.comment-form--disabled - margin-top: 4px - padding-top: 40px - padding-bottom: 40px - -.comment-item, .comment-form - .details__element a - color: $color-grey-medium diff --git a/web/themes/joinup/prototype/sass/components/_details.sass b/web/themes/joinup/prototype/sass/components/_details.sass deleted file mode 100644 index 3f51eff9f1..0000000000 --- a/web/themes/joinup/prototype/sass/components/_details.sass +++ /dev/null @@ -1,91 +0,0 @@ -// Component -// -------------------------------------------------- - -// Elements -// -------------------------------------------------- -.details__element - font-size: $font-size-xsmall - display: inline-block - margin-right: 10px - margin-top: 5px - padding-right: 10px - vertical-align: middle - border-right: 1px solid $color-grey-medium - &:last-of-type - margin-right: 0 - padding-right: 0 - border-right: none - * - display: inline - -.details__element-item a - color: $color-blue-dark - font-weight: $font-weight-bold - -.details__user - margin: 5px 0 0 0 - display: inline-block - -.details__avatar - margin-right: 10px - img - width: 40px - height: 40px - background-color: #fff - +border-radius(50%) - -.details__user-item - display: inline-block - a - color: $color-grey-medium - text-decoration: none - -.details__element-headline - margin-top: 0 - h2 - font-size: $font-size-xsmall - font-weight: $font-weight - margin: 0 - -.details__element-created - display: inline-block - vertical-align: middle - margin-top: 0 - -.details__bottom - .tag - margin-right: 1px - &:after - content: ',' - &:last-of-type - margin-right: 0 - &:after - content: none - -// Modifiers -// -------------------------------------------------- -.details__element--block - display: block - border: none - a - color: $color-grey-medium - font-weight: $font-weight-medium - -.details__element--single - +number-rows(1, $row-height-small) - - -// Dependiencies -// -------------------------------------------------- -.page__title-wrapper - .details - margin: 10px 0 - +breakpoint(mobile) - margin: 0 - -.timeline__listing-details - .details__element - +breakpoint(sm-mobile, mobile) - margin-right: 0 - padding-right: 0 - border-right: none diff --git a/web/themes/joinup/prototype/sass/components/_ec-menu.sass b/web/themes/joinup/prototype/sass/components/_ec-menu.sass deleted file mode 100644 index b852b240c9..0000000000 --- a/web/themes/joinup/prototype/sass/components/_ec-menu.sass +++ /dev/null @@ -1,33 +0,0 @@ -// European Commision menu -// -// Component -// -------------------------------------------------- -.ec-menu - list-style-type: none - margin-top: 0 - margin-bottom: 0 - padding-left: 0 - +flex - +flex-direction(row) - +flex-wrap(wrap) - +justify-content(flex-start) - +align-items(center) - -// Elements -// -------------------------------------------------- -.ec-menu__item - margin-right: 20px - margin-bottom: 5px - -.ec-menu__link - color: #c0d0e3 - text-decoration: underline - -// Modifiers -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.ec-menu__link - &:hover - text-decoration: none diff --git a/web/themes/joinup/prototype/sass/components/_editor-area.sass b/web/themes/joinup/prototype/sass/components/_editor-area.sass deleted file mode 100644 index 2d6d9c3fd1..0000000000 --- a/web/themes/joinup/prototype/sass/components/_editor-area.sass +++ /dev/null @@ -1,21 +0,0 @@ -// Component -// -------------------------------------------------- -.editor-area - -// Elements -// -------------------------------------------------- -.editor-area__helptext - display: none - -.editor-area - .filter-wrapper - label - margin-right: 10px - font-size: 12px - color: $color-base - .form__label, select - display: inline-block - - -// Modifiers -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_etiquette.sass b/web/themes/joinup/prototype/sass/components/_etiquette.sass deleted file mode 100644 index b044e3fb19..0000000000 --- a/web/themes/joinup/prototype/sass/components/_etiquette.sass +++ /dev/null @@ -1,41 +0,0 @@ -// Etiquette -// -// Markup: html/etiquette.html -// -// Etiquette used next to the listing block title. -// -// .etiquette--blue - Blue colored - #eb5b5c -// -// Styleguide 2.4 - -// Component -// -------------------------------------------------- -.etiquette - font-size: $font-size-xsmall - font-weight: $font-weight - display: inline-block - padding: 5px 20px - vertical-align: middle - +border-radius(15px) - +breakpoint(mobile) - margin-left: 10px - margin-bottom: 0 - -// Elements -// -------------------------------------------------- - -// Modifiers -// -------------------------------------------------- -.etiquette--blue - color: #fff - background-color: lighten($color-blue-default, 15%) - -.etiquette--red - color: #fff - background-color: $color-error - a - color: #fff - text-decoration: none - -// Dependiencies -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_featured-lg.sass b/web/themes/joinup/prototype/sass/components/_featured-lg.sass deleted file mode 100644 index 20beffe27d..0000000000 --- a/web/themes/joinup/prototype/sass/components/_featured-lg.sass +++ /dev/null @@ -1,101 +0,0 @@ -// Featured large -// -// Featured large component - -// Component -// -------------------------------------------------- -.featured-lg - position: relative - margin: 0 auto - padding: 20px 0 - background: $color-blue-default url('../images/featured-lg-background.jpg') no-repeat center top - -webkit-background-size: cover - -moz-background-size: cover - -o-background-size: cover - background-size: cover - -// Elements -// -------------------------------------------------- -.featured-lg__wrapper - position: relative - max-width: 970px - margin: 0 auto - text-align: center - color: #fff - +z-index(highlight) - -.featured-lg__text, -.featured-lg__search-bar - margin-bottom: 30px - +breakpoint(tablet) - margin-bottom: 60px - -.featured-lg__logo - margin-top: 40px - margin-bottom: 30px - img - height: 60px - +breakpoint(tablet) - margin-bottom: 40px - img - height: 90px - -.featured-lg__stats - margin-bottom: 40px - -.featured-lg__text - margin-top: 0 - padding: 0 20px - font-weight: $font-weight-thin - max-width: 540px - margin-left: auto - margin-right: auto - -// Dependiencies -// -------------------------------------------------- -.featured-lg__stats - .stats__wrapper - position: relative - text-align: left - +breakpoint(sm-mobile, mobile) - width: 200px - margin: 0 auto 30px auto - +breakpoint(mobile) - display: inline-block - vertical-align: top - &:last-child - margin-right: 0 - +breakpoint(mobile, tablet) - width: 25% - margin-right: 5% - +breakpoint(tablet) - width: 200px - margin-right: 40px - - a - color: #fff - display: inline-block - text-decoration: none - - .stats__icon - position: absolute - top: 6px - left: 0 - +icon-size(45px) - - .stats__text - margin-bottom: 15px - padding-left: 60px - - .stats__description - text-align: left - -// Modifiers -// -------------------------------------------------- -.featured-lg__stats - .stats__text--upper, - .stats__text--lower - text-align: left - - .stats__text--upper - font-size: 32px diff --git a/web/themes/joinup/prototype/sass/components/_featured.sass b/web/themes/joinup/prototype/sass/components/_featured.sass deleted file mode 100644 index 5ab0462d7e..0000000000 --- a/web/themes/joinup/prototype/sass/components/_featured.sass +++ /dev/null @@ -1,217 +0,0 @@ -// Featured -// -// Featured component - -// Component -// -------------------------------------------------- -.featured - position: relative - margin: 0 auto - -// Elements -// -------------------------------------------------- -.featured__outer-wrapper - background: url('../images/featured-bg.jpg') no-repeat center top - position: relative - margin: 0 auto - -webkit-background-size: cover - -moz-background-size: cover - -o-background-size: cover - background-size: cover - -.featured__inner-wrapper - position: relative - max-width: 1200px - margin: 0 auto - text-align: center - padding: 20px 0 - +z-index(highlight+1) - a - text-decoration: none - @media print - padding: 0 - padding-bottom: 20px - -.featured__menu-wrapper - position: relative - max-width: 1200px - margin: 0 auto - text-align: center - +z-index(dropdown) - +hidden-print - -.featured__overlay - position: absolute - top: 0 - left: 0 - width: 100% - height: 100% - opacity: .6 - background-color: $color-blue-default - +z-index(highlight) - -.featured__link-wrapper - color: inherit - text-decoration: none - position: absolute - top: 0 - left: 0 - width: 100% - height: 100% - +z-index(highlight+2) - -.featured__link-wrapper--outer - +z-index(highlight+1) - -.featured__text - position: relative - margin: 0 0 20px 0 - padding: 0 - text-align: center - letter-spacing: 2px - color: #fff - font-size: $font-size-h2 - +breakpoint(mobile) - font-size: $font-size-h1 - margin: 0 - text-align: left - -.featured__logo - margin: 0 0 10px 0 - +breakpoint(mobile) - margin: 0 20px 0 0 - -.featured__title-wrapper - margin: 0 - padding: 0 - +breakpoint(mobile) - margin: 0 0 20px 0 - padding: 0 20px - display: flex - align-items: center - justify-content: center - -.featured__text-small - font-size: $font-size-xsmall - text-transform: none - word-wrap: break-word - -.featured__text--double - margin: 0 0 30px 0 - text-transform: none - +breakpoint(mobile) - margin-bottom: 20px - h1 - margin: 0 - -.featured__text-upper - text-transform: uppercase - -.featured__stats - display: inline-block - margin-bottom: 10px - text-align: left - vertical-align: middle - background-color: #fff - padding: 0 15px - +border-radius(3px) - color: $color-base - a - color: $color-base - display: inline-block - vertical-align: middle - +breakpoint(mobile) - margin: 0 10px - .stats__column - display: inline-block - vertical-align: middle - padding: 15px - min-width: 0 - .stats__wrapper - margin-bottom: 4px - &:last-child - margin-bottom: 0 - .stats__icon, - .stats__text - display: inline-block - vertical-align: middle - .stats__icon - margin-right: 4px - +icon-size(20px) - .stats__row - .stats__column - padding-top: 0 - &:first-child - .stats__column - padding-top: 15px - .stats__text a - text-decoration: underline - -.featured__action - display: inline-block - vertical-align: middle - -.featured__form-button - position: relative - display: inline-block - margin: 10px - +z-index(max) - +hidden-print - -// Style social media links for user -.featured__container - margin-bottom: 20px - -.featured__icon - margin-bottom: 15px - .icon - color: #fff - font-size: 50px - -.featured__navy-blue-wrapper - margin: 45px 0 - -// Modifiers -// -------------------------------------------------- -.featured__stats - .stats__wrapper--centered - text-align: center - .stats__column--border - border-right: 1px solid $color-grey-light - +breakpoint(desktop) - .stats__column--wide - min-width: 165px - .stats__column--icons - padding-left: 30px - .stats__column--border - padding-right: 30px - -.featured--navy-blue - max-width: 1200px - justify-content: center - -.featured__text--centered - text-align: center - -// Dependiencies -// -------------------------------------------------- -.featured__menu-wrapper - .button--default - +breakpoint(sm-mobile, mobile) - display: block - margin: 0 auto - .circle-menu - position: fixed - right: 40px - bottom: 40px - +breakpoint(mobile) - position: absolute - bottom: -40px - width: 80px - height: 80px - border-radius: 50% - background-color: $color-grey-bg - +breakpoint(lg-desktop) - right: 0 - .circle-menu__button - +centered \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/components/_fieldset.sass b/web/themes/joinup/prototype/sass/components/_fieldset.sass deleted file mode 100644 index 61a431dd16..0000000000 --- a/web/themes/joinup/prototype/sass/components/_fieldset.sass +++ /dev/null @@ -1,150 +0,0 @@ -// Fieldset - - -// Component -// -------------------------------------------------- -.fieldset - margin-bottom: 25px - &:last-of-type - margin-bottom: 0 - -// Elements -// -------------------------------------------------- -.fieldset__header - margin-top: 0 - margin-bottom: 10px - h3 - margin-top: 0 - margin-bottom: 0 - -.fieldset__field - margin-bottom: $field-margin - &:last-of-type - margin-bottom: 0 - -.fieldset__field-label - font-weight: $font-weight-medium - margin-top: 0 - -.fieldset__field-item - word-wrap: break-word - -.fieldset__title - margin-top: 0 - -.fieldset - p:last-child - margin-bottom: 0 - -.fieldset__show-more-link - display: block - margin-top: $field-margin - .icon--arrow-down - transition: transform 300ms - &.is-expanded - .icon--arrow-down - transform: rotateZ(-180deg) - -.fieldset__extra-items - html.js & - display: none - -.fieldset__read-more - display: inline - -.fieldset__table-wrapper - overflow-x: auto - -.fieldset--abstract-wrapper - margin-bottom: 16px - > p - display: inline - -// Modifiers -// -------------------------------------------------- -.fieldset--separated - margin-top: 40px - -.fieldset--box - margin: $form-margin -20px - padding: 20px - background: $color-grey-lighter - +breakpoint(tablet) - margin-right: -30px - margin-left: -30px - padding: 40px 30px - +breakpoint(desktop) - margin-right: -60px - margin-left: -60px - padding: 40px 60px - &:last-child - margin-bottom: -20px - +breakpoint(tablet) - margin-bottom: -40px - -.fieldset__field--multiple - .fieldset__field-item - margin-bottom: $field-margin - &:last-of-type - margin-bottom: 0 - -.fieldset--border-bottom - position: relative - margin-bottom: 25px - padding-bottom: 25px - margin-right: -20px - margin-left: -20px - padding-right: 20px - padding-left: 20px - border-bottom: 2px solid $color-grey-light - +breakpoint(sm) - margin-right: -30px - margin-left: -30px - padding-right: 30px - padding-left: 30px - +breakpoint(md) - margin-right: -60px - margin-left: -60px - padding-right: 60px - padding-left: 60px - -.fieldset--textarea - overflow: hidden - img - margin-bottom: 16px - img.align-left - float: none - +breakpoint(xs) - float: left - margin-right: 20px - img.align-right - float: none - +breakpoint(xs) - float: right - margin-left: 20px - table - +breakpoint(md) - table-layout: fixed - td - vertical-align: top - min-width: 100px - -.fieldset__field--files - .icon, - .fieldset__file-wrapper - display: inline-block - .file, - .fieldset__file-size - display: block - .fieldset__field-item - margin-bottom: $tile-margin - &:last-child - margin: 0 - .icon - margin-right: $tile-margin - -// Dependiencies -// -------------------------------------------------- - -// States -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_filters.sass b/web/themes/joinup/prototype/sass/components/_filters.sass deleted file mode 100644 index 678c351a75..0000000000 --- a/web/themes/joinup/prototype/sass/components/_filters.sass +++ /dev/null @@ -1,114 +0,0 @@ -// Filters -// -// Filters used in the collection/solution listings. -// -// Markup: html/filters.html -// -// Styleguide 2.6 - -// Component -// -------------------------------------------------- -.filter - margin-bottom: 15px - padding-left: 0 - position: relative - &:before - display: none - +breakpoint(mobile) - display: inline-block - margin-right: 10px - vertical-align: top - -.filters - padding-left: 0 - +breakpoint(sm-mobile, mobile) - text-align: left - -// Elements -// -------------------------------------------------- -.filter__label, -.filter__term, -.filter__icon - display: inline-block - vertical-align: middle - -.filter__term a - text-decoration: none - -.filter__icon - position: relative - cursor: pointer - top: 1px - margin-left: 4px - color: $color-base - +icon-size(12px) - -.filter__dropdown-toggle - font-size: 14px - position: relative - border: none - outline: none - background: none - .filter__label - color: $color-orange - -.filter__dropdown - display: none - margin-top: 15px - padding: 30px - background-color: #fff - .filters - margin-bottom: 0 - -.filter__menu - min-width: 200px - -.filters--more - .facet-item - margin-bottom: 0 - width: 100% - -// Modifiers -// -------------------------------------------------- -.filters--solutions - margin-top: 30px - margin-bottom: 10px - -.filters--horizontal - position: relative - .facet-item - &:before - content: none - .mdl-menu__container - margin-top: 10px - - -// Dependencies -// -------------------------------------------------- -.listing__header - .filter - font-size: $font-size-base - display: inline - margin-bottom: 0 - -// States -// -------------------------------------------------- -.filter__dropdown-toggle - &.is-active - &:before - bottom: -30px - display: block - width: 0 - height: 0 - content: '' - border-right: 12px solid transparent - border-bottom: 12px solid #fff - border-left: 12px solid transparent - +centered($horizontal: true, $vertical: false) - -.filter__dropdown - &.is-active - display: block - -.filters--more - margin-top: 0 diff --git a/web/themes/joinup/prototype/sass/components/_footer-ec-menu.sass b/web/themes/joinup/prototype/sass/components/_footer-ec-menu.sass deleted file mode 100644 index b29b166316..0000000000 --- a/web/themes/joinup/prototype/sass/components/_footer-ec-menu.sass +++ /dev/null @@ -1,39 +0,0 @@ -// Footer EC menu -// -// Markup: html/footer-ec-menu.html -// -// European Commission menu placed in the footer second -// -// Styleguide 2.14.2 - -// Component -// -------------------------------------------------- -.ec-menu - margin-top: 0 - margin-bottom: 0 - padding-left: 0 - list-style-type: none - +flex - +flex-direction(row) - +flex-wrap(wrap) - +justify-content(flex-start) - +align-items(center) - -// Elements -// -------------------------------------------------- -.ec-menu__item - margin-right: 20px - margin-bottom: 5px - -.ec-menu__link - text-decoration: underline - color: #fff - -// Modifiers -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.ec-menu__link - &:hover - text-decoration: none diff --git a/web/themes/joinup/prototype/sass/components/_footer-social-media.sass b/web/themes/joinup/prototype/sass/components/_footer-social-media.sass deleted file mode 100644 index 448184c265..0000000000 --- a/web/themes/joinup/prototype/sass/components/_footer-social-media.sass +++ /dev/null @@ -1,71 +0,0 @@ -// Footer social media -// -// Markup: html/footer-social-media.html -// -// Joinup social media menu with icons placed in the footer first -// -// Styleguide 2.14.1 - -// Component -// -------------------------------------------------- -.social-media - display: flex - -// Elements -// -------------------------------------------------- -.social-media__label - font-weight: $font-weight-bold - margin-top: 0 - margin-bottom: 0 - color: #fff - white-space: nowrap - margin-right: 10px - -.social-media__menu - margin-top: 2px - margin-bottom: 0 - padding-left: 0 - list-style-type: none - +inline-flex - +flex-direction(row) - +flex-wrap(wrap) - +justify-content(flex-start) - +align-items(center) - -.social-media__item - margin-right: 10px - margin-bottom: 10px - &:last-child - margin-right: 0 - -.social-media__link - text-decoration: none - +flex - +flex-direction(row) - +flex-wrap(nowrap) - +justify-content(flex-start) - +align-items(center) - -// Modifiers -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- -.social-media__link - span:first-child - margin-right: 10px - &:last-child - margin-right: 0 - .icon, - .text - color: #fff - .text - text-decoration: underline - -// States -// -------------------------------------------------- -.social-media__link - &:hover - .text - text-decoration: none - diff --git a/web/themes/joinup/prototype/sass/components/_form-table.sass b/web/themes/joinup/prototype/sass/components/_form-table.sass deleted file mode 100644 index e5ec8a47fa..0000000000 --- a/web/themes/joinup/prototype/sass/components/_form-table.sass +++ /dev/null @@ -1,113 +0,0 @@ -// Component -// -------------------------------------------------- -// .form-table - -// Elements -// -------------------------------------------------- -.form-table__row - width: auto - -.form-table__button - margin-top: 15px - margin-left: 25px - -.form-table__cell - position: relative - display: table-cell - width: auto - margin: 0 - padding: 25px 15px - -.form-table__header - margin: 0 - padding: 20px 10px - -.form-table__label - font-weight: normal - color: $color-grey-input - -.form-table_link-icon - +icon-size(40px) - -.form-table__link-content - width: 100% - padding-left: 0 - -// Modifiers -// -------------------------------------------------- -.form-table__cell--icon-container - width: 40px - padding: 0 - -.form-table--formatter-table - margin-bottom: $table-margin - -// Dependencies -// -------------------------------------------------- -.form-table - .form-table__row - .dropbutton-multiple - min-height: auto - margin: 0 - padding: 0 - .dropbutton - display: flex - .dropbutton-widget - position: static - .dropbutton-toggle - display: none - .dropbutton-action - position: static - display: block - margin-right: 10px - &:last-child - margin-right: 0 - &.draggable - .form-table__cell - .tabledrag-handle, - .tabledrag-changed, - .form-managed-file, - .menu-item__link - display: table-cell - vertical-align: middle - .form-managed-file - width: 100% - .checkbox - margin: 0 - .tabledrag-handle - height: auto - margin: 0 10px 0 0 - .handle - width: 20px - height: 20px - margin: 0 - padding: 0 - background-position: 50% 50% - .tabledrag-changed - padding-left: 5px - &.tabledrag-root - a.tabledrag-handle - .handle - background-image: url('../images/up-down.svg') - .indentation - height: 24px - margin: 0 - padding: 0 - -.table-operations - .form-table - margin-bottom: 25px - .form-table__cell - padding-top: 25px - padding-bottom: 25px - -.adms-validator-form - .form-table - display: block - overflow-x: auto - margin-top: $form-margin - -// Fix margin if there is more than one text field in a table cell. -.form-table__cell - .mdl-textfield + .mdl-textfield - margin-top: $table-margin diff --git a/web/themes/joinup/prototype/sass/components/_form.sass b/web/themes/joinup/prototype/sass/components/_form.sass deleted file mode 100644 index 7923a32d0b..0000000000 --- a/web/themes/joinup/prototype/sass/components/_form.sass +++ /dev/null @@ -1,279 +0,0 @@ -// Component -// -------------------------------------------------- -// .form - -// Elements -// -------------------------------------------------- -.form__actions - margin-top: 25px - margin-right: 10px - margin-bottom: 0 !important - -.form__label - font-size: 16px - font-weight: 600 - color: $color-blue-dark - margin-bottom: 15px - -.form__label - font-size: 16px - font-weight: 600 - color: $color-blue-dark - margin-bottom: 15px - -.form__text - font-size: 16px - -.form__legend - margin-bottom: 15px - .form__label - margin-bottom: 0 - -.form__field-container - margin-bottom: 25px - -.form__cell - margin: 0 - +breakpoint(tablet) - margin: 8px - -.form__actions_inner - +inline-flex - +flex-wrap(wrap) - .button - @extend .button-inline - -.form-item-persistent-login - margin-bottom: 20px - -.form-select - background-color: #fff - border: 1px #a0a1a2 solid - font-size: 16px - height: 35px - max-width: 100% - - &[multiple="multiple"] - height: auto - min-height: 200px - padding: 5px - - option - padding: 2px 5px - -.form-type-date - display: inline-block - - input[type="date"], - input[type="time"] - border: none - border-bottom: 1px #a0a1a2 solid - font: inherit - font-size: 16px - - .form__label - margin-bottom: 0 - -.form__content - @extend .white-box - -.form__description - font-size: $font-size-xsmall - font-weight: $font-weight-thin - display: block - margin-top: 6px - color: lighten($color-grey-medium, 10%) - ul - margin-top: 0 - margin-bottom: 0 - padding-left: 30px - li - font-size: $font-size-xsmall - font-weight: $font-weight-thin - color: lighten($color-grey-medium, 10%) - -.form-wrapper - margin-bottom: $form-margin - &.form__actions-wrapper - margin-bottom: 0 - -// Asterisk is added for all required fields except collection and solution forms. -.form__with-asterisk - label.form-required - position: relative - &:before - position: absolute - right: -15px - content: '*' - color: $color-error - -.form__with-asterisk .mdl-checkbox__label label.form-required - &:before - display: none - &:after - display: inline-block - content: "*" - color: #eb5b5c - margin: 0 0 0 5px - -.form__exposed-form - select, .form-item - width: 100% - .form__actions input - margin: 0 - -.form__margin-top - margin-top: $form-margin - -// Styling for members overview -.form__member-actions - .form-wrapper - .form-item, - .form-actions - display: inline-block - vertical-align: bottom - width: 100% - +breakpoint(lg-desktop) - .form-item - width: 60% - .form-actions - width: 35% - margin-left: $form-margin - margin-top: 0 - input - margin: 0 - -.form__add-more-wrapper - margin-top: $table-margin - .form-item, - .button - display: inline-block - vertical-align: bottom - .form-item - margin-right: 20px - select - min-width: 200px - height: 50px - -// Modifiers -// -------------------------------------------------- -.form__description--checkbox - margin-left: 25px - -// Dependencies -// -------------------------------------------------- -.form__actions - .dropbutton-wrapper - float: none - width: auto - .dropbutton-multiple - @extend .button-inline - &.open - .dropbutton-arrow - top: 40% - .dropbutton-widget - padding-right: 0 - .dropbutton-action - .button - margin: 0 - &.secondary-action - position: absolute - white-space: nowrap - .button - margin-top: 5px - .dropbutton-widget - .dropbutton - overflow: visible - .dropbutton-toggle - .dropbutton-arrow - color: #fff - -.form__actions--no-margin - margin: 0 - .button - margin: 0 - .form__actions_inner - width: 100% - -.form-wrapper - .form__label - &.mdl-checkbox__label - margin-bottom: 0 - -// Elements with validation errors -.form-item - input.error, - textarea.error, - select.error, - textarea.error + .cke - border-width: 1px - border-color: $color-error - -// My subscriptions form -.form__subscribe-types - margin-bottom: 0 - .form-item - flex: 1 100% - margin-bottom: $tile-margin - select - width: 100% - .form__subscribe-save - flex: 1 100% - max-width: 100% - +breakpoint(mobile) - .form-item - flex: 1 50% - +breakpoint(desktop) - .form__subscribe-save - flex: 1 100% - +breakpoint(lg-desktop) - .form-item - flex: 0 1 auto - margin-bottom: 0 - margin-right: $tile-margin - .form__subscribe-save - flex: 0 1 auto - margin-left: auto - -.form__subscribe-types-inner - display: flex - flex-flow: row wrap - align-items: center - .form__label - font-size: 14px - font-weight: normal - -.form__subscribe-frequency - .form-item - margin-bottom: $field-margin - +breakpoint(lg-desktop) - display: flex - align-items: flex-end - .form-item - flex: 1 72% - max-width: 72% - margin-bottom: 0 - .form__subscribe-save - flex: 1 28% - max-width: 28% - text-align: right - -.form__subscribe-actions - text-align: right - margin-right: 0 - .button - margin-right: 0 - -// Add red asterisk in a cas form. -.cas-account-link-form.form__with-asterisk - .mdl-textfield - label - position: relative - &:before - position: absolute - right: -15px - content: '*' - color: $color-error - -// States -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_header-menu.sass b/web/themes/joinup/prototype/sass/components/_header-menu.sass deleted file mode 100644 index 01d0b61bd8..0000000000 --- a/web/themes/joinup/prototype/sass/components/_header-menu.sass +++ /dev/null @@ -1,57 +0,0 @@ -// Header menu -// -// Markup: html/header-menu.html -// -// Menu placed in the header with active Collection item -// -// Styleguide 2.7.2 - -// Component -// -------------------------------------------------- -.header-menu - display: none - +breakpoint(tablet) - +flex - -// Elements -// -------------------------------------------------- -.header-menu__link - line-height: 60px !important - position: relative - display: block - width: 170px - padding: 0 !important - text-align: center - text-decoration: none - text-transform: uppercase - border-top: 2px solid transparent - border-bottom: 2px solid transparent - -.header-menu__wrapper - text-align: center - -.header-menu__icon - display: inline-block - vertical-align: middle - margin-right: 8px - +icon-size(30px) - -.header-menu__text - font-weight: $font-weight-medium - display: inline-block - text-align: left - vertical-align: middle - -// Modifiers -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.header-menu__link.active-trail, .header-menu__link.is-active - color: $color-blue-default - background: #fff - border-top: 2px solid $color-orange - opacity: 1 diff --git a/web/themes/joinup/prototype/sass/components/_icon-card.sass b/web/themes/joinup/prototype/sass/components/_icon-card.sass deleted file mode 100644 index 08ecb85a74..0000000000 --- a/web/themes/joinup/prototype/sass/components/_icon-card.sass +++ /dev/null @@ -1,47 +0,0 @@ -// Icon card -// -// Content inside is centered vertically and horizontally. -// -// Markup: html/icon-card.html -// -// Styleguide 2.17 - -// Component -// -------------------------------------------------- -.icon-card - position: relative - min-height: 230px - -// Elements -// -------------------------------------------------- -.icon-card__link - position: absolute - top: 0 - left: 0 - width: 100% - height: 100% - text-decoration: none - color: $color-base - text-transform: uppercase - -.icon-card__inner - text-align: center - display: block - +centered - width: 100% - -.icon-card__icon - +icon-size(150px) - -.icon-card__text - margin-top: 20px - display: block - -// Modifiers -// -------------------------------------------------- -.icon-card--grey - background-color: $color-grey-lighter - min-height: 140px - .icon-card__icon - color: $color-grey-medium - +icon-size(50px) \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/components/_icon.sass b/web/themes/joinup/prototype/sass/components/_icon.sass deleted file mode 100644 index 29a1d283e5..0000000000 --- a/web/themes/joinup/prototype/sass/components/_icon.sass +++ /dev/null @@ -1,309 +0,0 @@ -// Icon -// -// Icons used across Joinup platform. -// -// Markup: html/icon.html -// -// .icon--asset_distribution - Asset distribution icon -// .icon--asset_release - Asset release icon -// .icon--business-case - Business case icon -// .icon--collections - Collection icon -// .icon--custom_page - Custom page icon -// .icon--discussion - Discussion icon -// .icon--document - Document icon -// .icon--events - Event icon -// .icon--content - Generic content icon -// .icon--licence - Licence icon -// .icon--news - News icon -// .icon--newsletter - Newsletter icon -// .icon--solutions - Solution icon -// .icon--video - Video icon -// .icon--followers - Followers icon -// .icon--user - User icon -// .icon--like - Like icon -// .icon--plus - Plus icon -// .icon--download - Download icon -// .icon--error - Error icon used in the alert component -// .icon--warning - Warning icon used in the alert component -// .icon--info - Info icon used in the alert component -// .icon--success - Success icon used in the alert component -// .icon--close - Close icon used in the alert component -// .icon--draggable - Draggable icon used in the form component -// .icon--search - Search icon -// .icon--menu - Menu icon -// .icon--arrow-down - Arrow down icon used in the filter component -// .icon--share - Share icon -// .icon--shared - Shared icon -// .icon--load - Load icon used in the load more tile component -// .icon--location - Location icon -// .icon--out - Out icon used for external link -// .icon--pin - Pin icon -// .icon--anchor - Anchor icon -// .icon--facebook - Facebook icon -// .icon--googleplus - Google+ icon -// .icon--twitter - Twitter icon -// .icon--linkedin - LinkedIn icon -// .icon--youtube - YouTube icon -// .icon--slideshare - SlideShare icon -// .icon--vimeo - Vimeo icon -// .icon--github - GitHub icon -// .icon--star - Star icon used to mark featured tile -// .icon--help - Question mark icon used in a tour button -// -// Styleguide 2.8 - -$waat-icons-font-path: '../fonts/waat-icons/waat-icons' - -// Component -// -------------------------------------------------- -@font-face - font-family: 'WAAT Icons' - src: url("#{$waat-icons-font-path}.eot") - src: url("#{$waat-icons-font-path}.eot?#iefix") format("embedded-opentype"), url("#{$waat-icons-font-path}.woff") format("woff"), url("#{$waat-icons-font-path}.ttf") format("truetype"), url("#{$waat-icons-font-path}.svg#icomoon") format("svg") - -.icon - font-family: 'WAAT Icons' - speak: none - font-style: normal - font-weight: normal - font-variant: normal - text-transform: none - display: inline-block - line-height: 100% - -webkit-font-smoothing: antialiased - -moz-osx-font-smoothing: grayscale - -// Modifiers -// -------------------------------------------------- -.icon--discussion:before, -.icon--discussions:before - content: '\e8bd' - -.icon--event:before, -.icon--events:before - content: '\e8c0' - -.icon--asset_release:before - content: '\e8bf' - -.icon--news:before - content: '\e8be' - -.icon--document:before, -.icon--documents:before - content: '\e8c2' - -.icon--custom_page:before - content: '\e8c1' - -.icon--solution:before, -.icon--solutions:before - content: '\e8c4' - color: $color-orange - -.icon--collection:before, -.icon--collections:before - content: '\e8c3' - color: $color-green-new - -.icon--distribution:before, -.icon--distributions:before, -.icon--asset_distribution:before - content: '\e8bc' - -.icon--business-case:before - content: '\e7c6' - -.icon--content:before, -.icon--keep-up-to-date:before - content: '\e8c8' - -.icon--licence:before - content: '\e8ca' - -.icon--newsletter:before - content: '\e8c9' - -.icon--video:before - content: '\e8cb' - -.icon--followers:before - content: '\e74b' - -// Statuses -// -------------------------------------------------- -.icon--success:before - content: '\e618' - -.icon--error:before - content: '\e663' - -.icon--warning:before - content: '\e65c' - -.icon--info:before - content: '\e891' - -// Social media -// -------------------------------------------------- -.icon--facebook:before - content: '\e61f' - -.icon--gplus:before, -.icon--googleplus:before - content: '\e88e' - -.icon--twitter:before - content: '\e61e' - -.icon--linkedin:before - content: '\e623' - -.icon--youtube:before - content: '\e8d5' - -.icon--slideshare:before - content: '\e8d3' - -.icon--vimeo:before - content: '\e8d4' - -.icon--github:before - content: '\e8d6' - -.icon--star:before - content: '\e61d' - -// File mime icons: -// -------------------------------------------------- -.icon--mime-default:before - content: '\e645' - -.icon--mime-doc:before, -.icon--mime-docx:before - content: '\e63f' - -.icon--mime-exe:before - content: '\e644' - -.icon--mime-gif:before - content: '\e886' - -.icon--mime-jpg:before - content: '\e642' - -.icon--mime-pdf:before - content: '\e641' - -.icon--mime-png:before - content: '\e643' - -.icon--mime-ppt:before - content: '\e887' - -.icon--mime-rar:before - content: '\e63e' - -.icon--mime-xls:before, -.icon--mime-xlsx:before - content: '\e640' - -.icon--mime-zip:before - content: '\e63d' - -// Navigation -// -------------------------------------------------- -.icon--arrow-down:before - content: '\e60f' - -.icon--arrow-up:before - content: '\e611' - -.icon--first:before - content: '\e89a' - -.icon--previous:before - content: '\e612' - -.icon--next:before - content: '\e610' - -.icon--last:before - content: '\e89b' - -// Other -// -------------------------------------------------- -.icon--user:before - content: '\e746' - -.icon--like:before - content: '\e758' - -.icon--plus:before - content: '\e668' - -.icon--download:before - content: '\e7b9' - -.icon--check:before - content: '\e877' - -.icon--check-2:before - content: '\e62a' - -.icon--close:before - content: '\e65a' - -.icon--draggable:before - content: '\e854' - -.icon--search:before - content: '\e653' - -.icon--menu:before - content: '\e89f' - -.icon--share:before - content: '\e66d' - -.icon--shared:before - content: '\e8d1' - -.icon--load:before - content: '\e862' - -.icon--location:before - content: '\e678' - -.icon--out:before - content: '\e860' - -.icon--remove:before - content: '\e657' - -.icon--edit:before - content: '\e6a3' - -.icon--cancel:before - content: '\e66a' - -.icon--pin:before - content: '\e679' - -.icon--external:before - content: '\e7a9' - -.icon--play:before - content: '\e799' - -.icon--anchor:before - content: '\e62b' - -.icon--dots:before - content: '\e8ab' - -.icon--help:before - content: '\e60e' - -.icon--footer-newsletter:before - content: '\e628' diff --git a/web/themes/joinup/prototype/sass/components/_icons-bar.sass b/web/themes/joinup/prototype/sass/components/_icons-bar.sass deleted file mode 100644 index 64a201917c..0000000000 --- a/web/themes/joinup/prototype/sass/components/_icons-bar.sass +++ /dev/null @@ -1,29 +0,0 @@ -// Content -// -// Content section - -// Component -// -------------------------------------------------- -.icons-bar - width: 100% - text-align: right - -// Elements -// -------------------------------------------------- -.icons-bar__item - display: inline-block - padding-right: 25px - color: $color-blue-dark - font-size: 12px - font-weight: 600 - -// Modifiers -// -------------------------------------------------- -.icons-bar__item--solutions - background: url('../images/solutions-tile-icon.png') right center no-repeat - -.tile__icons-item--members - background: url('../images/members-tile-icon.png') right center no-repeat - -.tile__icons-item--like - background: url('../images/like-tile-icon.png') right center no-repeat diff --git a/web/themes/joinup/prototype/sass/components/_image-caption.sass b/web/themes/joinup/prototype/sass/components/_image-caption.sass deleted file mode 100644 index 3b850a970f..0000000000 --- a/web/themes/joinup/prototype/sass/components/_image-caption.sass +++ /dev/null @@ -1,27 +0,0 @@ -// Image caption - -// Component -// -------------------------------------------------- -.image-caption - &.align-right - margin-left: 0 - margin-right: 0 - float: none - +breakpoint(xs) - float: right - margin-left: 20px - &.align-left - margin-left: 0 - margin-right: 0 - float: none - +breakpoint(xs) - float: left - margin-right: 20px - &.wysiwyg-one-third-width - max-width: 306px - &.wysiwyg-half-width - max-width: 460px - figcaption - font-size: $font-size-xsmall - img - margin-bottom: $field-margin \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/components/_inline-social-media.sass b/web/themes/joinup/prototype/sass/components/_inline-social-media.sass deleted file mode 100644 index 57c05bc26b..0000000000 --- a/web/themes/joinup/prototype/sass/components/_inline-social-media.sass +++ /dev/null @@ -1,34 +0,0 @@ -// Inline social media -// -// Markup: html/inline-social-media.html -// -// Styleguide 2.16 - -// Component -// -------------------------------------------------- -.inline-social-media - margin: 0 - padding: 0 - line-height: normal - height: 16px - -// Elements -// -------------------------------------------------- -.inline-social-media__item - margin: 0 5px - display: inline-block - &:first-child - margin-left: 0 - &:last-child - margin-right: 0 - -.inline-social-media__link - display: block - height: 16px - .icon - +icon-size(16px) - color: #fff - -// Modifiers -// -------------------------------------------------- - diff --git a/web/themes/joinup/prototype/sass/components/_invite-form.sass b/web/themes/joinup/prototype/sass/components/_invite-form.sass deleted file mode 100644 index 48c47aaff3..0000000000 --- a/web/themes/joinup/prototype/sass/components/_invite-form.sass +++ /dev/null @@ -1,10 +0,0 @@ -// Invite form -// -// @todo this needs to be redone. - -.invite-form__add - html.js & - display: none - -.invite-form__list - margin-top: 25px diff --git a/web/themes/joinup/prototype/sass/components/_licence.sass b/web/themes/joinup/prototype/sass/components/_licence.sass deleted file mode 100644 index e5b9bdcacf..0000000000 --- a/web/themes/joinup/prototype/sass/components/_licence.sass +++ /dev/null @@ -1,290 +0,0 @@ -// Licence -// - -// Component -// -------------------------------------------------- - -// Elements -// -------------------------------------------------- -.licence-filter__header - height: 45px - color: #fff - text-align: center - span - font-weight: $font-weight-medium - vertical-align: middle - line-height: 45px - -.licence-filter__label - color: $color-blue-dark - font-weight: bold - margin: 0 0 10px - -.licence-filter__content - margin: 7px 0 - -.licence__card - height: 100% - -.licence-filter__list - padding: 0 - margin: 0 - list-style: none - .licence-filter__item - font-size: $font-size-small - &:last-child - margin-bottom: 0 - a - display: block - padding: 7px 14px - text-decoration: none - &:hover - text-decoration: underline - &.is-active - padding: 7px 14px 6px - background: $color-grey-input - border-bottom: 1px solid #fff - color: #fff - -.licence-tile - display: block - -.licence-tile__title - div - display: inline - .icon - margin-left: 0 - margin-right: 5px - float: left - +breakpoint(mobile) - margin-left: -21px - -.licence-tile__line - font-size: $font-size-xsmall - display: flex - -.licence-tile__label - color: #fff - padding: 5px 10px - margin-right: 10px - -.licence-tile__label-wrapper - min-width: 100px - text-align: right - -.licence-tile__button - display: inline-block - text-decoration: none - padding: 10px 30px - border: 2px solid $color-blue-warm - font-size: $font-size-small - border-radius: 5px - background: $color-blue-warm - color: #fff - &:hover - color: $color-base - background: transparent - -.licence-tile__button--disabled - background: transparent - color: $color-base - border-color: $color-orange-warm - pointer-events: none - -.licence-tile__actions - +z-index(highlight+1) - +breakpoint(lg-desktop) - position: absolute - right: 20px - bottom: 20px - -.licence-tile__actions-item - display: inline-block - margin-right: $field-margin - margin-bottom: $field-margin - &:last-child - margin-right: 0 - margin-bottom: 0 - +breakpoint(lg-desktop) - margin-bottom: 0 - -.licence-counter - font-weight: bold - margin: 10px 0 - +breakpoint(desktop) - margin: 0 0 10px - -.licence-search__label - color: $color-blue-dark - font-weight: bold - display: inline-block - vertical-align: middle - -.licence-search__input - display: inline-block - vertical-align: middle - +breakpoint(mobile) - margin: 0 10px 5px 10px - -.licence-search__form - .licence-search__reset - margin: 10px 0 - +breakpoint(desktop) - margin: 0 - display: flex - justify-content: space-between - align-items: center - -// Modifiers -// -------------------------------------------------- -.licence-filter--can - .licence-filter__header - background-color: $color-green-warm - .licence-filter__item - a - color: $color-green-warm - &.licence-comparer__sidebar-header - background-color: $color-green-warm - &.licence-comparer__sidebar-cell - color: $color-green-warm - -.licence-filter--must - .licence-filter__header - background-color: $color-beige-warm - .licence-filter__item - a - color: $color-beige-warm - &.licence-comparer__sidebar-header - background-color: $color-beige-warm - &.licence-comparer__sidebar-cell - color: $color-beige-warm - -.licence-filter--cannot - .licence-filter__header - background-color: $color-red-warm - .licence-filter__item - a - color: $color-red-warm - &.licence-comparer__sidebar-header - background-color: $color-red-warm - &.licence-comparer__sidebar-cell - color: $color-red-warm - -.licence-filter--compatible - .licence-filter__header - background-color: $color-blue-warm - .licence-filter__item - a - color: $color-blue-warm - &.licence-comparer__sidebar-header - background-color: $color-blue-warm - &.licence-comparer__sidebar-cell - color: $color-blue-warm - -.licence-filter--law - .licence-filter__header - background-color: $color-grey-warm - .licence-filter__item - a - color: $color-grey-warm - &.licence-comparer__sidebar-header - background-color: $color-grey-warm - &.licence-comparer__sidebar-cell - color: $color-grey-warm - -.licence-filter--support - .licence-filter__header - background-color: $color-orange-warm - .licence-filter__item - a - color: $color-orange-warm - &.licence-comparer__sidebar-header - background-color: $color-orange-warm - &.licence-comparer__sidebar-cell - color: $color-orange-warm - -.licence-tile__line--can - .licence-tile__label - background-color: $color-green-warm - .licence-tile__value - color: $color-green-warm - -.licence-tile__line--must - .licence-tile__label - background-color: $color-beige-warm - .licence-tile__value - color: $color-beige-warm - -.licence-tile__line--cannot - .licence-tile__label - background-color: $color-red-warm - .licence-tile__value - color: $color-red-warm - -.licence-tile__line--compatible - .licence-tile__label - background-color: $color-blue-warm - .licence-tile__value - color: $color-blue-warm - -.licence-tile__line--law - .licence-tile__label - background-color: $color-grey-warm - .licence-tile__value - color: $color-grey-warm - -.licence-tile__line--support - .licence-tile__label - background-color: $color-orange-warm - .licence-tile__value - color: $color-orange-warm - -.licence-comparer - border-spacing: 0 - width: 100% - +breakpoint(tablet) - table-layout: fixed - td - padding: 5px - .icon - font-size: $font-size-xsmall - color: #fff - background: $color-orange - border-radius: 50% - padding: 5px - &__wrapper - overflow-x: auto - &__cell, &__header - background: #fff - padding: 5px - border: 5px solid $color-grey-bg - text-align: center - &:nth-child(2) - border-left-width: 10px - &__header - font-weight: $font-weight-bold - padding: 10px - &__sidebar-header - color: #fff - padding: 5px - height: 45px - text-align: center - font-weight: $font-weight-medium - font-size: $font-size-base - &__sidebar-cell - border: 5px solid #fff - background: #fff - &__empty-cell - background: $color-grey-filler - -// Dependiencies -// -------------------------------------------------- -.licence-tile - .listing__card - min-height: 0 - -// States -// -------------------------------------------------- -.licence-tile - &.is-hidden - display: none diff --git a/web/themes/joinup/prototype/sass/components/_listing.sass b/web/themes/joinup/prototype/sass/components/_listing.sass deleted file mode 100644 index 852926c492..0000000000 --- a/web/themes/joinup/prototype/sass/components/_listing.sass +++ /dev/null @@ -1,491 +0,0 @@ -// Listing -// -// Listing may contains various types of tiles presented below. -// Size of the tile can be modified thanks to mdl-cell--X-col class, where X specifies the column size for the cell. -// -// Styleguide 2.9 - -// Component -// -------------------------------------------------- -// .listing - -// Elements -// -------------------------------------------------- -.listing__item - position: relative - background: #fff - display: flex - align-items: stretch - -.listing__card - display: flex - align-items: stretch - -.listing__image - position: relative - overflow: hidden - height: 140px - margin: 10px 10px 0 - text-align: center - background: $color-grey-white - +z-index(highlight) - img - max-width: 100% - max-height: 140px - height: auto - width: auto - +centered - -.listing__metadata - word-wrap: break-word - +z-index(highlight+1) - -.listing__avatar - width: 60px - height: 60px - margin-top: -50px - padding: 5px - background-color: #fff - +border-radius(50%) - -.listing__metadata, -.listing__wrapper, -.listing__inner-tile - padding: 20px - -.listing__field - margin-bottom: $tile-margin - &.listing__tags - margin-bottom: 0 - -.listing__field--no-margin - margin-bottom: 0 - -.listing__title, -.listing__title a - font-size: 16px - font-weight: 600 - margin: 0 - text-decoration: none - color: $color-blue-dark - word-wrap: break-word - -.listing__motivation - margin-bottom: $tile-margin - color: $color-blue-dark - +breakpoint(lg-desktop) - margin-bottom: 0 - -.listing__subtitle - margin: 0 - -.listing__teaser - font-size: 14px - font-weight: $font-weight-thin - margin: 0 - color: $color-grey-medium - p - margin-bottom: 0 - -.listing__tags, .listing__tags a - font-size: $font-size-xsmall - -.listing__stats - position: absolute - right: 0 - bottom: 0 - left: 0 - width: 100% - padding: 0 20px - text-align: right - -.listing__stat - display: inline-block - vertical-align: middle - -.listing__icon, -.listing__text - display: inline-block - vertical-align: middle - -.listing__icon - color: lighten($color-grey-medium, 10%) - margin-left: 6px - +icon-size(16px) - -.listing__text - font-size: $font-size-xsmall - font-weight: $font-weight-medium - position: relative - right: -4px - color: $color-blue-default - -.listing__header - margin-top: 30px - margin-bottom: 30px - -.listing__corner - position: absolute - top: 7px - right: 7px - width: 30px - height: 30px - background-color: $color-orange - +z-index(highlight+1) - +border-radius(50%) - .icon - color: #fff - +icon-size(15px) - +centered - -.listing__action-link__wrapper - padding: 0 20px - a - position: relative - +z-index(highlight+1) - -.listing__link - position: absolute - top: 0 - right: 0 - bottom: 0 - left: 0 - +z-index(highlight) - & > a - display: block - width: 100% - height: 100% - -// Modifiers -// -------------------------------------------------- -.listing__image--default - background-color: $color-grey-lighter - .icon - color: $color-grey-medium - +icon-size(50px) - +centered - -.listing__card--inline-container - +breakpoint(mobile) - flex-direction: row - .listing__metadata - +breakpoint(mobile) - flex: 0 1 100% - align-self: center - .listing__image, - .listing__inner-tile - +breakpoint(mobile) - flex: 0 0 220px - height: auto - min-height: 100% - .listing__inner-tile - .listing__field - &:last-child - margin-bottom: 0 - .listing__inner-tile--wider - +breakpoint(mobile) - flex: 0 0 40% - padding-right: 0 - -ms-flex-preferred-size: calc(40% - 20px) - .listing__inner-tile--shifted - padding-bottom: 0 - .listing__field - display: inline-block - margin-bottom: 0 - &:first-child - margin-right: 15px - +breakpoint(mobile) - padding-left: 41px - flex: 0 0 100% - .listing__metadata--licence - .listing__teaser - max-height: none - a - overflow-wrap: break-word - word-wrap: break-word - word-break: break-all - +breakpoint(mobile) - flex: 0 0 60% - -ms-flex-preferred-size: calc(60% - 40px) - +breakpoint(lg-desktop) - padding-bottom: 70px - -.listing__card--stats-container - .listing__metadata - padding-bottom: 40px - -.listing__card--full-width - min-height: 140px !important - -.listing__fields--bottom-aligned - +breakpoint(mobile) - position: absolute - right: 20px - bottom: 20px - left: 20px - .listing__field:last-of-type - margin-bottom: 0 - -.listing__title--link a - color: $color-orange - -.listing__card--corner-title - .listing__title - margin-right: 20px - -.listing__subtitle:first-of-type - margin-top: $tile-margin-small - -// Set fixed height for fields. -.listing__card - +breakpoint(xs) - min-height: 285px - -.listing__text-container - +breakpoint(xs) - overflow: hidden - margin-bottom: $tile-margin - .listing__field:last-child - margin-bottom: 0 - -.listing__item--newsletter - .listing__title - color: #fff - -.listing__text-container--news, -.listing__text-container--document - +breakpoint(xs) - +calc-space(7, $row-height, $tile-margin, 1, $row-height-small, $tile-margin-small) - -.listing__text-container--licence, -.listing__text-container--newsletter, -.listing__text-container--discussion - +breakpoint(xs) - +calc-space(8, $row-height, $tile-margin) - -.listing__title - +number-rows(3, $row-height) - -.listing__card--collection, -.listing__card--solution, -.listing__card--custom-page - .listing__title - +number-rows(3, $row-height) - -.listing__card--event, -.listing__card--asset-distribution, -.listing__card--asset-release - .listing__title - +number-rows(3, $row-height) - -.listing__author, -.listing__tags, -.listing__date, -.listing__status, -.listing__single - +number-rows(1, $row-height) - -.listing__subtitle - +number-rows(1, $row-height-small, true) - -.listing__teaser - +number-rows(7, $row-height) - -.listing__card--user - .listing__teaser - +number-rows(1, $row-height) - -// Dependiencies -// -------------------------------------------------- -.listing__title - .icon - position: relative - top: 1px - margin-left: 6px - +icon-size(16px) - a - position: relative - +z-index(highlight+1) - -.listing__single - .label, - .value - font-size: $font-size-xsmall - vertical-align: middle - a - color: $color-base - position: relative - +z-index(highlight+1) - .value - display: inline - .label - width: 50px - margin-right: 10px - text-align: right - display: inline-block - -.listing__licence - .value - a - color: $color-orange - -// Modifiers -// -------------------------------------------------- -.listing__card - &.is-featured - background: $color-grey-light - -// Listing -// -// Tile: default (1/2 width) pinned -// -// Markup: html/listing-item--default-col-6.html -// -// Styleguide 2.9.1 - -// Component -// -------------------------------------------------- - -// Tile: default (full width) -// -// Markup: html/listing-item--default-col-12.html -// -// Styleguide 2.9.2 - -// Component -// -------------------------------------------------- - -// Tile: news (1/2 width) -// -// Markup: html/listing-item--news-col-6.html -// -// Styleguide 2.9.3 - -// Component -// -------------------------------------------------- - -// Tile: news (full width) -// -// Markup: html/listing-item--news-col-12.html -// -// Styleguide 2.9.4 - -// Component -// -------------------------------------------------- - -// Tile: event (1/2 width) -// -// Markup: html/listing-item--event-col-6.html -// -// Styleguide 2.9.5 - -// Component -// -------------------------------------------------- - -// Tile: event (full width) -// -// Markup: html/listing-item--event-col-12.html -// -// Styleguide 2.9.6 - -// Component -// -------------------------------------------------- - -// Tile: distribution (1/2 width) -// -// Markup: html/listing-item--distribution-col-6.html -// -// Styleguide 2.9.7 - -// Component -// -------------------------------------------------- - -// Tile: distribution (full width) -// -// Markup: html/listing-item--distribution-col-12.html -// -// Styleguide 2.9.8 - -// Component -// -------------------------------------------------- - -// Tile: documentation -// -// Markup: html/listing-item--documentation.html -// -// Styleguide 2.9.9 - -// Component -// -------------------------------------------------- - -// Tile: newsletter -// -// Markup: html/listing-item--newsletter.html -// -// Styleguide 2.9.10 - -// Component -// -------------------------------------------------- -.listing__item--newsletter - color: #fff - background-color: $color-blue-medium - h3 - margin-top: 0 - .mdl-card - background-color: $color-blue-medium - .mdl-textfield__input - border-bottom-color: #fff - .mdl-textfield__input, - .mdl-textfield__label - opacity: .5 - color: #fff - .mdl-textfield--floating-label.is-focused, - .mdl-textfield--floating-label.is-dirty - .mdl-textfield__input, - .mdl-textfield__label - opacity: 1 - color: #fff - .mdl-textfield__label:after - background-color: #fff !important - -// Listing -// -// Tile: load more -// -// Markup: html/listing-item--load-more.html -// -// Styleguide 2.9.11 - -// Component -// -------------------------------------------------- -.listing__item--load-more - position: relative - min-height: 200px - border: 5px solid #fff - background-color: $color-grey-bg - cursor: pointer - .load-more - text-decoration: none - .load-more__icon - margin-bottom: 10px - +icon-size(36px) - -// Listing -// -// Tile: video (1/2 width) -// -// Markup: html/listing-item--video-col-6.html -// -// Styleguide 2.9.12 - -// Component -// -------------------------------------------------- - -// Tile: video (full width) -// -// Markup: html/listing-item--video-col-12.html -// -// Styleguide 2.9.13 - -// Component -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_load-more.sass b/web/themes/joinup/prototype/sass/components/_load-more.sass deleted file mode 100644 index c83d897137..0000000000 --- a/web/themes/joinup/prototype/sass/components/_load-more.sass +++ /dev/null @@ -1,37 +0,0 @@ -// Component -// -------------------------------------------------- -.load-more - position: absolute - top: 0 - left: 0 - width: 100% - height: 100% - text-decoration: none - -// Elements -// -------------------------------------------------- -.load-more__wrapper - text-align: center - +centered - -.load-more__icon - color: darken($color-grey-light, 10%) - -.load-more__text - font-size: $font-size-base - font-weight: $font-weight-medium - color: $color-base - -// Modifiers -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- -.comment-item--load-more - .load-more__icon, - .load-more__text - display: inline-block - vertical-align: middle - .load-more__icon - margin-right: 10px - +icon-size(36px) diff --git a/web/themes/joinup/prototype/sass/components/_login-menu.sass b/web/themes/joinup/prototype/sass/components/_login-menu.sass deleted file mode 100644 index 3055491baa..0000000000 --- a/web/themes/joinup/prototype/sass/components/_login-menu.sass +++ /dev/null @@ -1,39 +0,0 @@ -// Login menu -// -// Login menu component - -// Component -// -------------------------------------------------- -.login-menu - display: inline-block - width: auto - -// Elements -// -------------------------------------------------- -.login-menu__button - float: right - clear: right - min-width: 0 - height: 60px - padding: 0 - img - border-radius: 20px - margin: 10px 0 - span - color: #fff - text-transform: none - vertical-align: middle - line-height: 40px - padding: 0 5px - &:hover - background: none - -.login-menu__link - text-decoration: none - color: $color-blue-default - white-space: nowrap !important - -// Modifiers -// -------------------------------------------------- -.login-menu__button--text - height: 40px diff --git a/web/themes/joinup/prototype/sass/components/_navigation-bottom.sass b/web/themes/joinup/prototype/sass/components/_navigation-bottom.sass deleted file mode 100644 index 541bd464b2..0000000000 --- a/web/themes/joinup/prototype/sass/components/_navigation-bottom.sass +++ /dev/null @@ -1,56 +0,0 @@ -// Navigation bottom -// -// Navigation bottom component - -// Component -// -------------------------------------------------- -.navigation-bottom - @extend .white-box - -// Elements -// -------------------------------------------------- -ul.navigation-bottom__list - margin: 0 - padding: 0 - a - color: $color-base - text-decoration: none - &:hover - text-decoration: underline - &.is-active - font-weight: $font-weight-medium - &:hover - text-decoration: none - -// Style table of contents navigation -ul.navigation-bottom__links - padding: 0 - display: flex - margin: $table-margin 0 0 0 - li - list-style: none - a - color: $color-base - text-decoration: none - &:hover - text-decoration: underline - &.prev, - &.next - width: 46% - &.up - width: 8% - min-width: 30px - text-align: center - &.prev - .icon - padding-right: 5px - &.next - text-align: right - .icon - padding-left: 5px - &--only-next - li.next - width: 100% - -// Modifiers -// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_page.sass b/web/themes/joinup/prototype/sass/components/_page.sass deleted file mode 100644 index 32edfafbbc..0000000000 --- a/web/themes/joinup/prototype/sass/components/_page.sass +++ /dev/null @@ -1,73 +0,0 @@ -// Page -// - -// Component -// -------------------------------------------------- -// .page - -// Elements -// -------------------------------------------------- -.page__title, -.page__title-wrapper - position: relative - margin-bottom: 20px - letter-spacing: 1px - -.page__title-wrapper - +breakpoint(tablet) - margin: 0 60px 40px 60px - -.region--featured - .page__title-wrapper - margin: 20px 0 - +breakpoint(desktop) - margin-top: 40px - margin-bottom: 40px - .page__title-wrapper--create - margin-left: 50px - -.section--content-middle - .page__title, - .page__title-wrapper - +breakpoint(tablet) - margin: 0 60px 40px 0 - -.page__content - @media print - padding: 0 - padding-bottom: 20px - -.page__title, -.page__title-wrapper - .icon--plus - left: -50px - +centered($horizontal: false, $vertical: true) - +icon-size(35px) - h1 - margin: 0 - display: inline - vertical-align: middle - .permalink - display: none - color: $color-base - font-size: $font-size-medium - vertical-align: middle - &:hover - .permalink - display: inline - -.page__title-wrapper - @media print - margin: 0 - -// Modifiers -// -------------------------------------------------- - -// States -// -------------------------------------------------- - -// Dependencies -// -------------------------------------------------- -.content-container--default - .page__content - @extend .white-box diff --git a/web/themes/joinup/prototype/sass/components/_pager.sass b/web/themes/joinup/prototype/sass/components/_pager.sass deleted file mode 100644 index 96ab208ab8..0000000000 --- a/web/themes/joinup/prototype/sass/components/_pager.sass +++ /dev/null @@ -1,102 +0,0 @@ -// Pager -// -// Markup: html/pager.html -// -// Default listing pager with maximum 9 items -// -// Styleguide 2.15 - -// Component -// -------------------------------------------------- -.pager - margin: 40px 0 0 0 - -// Elements -// -------------------------------------------------- -.pager__list - display: flex - display: -webkit-flex - flex-direction: row - flex-wrap: nowrap - justify-content: center - -webkit-justify-content: center - align-items: center - margin-top: 0 - margin-bottom: 0 - padding-left: 0 - list-style-type: none - -.pager__item - position: relative - width: 50px - height: 50px - padding-bottom: 0 - padding-left: 0 - margin-bottom: 0 - &:before - display: none - +breakpoint(md) - width: 40px - height: 40px - -.pager__link - width: 100% - height: 100% - display: block - text-decoration: none - -// Modifiers -// -------------------------------------------------- -.pager__item--active - background-color: $color-blue-default - -.pager__item--inactive, .pager__item--ellipsis - display: none - +breakpoint(md) - display: block - -// States -// -------------------------------------------------- -.pager__item - &:hover, - &:focus, - &:active - color: $color-base - background-color: $color-grey-lighter - -.pager__item--active - &, - &:hover, - &:focus, - &:active - cursor: default - background-color: $color-blue-default - -.pager__item--ellipsis - &:hover, - &:focus, - &:active - cursor: default - background-color: transparent - -// Dependencies -// -------------------------------------------------- -.pager__item - .text, - .icon - color: $color-base - +centered - .text - font-size: 20px - +breakpoint(md) - font-size: 14px - .icon - font-size: 16px - +breakpoint(md) - font-size: 12px - -.pager__item--active - .pager__link - cursor: default - .text - color: #fff diff --git a/web/themes/joinup/prototype/sass/components/_search-bar.sass b/web/themes/joinup/prototype/sass/components/_search-bar.sass deleted file mode 100644 index 7ca2267610..0000000000 --- a/web/themes/joinup/prototype/sass/components/_search-bar.sass +++ /dev/null @@ -1,174 +0,0 @@ -// Search bar -// -// Markup: html/search-bar.html -// -// .search-bar - Default -// .search-bar--white - White colored -// -// - -// Component -// -------------------------------------------------- -// .search-bar - - -// Elements -// -------------------------------------------------- -.search-bar__wrapper - margin-bottom: 40px - text-align: center - -.search-bar__label - width: 40px - height: 40px - -.search-bar__icon - padding: 0 - color: lighten($color-grey-medium, 10%) - +icon-size(25px) - +border-radius(50%) - +centered - -.search-bar__input - font-weight: $font-weight-thin - color: lighten($color-grey-medium, 10%) - border-bottom-color: lighten($color-grey-medium, 10%) - box-sizing: border-box - &::-webkit-input-placeholder - font-size: $font-size-base - font-weight: $font-weight-thin - font-style: italic - color: lighten($color-grey-medium, 10%) - &:-moz-placeholder - font-size: $font-size-base - font-weight: $font-weight-thin - font-style: italic - color: lighten($color-grey-medium, 10%) - &::-moz-placeholder - font-size: $font-size-base - font-weight: $font-weight-thin - font-style: italic - color: lighten($color-grey-medium, 10%) - &:-ms-input-placeholder - font-size: $font-size-base - font-weight: $font-weight-thin - font-style: italic - color: lighten($color-grey-medium, 10%) - -.search-bar__input-container - margin-left: 0 - padding: 10px 0 - -.search-bar__block - position: relative - max-width: 570px - margin: 20px auto - +breakpoint(tablet) - margin-top: 40px - margin-bottom: 40px - -// Modifiers -// -------------------------------------------------- -.search-bar--header - position: absolute - top: 0 - right: 75px - overflow: hidden - height: 64px - padding: 0 - +z-index(highlight) - -.search-bar--header-shifted - right: 120px - -.search-bar--section - width: 85% - margin-left: -40px - padding: 0 - +breakpoint(tablet) - width: 570px - -// Dependiencies -// -------------------------------------------------- -.search-bar--header - .search-bar__label - position: relative - bottom: auto - display: inline-block - vertical-align: middle - .search-bar__input - font-weight: $font-weight-thin - display: inline-block - vertical-align: middle - border-bottom: 1px solid #fff - -.search-bar--section - .search-bar__label - top: 0 - left: 0 - .search-bar__input - font-weight: $font-weight-thin - padding-left: 45px - border-bottom: 2px solid lighten($color-grey-medium, 10%) - -.search-bar--white - .search-bar__icon - color: #fff - .search-bar__input - color: #fff - border-bottom-color: #fff - &::-webkit-input-placeholder - color: #fff - &:-moz-placeholder - color: #fff - &::-moz-placeholder - color: #fff - &:-ms-input-placeholder - color: #fff - -.search-bar__block - .search-bar__button-container - position: relative - left: 20px - width: 25px - height: 25px - padding: 0 - +border-radius(50%) - +centered($horizontal: false, $vertical: true) - +breakpoint(tablet) - left: -10px - .search-bar__button - font-size: 0 - width: 25px - height: 25px - padding: 0 - cursor: pointer - border: none - background: none - +z-index(navigation) - +centered - label - display: none - -// States -// -------------------------------------------------- -.search-bar--header - &.is-focused, - &.is-dirty - width: calc(100% - 130px) - background-color: $color-blue-default - +z-index(navigation) - +breakpoint(tablet) - width: calc(100% - 200px) - .search-bar__input-container - width: calc(100% - 50px) - max-width: 100% - -.search-bar--header-shifted - &.is-focused, - &.is-dirty - width: calc(100% - 175px) - +breakpoint(tablet) - width: calc(100% - 280px) - .search-bar__input-container - width: calc(100% - 50px) diff --git a/web/themes/joinup/prototype/sass/components/_share-box.sass b/web/themes/joinup/prototype/sass/components/_share-box.sass deleted file mode 100644 index 9c525d22d5..0000000000 --- a/web/themes/joinup/prototype/sass/components/_share-box.sass +++ /dev/null @@ -1,98 +0,0 @@ -// Share box -// - -// Component -// -------------------------------------------------- - -// Elements -// -------------------------------------------------- -.share-box__row - position: relative - min-height: 50px - margin-bottom: 20px - &:last-child - border-bottom: none - min-height: auto - margin-bottom: 0 - -.share-box__item - text-decoration: none - -.share-box__label - margin-left: 14px - color: $color-base - font-size: $font-size-base - font-weight: $font-weight - -.share-box__image img - max-width: 50px - max-height: 50px - -.share-box__social-icon - color: $color-blue-dark - +icon-size(50px) - -.share-box__container - display: flex - flex-direction: column - justify-content: space-between - max-width: $screen-sm - overflow-y: hidden - +breakpoint(sm) - flex-direction: row - min-width: $screen-sm / 2 - -.share-box__title - margin-top: 0 - color: $color-base - -.share-box__social - margin-bottom: 20px - +breakpoint(sm) - margin-right: 40px - margin-bottom: 0 - .share-box__item - display: flex - align-items: center - margin-right: 5px - margin-left: 5px - padding-right: 10px - -.share-box__collections - .share-box__row - margin-left: 10px - padding-left: 30px - +breakpoint(sm) - margin-left: 0 - .share-box__item - display: flex - align-items: flex-start - -// Modifiers -// -------------------------------------------------- -.share-box__container--single-column - justify-content: center - .share-box__social - margin-right: 0 - .share-box__title - text-align: center - -// Dependiencies -// -------------------------------------------------- -.share-box__container - fieldset - margin-bottom: 0 - .form-type-checkbox - position: absolute - top: 0 - left: 0 - .form__label - display: none - -.share-content-form - .form__legend - margin: 0 - -.ajax-progress-throbber - .message - display: none diff --git a/web/themes/joinup/prototype/sass/components/_sidebar-menu.sass b/web/themes/joinup/prototype/sass/components/_sidebar-menu.sass deleted file mode 100644 index 3f8d9360e5..0000000000 --- a/web/themes/joinup/prototype/sass/components/_sidebar-menu.sass +++ /dev/null @@ -1,107 +0,0 @@ -// Sidebar menu -// -// Sidebar menu component - -// Component -// -------------------------------------------------- -.sidebar-menu - position: relative - +z-index(navigation) - +breakpoint(desktop) - width: 100% - .mdl-menu__container, - .mdl-menu__outline, - .mdl-menu - width: 100% !important - .mdl-menu - padding: 0 - .mdl-menu__outline - background-color: transparent - box-shadow: none - -// Elements -// -------------------------------------------------- -.sidebar-menu ul - padding-left: 0 - margin: 0 - -.sidebar-menu__button - width: 60px - height: 60px - border-radius: 0 - +z-index(navigation) - -.sidebar-menu__item - padding: 0 - -.sidebar-menu__link--active - background-color: #fff - border-left-color: $color-orange - font-weight: $font-weight-medium - -.sidebar-menu__link - display: block - padding: 15px 15px 15px 20px - color: $color-base - border-left: 4px solid transparent - text-decoration: none - &:hover, - &:active, - &:focus, - &.is-active - @extend .sidebar-menu__link--active - - -.sidebar-menu - .icon - color: #fff - +icon-size(35px) - +centered - -.sidebar-menu__contextual - +breakpoint(desktop) - .contextual - +z-index(dropdown) - -// Modifiers -// -------------------------------------------------- -.sidebar-menu__button--mobile - position: absolute - top: -45px - .icon - color: $color-base - +breakpoint(desktop) - display: none - -.sidebar-menu__button--desktop - display: none - margin: 10px 0 10px 6px - .icon - color: $color-base - +breakpoint(desktop) - display: block - -// Dependiencies -// -------------------------------------------------- -.section--sidebar-left - .sidebar-menu - +breakpoint(desktop) - .mdl-menu - position: relative - opacity: 1 - clip: rect(0px 181.328px 144px 0px) - .mdl-menu__item - opacity: 1 - .mdl-menu__container - visibility: visible - background: transparent - position: relative - +z-index(navigation) - &.is-hidden - visibility: hidden - &:not(.is-hidden) - height: auto - -.menu-item--active-trail - .sidebar-menu__link - @extend .sidebar-menu__link--active diff --git a/web/themes/joinup/prototype/sass/components/_tab.sass b/web/themes/joinup/prototype/sass/components/_tab.sass deleted file mode 100644 index e858e25125..0000000000 --- a/web/themes/joinup/prototype/sass/components/_tab.sass +++ /dev/null @@ -1,158 +0,0 @@ -// Tab -// -// Markup: html/tab.html -// -// Styleguide 2.11 - -// Component -// -------------------------------------------------- -.tab - background-color: transparent - -// Elements -// -------------------------------------------------- -.tab__container - margin-bottom: 40px - +flex - +flex-direction(column) - +flex-wrap(nowrap) - +justify-content(space-around) - +breakpoint(sm) - margin-bottom: 30px - border-bottom: none - +flex-direction(row) - +align-items(center) - -// Modifiers -// -------------------------------------------------- -.tabs--horizontal - margin: 0 - padding: 0 - border-bottom: 1px solid $color-grey-light - +justify-content(center) - +flex - +flex-direction(column) - +flex-wrap(nowrap) - +breakpoint(sm) - border-bottom: none - +flex-direction(row) - +align-items(center) - - -.tab--horizontal - border-bottom: 1px solid $color-grey-light - background-color: $color-grey-light - a - text-decoration: none - color: $color-base - &:hover - color: $color-orange - -.tab--content-type - position: relative - padding: 15px 5px - text-align: center - text-decoration: none - color: $color-base - +breakpoint(xxs, xs) - margin-bottom: 20px - border-bottom: 1px solid darken($color-grey-light, 5%) - .tab__content - +inline-flex - width: 100% - .tab__icon - color: lighten($color-grey-medium, 10%) - +icon-size(45px) - +breakpoint(xxs, xs) - +centered($horizontal: false, $vertical: true) - .tab__text - +breakpoint(xxs, xs) - margin: 0 auto - +breakpoint(sm) - margin-left: 15px - text-align: left - .tab__text--upper - font-size: 32px - font-weight: $font-weight-bold - line-height: 1 - display: block - margin-bottom: 4px - .tab__text--lower - display: block - -.tab--more - position: relative - display: inline-block - width: 90px - margin: 15px auto 15px auto - padding-bottom: 10px - cursor: pointer - text-align: center - text-decoration: none - +breakpoint(sm) - width: auto - margin: 0 - .tab__text, - .tab__icon - display: inline-block - vertical-align: middle - color: $color-orange - .tab__text - font-size: $font-size-small - font-weight: $font-weight-bold - text-transform: uppercase - .tab__icon - margin-left: 4px - +icon-size(14px) - -// Dependiencies -// -------------------------------------------------- -.timeline - .tab--more - position: absolute - right: -40px - bottom: -140px - display: block - width: 120px - height: 40px - padding: 0 - .tab--more-wrapper - top: 50% - -.section--featured-navy-blue - .tab--content-type - .tab__icon, - .tab__text - color: #fff - .tab__text--upper - font-weight: $font-weight - &.is-active - .tab__icon - color: #fff - -// States -// -------------------------------------------------- -.tab--horizontal - &.is-active - font-weight: $font-weight-medium - border-bottom: 1px solid #fff - background-color: #fff - -.tab--content-type - &.is-active - border-bottom: 2px solid $color-orange - .tab__icon - color: $color-base - &:before - position: absolute - right: 0 - bottom: -6px - left: 0 - display: block - width: 0 - height: 0 - margin: 0 auto - content: '' - border-top: 4px solid $color-orange - border-right: 4px solid transparent - border-left: 4px solid transparent diff --git a/web/themes/joinup/prototype/sass/components/_tallinn.sass b/web/themes/joinup/prototype/sass/components/_tallinn.sass deleted file mode 100644 index e1185dc5b0..0000000000 --- a/web/themes/joinup/prototype/sass/components/_tallinn.sass +++ /dev/null @@ -1,45 +0,0 @@ -// Tallinn -// -// Tallinn status messages. -// -// .tallinn--no_progress - #eb5b5c -// .tallinn--in_progress - #ee8917 -// .tallinn--no_data - #707475 -// .tallinn--completed - #98c04c - -// Component -// -------------------------------------------------- -.tallinn - position: relative - padding: 5px 5px - +border-radius(4px) - -// Elements -// -------------------------------------------------- -.tallinn__message, .tallinn__message a - color: #fff - -// Modifiers -// -------------------------------------------------- -.tallinn--no_progress - background-color: $color-error - -.tallinn--in_progress - background-color: $color-orange - -.tallinn--no_data - background-color: $color-grey-medium - -.tallinn--completed - background-color: $color-success - -details.tallinn-box - margin-left: 0 - margin-right: 0 - -.tallinn-chart__legend - ul - li - text-indent: 0 - padding-left: 0 - diff --git a/web/themes/joinup/prototype/sass/components/_timeline.sass b/web/themes/joinup/prototype/sass/components/_timeline.sass deleted file mode 100644 index 2983088dc2..0000000000 --- a/web/themes/joinup/prototype/sass/components/_timeline.sass +++ /dev/null @@ -1,170 +0,0 @@ -// Timeline -// -// Markup: html/timeline.html -// -// Styleguide 2.12 - -// Component -// -------------------------------------------------- -.timeline - padding: 0 - background-color: transparent - -// Elements -// -------------------------------------------------- -.timeline__release - padding: 0 - +breakpoint(sm-mobile, mobile) - padding-bottom: 30px - &:last-of-type - padding-bottom: 0 - +breakpoint(tablet) - &:last-of-type - padding-bottom: 160px -.timeline__release-progression - position: relative - margin: 0 - +breakpoint(sm-mobile, mobile) - width: 100% - -.timeline__release-info - +breakpoint(tablet) - margin: 40px 50px 0 0 - text-align: right - .release__info-element - display: inline-block - margin: 0 5px 20px 0 - +breakpoint(tablet) - display: block - margin-right: 0 - margin-bottom: 10px - -.timeline__release-bar - display: none - +breakpoint(tablet) - position: absolute - top: 0 - right: 20px - display: block - width: 4px - height: 110% - background-color: $color-grey-light - &:before - top: 38px - display: block - width: 18px - height: 18px - content: '' - border: 4px solid $color-grey-bg - background-color: $color-grey-light - +border-radius(50%) - +centered($horizontal: true, $vertical: false) - -.timeline__release-content - position: relative - margin: 0 - padding: 20px - background-color: #fff - +breakpoint(sm-mobile, mobile) - width: 100% - +breakpoint(tablet) - margin: 20px 0 0 20px - padding-right: 10px - padding-left: 10px - &:before - position: absolute - top: 20px - left: -12px - display: none - width: 0 - height: 0 - content: '' - border-top: 12px solid transparent - border-right: 12px solid #fff - border-bottom: 12px solid transparent - +breakpoint(tablet) - display: block - -.timeline__meta - +breakpoint(tablet) - margin-right: 30px - margin-left: 30px - -.timeline__release-title - margin-top: 0 - margin-bottom: 20px - -.timeline__release-abstract - color: $color-grey-medium - margin-bottom: 20px - p, - a, - div - display: inline - p:last-child - margin-bottom: 0 - -.timeline__listing-block-title - margin-top: 0 - +breakpoint(tablet) - margin-left: 30px - margin-right: 30px - margin-bottom: 20px - -.timeline__listing - overflow: hidden - -.timeline__listing-item - overflow: hidden - margin-top: 0 - margin-bottom: 10px - &:last-child - margin-bottom: 0 - +breakpoint(tablet) - padding: 20px 30px - background-color: #f0f7f7 - -.timeline__listing-title - float: left - +breakpoint(tablet) - float: none - margin-bottom: 10px - -.timeline__listing-details - float: right - margin-left: 10px - +breakpoint(tablet) - float: none - margin-left: 0 - .value - +breakpoint(sm-mobile, mobile) - font-size: $font-size-small - -.timeline__read-more - margin-top: 20px - text-align: right - text-transform: uppercase - -// Modifiers -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.timeline__release - &:first-child - .timeline__release-progression - overflow: hidden - .timeline__release-content - margin-top: 0 - .timeline__release-info - margin-top: 22px - .timeline__release-bar - top: 20px - background-color: $color-blue-slider - &:before - top: -1px - border-color: $color-grey-bg - background-color: $color-blue-slider diff --git a/web/themes/joinup/prototype/sass/components/_vertical-menu.sass b/web/themes/joinup/prototype/sass/components/_vertical-menu.sass deleted file mode 100644 index b5c85e986a..0000000000 --- a/web/themes/joinup/prototype/sass/components/_vertical-menu.sass +++ /dev/null @@ -1,36 +0,0 @@ -// Vertical menu - - -// Component -// -------------------------------------------------- -.vertical-menu - list-style-type: none - padding-left: 0 - -// Elements -// -------------------------------------------------- -.vertical-menu__label - margin-top: 0 - margin-bottom: 10px - -.vertical-menu__link - color: $color-blue-dark - -// Modifiers -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- -.section--footer - .vertical-menu - margin-top: 0 - margin-bottom: 0 - .vertical-menu__link - color: #fff - -// States -// -------------------------------------------------- -.vertical-menu__link - &:hover - text-decoration: none - diff --git a/web/themes/joinup/prototype/sass/components/_vertical-tabs.sass b/web/themes/joinup/prototype/sass/components/_vertical-tabs.sass deleted file mode 100644 index d3c26deaf3..0000000000 --- a/web/themes/joinup/prototype/sass/components/_vertical-tabs.sass +++ /dev/null @@ -1,74 +0,0 @@ -// vertical tabs -// -// vertical tabs component - -// Component -// -------------------------------------------------- -.vertical-tabs - -// Elements -// -------------------------------------------------- -.vertical-tabs__wrapper - width: 100% - -.vertical-tabs__pane - padding: 20px - background-color: #fff - margin-bottom: 0 !important - +breakpoint(tablet) - padding: 40px 30px - +breakpoint(desktop) - padding: 40px 60px - -.vertical-tabs__pane > summary - display: none - -.vertical-tabs__details-summary - display: none - -.vertical-tabs__menu - padding-left: 0 - display: none - +breakpoint(mobile) - display: block - -.vertical-tabs__menu-item - display: block - border-bottom: 1px solid $color-grey-light - background-color: $color-grey-lighter - a - display: block - padding: 20px 30px - text-decoration: none - -.vertical-tabs__menu-item-title - color: $color-base - display: block - font-weight: $font-weight - -.vertical-tabs__menu-item-summary - font-size: $font-size-small - 1px - font-weight: $font-weight-thin - margin-top: 4px - color: $color-grey-medium - display: block - -.vertical-tabs__actions - .button - margin-bottom: 5px - -.vertical-tabs__menu-item--mobile - display: block - +breakpoint(mobile) - display: none - - -// Modifiers -// -------------------------------------------------- - -// States -// -------------------------------------------------- -.vertical-tabs__menu-item.is-selected - background-color: #fff - .vertical-tabs__menu-item-title - font-weight: $font-weight-medium diff --git a/web/themes/joinup/prototype/sass/layouts/_grid.sass b/web/themes/joinup/prototype/sass/layouts/_grid.sass deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/web/themes/joinup/prototype/sass/layouts/_layout.sass b/web/themes/joinup/prototype/sass/layouts/_layout.sass deleted file mode 100644 index c6b67c720a..0000000000 --- a/web/themes/joinup/prototype/sass/layouts/_layout.sass +++ /dev/null @@ -1,22 +0,0 @@ -h1, -h2, -h3, -span, -a, -div - font-family: 'Open Sans', sans-serif - line-height: normal - -div - box-sizing: border-box - -img - max-width: 100% - height: auto - -.main-container - width: 100% - padding-left: 16px - padding-right: 16px - max-width: $container-desktop - margin: 0 auto diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--featured.sass b/web/themes/joinup/prototype/sass/layouts/sections/_section--featured.sass deleted file mode 100644 index 7524cc89bd..0000000000 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--featured.sass +++ /dev/null @@ -1,20 +0,0 @@ -// Featured -// -// Featured component - -// Component -// -------------------------------------------------- -.section--featured - .support-menu - position: absolute - top: 5px - right: 65px - .anonymous-menu - position: absolute - top: 5px - right: 20px - +z-index(navigation) - -.section--featured-navy-blue - text-align: center - background-color: #27456b diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass b/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass deleted file mode 100644 index c20a4a8255..0000000000 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--footer.sass +++ /dev/null @@ -1,26 +0,0 @@ -// Footer -// -// Footer component - -// Component -// -------------------------------------------------- -.section--footer - margin-top: auto - +hidden-print - .footer__first - background-color: $color-blue-default - .footer__second - padding-top: 10px - padding-bottom: 5px - background-color: $color-blue-default - .footer__site-name - margin-top: 0 - margin-bottom: 10px - img - height: 30px - width: auto - .footer__version - a - color: #acb7c4 - font-size: 0.85em - text-decoration: none diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--header.sass b/web/themes/joinup/prototype/sass/layouts/sections/_section--header.sass deleted file mode 100644 index a701b8803d..0000000000 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--header.sass +++ /dev/null @@ -1,21 +0,0 @@ -// Header -// -// Header component - -// Component -// -------------------------------------------------- -.section--header - background-color: $color-blue-default - +hidden-print - -// Elements -// -------------------------------------------------- - -// Dependiencies -// -------------------------------------------------- -.section--header - nav - position: relative - +z-index(navigation) - &.block--small-nav - +z-index(header) \ No newline at end of file diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--sidebar-left.sass b/web/themes/joinup/prototype/sass/layouts/sections/_section--sidebar-left.sass deleted file mode 100644 index 0f53e7e250..0000000000 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--sidebar-left.sass +++ /dev/null @@ -1,44 +0,0 @@ -// Section sidebar left -// -// Sidebar component - -// Component -// -------------------------------------------------- -.section--sidebar-left - +hidden-print - &:not(.section--sidebar-left--search) - +breakpoint(xxs, sm) - margin: 0 - -// Elements -// -------------------------------------------------- -.section--sidebar-left--search - min-width: 208px - .section--sidebar-left--search--wrapper - background-color: #F4F5F7 - padding: 5px 20px 20px 20px - +breakpoint(tablet) - margin: 16px 0 0 0 - ul.item-list__checkbox - margin-bottom: 10px - .mdl-checkbox__label - display: flex - flex-direction: row - flex-wrap: wrap - width: 100% - span - display: flex - flex-direction: column - flex-basis: 100% - flex: 1 - &.facet-item__value - flex: 2 - &.facet-item__count - text-align: right - h2 - font-size: 20px - margin-bottom: 10px - h3 - margin-bottom: 5px - select - width: 100% diff --git a/web/themes/joinup/prototype/sass/variables/_variables.sass b/web/themes/joinup/prototype/sass/variables/_variables.sass deleted file mode 100644 index 012fc4ba62..0000000000 --- a/web/themes/joinup/prototype/sass/variables/_variables.sass +++ /dev/null @@ -1,96 +0,0 @@ -// Colors -// -------------------------------------------------- -$color-base: #211b38 - -$color-grey-white: #fff -$color-grey-lighter: #f4f6f7 -$color-grey-light: #e1e1e1 -$color-grey-medium: #707475 -$color-grey-bg: #e9edee -$color-grey-input: #a0a1a2 -$color-grey-border: #c5c5c5 -$color-grey-filler: #dcdcdc - -$color-blue-default: #27456b -$color-blue-lighter: #32afff -$color-blue-light: #184f85 -$color-blue-medium: #2875cf -$color-blue-dark: #04213e -$color-blue-slider: #0067a2 - -$color-yellow: #ffec00 -$color-orange: #ee8917 -$color-green: #51c77d -$color-green-new: #498b7d -$color-purple: #2a2348 -$color-error: #eb5b5c -$color-warning: #ea9e50 -$color-info: #2875cf -$color-success: #98c04c - -// licence colors -$color-green-warm: #0aa198 -$color-beige-warm: #988a7f -$color-red-warm: #d05655 -$color-blue-warm: #3486dc -$color-grey-warm: #8897aa -$color-orange-warm: #e5bc7a - - -// Layout -// -------------------------------------------------- -$container-desktop: 1600px - -// Margin for form elements -$form-margin: 25px -$form-large-margin: 40px - -// Margin for tables -$table-margin: 16px - -// Margin for fields -$field-margin: 10px - -// Margin for tiles -$tile-margin: 15px -$tile-margin-small: 5px - -// Line height needed for fixed number of rows. -$row-height: 23px -$row-height-small: 17px - -// Typography -// -------------------------------------------------- -$font-size-base: 16px -$font-size-large: 40px -$font-size-medium: 20px -$font-size-small: 14px -$font-size-xsmall: 12px - -$font-size-h1: 36px -$font-size-h2: 24px -$font-size-h3: 16px -$font-size-h4: 13px -$font-size-h5: 11px - -$font-weight-thin: 300 -$font-weight: 400 -$font-weight-medium: 600 -$font-weight-bold: 700 - -// Breakpoints -// -------------------------------------------------- -$screen-lg: 1200px -$screen-lg-min: $screen-lg -$screen-md-max: $screen-lg - 1 -$screen-md: 992px -$screen-md-min: $screen-md -$screen-sm-max: $screen-md - 1 -$screen-sm: 840px -$screen-sm-min: $screen-sm -$screen-xs-max: $screen-sm - 1 -$screen-xs: 480px -$screen-xs-min: $screen-xs -$screen-xxs: 0 -$screen-xxs-min: $screen-xxs -$screen-xxs-max: $screen-xs - 1 diff --git a/web/themes/joinup/prototype/scss/_drupal-hacks.scss b/web/themes/joinup/prototype/scss/_drupal-hacks.scss new file mode 100644 index 0000000000..43203bef6f --- /dev/null +++ b/web/themes/joinup/prototype/scss/_drupal-hacks.scss @@ -0,0 +1,659 @@ +.draggable { + .field-multiple-drag { + width: 45px; + padding-right: 0; + } +} + +.tabledrag-toggle-weight-wrapper { + display: none; +} + +// @todo Remove this hack as part of ISAICP-3021. +// @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3021 +.joinup-nodrag { + a.tabledrag-handle, + .field-multiple-drag { + display: none !important; + } +} + +#edit-field-ar-owner-actions.container-inline { + width: 100%; + display: block; + + div { + display: inline-block; + } +} + +textarea { + max-width: 100%; +} + +.messages { + background-image: none; +} + +// Fix wrapper width in forms with vertical tabs. +.field-group-tabs-wrapper { + width: 100%; +} + +// Inline entity from styles. +.ief-entity-table { + margin-bottom: 20px; + + .form-table__cell { + height: 70px; + padding: 0 15px; + } + + .ief-entity-operations { + margin-bottom: 0; + } +} + +// Styles for multiple field table. +.field--widget-inline-entity-form-complex { + .form-type-select { + display: inline-block; + vertical-align: middle; + margin-right: 30px; + + select { + height: 25px; + width: auto; + font-size: 14px; + color: $color-grey-medium; + } + } + + .button__no-bg-wrapper { + margin-right: 30px; + } +} + +.ief-entity-table > .form-table__body > .form-table__row:nth-child(2) > .form-table__cell { + padding-top: 15px; +} + +#block-navigation { + p { + padding-top: 10px; + padding-right: 35px; + } +} + +// Contextual region changes +// Default icon is replaced +.contextual { + @include z-index(navigation); + + button.trigger { + font-family: "WAAT Icons"; + font-size: 0; + font-weight: normal; + font-style: normal; + font-variant: normal; + line-height: 100%; + position: relative !important; + display: inline-block; + width: 30px !important; + height: 30px !important; + padding: 0; + text-indent: 0; + text-transform: none; + color: $color-base; + border: none !important; + border-radius: 30px !important; + background: none; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + &:hover, + &:focus { + background: $color-grey-light; + } + + &:before { + content: ""; + + @include icon-size(15px); + } + } +} + +// Contextual links behaviour in tiles. +.listing__card { + .contextual { + button.trigger.visually-hidden { + // Restore the default absolute positioning applied by .visually-hidden class. + position: absolute !important; + } + } +} + +// Move contextual button to the left +// on pinned tiles. +.listing__card { + .contextual { + right: auto; + left: 6px; + top: 6px !important; + + .trigger { + right: auto; + left: 0; + float: left; + } + + .contextual-links { + right: auto; + left: 0; + border-radius: 0 4px 4px 4px; + } + } +} + +// Change contextual button color +// on dark backgrounds +.section--featured, +.section--header, +.section--footer { + .contextual { + button.trigger { + color: #fff; + + &:hover, + &:focus { + background-image: none; + background: $color-grey-medium; + } + } + } +} + +ul.contextual-links { + @include z-index(highlight + 2); + + position: relative; + padding-left: 0; + margin: 0; + + li { + text-indent: 0; + + &::before { + display: none; + } + } +} + +.contextual-region.focus { + outline: none; + outline-offset: 0; +} + +// Fix contextual button on collection and solution pages. +.canonical-entity-page--rdf-entity--solution, +.canonical-entity-page--rdf-entity--collection { + article.contextual-region { + & > .contextual { + top: -36px; + } + } +} + +// Fixes dropdown button for main menu. +// It is needed only for admin. +#block-joinup-theme-main-menu { + .contextual { + @include z-index(dropdown); + } +} + +// Fix password policy table +#password-policy-status { + margin-bottom: $form-margin; + + table { + th:first-child, td:first-child { + display: none; + } + } +} + +.form-type-password-confirm { + margin-bottom: $form-margin; + + input.password-confirm { + margin-bottom: $form-margin; + } +} + +.is-only-placeholder { + background: repeating-linear-gradient(-45deg, red, red 25px, rgba(255, 255, 255, 1) 25px, rgba(255, 255, 255, 1) 50px); +} + +.block-local-tasks-block { + @include hidden-print; +} + +.block-facet--links-inline { + display: inline-block; +} + +form .description { + @extend .form__description; +} + +// Fix facets in search header +.block-facets { + position: relative; +} + +// jQuery ui hacks +.ui-dialog { + width: calc(100% - 30px) !important; + max-width: 840px; + margin-left: 15px; + margin-right: 15px; + padding: 20px; + + @include z-index(modal); + @include breakpoint(sm) { + width: auto !important; + } + + + .ui-dialog-buttonpane { + border: none; + padding: 0 !important; + margin: 0; + display: flex; + justify-content: flex-end; + + .button { + margin: 0; + font-weight: $font-weight-medium; + } + } + + .ui-widget-content { + padding: 0; + color: $color-base; + } + + .ui-dialog-content { + padding: 0; + font-weight: $font-weight-thin; + color: $color-grey-medium; + font-size: $font-size-small; + + .form-actions, .button { + margin: 0; + } + + .form__actions_inner { + display: block; + } + } + + .ui-dialog-title { + float: none; + padding-right: 30px; + white-space: normal; + margin: 0; + font-size: $font-size-h2; + } + + .ui-dialog-titlebar-close { + height: 15px !important; + width: 15px !important; + background: none !important; + border: none !important; + top: 10px; + right: 0; + + .ui-icon { + @extend .icon; + + color: $color-blue-dark; + background: none; + border: none !important; + text-indent: 0; + font-size: 0; + padding: 0; + + &:before { + @include icon-size(15px); + + content: ""; + } + } + } + + .ui-dialog-buttonset { + float: none !important; + margin-top: $form-margin; + + @include breakpoint(sm) { + display: flex; + justify-content: space-between; + } + + + .button { + width: 100%; + margin-bottom: 10px; + + @include breakpoint(sm) { + width: auto; + margin-right: 15px; + margin-bottom: 0; + } + + + &:last-of-type { + margin-bottom: 0; + + @include breakpoint(sm) { + margin-right: 0; + } + } + } + } + + .ui-widget-header { + font-size: $font-size-h3; + margin-bottom: $field-margin; + padding: 0; + background: none; + color: $color-blue-dark; + border: none; + font-weight: $font-weight-medium; + } +} + +// Hide select formats in a comment field for anonymous users +// Remove margin for textarea +.comment-form-anonymous { + margin-bottom: 0; + + .filter-wrapper { + display: none; + } +} + +// Prevent overlapping contextal button and local tasks button. +.section--featured .contextual { + top: 50px; +} + +#block-joinup-theme-local-tasks { + position: absolute; + top: 10px; + right: 10px; + + @include z-index(dropdown); + + a { + text-decoration: none; + } + + .icon { + @include icon-size(15px); + + color: #fff; + } + + &:first-child { + .icon { + color: $color-base; + } + } +} + +// Remove border for iframes +article { + iframe { + border: none; + } +} + +// Style tour popup nub +.joyride-tip-guide { + .joyride-nub { + border: solid 14px $color-grey-border; + + &:after { + content: " "; + display: block; + border: 14px solid #fff; + width: 0; + height: 0; + + @include z-index(modal); + + position: absolute; + } + + &.top { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + + &:after { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + top: -13px; + left: -14px; + } + } + + &.bottom { + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + + &:after { + border-bottom-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + bottom: -13px; + left: -14px; + } + } + + &.right { + border-top-color: transparent; + border-right-color: transparent; + border-bottom-color: transparent; + + &:after { + border-top-color: transparent; + border-right-color: transparent; + border-bottom-color: transparent; + top: -14px; + right: -13px; + } + } + + &.left { + border-top-color: transparent; + border-left-color: transparent; + border-bottom-color: transparent; + + &:after { + border-top-color: transparent; + border-left-color: transparent; + border-bottom-color: transparent; + top: -14px; + left: -13px; + } + } + + &.top-right { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + + &:after { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + top: -13px; + right: -14px; + } + } + } +} + +// Style tour popup content +.joyride-tip-guide { + border-radius: 3px; + border: 1px solid $color-grey-border; +} + +.joyride-content-wrapper { + padding: 20px 25px 70px 20px; + + .button { + position: absolute; + bottom: 20px; + left: 20px; + padding: 5px 10px; + } + + .tour-progress, .button { + font-size: 12px; + } + + .joyride-close-tip { + @extend .icon; + + top: 10px; + right: 10px; + text-decoration: none; + color: $color-blue-dark; + text-indent: 0; + font-size: 0; + + &:before { + @include icon-size(15px); + + content: ""; + } + } + + .tour-tip-label { + margin: 0 0 10px 0; + font-size: $font-size-h3; + + &:empty { + margin-bottom: 0; + } + } + + .tour-tip-body { + margin-bottom: 0; + font-weight: $font-weight-thin; + color: $color-grey-medium; + font-size: $font-size-small; + } +} + +// Style the support menu. +.support-menu { + .support-button { + width: 40px; + height: 40px; + color: #fff; + font-size: 25px; + margin-right: 15px; + + @include z-index(navigation); + + .icon { + @include centered; + } + } + + a.support-menu__link { + color: $color-blue-default; + text-decoration: none; + white-space: nowrap; + } +} + +// Fix the feed icon styling. +.feed-icon { + background: url(../../../../core/misc/feed.svg) no-repeat; + overflow: hidden; + text-indent: -9999px; + display: block; + width: 16px; + height: 16px; +} + +// Internet Explorer fix. +details { + display: block; +} + +details .details-title { + padding-bottom: 15px; + text-decoration: none; + + @extend .form__label; +} + +// Fixes on tallinn edit form. +.node-tallinn-report-edit-form { + .vertical-tabs__pane > .form__description { + margin-bottom: $form-margin; + font-size: $font-size-small; + } + + .vertical-tabs__pane > summary { + display: block; + font-size: $font-size-h2; + pointer-events: none; + + &::-webkit-details-marker { + display: none; + } + } +} + +// Wrapper for map on event page. +.custom-map-wrapper { + background: #fff; + + .wtfooter { + margin-left: 10px; + } +} + +// List with buttons. +.links--buttons { + padding: 0; + margin: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + margin: 0 5px; + } +} + +// Fix margin for attachments in forms. +.form-managed-file { + .mdl-textfield { + margin-top: $table-margin; + } +} diff --git a/web/themes/joinup/prototype/scss/_mdl-hacks.scss b/web/themes/joinup/prototype/scss/_mdl-hacks.scss new file mode 100644 index 0000000000..0b7c10a6f4 --- /dev/null +++ b/web/themes/joinup/prototype/scss/_mdl-hacks.scss @@ -0,0 +1,166 @@ +.mdl-card { + width: 100% !important; +} + +.mdl-cell--12-col-tablet { + @include breakpoint(mobile, tablet) { + width: 100%; + } +} + +.mdl-layout__header-row { + height: 64px !important; + + @include breakpoint(tablet) { + padding: 0 20px; + } + + + &.mdl-layout__header-row--maintenance { + padding: 0 20px; + } +} + +.mdl-menu { + .mdl-menu__item { + height: auto; + padding: 0; + + a { + display: block; + padding: 16px; + white-space: normal; + } + } +} + +.mdl-layout__drawer { + @include z-index(max + 1); +} + +.mdl-layout__obfuscator { + @include z-index(max); +} + +.mdl-layout__drawer-button { + top: 4px; + + @include hidden-print; + @include breakpoint(tablet) { + display: none; + } + + + .material-icons { + font-size: 40px; + color: #fff; + + @include centered; + } +} + +.mdl-textfield--floating-label { + .field-prefix { + display: none; + } +} + +.mdl-spinner { + position: fixed; + top: 48.5%; + left: 49%; + + @include z-index(max); +} + +.mdl-grid--center { + justify-content: center; +} + +.join-collection-form, +#block-joinup-theme-local-tasks { + .mdl-menu__item a { + white-space: nowrap; + color: $color-blue-default; + } + + .mdl-menu__container { + margin-top: $field-margin; + } +} + +// Fix for iOS overflow issue caused by not respecting % height value +.mdl-layout__container { + height: auto; +} + +.mdl-layout { + min-height: 100vh; +} + +// Fix for Internet Explorer unstretched content section (once empty) and footer overflow issues caused by not respecting the min-height value +@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + .mdl-layout__container { + height: 100vh; + + .section--header, + .section--footer { + flex-shrink: 0; + } + + .section--featured, + .section--content { + flex-grow: 1; + flex-shrink: 0; + } + } + + body.has-cookie-consent-banner { + .mdl-layout__container { + height: auto; + } + } +} + +.filter { + .mdl-menu__container { + max-height: 400px; + margin-top: 5px; + + &.is-upgraded { + // Align drop down menu to the left on smaller devices. + @include breakpoint(sm-mobile, mobile) { + left: 0 !important; + } + + + .mdl-menu { + position: relative; + } + } + } + + .mdl-menu { + overflow-x: hidden; + overflow-y: auto; + max-height: 400px; + } +} + +// Hide visually the original checkbox input to allow the browser validation message to appear properly. +.mdl-checkbox.is-upgraded .mdl-checkbox__input { + position: absolute; + top: 20px; + left: 8px; + width: 1px; + height: 1px; + margin: 0; + padding: 0; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(100%); + overflow: hidden; + outline: 0; + -webkit-appearance: none; + appearance: none; +} diff --git a/web/themes/joinup/prototype/scss/_mixins.scss b/web/themes/joinup/prototype/scss/_mixins.scss new file mode 100644 index 0000000000..b275f48b20 --- /dev/null +++ b/web/themes/joinup/prototype/scss/_mixins.scss @@ -0,0 +1,242 @@ +// Breakpoints +@mixin breakpoint($min: null, $max: null) { + // Declare breakpoint value variables + $min-width: null !default; + $max-width: null !default; + + // Always interpret min value since it is cardinal. + @if $min == lg or $min == lg-desktop { + $min-width: $screen-lg-min; + } + @else if $min == md or $min == desktop { + $min-width: $screen-md-min; + } + @else if $min == sm or $min == tablet { + $min-width: $screen-sm-min; + } + @else if $min == xs or $min == mobile { + $min-width: $screen-xs-min; + } + @else if $min == xxs or $min == sm-mobile { + $min-width: $screen-xxs-min; + } + + // Interpret also max value if defined. + @if $max { + @if $max == md or $max == desktop { + $max-width: $screen-md-max; + } + @else if $max == sm or $max == tablet { + $max-width: $screen-sm-max; + } + @else if $max == xs or $max == mobile { + $max-width: $screen-xs-max; + } + @else if $max == xxs or $max == sm-mobile { + $max-width: $screen-xxs-max; + } + + // Render min and max breakpoint if both are defined + @media (min-width: $min-width) and (max-width: $max-width) { + @content; + } + } + @else { + // Else render only min breakpoint. + @media (min-width: $min-width) { + @content; + } + } +} + +// Border radius +@mixin border-radius($radius) { + -webkit-border-radius: $radius; + -moz-border-radius: $radius; + border-radius: $radius; +} + +// WAAT icon size +@mixin icon-size($size) { + width: $size; + height: $size; + line-height: $size; + font-size: $size; +} + +// Centering +@mixin centered($horizontal: true, $vertical: true) { + position: absolute; + + @if $horizontal and $vertical { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + @else if $horizontal { + left: 50%; + -webkit-transform: translate(-50%, 0); + -moz-transform: translate(-50%, 0); + -ms-transform: translate(-50%, 0); + transform: translate(-50%, 0); + } + @else if $vertical { + top: 50%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + } +} + +// Hidden print +@mixin hidden-print { + @media print { + display: none !important; + } +} + +// Flexbox +// Defines a block flex container; enables a flex context for all its direct children. +@mixin flex { + display: -webkit-box; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: flex; +} + +// Inline flex +// Defines an inline flex container; enables a flex context for all its direct children. +@mixin inline-flex { + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -moz-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; +} + +// Flex flow direction +// Defines the main axis around which the items are placed in the flex container. +@mixin flex-direction($value: row) { + -webkit-flex-direction: $value; + -moz-flex-direction: $value; + -ms-flex-direction: $value; + flex-direction: $value; + + @if $value == row { + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + } + @else if $value == column { + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + } +} + +// Flex wrap +// Defines whether flex items will be wrap. +@mixin flex-wrap($value: nowrap) { + -webkit-flex-wrap: $value; + -moz-flex-wrap: $value; + flex-wrap: $value; + + @if $value == nowrap { + -ms-flex-wrap: none; + } + @else { + -ms-flex-wrap: $value; + } +} + +// Justify content +// Defines the alignment along the main axis. +@mixin justify-content($value: flex-start) { + -webkit-justify-content: $value; + -moz-justify-content: $value; + justify-content: $value; + + @if $value == flex-start { + -webkit-box-pack: start; + -ms-flex-pack: start; + } + @else if $value == flex-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + } + @else if $value == space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + } + @else if $value == space-around { + -ms-flex-pack: distribute; + } + @else { + -webkit-box-pack: $value; + -ms-flex-pack: $value; + } +} + +// Align items +// Defines the default behaviour of the flex items along the cross axis on the current line. +@mixin align-items($value: stretch) { + -webkit-align-items: $value; + -moz-align-items: $value; + align-items: $value; + + @if $value == flex-start { + -webkit-box-align: start; + -ms-flex-align: start; + } + @else if $value == flex-end { + -webkit-box-align: end; + -ms-flex-align: end; + } + @else { + -webkit-box-align: $value; + -ms-flex-align: $value; + } +} + +// Z-indexes map-get +$z-index: (auto: auto, zero: 0, highlight: 1, highlight + 1: 2, highlight + 2: 3, navigation: 10, dropdown: 15, header: 16, modal: 20, max: 999, max + 1: 1000) !default; + +@function z-index($key) { + @if map-has-key($z-index, $key) { + @return map-get($z-index, $key); + } + + @warn "The key '#{$key}' is not in the map '$z-index'"; + + @return null; +} + +@mixin z-index($key) { + z-index: z-index($key); +} + +// Maximum number of rows +// Defines maximum number of rows allowed in a field +@mixin number-rows($number, $row-height, $fixed: false) { + max-height: $number * $row-height; + line-height: $row-height; + overflow: hidden; + + @if $fixed { + @include breakpoint(tablet) { + height: $number * $row-height; + } + } +} + +// Calculates height for text container in tiles +@mixin calc-space($number, $row-height, $margin, $number-small: 0, $row-height-small: 0, $margin-small: 0) { + max-height: $number * $row-height + $number-small * $row-height-small + $margin + $margin-small; + + &.listing__text-container--tags { + max-height: ($number - 1) * $row-height + $number-small * $row-height-small + $margin + $margin-small; + } +} diff --git a/web/themes/joinup/prototype/scss/app.scss b/web/themes/joinup/prototype/scss/app.scss new file mode 100644 index 0000000000..8d80c7a088 --- /dev/null +++ b/web/themes/joinup/prototype/scss/app.scss @@ -0,0 +1,97 @@ +// Font declarations +@import "base/fontfaces"; + +// Variables +@import "variables/variables"; + +// Importing mixins +@import "mixins"; + +// Base +// +// Basic html elements +// +// Styleguide 1 +@import "base/body"; +@import "base/paragraph"; +@import "base/heading"; +@import "base/blockquote"; +@import "base/link"; +@import "base/ordered_list"; +@import "base/unordered_list"; +@import "base/table"; +@import "base/radio"; +@import "base/checkbox"; +@import "base/cookie_consent_kit"; +@import "base/input"; +@import "base/shared"; + +// Components +// +// Joinup components +// +// Styleguide 2 +@import "components/search-bar"; +@import "components/header"; +@import "components/header-logo"; +@import "components/header-menu"; +@import "components/login-menu"; +@import "components/icons-bar"; +@import "components/sidebar-menu"; +@import "components/listing"; +@import "components/featured"; +@import "components/featured-lg"; +@import "components/icon"; +@import "components/background"; +@import "components/button"; +@import "components/form"; +@import "components/editor-area"; +@import "components/tab"; +@import "components/alert"; +@import "components/tallinn"; +@import "components/form-table"; +@import "components/file-upload"; +@import "components/draggable"; +@import "components/vertical-tabs"; +@import "components/circle-menu"; +@import "components/filters"; +@import "components/details"; +@import "components/action-link"; +@import "components/etiquette"; +@import "components/timeline"; +@import "components/announcement"; +@import "components/avatar"; +@import "components/comment"; +@import "components/load-more"; +@import "components/fieldset"; +@import "components/pager"; +@import "components/share-box"; +@import "components/footer"; +@import "components/footer-ec-menu"; +@import "components/footer-social-media"; +@import "components/vertical-menu"; +@import "components/page"; +@import "components/block"; +@import "components/icon-card"; +@import "components/inline-social-media"; +@import "components/chip"; +@import "components/chipfield"; +@import "components/invite-form"; +@import "components/navigation-bottom"; +@import "components/image-caption"; +@import "components/licence"; + +// Sections +@import "layouts/sections/section"; +@import "layouts/sections/section--footer"; +@import "layouts/sections/section--header"; +@import "layouts/sections/section--content"; +@import "layouts/sections/section--featured"; +@import "layouts/sections/section--sidebar-left"; + +// Layouts +@import "layouts/layout"; +@import "layouts/grid"; + +@import "mdl-hacks"; +@import "drupal-hacks"; diff --git a/web/themes/joinup/prototype/scss/base/_blockquote.scss b/web/themes/joinup/prototype/scss/base/_blockquote.scss new file mode 100644 index 0000000000..f99cb60651 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_blockquote.scss @@ -0,0 +1,34 @@ +// Blockquote +// +// Markup: html/blockquote.html +// +// Styleguide 1.4 + +blockquote { + position: relative; + clear: both; + overflow: hidden; + margin: 24px -60px; + padding: 40px 80px; + color: #fff; + background-color: $color-blue-medium; + + &:before, + &:after { + display: none; + } +} + +.blockquote__paragraph { + font-size: $font-size-base; + font-weight: $font-weight; + font-style: italic; + line-height: 1.8; +} + +.blockquote__author { + font-size: $font-size-base - 2px; + font-style: normal; + margin-top: 24px; + text-align: right; +} diff --git a/web/themes/joinup/prototype/sass/base/_body.sass b/web/themes/joinup/prototype/scss/base/_body.scss similarity index 50% rename from web/themes/joinup/prototype/sass/base/_body.sass rename to web/themes/joinup/prototype/scss/base/_body.scss index 89301bbec0..386baaee10 100644 --- a/web/themes/joinup/prototype/sass/base/_body.sass +++ b/web/themes/joinup/prototype/scss/base/_body.scss @@ -4,6 +4,7 @@ // // Styleguide 1.1 -body - background: $color-grey-bg - color: $color-base \ No newline at end of file +body { + background: $color-grey-bg; + color: $color-base; +} diff --git a/web/themes/joinup/prototype/scss/base/_checkbox.scss b/web/themes/joinup/prototype/scss/base/_checkbox.scss new file mode 100644 index 0000000000..b34bb4b0a4 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_checkbox.scss @@ -0,0 +1,60 @@ +// Checkbox +// +// Markup: html/checkbox.html +// +// Styleguide 1.10 + +// Component +// -------------------------------------------------- +.checkbox { + display: block; + margin: 15px 0; +} + +.mdl-checkbox { + height: auto; + min-height: 24px; +} + +// Elements +// -------------------------------------------------- +.mdl-checkbox__ripple-container { + .mdl-ripple { + background-color: $color-blue-medium; + } +} + +.mdl-checkbox__label { + font-size: $font-size-xsmall; + font-weight: $font-weight-thin; + display: block; + color: lighten($color-grey-medium, 10%); +} + +// Modifiers +// -------------------------------------------------- +.checkbox--inline { + display: inline-block; + width: auto; + margin-right: 15px; + vertical-align: middle; + + &:last-of-type { + margin-right: 0; + } +} + +// Dependiencies +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.mdl-checkbox.is-checked { + .mdl-checkbox__box-outline { + border-color: $color-blue-medium; + } + + .mdl-checkbox__tick-outline { + background-color: $color-blue-medium; + } +} diff --git a/web/themes/joinup/prototype/scss/base/_cookie_consent_kit.scss b/web/themes/joinup/prototype/scss/base/_cookie_consent_kit.scss new file mode 100644 index 0000000000..6be275f4ee --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_cookie_consent_kit.scss @@ -0,0 +1,8 @@ +// Cookie Consent Kit +// +// Styleguide 1.4 + +#cookie-consent-banner { + max-width: 100%; + border: none !important; +} diff --git a/web/themes/joinup/prototype/scss/base/_fontfaces.scss b/web/themes/joinup/prototype/scss/base/_fontfaces.scss new file mode 100644 index 0000000000..c0ee0880ec --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_fontfaces.scss @@ -0,0 +1,132 @@ +// Typography +// + +// open-sans-300 - latin +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 300; + src: url("../fonts/open-sans/open-sans-v14-latin-300.eot"); + + // IE9 Compat Modes + src: local("Open Sans Light"), local("OpenSans-Light"), url("../fonts/open-sans/open-sans-v14-latin-300.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-300.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-300.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-300.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-300.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-regular - latin +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: url("../fonts/open-sans/open-sans-v14-latin-regular.eot"); + + // IE9 Compat Modes + src: local("Open Sans Regular"), local("OpenSans-Regular"), url("../fonts/open-sans/open-sans-v14-latin-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-regular.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-regular.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-regular.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-regular.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-300italic - latin +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 300; + src: url("../fonts/open-sans/open-sans-v14-latin-300italic.eot"); + + // IE9 Compat Modes + src: local("Open Sans Light Italic"), local("OpenSans-LightItalic"), url("../fonts/open-sans/open-sans-v14-latin-300italic.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-300italic.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-300italic.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-300italic.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-300italic.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-600 - latin +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 600; + src: url("../fonts/open-sans/open-sans-v14-latin-600.eot"); + + // IE9 Compat Modes + src: local("Open Sans SemiBold"), local("OpenSans-SemiBold"), url("../fonts/open-sans/open-sans-v14-latin-600.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-600.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-600.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-600.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-600.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-600italic - latin +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 600; + src: url("../fonts/open-sans/open-sans-v14-latin-600italic.eot"); + + // IE9 Compat Modes + src: local("Open Sans SemiBold Italic"), local("OpenSans-SemiBoldItalic"), url("../fonts/open-sans/open-sans-v14-latin-600italic.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-600italic.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-600italic.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-600italic.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-600italic.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-italic - latin +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 400; + src: url("../fonts/open-sans/open-sans-v14-latin-italic.eot"); + + // IE9 Compat Modes + src: local("Open Sans Italic"), local("OpenSans-Italic"), url("../fonts/open-sans/open-sans-v14-latin-italic.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-italic.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-italic.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-italic.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-italic.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-700italic - latin +@font-face { + font-family: "Open Sans"; + font-style: italic; + font-weight: 700; + src: url("../fonts/open-sans/open-sans-v14-latin-700italic.eot"); + + // IE9 Compat Modes + src: local("Open Sans Bold Italic"), local("OpenSans-BoldItalic"), url("../fonts/open-sans/open-sans-v14-latin-700italic.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-700italic.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-700italic.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-700italic.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-700italic.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// open-sans-700 - latin +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: url("../fonts/open-sans/open-sans-v14-latin-700.eot"); + + // IE9 Compat Modes + src: local("Open Sans Bold"), local("OpenSans-Bold"), url("../fonts/open-sans/open-sans-v14-latin-700.eot?#iefix") format("embedded-opentype"), url("../fonts/open-sans/open-sans-v14-latin-700.woff2") format("woff2"), url("../fonts/open-sans/open-sans-v14-latin-700.woff") format("woff"), url("../fonts/open-sans/open-sans-v14-latin-700.ttf") format("truetype"), url("../fonts/open-sans/open-sans-v14-latin-700.svg#OpenSans") format("svg"); +} + +// Legacy iOS + +// Material icons // +// fallback // +@font-face { + font-family: "Material Icons"; + font-style: normal; + font-weight: 400; + src: url("../fonts/material-icons/MaterialIcons-Regular.eot"); + src: local("Material Icons"), local("MaterialIcons-Regular"), url("../fonts/material-icons/MaterialIcons-Regular.woff2") format("woff2"), url("../fonts/material-icons/MaterialIcons-Regular.woff") format("woff"), url("../fonts/material-icons/MaterialIcons-Regular.ttf") format("truetype"); +} + +.material-icons { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -moz-font-feature-settings: "liga"; + -moz-osx-font-smoothing: grayscale; +} diff --git a/web/themes/joinup/prototype/scss/base/_heading.scss b/web/themes/joinup/prototype/scss/base/_heading.scss new file mode 100644 index 0000000000..0122607253 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_heading.scss @@ -0,0 +1,32 @@ +// Heading +// +// Markup: html/heading.html +// +// Styleguide 1.3 + +h1, +h2, +h3, +h4 { + font-weight: $font-weight-medium; +} + +h1 { + font-size: $font-size-h1; +} + +h2 { + font-size: $font-size-h2; +} + +h3 { + font-size: $font-size-h3; +} + +h4 { + font-size: $font-size-h4; +} + +h5 { + font-size: $font-size-h5; +} diff --git a/web/themes/joinup/prototype/scss/base/_input.scss b/web/themes/joinup/prototype/scss/base/_input.scss new file mode 100644 index 0000000000..e340a8275b --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_input.scss @@ -0,0 +1,134 @@ +// Input +// +// Markup: html/input.html +// +// Styleguide 1.11 + +// Component +// -------------------------------------------------- +// .mdl-textfield + +// Elements +// -------------------------------------------------- +.mdl-textfield__input { + height: 42px; + padding-top: 0; + padding-bottom: 0; + border-width: 1px; + border-color: $color-grey-input; + border-radius: 0; +} + +.mdl-textfield__label-container { + position: relative; +} + +.mdl-textfield__label { + font-size: $font-size-medium; + top: 10px; + color: $color-grey-input; + + &:after { + bottom: 0; + } +} + +.textfield__helptext { + font-size: $font-size-xsmall; + font-weight: $font-weight-thin; + display: block; + margin-top: 6px; + color: lighten($color-grey-medium, 10%); +} + +// Modifiers +// -------------------------------------------------- +.textfield--full-width { + width: 100%; +} + +.mdl-textfield--with-prefix { + @include breakpoint(sm) { + display: flex; + align-items: center; + } + + + .mdl-textfield__prefix { + margin-bottom: 20px; + + @include breakpoint(sm) { + min-width: 230px; + margin-bottom: 0; + } + } + + .mdl-textfield__label-container { + @include breakpoint(sm) { + width: 100%; + } + } +} + +// Dependiencies +// -------------------------------------------------- +.form-table { + &.field-multiple-table { + .mdl-textfield { + padding-top: 0; + padding-bottom: 0; + } + } + + &.responsive-enabled { + .mdl-textfield { + padding-top: 0; + padding-bottom: 0; + } + } +} + +// States +// -------------------------------------------------- +.mdl-textfield { + &.is-invalid { + .mdl-textfield__input { + border-width: 1px; + border-color: $color-grey-input; + } + + .mdl-textfield__label { + font-size: $font-size-medium; + color: $color-grey-input; + + &:after { + background-color: #a0a1a2; + } + } + } + + &.is-focused, + &.is-dirty { + .mdl-textfield__label { + font-size: $font-size-small; + top: -16px; + color: $color-blue-medium; + + &:after { + bottom: 0; + background-color: $color-blue-medium; + } + } + } +} + +.mdl-textfield--textarea { + &.is-focused, + &.is-dirty { + .mdl-textfield__input { + height: auto; + padding-top: 12px; + padding-bottom: 12px; + } + } +} diff --git a/web/themes/joinup/prototype/scss/base/_link.scss b/web/themes/joinup/prototype/scss/base/_link.scss new file mode 100644 index 0000000000..f9d7004fc9 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_link.scss @@ -0,0 +1,14 @@ +// Link +// +// Markup: html/link.html +// +// Styleguide 1.5 + +a { + color: #ee8917; + word-wrap: break-word; + + &[href]:after { + content: none !important; + } +} diff --git a/web/themes/joinup/prototype/scss/base/_ordered_list.scss b/web/themes/joinup/prototype/scss/base/_ordered_list.scss new file mode 100644 index 0000000000..ec8664c06e --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_ordered_list.scss @@ -0,0 +1,43 @@ +// Ordered list +// +// Markup: html/ordered-list.html +// +// Styleguide 1.6 + +article { + ol { + padding-left: 15px; + list-style-type: none; + counter-reset: step-counter; + + li { + margin-bottom: 4px; + + &:before { + margin-right: 5px; + counter-increment: step-counter; + content: counters(step-counter, ".") "."; + } + } + + // Indent + li { + &:before { + width: 4px; + height: 4px; + } + } + + ol, ul { + padding-left: 15px; + counter-reset: step-counter; + + li { + &:before { + width: 2px; + height: 2px; + } + } + } + } +} diff --git a/web/themes/joinup/prototype/sass/base/_paragraph.sass b/web/themes/joinup/prototype/scss/base/_paragraph.scss similarity index 100% rename from web/themes/joinup/prototype/sass/base/_paragraph.sass rename to web/themes/joinup/prototype/scss/base/_paragraph.scss diff --git a/web/themes/joinup/prototype/scss/base/_radio.scss b/web/themes/joinup/prototype/scss/base/_radio.scss new file mode 100644 index 0000000000..5b9807fa2d --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_radio.scss @@ -0,0 +1,46 @@ +// Radio +// +// Markup: html/radio.html +// +// Styleguide 1.9 + +// Component +// -------------------------------------------------- +.radio { + display: block; + margin: 15px 0; +} + +// Elements +// -------------------------------------------------- +.mdl-radio__inner-circle { + background: $color-blue-medium; +} + +// Modifiers +// -------------------------------------------------- +.radio--inline { + display: inline-block; + vertical-align: middle; + margin-right: 15px; + + &:last-of-type { + margin-right: 0; + } +} + +// Dependiencies +// -------------------------------------------------- +.mdl-radio__ripple-container { + .mdl-ripple { + background: $color-blue-medium; + } +} + +// States +// -------------------------------------------------- +.mdl-radio.is-checked { + .mdl-radio__outer-circle { + border-color: $color-blue-medium; + } +} diff --git a/web/themes/joinup/prototype/scss/base/_shared.scss b/web/themes/joinup/prototype/scss/base/_shared.scss new file mode 100644 index 0000000000..75ad0a1ec1 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_shared.scss @@ -0,0 +1,97 @@ +.bold, .bold a { + font-weight: $font-weight-bold; +} + +.italic { + font-style: italic; +} + +.underline { + text-decoration: underline; +} + +.uppercase { + text-transform: uppercase; +} + +.gray { + color: $color-grey-medium; +} + +.blue { + color: $color-blue-slider; +} + +.color-base, .color-base a { + color: $color-base; +} + +.left { + text-align: left; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.small { + font-size: $font-size-small; +} + +.truncated { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 100%; +} + +.hide--phone { + @include breakpoint(sm-mobile, mobile) { + display: none !important; + } +} + +.hide--tablet { + @include breakpoint(mobile, tablet) { + display: none !important; + } +} + +.hide--desktop { + @include breakpoint(tablet, desktop) { + display: none !important; + } +} + +.row { + margin-left: -16px; + margin-right: -16px; +} + +hr { + margin: 0; +} + +// Abstract classes +.white-box { + padding: 20px; + background-color: #fff; + + @include breakpoint(tablet) { + padding: 40px 30px; + } + + + @include breakpoint(desktop) { + padding: 40px 60px; + } +} + +.button-inline { + justify-content: space-between; + margin: 15px 15px 0 0; +} diff --git a/web/themes/joinup/prototype/scss/base/_table.scss b/web/themes/joinup/prototype/scss/base/_table.scss new file mode 100644 index 0000000000..19a44e52f6 --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_table.scss @@ -0,0 +1,48 @@ +// Table +// +// Markup: html/table.html +// +// Styleguide 1.8 + +table:not(.licence-comparer) { + width: 100%; + border-spacing: 0; + + thead { + th { + background-color: #fff; + text-align: left; + border-bottom: 1px solid $color-grey-light; + } + } + + tbody { + tr { + &:nth-child(odd) { + background-color: #fff; + } + + &:nth-child(even) { + background-color: $color-grey-lighter; + } + } + + td { + &.no { + color: $color-grey-medium; + } + } + } + + thead, + tbody { + th, + td { + padding: 15px; + + &.no { + text-align: center; + } + } + } +} diff --git a/web/themes/joinup/prototype/scss/base/_unordered_list.scss b/web/themes/joinup/prototype/scss/base/_unordered_list.scss new file mode 100644 index 0000000000..acf621df3a --- /dev/null +++ b/web/themes/joinup/prototype/scss/base/_unordered_list.scss @@ -0,0 +1,28 @@ +// Unordered list +// +// Markup: html/unordered-list.html +// +// Styleguide 1.7 + +article, .navigation-bottom { + ul { + padding-left: 15px; + list-style-type: none; + + li { + padding-left: 15px; + margin-bottom: 4px; + text-indent: -12px; + + &:before { + padding-right: 6px; + content: "•"; + color: $color-base; + } + } + + ul, ol { + padding-left: 15px; + } + } +} diff --git a/web/themes/joinup/prototype/sass/base/html/blockquote.html b/web/themes/joinup/prototype/scss/base/html/blockquote.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/blockquote.html rename to web/themes/joinup/prototype/scss/base/html/blockquote.html diff --git a/web/themes/joinup/prototype/sass/base/html/checkbox.html b/web/themes/joinup/prototype/scss/base/html/checkbox.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/checkbox.html rename to web/themes/joinup/prototype/scss/base/html/checkbox.html diff --git a/web/themes/joinup/prototype/sass/base/html/heading.html b/web/themes/joinup/prototype/scss/base/html/heading.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/heading.html rename to web/themes/joinup/prototype/scss/base/html/heading.html diff --git a/web/themes/joinup/prototype/sass/base/html/input.html b/web/themes/joinup/prototype/scss/base/html/input.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/input.html rename to web/themes/joinup/prototype/scss/base/html/input.html diff --git a/web/themes/joinup/prototype/sass/base/html/link.html b/web/themes/joinup/prototype/scss/base/html/link.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/link.html rename to web/themes/joinup/prototype/scss/base/html/link.html diff --git a/web/themes/joinup/prototype/sass/base/html/ordered-list.html b/web/themes/joinup/prototype/scss/base/html/ordered-list.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/ordered-list.html rename to web/themes/joinup/prototype/scss/base/html/ordered-list.html diff --git a/web/themes/joinup/prototype/sass/base/html/paragraph.html b/web/themes/joinup/prototype/scss/base/html/paragraph.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/paragraph.html rename to web/themes/joinup/prototype/scss/base/html/paragraph.html diff --git a/web/themes/joinup/prototype/sass/base/html/radio.html b/web/themes/joinup/prototype/scss/base/html/radio.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/radio.html rename to web/themes/joinup/prototype/scss/base/html/radio.html diff --git a/web/themes/joinup/prototype/sass/base/html/table.html b/web/themes/joinup/prototype/scss/base/html/table.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/table.html rename to web/themes/joinup/prototype/scss/base/html/table.html diff --git a/web/themes/joinup/prototype/sass/base/html/unordered-list.html b/web/themes/joinup/prototype/scss/base/html/unordered-list.html similarity index 100% rename from web/themes/joinup/prototype/sass/base/html/unordered-list.html rename to web/themes/joinup/prototype/scss/base/html/unordered-list.html diff --git a/web/themes/joinup/prototype/scss/components/_action-link.scss b/web/themes/joinup/prototype/scss/components/_action-link.scss new file mode 100644 index 0000000000..4cf08fdf4f --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_action-link.scss @@ -0,0 +1,59 @@ +// Action link +// +// Action link component + +// Component +// -------------------------------------------------- +.action-link, .action-link__wrapper a { + font-size: $font-size-xsmall; + font-weight: $font-weight-medium; + margin-right: 10px; + text-decoration: none; + text-transform: uppercase; + color: $color-base; + + &:last-of-type { + margin-right: 0; + } +} + +// Elements +// -------------------------------------------------- +.action-link__icon, +.action-link__title { + display: inline-block; + vertical-align: middle; +} + +.action-link__icon { + margin-right: 6px; + + @include icon-size(16px); +} + +// Modifiers +// -------------------------------------------------- +.action-link__wrapper--normal-case a { + font-weight: $font-weight-medium; + text-transform: none; +} + +// Dependiencies +// -------------------------------------------------- +.listing { + .action-link__wrapper { + margin-top: 20px; + } +} + +.timeline__listing { + > .action-link__wrapper { + margin: 30px 20px 10px 20px; + } +} + +.timeline__listing-item { + > .action-link__wrapper { + margin-top: 10px; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_alert.scss b/web/themes/joinup/prototype/scss/components/_alert.scss new file mode 100644 index 0000000000..61e10f1a6b --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_alert.scss @@ -0,0 +1,92 @@ +// Alert +// +// Alert messages. +// +// Markup: html/alert.html +// +// .alert--error - #eb5b5c +// .alert--warning - #ee8917 +// .alert--info - #2875cf +// .alert--success - #98c04c +// +// Styleguide 2.1 + +// Component +// -------------------------------------------------- +.alert { + position: relative; + margin-bottom: 40px; + padding: 20px 60px; + + @include border-radius(4px); +} + +// Elements +// -------------------------------------------------- +.alert__icon { + left: 15px; + color: #fff; + + @include icon-size(30px); + @include centered($horizontal: false, $vertical: true); +} + +.alert__message, .alert__message a { + color: #fff; +} + +.alert__close { + position: absolute; + top: 0; + right: 0; + opacity: 0.4; + color: #000; + + @include icon-size(30px); +} + +// Modifiers +// -------------------------------------------------- +.alert--error { + background-color: $color-error; +} + +.alert--warning { + background-color: $color-warning; +} + +.alert--info { + background-color: $color-info; +} + +.alert--success, +.alert--status { + background-color: $color-success; +} + +// Drupal hacks +.form-managed-file { + .messages { + color: #fff; + position: relative; + margin-bottom: 20px; + padding: 20px 60px; + + @include border-radius(4px); + } + + .messages--error { + background-color: $color-error; + } +} + +// Dependencies +.listing__item { + .alert { + padding: 10px; + + .icon { + display: none; + } + } +} diff --git a/web/themes/joinup/prototype/sass/components/_announcement.sass b/web/themes/joinup/prototype/scss/components/_announcement.scss similarity index 58% rename from web/themes/joinup/prototype/sass/components/_announcement.sass rename to web/themes/joinup/prototype/scss/components/_announcement.scss index f112485c5f..e01960299d 100644 --- a/web/themes/joinup/prototype/sass/components/_announcement.sass +++ b/web/themes/joinup/prototype/scss/components/_announcement.scss @@ -1,14 +1,16 @@ // Component // -------------------------------------------------- -.announcement - padding: 40px 0 - background-color: #f0f7f7 +.announcement { + padding: 40px 0; + background-color: #f0f7f7; +} // Elements // -------------------------------------------------- -.announcement__content - line-height: 1.6 - color: $color-grey-medium +.announcement__content { + line-height: 1.6; + color: $color-grey-medium; +} // Modifiers // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_avatar.sass b/web/themes/joinup/prototype/scss/components/_avatar.scss similarity index 60% rename from web/themes/joinup/prototype/sass/components/_avatar.sass rename to web/themes/joinup/prototype/scss/components/_avatar.scss index 7c5f25f514..db50e4ff82 100644 --- a/web/themes/joinup/prototype/sass/components/_avatar.sass +++ b/web/themes/joinup/prototype/scss/components/_avatar.scss @@ -1,24 +1,28 @@ // Component // -------------------------------------------------- -.avatar - +border-radius(50%) +.avatar { + @include border-radius(50%); +} // Elements // -------------------------------------------------- // Modifiers // -------------------------------------------------- -.avatar--25 - width: 25px - height: 25px +.avatar--25 { + width: 25px; + height: 25px; +} -.avatar--50 - width: 50px - height: 50px +.avatar--50 { + width: 50px; + height: 50px; +} -.avatar--70 - width: 70px - height: 70px +.avatar--70 { + width: 70px; + height: 70px; +} // Dependiencies // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_background.sass b/web/themes/joinup/prototype/scss/components/_background.scss similarity index 72% rename from web/themes/joinup/prototype/sass/components/_background.sass rename to web/themes/joinup/prototype/scss/components/_background.scss index ffe8ab976a..3659ad88c2 100644 --- a/web/themes/joinup/prototype/sass/components/_background.sass +++ b/web/themes/joinup/prototype/scss/components/_background.scss @@ -1,12 +1,13 @@ // Component // -------------------------------------------------- -.bg +.bg {} // Elements // -------------------------------------------------- // Modifiers // -------------------------------------------------- -.bg--blue - background-color: $color-blue-medium - color: #fff \ No newline at end of file +.bg--blue { + background-color: $color-blue-medium; + color: #fff; +} diff --git a/web/themes/joinup/prototype/scss/components/_block.scss b/web/themes/joinup/prototype/scss/components/_block.scss new file mode 100644 index 0000000000..9efc4cc026 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_block.scss @@ -0,0 +1,38 @@ +// Block +// + +// Component +// -------------------------------------------------- +//.block + +// Elements +// -------------------------------------------------- +.block__title { + margin: 30px 0; +} + +// Modifiers +// -------------------------------------------------- +.block--separated { + margin-top: 40px; + border-top: 1px solid $color-grey-light; +} + +.block-facet--checkbox { + h2 { + margin-top: 8px; + margin-bottom: $tile-margin; + } + + .item-list__checkbox { + list-style: none; + margin-top: 0; + padding: 0; + } + + .mdl-checkbox__label { + color: $color-base; + font-size: $font-size-small; + font-weight: $font-weight; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_button.scss b/web/themes/joinup/prototype/scss/components/_button.scss new file mode 100644 index 0000000000..e3bfc61e3e --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_button.scss @@ -0,0 +1,156 @@ +// Button +// +// Markup: html/button.html +// +// .button - #32afff +// .button--blue - #2875cf +// .button--transparent - Transparent +// .button--full-width - Full-width +// +// Styleguide 2.2 + +// Component +// -------------------------------------------------- +.button { + font-weight: $font-weight-medium; + font-weight: $font-weight-bold; + line-height: normal; + height: auto; + padding: 15px 30px; + text-decoration: none; + letter-spacing: 2px; + text-transform: uppercase; + color: #fff; + border-width: 3px !important; + border-style: solid; + border-color: $color-blue-lighter; + background-color: $color-blue-lighter !important; + background-image: none !important; + white-space: nowrap; + + @include hidden-print; + @include border-radius(4px); +} + +// Elements +// -------------------------------------------------- +.button__no-bg-wrapper { + position: relative; + display: inline-block; + height: 22px; + cursor: pointer; + vertical-align: middle; + + .icon { + @include z-index(highlight); + @include icon-size(10px); + @include centered($horizontal: false, $vertical: true); + } +} + +.button__no-bg { + font-weight: $font-weight-bold; + position: relative; + display: inline-block; + cursor: pointer; + vertical-align: middle; + letter-spacing: 2px; + text-transform: uppercase; + border: none; + background-color: transparent !important; + + @include z-index(highlight + 1); +} + +.button__container { + margin: 10px 0; +} + +// Modifiers +// -------------------------------------------------- +.button--blue { + color: #fff; + border-color: $color-blue-medium !important; + background-color: $color-blue-medium !important; +} + +.button--blue.is-disabled { + color: $color-grey-input; + border-color: $color-grey-light !important; + background-color: $color-grey-light !important; +} + +.button--blue-light { + border-color: $color-blue-lighter !important; + background-color: $color-blue-lighter !important; +} + +.button--transparent { + color: $color-grey-medium !important; + border-color: $color-grey-medium; + background-color: transparent !important; +} + +.button--blue-important { + border-color: $color-blue-medium; + background-color: $color-blue-medium !important; + + &:hover { + border-color: $color-blue-medium; + } +} + +.button--full-width { + width: 100%; +} + +.button--icon { + .icon { + margin-right: 5px; + } +} + +.button__no-bg-wrapper--circle { + .icon { + padding: 3px; + color: $color-blue-medium; + border: 2px solid $color-blue-medium; + border-radius: 50%; + } + + .button__no-bg { + line-height: 20px; + padding: 0 0 0 30px; + color: $color-blue-medium; + } + + &:hover { + .icon { + color: $color-blue-lighter; + border-color: $color-blue-lighter; + } + + .button__no-bg { + color: $color-blue-lighter; + } + } +} + +.button__no-bg-wrapper--grey { + .icon { + color: $color-grey-input; + } + + .button__no-bg { + padding: 0 0 0 20px; + color: $color-grey-input; + } +} + +// Dependiencies +// -------------------------------------------------- +.adms-validator-form { + .button { + margin-top: $form-margin; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_chip.scss b/web/themes/joinup/prototype/scss/components/_chip.scss new file mode 100644 index 0000000000..1ccf792697 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_chip.scss @@ -0,0 +1,62 @@ +// Chip +// +// Markup: todo. +// + +// Component +// -------------------------------------------------- +.mdl-chip { + height: 32px; + line-height: 32px; + padding: 0 12px; + border: 0; + border-radius: 16px; + background-color: #dedede; + display: inline-block; + color: rgba(0, 0, 0, 0.87); + margin: 2px 0; + font-size: 0; + white-space: nowrap; +} + +.mdl-chip__text { + font-size: 13px; + vertical-align: middle; + display: inline-block; +} + +.mdl-chip__action { + height: 24px; + width: 24px; + border-radius: 12px; + background: #767676 none !important; + opacity: 0.54; + cursor: pointer; + padding: 0; + margin: 0 0 0 4px; + font-size: 13px; + text-decoration: none; + color: rgba(0, 0, 0, 0.87); + border: none; + outline: none; + display: inline-block; + vertical-align: middle; + overflow: hidden; + text-align: center; + + &:focus, + &:active { + background-color: #4e4e4e !important; + } + + .icon { + font-size: 13px; + color: #fff; + position: relative; + left: 1px; + } +} + +.mdl-chip--deletable { + padding-right: 4px; +} diff --git a/web/themes/joinup/prototype/scss/components/_chipfield.scss b/web/themes/joinup/prototype/scss/components/_chipfield.scss new file mode 100644 index 0000000000..478ab3c230 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_chipfield.scss @@ -0,0 +1,74 @@ +// Chipfield +// +// Markup: todo. +// + +// Component +// -------------------------------------------------- +.mdl-chipfield { + //cursor: text + //padding-bottom: 0 + //margin-bottom: 20px + //border-bottom: 1px solid lightgrey + .inputs { + margin-left: 5px; + + //float: left + width: 100%; + display: inline-block; + + //position: relative + + } + + .mdl-chip { + position: absolute; + top: 15px; + left: 55px; + + @include z-index(navigation); + + //float: left + //margin-top: 15px + //margin-right: 5px + + } + + .mdl-textfield__input { + // ~ same height as the chips + 2*4 for the padding + //height: 38px + //border-bottom: none + + } + + .mdl-textfield__label { + top: 8px; + } + + // hide stuff from MaterialTextField + .mdl-textfield__label:after { + display: none; + } + + // search results + .results { + width: 100%; + max-height: 200px; + overflow-y: auto; + list-style: none; + position: absolute; + background-color: white; + z-index: 10; + padding: 0; + margin-top: 1px; + } + + .results li { + cursor: pointer; + padding: 10px 5px 10px 10px; + + &:hover, &.is-selected { + background-color: rgb(238, 238, 238); + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_circle-menu.scss b/web/themes/joinup/prototype/scss/components/_circle-menu.scss new file mode 100644 index 0000000000..c4428eff9c --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_circle-menu.scss @@ -0,0 +1,73 @@ +// Circle menu +// +// Markup: html/circle-menu.html +// +// Styleguide 2.3 + +// Component +// -------------------------------------------------- +// .circle-menu + +// Elements +// -------------------------------------------------- +.circle-menu__button { + background-color: $color-orange !important; + + .icon { + @include centered; + } +} + +// Modifiers +// -------------------------------------------------- +.circle-menu--tablet { + display: none; + + @include breakpoint(mobile) { + display: block; + } +} + +.circle-menu--mobile { + @include breakpoint(mobile) { + display: none; + } +} + +.circle-menu__link { + min-width: 130px; +} + +// Dependiencies +// -------------------------------------------------- +.circle-menu--tablet { + .mdl-menu__container { + margin-top: 10px; + } +} + +.circle-menu--mobile { + .mdl-menu__container { + margin-bottom: 10px; + } +} + +.circle-menu__button { + .icon { + color: #fff; + + @include icon-size(28px); + } + + .mdl-ripple { + background-color: #fff; + } +} + +.featured__menu-wrapper { + .circle-menu--tablet { + .mdl-menu__container { + margin-top: -15px; + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_comment.scss b/web/themes/joinup/prototype/scss/components/_comment.scss new file mode 100644 index 0000000000..b9d8d06828 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_comment.scss @@ -0,0 +1,104 @@ +// Component +// -------------------------------------------------- + +// Elements +// -------------------------------------------------- +.comment-item { + position: relative; + margin-top: 0; + margin-bottom: 0; + border-top: 2px solid $color-grey-bg; + width: 100%; + + &:first-of-type { + border-top: none; + } +} + +.comment-item__field { + margin-bottom: 15px; + + &:last-of-type { + margin-bottom: 0; + } +} + +.comment-item__blockquote { + font-weight: $font-weight-thin; + font-style: italic; + padding-left: 26px; + color: darken($color-grey-light, 8%); + border-left: 4px solid lighten($color-grey-light, 4%); +} + +.comment-item__stats { + text-align: right; +} + +.comment-item__text { + @extend .listing__text; +} + +.comment-item__icon { + @extend .listing__icon; +} + +.comment-form { + @include hidden-print; + + margin-top: 70px; + margin-bottom: 0; + padding-top: 50px; + padding-right: 20px; + padding-bottom: 50px; + padding-left: 20px; + background-color: #fff; + + .form__actions { + width: 100%; + text-align: right; + } + + .button { + margin: 0; + } + + @include breakpoint(tablet) { + padding-right: 60px; + padding-left: 60px; + } +} + +// Modifiers +// -------------------------------------------------- +.comment-item--default { + padding: 7px; + background-color: #fff; +} + +.comment-item--load-more { + min-height: 70px; + border: 5px solid darken($color-grey-light, 1%); + background-color: $color-grey-bg; +} + +.comment-form--unavailable { + margin-top: 20px; + padding-top: 40px; + padding-bottom: 40px; + margin-left: 0; + margin-right: 0; + width: 100%; +} + +.comment-form--disabled { + margin-top: 4px; + padding-top: 40px; + padding-bottom: 40px; +} + +.comment-item, .comment-form { + .details__element a { + color: $color-grey-medium; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_details.scss b/web/themes/joinup/prototype/scss/components/_details.scss new file mode 100644 index 0000000000..0e0af63e88 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_details.scss @@ -0,0 +1,127 @@ +// Component +// -------------------------------------------------- + +// Elements +// -------------------------------------------------- +.details__element { + font-size: $font-size-xsmall; + display: inline-block; + margin-right: 10px; + margin-top: 5px; + padding-right: 10px; + vertical-align: middle; + border-right: 1px solid $color-grey-medium; + + &:last-of-type { + margin-right: 0; + padding-right: 0; + border-right: none; + } + + * { + display: inline; + } +} + +.details__element-item a { + color: $color-blue-dark; + font-weight: $font-weight-bold; +} + +.details__user { + margin: 5px 0 0 0; + display: inline-block; +} + +.details__avatar { + margin-right: 10px; + + img { + width: 40px; + height: 40px; + background-color: #fff; + + @include border-radius(50%); + } +} + +.details__user-item { + display: inline-block; + + a { + color: $color-grey-medium; + text-decoration: none; + } +} + +.details__element-headline { + margin-top: 0; + + h2 { + font-size: $font-size-xsmall; + font-weight: $font-weight; + margin: 0; + } +} + +.details__element-created { + display: inline-block; + vertical-align: middle; + margin-top: 0; +} + +.details__bottom { + .tag { + margin-right: 1px; + + &:after { + content: ","; + } + + &:last-of-type { + margin-right: 0; + + &:after { + content: none; + } + } + } +} + +// Modifiers +// -------------------------------------------------- +.details__element--block { + display: block; + border: none; + + a { + color: $color-grey-medium; + font-weight: $font-weight-medium; + } +} + +.details__element--single { + @include number-rows(1, $row-height-small); +} + +// Dependiencies +// -------------------------------------------------- +.page__title-wrapper { + .details { + margin: 10px 0; + + @include breakpoint(mobile) { + margin: 0; + } + } +} + +.timeline__listing-details { + .details__element { + @include breakpoint(sm-mobile, mobile) { + margin-right: 0; + padding-right: 0; + border-right: none; + } + } +} diff --git a/web/themes/joinup/prototype/sass/components/_draggable.sass b/web/themes/joinup/prototype/scss/components/_draggable.scss similarity index 76% rename from web/themes/joinup/prototype/sass/components/_draggable.sass rename to web/themes/joinup/prototype/scss/components/_draggable.scss index a745995137..503277ace2 100644 --- a/web/themes/joinup/prototype/sass/components/_draggable.sass +++ b/web/themes/joinup/prototype/scss/components/_draggable.scss @@ -9,15 +9,18 @@ // Elements // -------------------------------------------------- -.draggable__icon - color: $color-grey-medium - text-decoration: none - font-size: 25px +.draggable__icon { + color: $color-grey-medium; + text-decoration: none; + font-size: 25px; + &:hover, &:active, - &:focus - color: $color-base - + &:focus { + color: $color-base; + } +} + // Modifiers // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_ec-menu.scss b/web/themes/joinup/prototype/scss/components/_ec-menu.scss new file mode 100644 index 0000000000..a7e944d98b --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_ec-menu.scss @@ -0,0 +1,39 @@ +// European Commision menu +// +// Component +// -------------------------------------------------- +.ec-menu { + list-style-type: none; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + + @include flex; + @include flex-direction(row); + @include flex-wrap(wrap); + @include justify-content(flex-start); + @include align-items(center); +} + +// Elements +// -------------------------------------------------- +.ec-menu__item { + margin-right: 20px; + margin-bottom: 5px; +} + +.ec-menu__link { + color: #c0d0e3; + text-decoration: underline; +} + +// Modifiers +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.ec-menu__link { + &:hover { + text-decoration: none; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_editor-area.scss b/web/themes/joinup/prototype/scss/components/_editor-area.scss new file mode 100644 index 0000000000..67e5af2330 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_editor-area.scss @@ -0,0 +1,26 @@ +// Component +// -------------------------------------------------- +.editor-area {} + +// Elements +// -------------------------------------------------- +.editor-area__helptext { + display: none; +} + +.editor-area { + .filter-wrapper { + label { + margin-right: 10px; + font-size: 12px; + color: $color-base; + } + + .form__label, select { + display: inline-block; + } + } +} + +// Modifiers +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_etiquette.scss b/web/themes/joinup/prototype/scss/components/_etiquette.scss new file mode 100644 index 0000000000..aac0351b38 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_etiquette.scss @@ -0,0 +1,48 @@ +// Etiquette +// +// Markup: html/etiquette.html +// +// Etiquette used next to the listing block title. +// +// .etiquette--blue - Blue colored - #eb5b5c +// +// Styleguide 2.4 + +// Component +// -------------------------------------------------- +.etiquette { + font-size: $font-size-xsmall; + font-weight: $font-weight; + display: inline-block; + padding: 5px 20px; + vertical-align: middle; + + @include border-radius(15px); + @include breakpoint(mobile) { + margin-left: 10px; + margin-bottom: 0; + } +} + +// Elements +// -------------------------------------------------- + +// Modifiers +// -------------------------------------------------- +.etiquette--blue { + color: #fff; + background-color: lighten($color-blue-default, 15%); +} + +.etiquette--red { + color: #fff; + background-color: $color-error; + + a { + color: #fff; + text-decoration: none; + } +} + +// Dependiencies +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_featured-lg.scss b/web/themes/joinup/prototype/scss/components/_featured-lg.scss new file mode 100644 index 0000000000..3386c249f7 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_featured-lg.scss @@ -0,0 +1,140 @@ +// Featured large +// +// Featured large component + +// Component +// -------------------------------------------------- +.featured-lg { + position: relative; + margin: 0 auto; + padding: 20px 0; + background: $color-blue-default url("../images/featured-lg-background.jpg") no-repeat center top; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + +// Elements +// -------------------------------------------------- +.featured-lg__wrapper { + position: relative; + max-width: 970px; + margin: 0 auto; + text-align: center; + color: #fff; + + @include z-index(highlight); +} + +.featured-lg__text, +.featured-lg__search-bar { + margin-bottom: 30px; + + @include breakpoint(tablet) { + margin-bottom: 60px; + } +} + +.featured-lg__logo { + margin-top: 40px; + margin-bottom: 30px; + + img { + height: 60px; + } + + @include breakpoint(tablet) { + margin-bottom: 40px; + + img { + height: 90px; + } + } +} + +.featured-lg__stats { + margin-bottom: 40px; +} + +.featured-lg__text { + margin-top: 0; + padding: 0 20px; + font-weight: $font-weight-thin; + max-width: 540px; + margin-left: auto; + margin-right: auto; +} + +// Dependiencies +// -------------------------------------------------- +.featured-lg__stats { + .stats__wrapper { + position: relative; + text-align: left; + + @include breakpoint(sm-mobile, mobile) { + width: 200px; + margin: 0 auto 30px auto; + } + + + @include breakpoint(mobile) { + display: inline-block; + vertical-align: top; + + &:last-child { + margin-right: 0; + } + } + + + @include breakpoint(mobile, tablet) { + width: 25%; + margin-right: 5%; + } + + + @include breakpoint(tablet) { + width: 200px; + margin-right: 40px; + } + + + a { + color: #fff; + display: inline-block; + text-decoration: none; + } + } + + .stats__icon { + position: absolute; + top: 6px; + left: 0; + + @include icon-size(45px); + } + + .stats__text { + margin-bottom: 15px; + padding-left: 60px; + } + + .stats__description { + text-align: left; + } +} + +// Modifiers +// -------------------------------------------------- +.featured-lg__stats { + .stats__text--upper, + .stats__text--lower { + text-align: left; + } + + .stats__text--upper { + font-size: 32px; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_featured.scss b/web/themes/joinup/prototype/scss/components/_featured.scss new file mode 100644 index 0000000000..baf6bf13aa --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_featured.scss @@ -0,0 +1,309 @@ +// Featured +// +// Featured component + +// Component +// -------------------------------------------------- +.featured { + position: relative; + margin: 0 auto; +} + +// Elements +// -------------------------------------------------- +.featured__outer-wrapper { + background: url("../images/featured-bg.jpg") no-repeat center top; + position: relative; + margin: 0 auto; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; +} + +.featured__inner-wrapper { + position: relative; + max-width: 1200px; + margin: 0 auto; + text-align: center; + padding: 20px 0; + + @include z-index(highlight + 1); + + a { + text-decoration: none; + } + + @media print { + padding: 0; + padding-bottom: 20px; + } +} + +.featured__menu-wrapper { + position: relative; + max-width: 1200px; + margin: 0 auto; + text-align: center; + + @include z-index(dropdown); + @include hidden-print; +} + +.featured__overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.6; + background-color: $color-blue-default; + + @include z-index(highlight); +} + +.featured__link-wrapper { + color: inherit; + text-decoration: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + + @include z-index(highlight + 2); +} + +.featured__link-wrapper--outer { + @include z-index(highlight + 1); +} + +.featured__text { + position: relative; + margin: 0 0 20px 0; + padding: 0; + text-align: center; + letter-spacing: 2px; + color: #fff; + font-size: $font-size-h2; + + @include breakpoint(mobile) { + font-size: $font-size-h1; + margin: 0; + text-align: left; + } +} + +.featured__logo { + margin: 0 0 10px 0; + + @include breakpoint(mobile) { + margin: 0 20px 0 0; + } +} + +.featured__title-wrapper { + margin: 0; + padding: 0; + + @include breakpoint(mobile) { + margin: 0 0 20px 0; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: center; + } +} + +.featured__text-small { + font-size: $font-size-xsmall; + text-transform: none; + word-wrap: break-word; +} + +.featured__text--double { + margin: 0 0 30px 0; + text-transform: none; + + @include breakpoint(mobile) { + margin-bottom: 20px; + } + + + h1 { + margin: 0; + } +} + +.featured__text-upper { + text-transform: uppercase; +} + +.featured__stats { + display: inline-block; + margin-bottom: 10px; + text-align: left; + vertical-align: middle; + background-color: #fff; + padding: 0 15px; + + @include border-radius(3px); + + color: $color-base; + + a { + color: $color-base; + display: inline-block; + vertical-align: middle; + } + + @include breakpoint(mobile) { + margin: 0 10px; + } + + + .stats__column { + display: inline-block; + vertical-align: middle; + padding: 15px; + min-width: 0; + } + + .stats__wrapper { + margin-bottom: 4px; + + &:last-child { + margin-bottom: 0; + } + } + + .stats__icon, + .stats__text { + display: inline-block; + vertical-align: middle; + } + + .stats__icon { + margin-right: 4px; + + @include icon-size(20px); + } + + .stats__row { + .stats__column { + padding-top: 0; + } + + &:first-child { + .stats__column { + padding-top: 15px; + } + } + } + + .stats__text a { + text-decoration: underline; + } +} + +.featured__action { + display: inline-block; + vertical-align: middle; +} + +.featured__form-button { + position: relative; + display: inline-block; + margin: 10px; + + @include z-index(max); + @include hidden-print; +} + +// Style social media links for user +.featured__container { + margin-bottom: 20px; +} + +.featured__icon { + margin-bottom: 15px; + + .icon { + color: #fff; + font-size: 50px; + } +} + +.featured__navy-blue-wrapper { + margin: 45px 0; +} + +// Modifiers +// -------------------------------------------------- +.featured__stats { + .stats__wrapper--centered { + text-align: center; + } + + .stats__column--border { + border-right: 1px solid $color-grey-light; + } + + @include breakpoint(desktop) { + .stats__column--wide { + min-width: 165px; + } + + .stats__column--icons { + padding-left: 30px; + } + + .stats__column--border { + padding-right: 30px; + } + } +} + +.featured--navy-blue { + max-width: 1200px; + justify-content: center; +} + +.featured__text--centered { + text-align: center; +} + +// Dependiencies +// -------------------------------------------------- +.featured__menu-wrapper { + .button--default { + @include breakpoint(sm-mobile, mobile) { + display: block; + margin: 0 auto; + } + } + + .circle-menu { + position: fixed; + right: 40px; + bottom: 40px; + + @include breakpoint(mobile) { + position: absolute; + bottom: -40px; + width: 80px; + height: 80px; + border-radius: 50%; + background-color: $color-grey-bg; + } + + + @include breakpoint(lg-desktop) { + right: 0; + } + } + + .circle-menu__button { + @include centered; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_fieldset.scss b/web/themes/joinup/prototype/scss/components/_fieldset.scss new file mode 100644 index 0000000000..a1503109da --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_fieldset.scss @@ -0,0 +1,225 @@ +// Fieldset + +// Component +// -------------------------------------------------- +.fieldset { + margin-bottom: 25px; + + &:last-of-type { + margin-bottom: 0; + } +} + +// Elements +// -------------------------------------------------- +.fieldset__header { + margin-top: 0; + margin-bottom: 10px; + + h3 { + margin-top: 0; + margin-bottom: 0; + } +} + +.fieldset__field { + margin-bottom: $field-margin; + + &:last-of-type { + margin-bottom: 0; + } +} + +.fieldset__field-label { + font-weight: $font-weight-medium; + margin-top: 0; +} + +.fieldset__field-item { + word-wrap: break-word; +} + +.fieldset__title { + margin-top: 0; +} + +.fieldset { + p:last-child { + margin-bottom: 0; + } +} + +.fieldset__show-more-link { + display: block; + margin-top: $field-margin; + + .icon--arrow-down { + transition: transform 300ms; + } + + &.is-expanded { + .icon--arrow-down { + transform: rotateZ(-180deg); + } + } +} + +.fieldset__extra-items { + html.js & { + display: none; + } +} + +.fieldset__read-more { + display: inline; +} + +.fieldset__table-wrapper { + overflow-x: auto; +} + +.fieldset--abstract-wrapper { + margin-bottom: 16px; + + > p { + display: inline; + } +} + +// Modifiers +// -------------------------------------------------- +.fieldset--separated { + margin-top: 40px; +} + +.fieldset--box { + margin: $form-margin -20px; + padding: 20px; + background: $color-grey-lighter; + + @include breakpoint(tablet) { + margin-right: -30px; + margin-left: -30px; + padding: 40px 30px; + } + + + @include breakpoint(desktop) { + margin-right: -60px; + margin-left: -60px; + padding: 40px 60px; + } + + + &:last-child { + margin-bottom: -20px; + + @include breakpoint(tablet) { + margin-bottom: -40px; + } + } +} + +.fieldset__field--multiple { + .fieldset__field-item { + margin-bottom: $field-margin; + + &:last-of-type { + margin-bottom: 0; + } + } +} + +.fieldset--border-bottom { + position: relative; + margin-bottom: 25px; + padding-bottom: 25px; + margin-right: -20px; + margin-left: -20px; + padding-right: 20px; + padding-left: 20px; + border-bottom: 2px solid $color-grey-light; + + @include breakpoint(sm) { + margin-right: -30px; + margin-left: -30px; + padding-right: 30px; + padding-left: 30px; + } + + + @include breakpoint(md) { + margin-right: -60px; + margin-left: -60px; + padding-right: 60px; + padding-left: 60px; + } +} + +.fieldset--textarea { + overflow: hidden; + + img { + margin-bottom: 16px; + } + + img.align-left { + float: none; + + @include breakpoint(xs) { + float: left; + margin-right: 20px; + } + } + + img.align-right { + float: none; + + @include breakpoint(xs) { + float: right; + margin-left: 20px; + } + } + + table { + @include breakpoint(md) { + table-layout: fixed; + } + + + td { + vertical-align: top; + min-width: 100px; + } + } +} + +.fieldset__field--files { + .icon, + .fieldset__file-wrapper { + display: inline-block; + } + + .file, + .fieldset__file-size { + display: block; + } + + .fieldset__field-item { + margin-bottom: $tile-margin; + + &:last-child { + margin: 0; + } + } + + .icon { + margin-right: $tile-margin; + } +} + +// Dependiencies +// -------------------------------------------------- + +// States +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_file-upload.sass b/web/themes/joinup/prototype/scss/components/_file-upload.scss similarity index 55% rename from web/themes/joinup/prototype/sass/components/_file-upload.sass rename to web/themes/joinup/prototype/scss/components/_file-upload.scss index 71a57ccb14..7bbfe365a4 100644 --- a/web/themes/joinup/prototype/sass/components/_file-upload.sass +++ b/web/themes/joinup/prototype/scss/components/_file-upload.scss @@ -11,20 +11,24 @@ // Elements // -------------------------------------------------- -.file-upload__wrapper - padding: 30px - text-align: center - border: 2px dashed lighten($color-grey-medium, 20%) - +border-radius(4px) - -.file-upload__heading - font-weight: $font-weight - margin-top: 0 - color: darken($color-grey-medium, 10%) - -.file-upload__description - margin-top: 24px - color: lighten($color-grey-medium, 10%) +.file-upload__wrapper { + padding: 30px; + text-align: center; + border: 2px dashed lighten($color-grey-medium, 20%); + + @include border-radius(4px); +} + +.file-upload__heading { + font-weight: $font-weight; + margin-top: 0; + color: darken($color-grey-medium, 10%); +} + +.file-upload__description { + margin-top: 24px; + color: lighten($color-grey-medium, 10%); +} // Modifiers // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_filters.scss b/web/themes/joinup/prototype/scss/components/_filters.scss new file mode 100644 index 0000000000..90c226ebc0 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_filters.scss @@ -0,0 +1,150 @@ +// Filters +// +// Filters used in the collection/solution listings. +// +// Markup: html/filters.html +// +// Styleguide 2.6 + +// Component +// -------------------------------------------------- +.filter { + margin-bottom: 15px; + padding-left: 0; + position: relative; + + &:before { + display: none; + } + + @include breakpoint(mobile) { + display: inline-block; + margin-right: 10px; + vertical-align: top; + } +} + +.filters { + padding-left: 0; + + @include breakpoint(sm-mobile, mobile) { + text-align: left; + } +} + +// Elements +// -------------------------------------------------- +.filter__label, +.filter__term, +.filter__icon { + display: inline-block; + vertical-align: middle; +} + +.filter__term a { + text-decoration: none; +} + +.filter__icon { + position: relative; + cursor: pointer; + top: 1px; + margin-left: 4px; + color: $color-base; + + @include icon-size(12px); +} + +.filter__dropdown-toggle { + font-size: 14px; + position: relative; + border: none; + outline: none; + background: none; + + .filter__label { + color: $color-orange; + } +} + +.filter__dropdown { + display: none; + margin-top: 15px; + padding: 30px; + background-color: #fff; + + .filters { + margin-bottom: 0; + } +} + +.filter__menu { + min-width: 200px; +} + +.filters--more { + .facet-item { + margin-bottom: 0; + width: 100%; + } +} + +// Modifiers +// -------------------------------------------------- +.filters--solutions { + margin-top: 30px; + margin-bottom: 10px; +} + +.filters--horizontal { + position: relative; + + .facet-item { + &:before { + content: none; + } + } + + .mdl-menu__container { + margin-top: 10px; + } +} + +// Dependencies +// -------------------------------------------------- +.listing__header { + .filter { + font-size: $font-size-base; + display: inline; + margin-bottom: 0; + } +} + +// States +// -------------------------------------------------- +.filter__dropdown-toggle { + &.is-active { + &:before { + bottom: -30px; + display: block; + width: 0; + height: 0; + content: ""; + border-right: 12px solid transparent; + border-bottom: 12px solid #fff; + border-left: 12px solid transparent; + + @include centered($horizontal: true, $vertical: false); + } + } +} + +.filter__dropdown { + &.is-active { + display: block; + } +} + +.filters--more { + margin-top: 0; +} diff --git a/web/themes/joinup/prototype/scss/components/_footer-ec-menu.scss b/web/themes/joinup/prototype/scss/components/_footer-ec-menu.scss new file mode 100644 index 0000000000..f67628bf88 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_footer-ec-menu.scss @@ -0,0 +1,45 @@ +// Footer EC menu +// +// Markup: html/footer-ec-menu.html +// +// European Commission menu placed in the footer second +// +// Styleguide 2.14.2 + +// Component +// -------------------------------------------------- +.ec-menu { + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + list-style-type: none; + + @include flex; + @include flex-direction(row); + @include flex-wrap(wrap); + @include justify-content(flex-start); + @include align-items(center); +} + +// Elements +// -------------------------------------------------- +.ec-menu__item { + margin-right: 20px; + margin-bottom: 5px; +} + +.ec-menu__link { + text-decoration: underline; + color: #fff; +} + +// Modifiers +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.ec-menu__link { + &:hover { + text-decoration: none; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_footer-social-media.scss b/web/themes/joinup/prototype/scss/components/_footer-social-media.scss new file mode 100644 index 0000000000..b412d4d4a6 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_footer-social-media.scss @@ -0,0 +1,90 @@ +// Footer social media +// +// Markup: html/footer-social-media.html +// +// Joinup social media menu with icons placed in the footer first +// +// Styleguide 2.14.1 + +// Component +// -------------------------------------------------- +.social-media { + display: flex; +} + +// Elements +// -------------------------------------------------- +.social-media__label { + font-weight: $font-weight-bold; + margin-top: 0; + margin-bottom: 0; + color: #fff; + white-space: nowrap; + margin-right: 10px; +} + +.social-media__menu { + margin-top: 2px; + margin-bottom: 0; + padding-left: 0; + list-style-type: none; + + @include inline-flex; + @include flex-direction(row); + @include flex-wrap(wrap); + @include justify-content(flex-start); + @include align-items(center); +} + +.social-media__item { + margin-right: 10px; + margin-bottom: 10px; + + &:last-child { + margin-right: 0; + } +} + +.social-media__link { + text-decoration: none; + + @include flex; + @include flex-direction(row); + @include flex-wrap(nowrap); + @include justify-content(flex-start); + @include align-items(center); +} + +// Modifiers +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- +.social-media__link { + span:first-child { + margin-right: 10px; + + &:last-child { + margin-right: 0; + } + } + + .icon, + .text { + color: #fff; + } + + .text { + text-decoration: underline; + } +} + +// States +// -------------------------------------------------- +.social-media__link { + &:hover { + .text { + text-decoration: none; + } + } +} diff --git a/web/themes/joinup/prototype/sass/components/_footer.sass b/web/themes/joinup/prototype/scss/components/_footer.scss similarity index 87% rename from web/themes/joinup/prototype/sass/components/_footer.sass rename to web/themes/joinup/prototype/scss/components/_footer.scss index 302632e111..3309885440 100644 --- a/web/themes/joinup/prototype/sass/components/_footer.sass +++ b/web/themes/joinup/prototype/scss/components/_footer.scss @@ -1,3 +1,3 @@ // Footer -// +// // Styleguide 2.14 diff --git a/web/themes/joinup/prototype/scss/components/_form-table.scss b/web/themes/joinup/prototype/scss/components/_form-table.scss new file mode 100644 index 0000000000..fdf9026d82 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_form-table.scss @@ -0,0 +1,163 @@ +// Component +// -------------------------------------------------- +// .form-table + +// Elements +// -------------------------------------------------- +.form-table__row { + width: auto; +} + +.form-table__button { + margin-top: 15px; + margin-left: 25px; +} + +.form-table__cell { + position: relative; + display: table-cell; + width: auto; + margin: 0; + padding: 25px 15px; +} + +.form-table__header { + margin: 0; + padding: 20px 10px; +} + +.form-table__label { + font-weight: normal; + color: $color-grey-input; +} + +.form-table_link-icon { + @include icon-size(40px); +} + +.form-table__link-content { + width: 100%; + padding-left: 0; +} + +// Modifiers +// -------------------------------------------------- +.form-table__cell--icon-container { + width: 40px; + padding: 0; +} + +.form-table--formatter-table { + margin-bottom: $table-margin; +} + +// Dependencies +// -------------------------------------------------- +.form-table { + .form-table__row { + .dropbutton-multiple { + min-height: auto; + margin: 0; + padding: 0; + } + + .dropbutton { + display: flex; + } + + .dropbutton-widget { + position: static; + } + + .dropbutton-toggle { + display: none; + } + + .dropbutton-action { + position: static; + display: block; + margin-right: 10px; + + &:last-child { + margin-right: 0; + } + } + + &.draggable { + .form-table__cell { + .tabledrag-handle, + .tabledrag-changed, + .form-managed-file, + .menu-item__link { + display: table-cell; + vertical-align: middle; + } + + .form-managed-file { + width: 100%; + } + + .checkbox { + margin: 0; + } + } + + .tabledrag-handle { + height: auto; + margin: 0 10px 0 0; + + .handle { + width: 20px; + height: 20px; + margin: 0; + padding: 0; + background-position: 50% 50%; + } + } + + .tabledrag-changed { + padding-left: 5px; + } + + &.tabledrag-root { + a.tabledrag-handle { + .handle { + background-image: url("../images/up-down.svg"); + } + } + } + } + } + + .indentation { + height: 24px; + margin: 0; + padding: 0; + } +} + +.table-operations { + .form-table { + margin-bottom: 25px; + } + + .form-table__cell { + padding-top: 25px; + padding-bottom: 25px; + } +} + +.adms-validator-form { + .form-table { + display: block; + overflow-x: auto; + margin-top: $form-margin; + } +} + +// Fix margin if there is more than one text field in a table cell. +.form-table__cell { + .mdl-textfield + .mdl-textfield { + margin-top: $table-margin; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_form.scss b/web/themes/joinup/prototype/scss/components/_form.scss new file mode 100644 index 0000000000..07ecdf9ffd --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_form.scss @@ -0,0 +1,411 @@ +// Component +// -------------------------------------------------- +// .form + +// Elements +// -------------------------------------------------- +.form__actions { + margin-top: 25px; + margin-right: 10px; + margin-bottom: 0 !important; +} + +.form__label { + font-size: 16px; + font-weight: 600; + color: $color-blue-dark; + margin-bottom: 15px; +} + +.form__label { + font-size: 16px; + font-weight: 600; + color: $color-blue-dark; + margin-bottom: 15px; +} + +.form__text { + font-size: 16px; +} + +.form__legend { + margin-bottom: 15px; + + .form__label { + margin-bottom: 0; + } +} + +.form__field-container { + margin-bottom: 25px; +} + +.form__cell { + margin: 0; + + @include breakpoint(tablet) { + margin: 8px; + } +} + +.form__actions_inner { + @include inline-flex; + @include flex-wrap(wrap); + + .button { + @extend .button-inline; + } +} + +.form-item-persistent-login { + margin-bottom: 20px; +} + +.form-select { + background-color: #fff; + border: 1px #a0a1a2 solid; + font-size: 16px; + height: 35px; + max-width: 100%; + + &[multiple="multiple"] { + height: auto; + min-height: 200px; + padding: 5px; + + option { + padding: 2px 5px; + } + } +} + +.form-type-date { + display: inline-block; + + input[type="date"], + input[type="time"] { + border: none; + border-bottom: 1px #a0a1a2 solid; + font: inherit; + font-size: 16px; + } + + .form__label { + margin-bottom: 0; + } +} + +.form__content { + @extend .white-box; +} + +.form__description { + font-size: $font-size-xsmall; + font-weight: $font-weight-thin; + display: block; + margin-top: 6px; + color: lighten($color-grey-medium, 10%); + + ul { + margin-top: 0; + margin-bottom: 0; + padding-left: 30px; + } + + li { + font-size: $font-size-xsmall; + font-weight: $font-weight-thin; + color: lighten($color-grey-medium, 10%); + } +} + +.form-wrapper { + margin-bottom: $form-margin; + + &.form__actions-wrapper { + margin-bottom: 0; + } +} + +// Asterisk is added for all required fields except collection and solution forms. +.form__with-asterisk { + label.form-required { + position: relative; + + &:before { + position: absolute; + right: -15px; + content: "*"; + color: $color-error; + } + } +} + +.form__with-asterisk .mdl-checkbox__label label.form-required { + &:before { + display: none; + } + + &:after { + display: inline-block; + content: "*"; + color: #eb5b5c; + margin: 0 0 0 5px; + } +} + +.form__exposed-form { + select, .form-item { + width: 100%; + } + + .form__actions input { + margin: 0; + } +} + +.form__margin-top { + margin-top: $form-margin; +} + +// Styling for members overview +.form__member-actions { + .form-wrapper { + .form-item, + .form-actions { + display: inline-block; + vertical-align: bottom; + width: 100%; + } + + @include breakpoint(lg-desktop) { + .form-item { + width: 60%; + } + + .form-actions { + width: 35%; + margin-left: $form-margin; + margin-top: 0; + + input { + margin: 0; + } + } + } + } +} + +.form__add-more-wrapper { + margin-top: $table-margin; + + .form-item, + .button { + display: inline-block; + vertical-align: bottom; + } + + .form-item { + margin-right: 20px; + } + + select { + min-width: 200px; + height: 50px; + } +} + +// Modifiers +// -------------------------------------------------- +.form__description--checkbox { + margin-left: 25px; +} + +// Dependencies +// -------------------------------------------------- +.form__actions { + .dropbutton-wrapper { + float: none; + width: auto; + } + + .dropbutton-multiple { + @extend .button-inline; + + &.open { + .dropbutton-arrow { + top: 40%; + } + } + + .dropbutton-widget { + padding-right: 0; + } + } + + .dropbutton-action { + .button { + margin: 0; + } + + &.secondary-action { + position: absolute; + white-space: nowrap; + + .button { + margin-top: 5px; + } + } + } + + .dropbutton-widget { + .dropbutton { + overflow: visible; + } + } + + .dropbutton-toggle { + .dropbutton-arrow { + color: #fff; + } + } +} + +.form__actions--no-margin { + margin: 0; + + .button { + margin: 0; + } + + .form__actions_inner { + width: 100%; + } +} + +.form-wrapper { + .form__label { + &.mdl-checkbox__label { + margin-bottom: 0; + } + } +} + +// Elements with validation errors +.form-item { + input.error, + textarea.error, + select.error, + textarea.error + .cke { + border-width: 1px; + border-color: $color-error; + } +} + +// My subscriptions form +.form__subscribe-types { + margin-bottom: 0; + + .form-item { + flex: 1 100%; + margin-bottom: $tile-margin; + + select { + width: 100%; + } + } + + .form__subscribe-save { + flex: 1 100%; + max-width: 100%; + } + + @include breakpoint(mobile) { + .form-item { + flex: 1 50%; + } + } + + + @include breakpoint(desktop) { + .form__subscribe-save { + flex: 1 100%; + } + } + + + @include breakpoint(lg-desktop) { + .form-item { + flex: 0 1 auto; + margin-bottom: 0; + margin-right: $tile-margin; + } + + .form__subscribe-save { + flex: 0 1 auto; + margin-left: auto; + } + } +} + +.form__subscribe-types-inner { + display: flex; + flex-flow: row wrap; + align-items: center; + + .form__label { + font-size: 14px; + font-weight: normal; + } +} + +.form__subscribe-frequency { + .form-item { + margin-bottom: $field-margin; + } + + @include breakpoint(lg-desktop) { + display: flex; + align-items: flex-end; + + .form-item { + flex: 1 72%; + max-width: 72%; + margin-bottom: 0; + } + + .form__subscribe-save { + flex: 1 28%; + max-width: 28%; + text-align: right; + } + } +} + +.form__subscribe-actions { + text-align: right; + margin-right: 0; + + .button { + margin-right: 0; + } +} + +// Add red asterisk in a cas form. +.cas-account-link-form.form__with-asterisk { + .mdl-textfield { + label { + position: relative; + + &:before { + position: absolute; + right: -15px; + content: "*"; + color: $color-error; + } + } + } +} + +// States +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/sass/components/_header-logo.sass b/web/themes/joinup/prototype/scss/components/_header-logo.scss similarity index 70% rename from web/themes/joinup/prototype/sass/components/_header-logo.sass rename to web/themes/joinup/prototype/scss/components/_header-logo.scss index 8b58febd4f..2f8ec9568b 100644 --- a/web/themes/joinup/prototype/sass/components/_header-logo.sass +++ b/web/themes/joinup/prototype/scss/components/_header-logo.scss @@ -1,19 +1,23 @@ // Header logo // // Markup: html/header-logo.html -// +// // Joinup logo placed in the header -// +// // Styleguide 2.7.1 // Component // -------------------------------------------------- -.header-logo - position: relative - height: 30px - +z-index(highlight+1) - img - height: 100% +.header-logo { + position: relative; + height: 30px; + + @include z-index(highlight + 1); + + img { + height: 100%; + } +} // Elements // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_header-menu.scss b/web/themes/joinup/prototype/scss/components/_header-menu.scss new file mode 100644 index 0000000000..4cf6d3a92f --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_header-menu.scss @@ -0,0 +1,66 @@ +// Header menu +// +// Markup: html/header-menu.html +// +// Menu placed in the header with active Collection item +// +// Styleguide 2.7.2 + +// Component +// -------------------------------------------------- +.header-menu { + display: none; + + @include breakpoint(tablet) { + @include flex; + } +} + +// Elements +// -------------------------------------------------- +.header-menu__link { + line-height: 60px !important; + position: relative; + display: block; + width: 170px; + padding: 0 !important; + text-align: center; + text-decoration: none; + text-transform: uppercase; + border-top: 2px solid transparent; + border-bottom: 2px solid transparent; +} + +.header-menu__wrapper { + text-align: center; +} + +.header-menu__icon { + display: inline-block; + vertical-align: middle; + margin-right: 8px; + + @include icon-size(30px); +} + +.header-menu__text { + font-weight: $font-weight-medium; + display: inline-block; + text-align: left; + vertical-align: middle; +} + +// Modifiers +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.header-menu__link.active-trail, .header-menu__link.is-active { + color: $color-blue-default; + background: #fff; + border-top: 2px solid $color-orange; + opacity: 1; +} diff --git a/web/themes/joinup/prototype/sass/components/_header.sass b/web/themes/joinup/prototype/scss/components/_header.scss similarity index 87% rename from web/themes/joinup/prototype/sass/components/_header.sass rename to web/themes/joinup/prototype/scss/components/_header.scss index 98baa1a379..9b795535fe 100644 --- a/web/themes/joinup/prototype/sass/components/_header.sass +++ b/web/themes/joinup/prototype/scss/components/_header.scss @@ -1,3 +1,3 @@ // Header -// +// // Styleguide 2.7 diff --git a/web/themes/joinup/prototype/scss/components/_icon-card.scss b/web/themes/joinup/prototype/scss/components/_icon-card.scss new file mode 100644 index 0000000000..9964614314 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_icon-card.scss @@ -0,0 +1,58 @@ +// Icon card +// +// Content inside is centered vertically and horizontally. +// +// Markup: html/icon-card.html +// +// Styleguide 2.17 + +// Component +// -------------------------------------------------- +.icon-card { + position: relative; + min-height: 230px; +} + +// Elements +// -------------------------------------------------- +.icon-card__link { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-decoration: none; + color: $color-base; + text-transform: uppercase; +} + +.icon-card__inner { + text-align: center; + display: block; + + @include centered; + + width: 100%; +} + +.icon-card__icon { + @include icon-size(150px); +} + +.icon-card__text { + margin-top: 20px; + display: block; +} + +// Modifiers +// -------------------------------------------------- +.icon-card--grey { + background-color: $color-grey-lighter; + min-height: 140px; + + .icon-card__icon { + color: $color-grey-medium; + + @include icon-size(50px); + } +} diff --git a/web/themes/joinup/prototype/scss/components/_icon.scss b/web/themes/joinup/prototype/scss/components/_icon.scss new file mode 100644 index 0000000000..7fd2c28100 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_icon.scss @@ -0,0 +1,381 @@ +// Icon +// +// Icons used across Joinup platform. +// +// Markup: html/icon.html +// +// .icon--asset_distribution - Asset distribution icon +// .icon--asset_release - Asset release icon +// .icon--business-case - Business case icon +// .icon--collections - Collection icon +// .icon--custom_page - Custom page icon +// .icon--discussion - Discussion icon +// .icon--document - Document icon +// .icon--events - Event icon +// .icon--content - Generic content icon +// .icon--licence - Licence icon +// .icon--news - News icon +// .icon--newsletter - Newsletter icon +// .icon--solutions - Solution icon +// .icon--video - Video icon +// .icon--followers - Followers icon +// .icon--user - User icon +// .icon--like - Like icon +// .icon--plus - Plus icon +// .icon--download - Download icon +// .icon--error - Error icon used in the alert component +// .icon--warning - Warning icon used in the alert component +// .icon--info - Info icon used in the alert component +// .icon--success - Success icon used in the alert component +// .icon--close - Close icon used in the alert component +// .icon--draggable - Draggable icon used in the form component +// .icon--search - Search icon +// .icon--menu - Menu icon +// .icon--arrow-down - Arrow down icon used in the filter component +// .icon--share - Share icon +// .icon--shared - Shared icon +// .icon--load - Load icon used in the load more tile component +// .icon--location - Location icon +// .icon--out - Out icon used for external link +// .icon--pin - Pin icon +// .icon--anchor - Anchor icon +// .icon--facebook - Facebook icon +// .icon--googleplus - Google+ icon +// .icon--twitter - Twitter icon +// .icon--linkedin - LinkedIn icon +// .icon--youtube - YouTube icon +// .icon--slideshare - SlideShare icon +// .icon--vimeo - Vimeo icon +// .icon--github - GitHub icon +// .icon--star - Star icon used to mark featured tile +// .icon--help - Question mark icon used in a tour button +// +// Styleguide 2.8 + +$waat-icons-font-path: "../fonts/waat-icons/waat-icons"; + +// Component +// -------------------------------------------------- +@font-face { + font-family: "WAAT Icons"; + src: url("#{$waat-icons-font-path}.eot"); + src: url("#{$waat-icons-font-path}.eot?#iefix") format("embedded-opentype"), url("#{$waat-icons-font-path}.woff") format("woff"), url("#{$waat-icons-font-path}.ttf") format("truetype"), url("#{$waat-icons-font-path}.svg#icomoon") format("svg"); +} + +.icon { + font-family: "WAAT Icons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + display: inline-block; + line-height: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +// Modifiers +// -------------------------------------------------- +.icon--discussion:before, +.icon--discussions:before { + content: ""; +} + +.icon--event:before, +.icon--events:before { + content: ""; +} + +.icon--asset_release:before { + content: ""; +} + +.icon--news:before { + content: ""; +} + +.icon--document:before, +.icon--documents:before { + content: ""; +} + +.icon--custom_page:before { + content: ""; +} + +.icon--solution:before, +.icon--solutions:before { + content: ""; + color: $color-orange; +} + +.icon--collection:before, +.icon--collections:before { + content: ""; + color: $color-green-new; +} + +.icon--distribution:before, +.icon--distributions:before, +.icon--asset_distribution:before { + content: ""; +} + +.icon--business-case:before { + content: ""; +} + +.icon--content:before, +.icon--keep-up-to-date:before { + content: ""; +} + +.icon--licence:before { + content: ""; +} + +.icon--newsletter:before { + content: ""; +} + +.icon--video:before { + content: ""; +} + +.icon--followers:before { + content: ""; +} + +// Statuses +// -------------------------------------------------- +.icon--success:before { + content: ""; +} + +.icon--error:before { + content: ""; +} + +.icon--warning:before { + content: ""; +} + +.icon--info:before { + content: ""; +} + +// Social media +// -------------------------------------------------- +.icon--facebook:before { + content: ""; +} + +.icon--gplus:before, +.icon--googleplus:before { + content: ""; +} + +.icon--twitter:before { + content: ""; +} + +.icon--linkedin:before { + content: ""; +} + +.icon--youtube:before { + content: ""; +} + +.icon--slideshare:before { + content: ""; +} + +.icon--vimeo:before { + content: ""; +} + +.icon--github:before { + content: ""; +} + +.icon--star:before { + content: ""; +} + +// File mime icons: +// -------------------------------------------------- +.icon--mime-default:before { + content: ""; +} + +.icon--mime-doc:before, +.icon--mime-docx:before { + content: ""; +} + +.icon--mime-exe:before { + content: ""; +} + +.icon--mime-gif:before { + content: ""; +} + +.icon--mime-jpg:before { + content: ""; +} + +.icon--mime-pdf:before { + content: ""; +} + +.icon--mime-png:before { + content: ""; +} + +.icon--mime-ppt:before { + content: ""; +} + +.icon--mime-rar:before { + content: ""; +} + +.icon--mime-xls:before, +.icon--mime-xlsx:before { + content: ""; +} + +.icon--mime-zip:before { + content: ""; +} + +// Navigation +// -------------------------------------------------- +.icon--arrow-down:before { + content: ""; +} + +.icon--arrow-up:before { + content: ""; +} + +.icon--first:before { + content: ""; +} + +.icon--previous:before { + content: ""; +} + +.icon--next:before { + content: ""; +} + +.icon--last:before { + content: ""; +} + +// Other +// -------------------------------------------------- +.icon--user:before { + content: ""; +} + +.icon--like:before { + content: ""; +} + +.icon--plus:before { + content: ""; +} + +.icon--download:before { + content: ""; +} + +.icon--check:before { + content: ""; +} + +.icon--check-2:before { + content: ""; +} + +.icon--close:before { + content: ""; +} + +.icon--draggable:before { + content: ""; +} + +.icon--search:before { + content: ""; +} + +.icon--menu:before { + content: ""; +} + +.icon--share:before { + content: ""; +} + +.icon--shared:before { + content: ""; +} + +.icon--load:before { + content: ""; +} + +.icon--location:before { + content: ""; +} + +.icon--out:before { + content: ""; +} + +.icon--remove:before { + content: ""; +} + +.icon--edit:before { + content: ""; +} + +.icon--cancel:before { + content: ""; +} + +.icon--pin:before { + content: ""; +} + +.icon--external:before { + content: ""; +} + +.icon--play:before { + content: ""; +} + +.icon--anchor:before { + content: ""; +} + +.icon--dots:before { + content: ""; +} + +.icon--help:before { + content: ""; +} + +.icon--footer-newsletter:before { + content: ""; +} diff --git a/web/themes/joinup/prototype/scss/components/_icons-bar.scss b/web/themes/joinup/prototype/scss/components/_icons-bar.scss new file mode 100644 index 0000000000..3912deeb66 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_icons-bar.scss @@ -0,0 +1,34 @@ +// Content +// +// Content section + +// Component +// -------------------------------------------------- +.icons-bar { + width: 100%; + text-align: right; +} + +// Elements +// -------------------------------------------------- +.icons-bar__item { + display: inline-block; + padding-right: 25px; + color: $color-blue-dark; + font-size: 12px; + font-weight: 600; +} + +// Modifiers +// -------------------------------------------------- +.icons-bar__item--solutions { + background: url("../images/solutions-tile-icon.png") right center no-repeat; +} + +.tile__icons-item--members { + background: url("../images/members-tile-icon.png") right center no-repeat; +} + +.tile__icons-item--like { + background: url("../images/like-tile-icon.png") right center no-repeat; +} diff --git a/web/themes/joinup/prototype/scss/components/_image-caption.scss b/web/themes/joinup/prototype/scss/components/_image-caption.scss new file mode 100644 index 0000000000..38a370a750 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_image-caption.scss @@ -0,0 +1,43 @@ +// Image caption + +// Component +// -------------------------------------------------- +.image-caption { + &.align-right { + margin-left: 0; + margin-right: 0; + float: none; + + @include breakpoint(xs) { + float: right; + margin-left: 20px; + } + } + + &.align-left { + margin-left: 0; + margin-right: 0; + float: none; + + @include breakpoint(xs) { + float: left; + margin-right: 20px; + } + } + + &.wysiwyg-one-third-width { + max-width: 306px; + } + + &.wysiwyg-half-width { + max-width: 460px; + } + + figcaption { + font-size: $font-size-xsmall; + } + + img { + margin-bottom: $field-margin; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_inline-social-media.scss b/web/themes/joinup/prototype/scss/components/_inline-social-media.scss new file mode 100644 index 0000000000..f50d8cf481 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_inline-social-media.scss @@ -0,0 +1,43 @@ +// Inline social media +// +// Markup: html/inline-social-media.html +// +// Styleguide 2.16 + +// Component +// -------------------------------------------------- +.inline-social-media { + margin: 0; + padding: 0; + line-height: normal; + height: 16px; +} + +// Elements +// -------------------------------------------------- +.inline-social-media__item { + margin: 0 5px; + display: inline-block; + + &:first-child { + margin-left: 0; + } + + &:last-child { + margin-right: 0; + } +} + +.inline-social-media__link { + display: block; + height: 16px; + + .icon { + @include icon-size(16px); + + color: #fff; + } +} + +// Modifiers +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_invite-form.scss b/web/themes/joinup/prototype/scss/components/_invite-form.scss new file mode 100644 index 0000000000..853683ee79 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_invite-form.scss @@ -0,0 +1,13 @@ +// Invite form +// +// @todo this needs to be redone. + +.invite-form__add { + html.js & { + display: none; + } +} + +.invite-form__list { + margin-top: 25px; +} diff --git a/web/themes/joinup/prototype/scss/components/_licence.scss b/web/themes/joinup/prototype/scss/components/_licence.scss new file mode 100644 index 0000000000..f823740f3e --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_licence.scss @@ -0,0 +1,443 @@ +// Licence +// + +// Component +// -------------------------------------------------- + +// Elements +// -------------------------------------------------- +.licence-filter__header { + height: 45px; + color: #fff; + text-align: center; + + span { + font-weight: $font-weight-medium; + vertical-align: middle; + line-height: 45px; + } +} + +.licence-filter__label { + color: $color-blue-dark; + font-weight: bold; + margin: 0 0 10px; +} + +.licence-filter__content { + margin: 7px 0; +} + +.licence__card { + height: 100%; +} + +.licence-filter__list { + padding: 0; + margin: 0; + list-style: none; + + .licence-filter__item { + font-size: $font-size-small; + + &:last-child { + margin-bottom: 0; + } + + a { + display: block; + padding: 7px 14px; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + + &.is-active { + padding: 7px 14px 6px; + background: $color-grey-input; + border-bottom: 1px solid #fff; + color: #fff; + } + } + } +} + +.licence-tile { + display: block; +} + +.licence-tile__title { + div { + display: inline; + } + + .icon { + margin-left: 0; + margin-right: 5px; + float: left; + } + + @include breakpoint(mobile) { + margin-left: -21px; + } +} + +.licence-tile__line { + font-size: $font-size-xsmall; + display: flex; +} + +.licence-tile__label { + color: #fff; + padding: 5px 10px; + margin-right: 10px; +} + +.licence-tile__label-wrapper { + min-width: 100px; + text-align: right; +} + +.licence-tile__button { + display: inline-block; + text-decoration: none; + padding: 10px 30px; + border: 2px solid $color-blue-warm; + font-size: $font-size-small; + border-radius: 5px; + background: $color-blue-warm; + color: #fff; + + &:hover { + color: $color-base; + background: transparent; + } +} + +.licence-tile__button--disabled { + background: transparent; + color: $color-base; + border-color: $color-orange-warm; + pointer-events: none; +} + +.licence-tile__actions { + @include z-index(highlight + 1); + @include breakpoint(lg-desktop) { + position: absolute; + right: 20px; + bottom: 20px; + } +} + +.licence-tile__actions-item { + display: inline-block; + margin-right: $field-margin; + margin-bottom: $field-margin; + + &:last-child { + margin-right: 0; + margin-bottom: 0; + } + + @include breakpoint(lg-desktop) { + margin-bottom: 0; + } +} + +.licence-counter { + font-weight: bold; + margin: 10px 0; + + @include breakpoint(desktop) { + margin: 0 0 10px; + } +} + +.licence-search__label { + color: $color-blue-dark; + font-weight: bold; + display: inline-block; + vertical-align: middle; +} + +.licence-search__input { + display: inline-block; + vertical-align: middle; + + @include breakpoint(mobile) { + margin: 0 10px 5px 10px; + } +} + +.licence-search__form { + .licence-search__reset { + margin: 10px 0; + } + + @include breakpoint(desktop) { + margin: 0; + display: flex; + justify-content: space-between; + align-items: center; + } +} + +// Modifiers +// -------------------------------------------------- +.licence-filter--can { + .licence-filter__header { + background-color: $color-green-warm; + } + + .licence-filter__item { + a { + color: $color-green-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-green-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-green-warm; + } +} + +.licence-filter--must { + .licence-filter__header { + background-color: $color-beige-warm; + } + + .licence-filter__item { + a { + color: $color-beige-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-beige-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-beige-warm; + } +} + +.licence-filter--cannot { + .licence-filter__header { + background-color: $color-red-warm; + } + + .licence-filter__item { + a { + color: $color-red-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-red-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-red-warm; + } +} + +.licence-filter--compatible { + .licence-filter__header { + background-color: $color-blue-warm; + } + + .licence-filter__item { + a { + color: $color-blue-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-blue-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-blue-warm; + } +} + +.licence-filter--law { + .licence-filter__header { + background-color: $color-grey-warm; + } + + .licence-filter__item { + a { + color: $color-grey-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-grey-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-grey-warm; + } +} + +.licence-filter--support { + .licence-filter__header { + background-color: $color-orange-warm; + } + + .licence-filter__item { + a { + color: $color-orange-warm; + } + } + + &.licence-comparer__sidebar-header { + background-color: $color-orange-warm; + } + + &.licence-comparer__sidebar-cell { + color: $color-orange-warm; + } +} + +.licence-tile__line--can { + .licence-tile__label { + background-color: $color-green-warm; + } + + .licence-tile__value { + color: $color-green-warm; + } +} + +.licence-tile__line--must { + .licence-tile__label { + background-color: $color-beige-warm; + } + + .licence-tile__value { + color: $color-beige-warm; + } +} + +.licence-tile__line--cannot { + .licence-tile__label { + background-color: $color-red-warm; + } + + .licence-tile__value { + color: $color-red-warm; + } +} + +.licence-tile__line--compatible { + .licence-tile__label { + background-color: $color-blue-warm; + } + + .licence-tile__value { + color: $color-blue-warm; + } +} + +.licence-tile__line--law { + .licence-tile__label { + background-color: $color-grey-warm; + } + + .licence-tile__value { + color: $color-grey-warm; + } +} + +.licence-tile__line--support { + .licence-tile__label { + background-color: $color-orange-warm; + } + + .licence-tile__value { + color: $color-orange-warm; + } +} + +.licence-comparer { + border-spacing: 0; + width: 100%; + + @include breakpoint(tablet) { + table-layout: fixed; + } + + + td { + padding: 5px; + } + + .icon { + font-size: $font-size-xsmall; + color: #fff; + background: $color-orange; + border-radius: 50%; + padding: 5px; + } + + &__wrapper { + overflow-x: auto; + } + + &__cell, &__header { + background: #fff; + padding: 5px; + border: 5px solid $color-grey-bg; + text-align: center; + + &:nth-child(2) { + border-left-width: 10px; + } + } + + &__header { + font-weight: $font-weight-bold; + padding: 10px; + } + + &__sidebar-header { + color: #fff; + padding: 5px; + height: 45px; + text-align: center; + font-weight: $font-weight-medium; + font-size: $font-size-base; + } + + &__sidebar-cell { + border: 5px solid #fff; + background: #fff; + } + + &__empty-cell { + background: $color-grey-filler; + } +} + +// Dependiencies +// -------------------------------------------------- +.licence-tile { + .listing__card { + min-height: 0; + } +} + +// States +// -------------------------------------------------- +.licence-tile { + &.is-hidden { + display: none; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_listing.scss b/web/themes/joinup/prototype/scss/components/_listing.scss new file mode 100644 index 0000000000..51f74269fa --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_listing.scss @@ -0,0 +1,648 @@ +// Listing +// +// Listing may contains various types of tiles presented below. +// Size of the tile can be modified thanks to mdl-cell--X-col class, where X specifies the column size for the cell. +// +// Styleguide 2.9 + +// Component +// -------------------------------------------------- +// .listing + +// Elements +// -------------------------------------------------- +.listing__item { + position: relative; + background: #fff; + display: flex; + align-items: stretch; +} + +.listing__card { + display: flex; + align-items: stretch; +} + +.listing__image { + position: relative; + overflow: hidden; + height: 140px; + margin: 10px 10px 0; + text-align: center; + background: $color-grey-white; + + @include z-index(highlight); + + img { + max-width: 100%; + max-height: 140px; + height: auto; + width: auto; + + @include centered; + } +} + +.listing__metadata { + word-wrap: break-word; + + @include z-index(highlight + 1); +} + +.listing__avatar { + width: 60px; + height: 60px; + margin-top: -50px; + padding: 5px; + background-color: #fff; + + @include border-radius(50%); +} + +.listing__metadata, +.listing__wrapper, +.listing__inner-tile { + padding: 20px; +} + +.listing__field { + margin-bottom: $tile-margin; + + &.listing__tags { + margin-bottom: 0; + } +} + +.listing__field--no-margin { + margin-bottom: 0; +} + +.listing__title, +.listing__title a { + font-size: 16px; + font-weight: 600; + margin: 0; + text-decoration: none; + color: $color-blue-dark; + word-wrap: break-word; +} + +.listing__motivation { + margin-bottom: $tile-margin; + color: $color-blue-dark; + + @include breakpoint(lg-desktop) { + margin-bottom: 0; + } +} + +.listing__subtitle { + margin: 0; +} + +.listing__teaser { + font-size: 14px; + font-weight: $font-weight-thin; + margin: 0; + color: $color-grey-medium; + + p { + margin-bottom: 0; + } +} + +.listing__tags, .listing__tags a { + font-size: $font-size-xsmall; +} + +.listing__stats { + position: absolute; + right: 0; + bottom: 0; + left: 0; + width: 100%; + padding: 0 20px; + text-align: right; +} + +.listing__stat { + display: inline-block; + vertical-align: middle; +} + +.listing__icon, +.listing__text { + display: inline-block; + vertical-align: middle; +} + +.listing__icon { + color: lighten($color-grey-medium, 10%); + margin-left: 6px; + + @include icon-size(16px); +} + +.listing__text { + font-size: $font-size-xsmall; + font-weight: $font-weight-medium; + position: relative; + right: -4px; + color: $color-blue-default; +} + +.listing__header { + margin-top: 30px; + margin-bottom: 30px; +} + +.listing__corner { + position: absolute; + top: 7px; + right: 7px; + width: 30px; + height: 30px; + background-color: $color-orange; + + @include z-index(highlight + 1); + @include border-radius(50%); + + .icon { + color: #fff; + + @include icon-size(15px); + @include centered; + } +} + +.listing__action-link__wrapper { + padding: 0 20px; + + a { + position: relative; + + @include z-index(highlight + 1); + } +} + +.listing__link { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + + @include z-index(highlight); + + & > a { + display: block; + width: 100%; + height: 100%; + } +} + +// Modifiers +// -------------------------------------------------- +.listing__image--default { + background-color: $color-grey-lighter; + + .icon { + color: $color-grey-medium; + + @include icon-size(50px); + @include centered; + } +} + +.listing__card--inline-container { + @include breakpoint(mobile) { + flex-direction: row; + } + + + .listing__metadata { + @include breakpoint(mobile) { + flex: 0 1 100%; + align-self: center; + } + } + + .listing__image, + .listing__inner-tile { + @include breakpoint(mobile) { + flex: 0 0 220px; + height: auto; + min-height: 100%; + } + } + + .listing__inner-tile { + .listing__field { + &:last-child { + margin-bottom: 0; + } + } + } + + .listing__inner-tile--wider { + @include breakpoint(mobile) { + flex: 0 0 40%; + padding-right: 0; + -ms-flex-preferred-size: calc(40% - 20px); + } + } + + .listing__inner-tile--shifted { + padding-bottom: 0; + + .listing__field { + display: inline-block; + margin-bottom: 0; + + &:first-child { + margin-right: 15px; + } + } + + @include breakpoint(mobile) { + padding-left: 41px; + flex: 0 0 100%; + } + } + + .listing__metadata--licence { + .listing__teaser { + max-height: none; + + a { + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-all; + } + } + + @include breakpoint(mobile) { + flex: 0 0 60%; + -ms-flex-preferred-size: calc(60% - 40px); + } + + + @include breakpoint(lg-desktop) { + padding-bottom: 70px; + } + } +} + +.listing__card--stats-container { + .listing__metadata { + padding-bottom: 40px; + } +} + +.listing__card--full-width { + min-height: 140px !important; +} + +.listing__fields--bottom-aligned { + @include breakpoint(mobile) { + position: absolute; + right: 20px; + bottom: 20px; + left: 20px; + } + + + .listing__field:last-of-type { + margin-bottom: 0; + } +} + +.listing__title--link a { + color: $color-orange; +} + +.listing__card--corner-title { + .listing__title { + margin-right: 20px; + } +} + +.listing__subtitle:first-of-type { + margin-top: $tile-margin-small; +} + +// Set fixed height for fields. +.listing__card { + @include breakpoint(xs) { + min-height: 285px; + } +} + +.listing__text-container { + @include breakpoint(xs) { + overflow: hidden; + margin-bottom: $tile-margin; + + .listing__field:last-child { + margin-bottom: 0; + } + } +} + +.listing__item--newsletter { + .listing__title { + color: #fff; + } +} + +.listing__text-container--news, +.listing__text-container--document { + @include breakpoint(xs) { + @include calc-space(7, $row-height, $tile-margin, 1, $row-height-small, $tile-margin-small); + } +} + +.listing__text-container--licence, +.listing__text-container--newsletter, +.listing__text-container--discussion { + @include breakpoint(xs) { + @include calc-space(8, $row-height, $tile-margin); + } +} + +.listing__title { + @include number-rows(3, $row-height); +} + +.listing__card--collection, +.listing__card--solution, +.listing__card--custom-page { + .listing__title { + @include number-rows(3, $row-height); + } +} + +.listing__card--event, +.listing__card--asset-distribution, +.listing__card--asset-release { + .listing__title { + @include number-rows(3, $row-height); + } +} + +.listing__author, +.listing__tags, +.listing__date, +.listing__status, +.listing__single { + @include number-rows(1, $row-height); +} + +.listing__subtitle { + @include number-rows(1, $row-height-small, true); +} + +.listing__teaser { + @include number-rows(7, $row-height); +} + +.listing__card--user { + .listing__teaser { + @include number-rows(1, $row-height); + } +} + +// Dependiencies +// -------------------------------------------------- +.listing__title { + .icon { + position: relative; + top: 1px; + margin-left: 6px; + + @include icon-size(16px); + } + + a { + position: relative; + + @include z-index(highlight + 1); + } +} + +.listing__single { + .label, + .value { + font-size: $font-size-xsmall; + vertical-align: middle; + + a { + color: $color-base; + position: relative; + + @include z-index(highlight + 1); + } + } + + .value { + display: inline; + } + + .label { + width: 50px; + margin-right: 10px; + text-align: right; + display: inline-block; + } +} + +.listing__licence { + .value { + a { + color: $color-orange; + } + } +} + +// Modifiers +// -------------------------------------------------- +.listing__card { + &.is-featured { + background: $color-grey-light; + } +} + +// Listing +// +// Tile: default (1/2 width) pinned +// +// Markup: html/listing-item--default-col-6.html +// +// Styleguide 2.9.1 + +// Component +// -------------------------------------------------- + +// Tile: default (full width) +// +// Markup: html/listing-item--default-col-12.html +// +// Styleguide 2.9.2 + +// Component +// -------------------------------------------------- + +// Tile: news (1/2 width) +// +// Markup: html/listing-item--news-col-6.html +// +// Styleguide 2.9.3 + +// Component +// -------------------------------------------------- + +// Tile: news (full width) +// +// Markup: html/listing-item--news-col-12.html +// +// Styleguide 2.9.4 + +// Component +// -------------------------------------------------- + +// Tile: event (1/2 width) +// +// Markup: html/listing-item--event-col-6.html +// +// Styleguide 2.9.5 + +// Component +// -------------------------------------------------- + +// Tile: event (full width) +// +// Markup: html/listing-item--event-col-12.html +// +// Styleguide 2.9.6 + +// Component +// -------------------------------------------------- + +// Tile: distribution (1/2 width) +// +// Markup: html/listing-item--distribution-col-6.html +// +// Styleguide 2.9.7 + +// Component +// -------------------------------------------------- + +// Tile: distribution (full width) +// +// Markup: html/listing-item--distribution-col-12.html +// +// Styleguide 2.9.8 + +// Component +// -------------------------------------------------- + +// Tile: documentation +// +// Markup: html/listing-item--documentation.html +// +// Styleguide 2.9.9 + +// Component +// -------------------------------------------------- + +// Tile: newsletter +// +// Markup: html/listing-item--newsletter.html +// +// Styleguide 2.9.10 + +// Component +// -------------------------------------------------- +.listing__item--newsletter { + color: #fff; + background-color: $color-blue-medium; + + h3 { + margin-top: 0; + } + + .mdl-card { + background-color: $color-blue-medium; + } + + .mdl-textfield__input { + border-bottom-color: #fff; + } + + .mdl-textfield__input, + .mdl-textfield__label { + opacity: 0.5; + color: #fff; + } + + .mdl-textfield--floating-label.is-focused, + .mdl-textfield--floating-label.is-dirty { + .mdl-textfield__input, + .mdl-textfield__label { + opacity: 1; + color: #fff; + } + } + + .mdl-textfield__label:after { + background-color: #fff !important; + } +} + +// Listing +// +// Tile: load more +// +// Markup: html/listing-item--load-more.html +// +// Styleguide 2.9.11 + +// Component +// -------------------------------------------------- +.listing__item--load-more { + position: relative; + min-height: 200px; + border: 5px solid #fff; + background-color: $color-grey-bg; + cursor: pointer; + + .load-more { + text-decoration: none; + } + + .load-more__icon { + margin-bottom: 10px; + + @include icon-size(36px); + } +} + +// Listing +// +// Tile: video (1/2 width) +// +// Markup: html/listing-item--video-col-6.html +// +// Styleguide 2.9.12 + +// Component +// -------------------------------------------------- + +// Tile: video (full width) +// +// Markup: html/listing-item--video-col-12.html +// +// Styleguide 2.9.13 + +// Component +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_load-more.scss b/web/themes/joinup/prototype/scss/components/_load-more.scss new file mode 100644 index 0000000000..4c20c079de --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_load-more.scss @@ -0,0 +1,47 @@ +// Component +// -------------------------------------------------- +.load-more { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + text-decoration: none; +} + +// Elements +// -------------------------------------------------- +.load-more__wrapper { + text-align: center; + + @include centered; +} + +.load-more__icon { + color: darken($color-grey-light, 10%); +} + +.load-more__text { + font-size: $font-size-base; + font-weight: $font-weight-medium; + color: $color-base; +} + +// Modifiers +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- +.comment-item--load-more { + .load-more__icon, + .load-more__text { + display: inline-block; + vertical-align: middle; + } + + .load-more__icon { + margin-right: 10px; + + @include icon-size(36px); + } +} diff --git a/web/themes/joinup/prototype/scss/components/_login-menu.scss b/web/themes/joinup/prototype/scss/components/_login-menu.scss new file mode 100644 index 0000000000..be55ad3dfa --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_login-menu.scss @@ -0,0 +1,49 @@ +// Login menu +// +// Login menu component + +// Component +// -------------------------------------------------- +.login-menu { + display: inline-block; + width: auto; +} + +// Elements +// -------------------------------------------------- +.login-menu__button { + float: right; + clear: right; + min-width: 0; + height: 60px; + padding: 0; + + img { + border-radius: 20px; + margin: 10px 0; + } + + span { + color: #fff; + text-transform: none; + vertical-align: middle; + line-height: 40px; + padding: 0 5px; + } + + &:hover { + background: none; + } +} + +.login-menu__link { + text-decoration: none; + color: $color-blue-default; + white-space: nowrap !important; +} + +// Modifiers +// -------------------------------------------------- +.login-menu__button--text { + height: 40px; +} diff --git a/web/themes/joinup/prototype/scss/components/_navigation-bottom.scss b/web/themes/joinup/prototype/scss/components/_navigation-bottom.scss new file mode 100644 index 0000000000..2abc0a530a --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_navigation-bottom.scss @@ -0,0 +1,87 @@ +// Navigation bottom +// +// Navigation bottom component + +// Component +// -------------------------------------------------- +.navigation-bottom { + @extend .white-box; +} + +// Elements +// -------------------------------------------------- +ul.navigation-bottom__list { + margin: 0; + padding: 0; + + a { + color: $color-base; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + + &.is-active { + font-weight: $font-weight-medium; + + &:hover { + text-decoration: none; + } + } + } +} + +// Style table of contents navigation +ul.navigation-bottom__links { + padding: 0; + display: flex; + margin: $table-margin 0 0 0; + + li { + list-style: none; + + a { + color: $color-base; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + &.prev, + &.next { + width: 46%; + } + + &.up { + width: 8%; + min-width: 30px; + text-align: center; + } + + &.prev { + .icon { + padding-right: 5px; + } + } + + &.next { + text-align: right; + + .icon { + padding-left: 5px; + } + } + } + + &--only-next { + li.next { + width: 100%; + } + } +} + +// Modifiers +// -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/components/_page.scss b/web/themes/joinup/prototype/scss/components/_page.scss new file mode 100644 index 0000000000..d59984d78c --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_page.scss @@ -0,0 +1,101 @@ +// Page +// + +// Component +// -------------------------------------------------- +// .page + +// Elements +// -------------------------------------------------- +.page__title, +.page__title-wrapper { + position: relative; + margin-bottom: 20px; + letter-spacing: 1px; +} + +.page__title-wrapper { + @include breakpoint(tablet) { + margin: 0 60px 40px 60px; + } +} + +.region--featured { + .page__title-wrapper { + margin: 20px 0; + + @include breakpoint(desktop) { + margin-top: 40px; + margin-bottom: 40px; + } + } + + .page__title-wrapper--create { + margin-left: 50px; + } +} + +.section--content-middle { + .page__title, + .page__title-wrapper { + @include breakpoint(tablet) { + margin: 0 60px 40px 0; + } + } +} + +.page__content { + @media print { + padding: 0; + padding-bottom: 20px; + } +} + +.page__title, +.page__title-wrapper { + .icon--plus { + left: -50px; + + @include centered($horizontal: false, $vertical: true); + @include icon-size(35px); + } + + h1 { + margin: 0; + display: inline; + vertical-align: middle; + } + + .permalink { + display: none; + color: $color-base; + font-size: $font-size-medium; + vertical-align: middle; + } + + &:hover { + .permalink { + display: inline; + } + } +} + +.page__title-wrapper { + @media print { + margin: 0; + } +} + +// Modifiers +// -------------------------------------------------- + +// States +// -------------------------------------------------- + +// Dependencies +// -------------------------------------------------- +.content-container--default { + .page__content { + @extend .white-box; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_pager.scss b/web/themes/joinup/prototype/scss/components/_pager.scss new file mode 100644 index 0000000000..1d5ff4b973 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_pager.scss @@ -0,0 +1,135 @@ +// Pager +// +// Markup: html/pager.html +// +// Default listing pager with maximum 9 items +// +// Styleguide 2.15 + +// Component +// -------------------------------------------------- +.pager { + margin: 40px 0 0 0; +} + +// Elements +// -------------------------------------------------- +.pager__list { + display: flex; + display: -webkit-flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + -webkit-justify-content: center; + align-items: center; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + list-style-type: none; +} + +.pager__item { + position: relative; + width: 50px; + height: 50px; + padding-bottom: 0; + padding-left: 0; + margin-bottom: 0; + + &:before { + display: none; + } + + @include breakpoint(md) { + width: 40px; + height: 40px; + } +} + +.pager__link { + width: 100%; + height: 100%; + display: block; + text-decoration: none; +} + +// Modifiers +// -------------------------------------------------- +.pager__item--active { + background-color: $color-blue-default; +} + +.pager__item--inactive, .pager__item--ellipsis { + display: none; + + @include breakpoint(md) { + display: block; + } +} + +// States +// -------------------------------------------------- +.pager__item { + &:hover, + &:focus, + &:active { + color: $color-base; + background-color: $color-grey-lighter; + } +} + +.pager__item--active { + &, + &:hover, + &:focus, + &:active { + cursor: default; + background-color: $color-blue-default; + } +} + +.pager__item--ellipsis { + &:hover, + &:focus, + &:active { + cursor: default; + background-color: transparent; + } +} + +// Dependencies +// -------------------------------------------------- +.pager__item { + .text, + .icon { + color: $color-base; + + @include centered; + } + + .text { + font-size: 20px; + + @include breakpoint(md) { + font-size: 14px; + } + } + + .icon { + font-size: 16px; + + @include breakpoint(md) { + font-size: 12px; + } + } +} + +.pager__item--active { + .pager__link { + cursor: default; + } + + .text { + color: #fff; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_search-bar.scss b/web/themes/joinup/prototype/scss/components/_search-bar.scss new file mode 100644 index 0000000000..e22236544b --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_search-bar.scss @@ -0,0 +1,239 @@ +// Search bar +// +// Markup: html/search-bar.html +// +// .search-bar - Default +// .search-bar--white - White colored +// +// + +// Component +// -------------------------------------------------- +// .search-bar + +// Elements +// -------------------------------------------------- +.search-bar__wrapper { + margin-bottom: 40px; + text-align: center; +} + +.search-bar__label { + width: 40px; + height: 40px; +} + +.search-bar__icon { + padding: 0; + color: lighten($color-grey-medium, 10%); + + @include icon-size(25px); + @include border-radius(50%); + @include centered; +} + +.search-bar__input { + font-weight: $font-weight-thin; + color: lighten($color-grey-medium, 10%); + border-bottom-color: lighten($color-grey-medium, 10%); + box-sizing: border-box; + + &::-webkit-input-placeholder { + font-size: $font-size-base; + font-weight: $font-weight-thin; + font-style: italic; + color: lighten($color-grey-medium, 10%); + } + + &:-moz-placeholder { + font-size: $font-size-base; + font-weight: $font-weight-thin; + font-style: italic; + color: lighten($color-grey-medium, 10%); + } + + &::-moz-placeholder { + font-size: $font-size-base; + font-weight: $font-weight-thin; + font-style: italic; + color: lighten($color-grey-medium, 10%); + } + + &:-ms-input-placeholder { + font-size: $font-size-base; + font-weight: $font-weight-thin; + font-style: italic; + color: lighten($color-grey-medium, 10%); + } +} + +.search-bar__input-container { + margin-left: 0; + padding: 10px 0; +} + +.search-bar__block { + position: relative; + max-width: 570px; + margin: 20px auto; + + @include breakpoint(tablet) { + margin-top: 40px; + margin-bottom: 40px; + } +} + +// Modifiers +// -------------------------------------------------- +.search-bar--header { + position: absolute; + top: 0; + right: 75px; + overflow: hidden; + height: 64px; + padding: 0; + + @include z-index(highlight); +} + +.search-bar--header-shifted { + right: 120px; +} + +.search-bar--section { + width: 85%; + margin-left: -40px; + padding: 0; + + @include breakpoint(tablet) { + width: 570px; + } +} + +// Dependiencies +// -------------------------------------------------- +.search-bar--header { + .search-bar__label { + position: relative; + bottom: auto; + display: inline-block; + vertical-align: middle; + } + + .search-bar__input { + font-weight: $font-weight-thin; + display: inline-block; + vertical-align: middle; + border-bottom: 1px solid #fff; + } +} + +.search-bar--section { + .search-bar__label { + top: 0; + left: 0; + } + + .search-bar__input { + font-weight: $font-weight-thin; + padding-left: 45px; + border-bottom: 2px solid lighten($color-grey-medium, 10%); + } +} + +.search-bar--white { + .search-bar__icon { + color: #fff; + } + + .search-bar__input { + color: #fff; + border-bottom-color: #fff; + + &::-webkit-input-placeholder { + color: #fff; + } + + &:-moz-placeholder { + color: #fff; + } + + &::-moz-placeholder { + color: #fff; + } + + &:-ms-input-placeholder { + color: #fff; + } + } +} + +.search-bar__block { + .search-bar__button-container { + position: relative; + left: 20px; + width: 25px; + height: 25px; + padding: 0; + + @include border-radius(50%); + @include centered($horizontal: false, $vertical: true); + @include breakpoint(tablet) { + left: -10px; + } + } + + .search-bar__button { + font-size: 0; + width: 25px; + height: 25px; + padding: 0; + cursor: pointer; + border: none; + background: none; + + @include z-index(navigation); + @include centered; + } + + label { + display: none; + } +} + +// States +// -------------------------------------------------- +.search-bar--header { + &.is-focused, + &.is-dirty { + width: calc(100% - 130px); + background-color: $color-blue-default; + + @include z-index(navigation); + @include breakpoint(tablet) { + width: calc(100% - 200px); + } + + + .search-bar__input-container { + width: calc(100% - 50px); + max-width: 100%; + } + } +} + +.search-bar--header-shifted { + &.is-focused, + &.is-dirty { + width: calc(100% - 175px); + + @include breakpoint(tablet) { + width: calc(100% - 280px); + } + + + .search-bar__input-container { + width: calc(100% - 50px); + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_share-box.scss b/web/themes/joinup/prototype/scss/components/_share-box.scss new file mode 100644 index 0000000000..441aab5514 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_share-box.scss @@ -0,0 +1,137 @@ +// Share box +// + +// Component +// -------------------------------------------------- + +// Elements +// -------------------------------------------------- +.share-box__row { + position: relative; + min-height: 50px; + margin-bottom: 20px; + + &:last-child { + border-bottom: none; + min-height: auto; + margin-bottom: 0; + } +} + +.share-box__item { + text-decoration: none; +} + +.share-box__label { + margin-left: 14px; + color: $color-base; + font-size: $font-size-base; + font-weight: $font-weight; +} + +.share-box__image img { + max-width: 50px; + max-height: 50px; +} + +.share-box__social-icon { + color: $color-blue-dark; + + @include icon-size(50px); +} + +.share-box__container { + display: flex; + flex-direction: column; + justify-content: space-between; + max-width: $screen-sm; + overflow-y: hidden; + + @include breakpoint(sm) { + flex-direction: row; + min-width: $screen-sm / 2; + } +} + +.share-box__title { + margin-top: 0; + color: $color-base; +} + +.share-box__social { + margin-bottom: 20px; + + @include breakpoint(sm) { + margin-right: 40px; + margin-bottom: 0; + } + + + .share-box__item { + display: flex; + align-items: center; + margin-right: 5px; + margin-left: 5px; + padding-right: 10px; + } +} + +.share-box__collections { + .share-box__row { + margin-left: 10px; + padding-left: 30px; + + @include breakpoint(sm) { + margin-left: 0; + } + } + + .share-box__item { + display: flex; + align-items: flex-start; + } +} + +// Modifiers +// -------------------------------------------------- +.share-box__container--single-column { + justify-content: center; + + .share-box__social { + margin-right: 0; + + .share-box__title { + text-align: center; + } + } +} + +// Dependiencies +// -------------------------------------------------- +.share-box__container { + fieldset { + margin-bottom: 0; + } + + .form-type-checkbox { + position: absolute; + top: 0; + left: 0; + + .form__label { + display: none; + } + } +} + +.share-content-form { + .form__legend { + margin: 0; + } +} + +.ajax-progress-throbber { + .message { + display: none; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_sidebar-menu.scss b/web/themes/joinup/prototype/scss/components/_sidebar-menu.scss new file mode 100644 index 0000000000..48d1dbfe7b --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_sidebar-menu.scss @@ -0,0 +1,154 @@ +// Sidebar menu +// +// Sidebar menu component + +// Component +// -------------------------------------------------- +.sidebar-menu { + position: relative; + + @include z-index(navigation); + @include breakpoint(desktop) { + width: 100%; + + .mdl-menu__container, + .mdl-menu__outline, + .mdl-menu { + width: 100% !important; + } + + .mdl-menu { + padding: 0; + } + + .mdl-menu__outline { + background-color: transparent; + box-shadow: none; + } + } +} + +// Elements +// -------------------------------------------------- +.sidebar-menu ul { + padding-left: 0; + margin: 0; +} + +.sidebar-menu__button { + width: 60px; + height: 60px; + border-radius: 0; + + @include z-index(navigation); +} + +.sidebar-menu__item { + padding: 0; +} + +.sidebar-menu__link--active { + background-color: #fff; + border-left-color: $color-orange; + font-weight: $font-weight-medium; +} + +.sidebar-menu__link { + display: block; + padding: 15px 15px 15px 20px; + color: $color-base; + border-left: 4px solid transparent; + text-decoration: none; + + &:hover, + &:active, + &:focus, + &.is-active { + @extend .sidebar-menu__link--active; + } +} + +.sidebar-menu { + .icon { + color: #fff; + + @include icon-size(35px); + @include centered; + } +} + +.sidebar-menu__contextual { + @include breakpoint(desktop) { + .contextual { + @include z-index(dropdown); + } + } +} + +// Modifiers +// -------------------------------------------------- +.sidebar-menu__button--mobile { + position: absolute; + top: -45px; + + .icon { + color: $color-base; + } + + @include breakpoint(desktop) { + display: none; + } +} + +.sidebar-menu__button--desktop { + display: none; + margin: 10px 0 10px 6px; + + .icon { + color: $color-base; + } + + @include breakpoint(desktop) { + display: block; + } +} + +// Dependiencies +// -------------------------------------------------- +.section--sidebar-left { + .sidebar-menu { + @include breakpoint(desktop) { + .mdl-menu { + position: relative; + opacity: 1; + clip: rect(0px 181.328px 144px 0px); + } + + .mdl-menu__item { + opacity: 1; + } + + .mdl-menu__container { + visibility: visible; + background: transparent; + position: relative; + + @include z-index(navigation); + + &.is-hidden { + visibility: hidden; + } + + &:not(.is-hidden) { + height: auto; + } + } + } + } +} + +.menu-item--active-trail { + .sidebar-menu__link { + @extend .sidebar-menu__link--active; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_tab.scss b/web/themes/joinup/prototype/scss/components/_tab.scss new file mode 100644 index 0000000000..c2613eea38 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_tab.scss @@ -0,0 +1,223 @@ +// Tab +// +// Markup: html/tab.html +// +// Styleguide 2.11 + +// Component +// -------------------------------------------------- +.tab { + background-color: transparent; +} + +// Elements +// -------------------------------------------------- +.tab__container { + margin-bottom: 40px; + + @include flex; + @include flex-direction(column); + @include flex-wrap(nowrap); + @include justify-content(space-around); + @include breakpoint(sm) { + margin-bottom: 30px; + border-bottom: none; + + @include flex-direction(row); + @include align-items(center); + } +} + +// Modifiers +// -------------------------------------------------- +.tabs--horizontal { + margin: 0; + padding: 0; + border-bottom: 1px solid $color-grey-light; + + @include justify-content(center); + @include flex; + @include flex-direction(column); + @include flex-wrap(nowrap); + @include breakpoint(sm) { + border-bottom: none; + + @include flex-direction(row); + @include align-items(center); + } +} + +.tab--horizontal { + border-bottom: 1px solid $color-grey-light; + background-color: $color-grey-light; + + a { + text-decoration: none; + color: $color-base; + + &:hover { + color: $color-orange; + } + } +} + +.tab--content-type { + position: relative; + padding: 15px 5px; + text-align: center; + text-decoration: none; + color: $color-base; + + @include breakpoint(xxs, xs) { + margin-bottom: 20px; + border-bottom: 1px solid darken($color-grey-light, 5%); + } + + + .tab__content { + @include inline-flex; + + width: 100%; + } + + .tab__icon { + color: lighten($color-grey-medium, 10%); + + @include icon-size(45px); + @include breakpoint(xxs, xs) { + @include centered($horizontal: false, $vertical: true); + } + } + + .tab__text { + @include breakpoint(xxs, xs) { + margin: 0 auto; + } + + + @include breakpoint(sm) { + margin-left: 15px; + text-align: left; + } + } + + .tab__text--upper { + font-size: 32px; + font-weight: $font-weight-bold; + line-height: 1; + display: block; + margin-bottom: 4px; + } + + .tab__text--lower { + display: block; + } +} + +.tab--more { + position: relative; + display: inline-block; + width: 90px; + margin: 15px auto 15px auto; + padding-bottom: 10px; + cursor: pointer; + text-align: center; + text-decoration: none; + + @include breakpoint(sm) { + width: auto; + margin: 0; + } + + + .tab__text, + .tab__icon { + display: inline-block; + vertical-align: middle; + color: $color-orange; + } + + .tab__text { + font-size: $font-size-small; + font-weight: $font-weight-bold; + text-transform: uppercase; + } + + .tab__icon { + margin-left: 4px; + + @include icon-size(14px); + } +} + +// Dependiencies +// -------------------------------------------------- +.timeline { + .tab--more { + position: absolute; + right: -40px; + bottom: -140px; + display: block; + width: 120px; + height: 40px; + padding: 0; + } + + .tab--more-wrapper { + top: 50%; + } +} + +.section--featured-navy-blue { + .tab--content-type { + .tab__icon, + .tab__text { + color: #fff; + } + + .tab__text--upper { + font-weight: $font-weight; + } + + &.is-active { + .tab__icon { + color: #fff; + } + } + } +} + +// States +// -------------------------------------------------- +.tab--horizontal { + &.is-active { + font-weight: $font-weight-medium; + border-bottom: 1px solid #fff; + background-color: #fff; + } +} + +.tab--content-type { + &.is-active { + border-bottom: 2px solid $color-orange; + + .tab__icon { + color: $color-base; + } + + &:before { + position: absolute; + right: 0; + bottom: -6px; + left: 0; + display: block; + width: 0; + height: 0; + margin: 0 auto; + content: ""; + border-top: 4px solid $color-orange; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_tallinn.scss b/web/themes/joinup/prototype/scss/components/_tallinn.scss new file mode 100644 index 0000000000..6665556271 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_tallinn.scss @@ -0,0 +1,55 @@ +// Tallinn +// +// Tallinn status messages. +// +// .tallinn--no_progress - #eb5b5c +// .tallinn--in_progress - #ee8917 +// .tallinn--no_data - #707475 +// .tallinn--completed - #98c04c + +// Component +// -------------------------------------------------- +.tallinn { + position: relative; + padding: 5px 5px; + + @include border-radius(4px); +} + +// Elements +// -------------------------------------------------- +.tallinn__message, .tallinn__message a { + color: #fff; +} + +// Modifiers +// -------------------------------------------------- +.tallinn--no_progress { + background-color: $color-error; +} + +.tallinn--in_progress { + background-color: $color-orange; +} + +.tallinn--no_data { + background-color: $color-grey-medium; +} + +.tallinn--completed { + background-color: $color-success; +} + +details.tallinn-box { + margin-left: 0; + margin-right: 0; +} + +.tallinn-chart__legend { + ul { + li { + text-indent: 0; + padding-left: 0; + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_timeline.scss b/web/themes/joinup/prototype/scss/components/_timeline.scss new file mode 100644 index 0000000000..5f6b0be289 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_timeline.scss @@ -0,0 +1,247 @@ +// Timeline +// +// Markup: html/timeline.html +// +// Styleguide 2.12 + +// Component +// -------------------------------------------------- +.timeline { + padding: 0; + background-color: transparent; +} + +// Elements +// -------------------------------------------------- +.timeline__release { + padding: 0; + + @include breakpoint(sm-mobile, mobile) { + padding-bottom: 30px; + + &:last-of-type { + padding-bottom: 0; + } + } + + + @include breakpoint(tablet) { + &:last-of-type { + padding-bottom: 160px; + } + } +} + +.timeline__release-progression { + position: relative; + margin: 0; + + @include breakpoint(sm-mobile, mobile) { + width: 100%; + } +} + +.timeline__release-info { + @include breakpoint(tablet) { + margin: 40px 50px 0 0; + text-align: right; + } + + + .release__info-element { + display: inline-block; + margin: 0 5px 20px 0; + + @include breakpoint(tablet) { + display: block; + margin-right: 0; + margin-bottom: 10px; + } + } +} + +.timeline__release-bar { + display: none; + + @include breakpoint(tablet) { + position: absolute; + top: 0; + right: 20px; + display: block; + width: 4px; + height: 110%; + background-color: $color-grey-light; + + &:before { + top: 38px; + display: block; + width: 18px; + height: 18px; + content: ""; + border: 4px solid $color-grey-bg; + background-color: $color-grey-light; + + @include border-radius(50%); + @include centered($horizontal: true, $vertical: false); + } + } +} + +.timeline__release-content { + position: relative; + margin: 0; + padding: 20px; + background-color: #fff; + + @include breakpoint(sm-mobile, mobile) { + width: 100%; + } + + + @include breakpoint(tablet) { + margin: 20px 0 0 20px; + padding-right: 10px; + padding-left: 10px; + } + + + &:before { + position: absolute; + top: 20px; + left: -12px; + display: none; + width: 0; + height: 0; + content: ""; + border-top: 12px solid transparent; + border-right: 12px solid #fff; + border-bottom: 12px solid transparent; + + @include breakpoint(tablet) { + display: block; + } + } +} + +.timeline__meta { + @include breakpoint(tablet) { + margin-right: 30px; + margin-left: 30px; + } +} + +.timeline__release-title { + margin-top: 0; + margin-bottom: 20px; +} + +.timeline__release-abstract { + color: $color-grey-medium; + margin-bottom: 20px; + + p, + a, + div { + display: inline; + } + + p:last-child { + margin-bottom: 0; + } +} + +.timeline__listing-block-title { + margin-top: 0; + + @include breakpoint(tablet) { + margin-left: 30px; + margin-right: 30px; + margin-bottom: 20px; + } +} + +.timeline__listing { + overflow: hidden; +} + +.timeline__listing-item { + overflow: hidden; + margin-top: 0; + margin-bottom: 10px; + + &:last-child { + margin-bottom: 0; + } + + @include breakpoint(tablet) { + padding: 20px 30px; + background-color: #f0f7f7; + } +} + +.timeline__listing-title { + float: left; + + @include breakpoint(tablet) { + float: none; + margin-bottom: 10px; + } +} + +.timeline__listing-details { + float: right; + margin-left: 10px; + + @include breakpoint(tablet) { + float: none; + margin-left: 0; + } + + + .value { + @include breakpoint(sm-mobile, mobile) { + font-size: $font-size-small; + } + } +} + +.timeline__read-more { + margin-top: 20px; + text-align: right; + text-transform: uppercase; +} + +// Modifiers +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.timeline__release { + &:first-child { + .timeline__release-progression { + overflow: hidden; + } + + .timeline__release-content { + margin-top: 0; + } + + .timeline__release-info { + margin-top: 22px; + } + + .timeline__release-bar { + top: 20px; + background-color: $color-blue-slider; + + &:before { + top: -1px; + border-color: $color-grey-bg; + background-color: $color-blue-slider; + } + } + } +} diff --git a/web/themes/joinup/prototype/scss/components/_vertical-menu.scss b/web/themes/joinup/prototype/scss/components/_vertical-menu.scss new file mode 100644 index 0000000000..5fe22896e8 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_vertical-menu.scss @@ -0,0 +1,43 @@ +// Vertical menu + +// Component +// -------------------------------------------------- +.vertical-menu { + list-style-type: none; + padding-left: 0; +} + +// Elements +// -------------------------------------------------- +.vertical-menu__label { + margin-top: 0; + margin-bottom: 10px; +} + +.vertical-menu__link { + color: $color-blue-dark; +} + +// Modifiers +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- +.section--footer { + .vertical-menu { + margin-top: 0; + margin-bottom: 0; + } + + .vertical-menu__link { + color: #fff; + } +} + +// States +// -------------------------------------------------- +.vertical-menu__link { + &:hover { + text-decoration: none; + } +} diff --git a/web/themes/joinup/prototype/scss/components/_vertical-tabs.scss b/web/themes/joinup/prototype/scss/components/_vertical-tabs.scss new file mode 100644 index 0000000000..0488b4f0e7 --- /dev/null +++ b/web/themes/joinup/prototype/scss/components/_vertical-tabs.scss @@ -0,0 +1,98 @@ +// vertical tabs +// +// vertical tabs component + +// Component +// -------------------------------------------------- +.vertical-tabs {} + +// Elements +// -------------------------------------------------- +.vertical-tabs__wrapper { + width: 100%; +} + +.vertical-tabs__pane { + padding: 20px; + background-color: #fff; + margin-bottom: 0 !important; + + @include breakpoint(tablet) { + padding: 40px 30px; + } + + + @include breakpoint(desktop) { + padding: 40px 60px; + } +} + +.vertical-tabs__pane > summary { + display: none; +} + +.vertical-tabs__details-summary { + display: none; +} + +.vertical-tabs__menu { + padding-left: 0; + display: none; + + @include breakpoint(mobile) { + display: block; + } +} + +.vertical-tabs__menu-item { + display: block; + border-bottom: 1px solid $color-grey-light; + background-color: $color-grey-lighter; + + a { + display: block; + padding: 20px 30px; + text-decoration: none; + } +} + +.vertical-tabs__menu-item-title { + color: $color-base; + display: block; + font-weight: $font-weight; +} + +.vertical-tabs__menu-item-summary { + font-size: $font-size-small - 1px; + font-weight: $font-weight-thin; + margin-top: 4px; + color: $color-grey-medium; + display: block; +} + +.vertical-tabs__actions { + .button { + margin-bottom: 5px; + } +} + +.vertical-tabs__menu-item--mobile { + display: block; + + @include breakpoint(mobile) { + display: none; + } +} + +// Modifiers +// -------------------------------------------------- + +// States +// -------------------------------------------------- +.vertical-tabs__menu-item.is-selected { + background-color: #fff; + + .vertical-tabs__menu-item-title { + font-weight: $font-weight-medium; + } +} diff --git a/web/themes/joinup/prototype/sass/components/html/!example.html b/web/themes/joinup/prototype/scss/components/html/!example.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/!example.html rename to web/themes/joinup/prototype/scss/components/html/!example.html diff --git a/web/themes/joinup/prototype/sass/components/html/alert.html b/web/themes/joinup/prototype/scss/components/html/alert.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/alert.html rename to web/themes/joinup/prototype/scss/components/html/alert.html diff --git a/web/themes/joinup/prototype/sass/components/html/button.html b/web/themes/joinup/prototype/scss/components/html/button.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/button.html rename to web/themes/joinup/prototype/scss/components/html/button.html diff --git a/web/themes/joinup/prototype/sass/components/html/circle-menu.html b/web/themes/joinup/prototype/scss/components/html/circle-menu.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/circle-menu.html rename to web/themes/joinup/prototype/scss/components/html/circle-menu.html diff --git a/web/themes/joinup/prototype/sass/components/html/draggable.html b/web/themes/joinup/prototype/scss/components/html/draggable.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/draggable.html rename to web/themes/joinup/prototype/scss/components/html/draggable.html diff --git a/web/themes/joinup/prototype/sass/components/html/etiquette.html b/web/themes/joinup/prototype/scss/components/html/etiquette.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/etiquette.html rename to web/themes/joinup/prototype/scss/components/html/etiquette.html diff --git a/web/themes/joinup/prototype/sass/components/html/file-upload.html b/web/themes/joinup/prototype/scss/components/html/file-upload.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/file-upload.html rename to web/themes/joinup/prototype/scss/components/html/file-upload.html diff --git a/web/themes/joinup/prototype/sass/components/html/filters.html b/web/themes/joinup/prototype/scss/components/html/filters.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/filters.html rename to web/themes/joinup/prototype/scss/components/html/filters.html diff --git a/web/themes/joinup/prototype/sass/components/html/footer-ec-menu.html b/web/themes/joinup/prototype/scss/components/html/footer-ec-menu.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/footer-ec-menu.html rename to web/themes/joinup/prototype/scss/components/html/footer-ec-menu.html diff --git a/web/themes/joinup/prototype/sass/components/html/footer-social-media.html b/web/themes/joinup/prototype/scss/components/html/footer-social-media.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/footer-social-media.html rename to web/themes/joinup/prototype/scss/components/html/footer-social-media.html diff --git a/web/themes/joinup/prototype/sass/components/html/header-logo.html b/web/themes/joinup/prototype/scss/components/html/header-logo.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/header-logo.html rename to web/themes/joinup/prototype/scss/components/html/header-logo.html diff --git a/web/themes/joinup/prototype/sass/components/html/header-menu.html b/web/themes/joinup/prototype/scss/components/html/header-menu.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/header-menu.html rename to web/themes/joinup/prototype/scss/components/html/header-menu.html diff --git a/web/themes/joinup/prototype/sass/components/html/icon-card.html b/web/themes/joinup/prototype/scss/components/html/icon-card.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/icon-card.html rename to web/themes/joinup/prototype/scss/components/html/icon-card.html diff --git a/web/themes/joinup/prototype/sass/components/html/icon.html b/web/themes/joinup/prototype/scss/components/html/icon.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/icon.html rename to web/themes/joinup/prototype/scss/components/html/icon.html diff --git a/web/themes/joinup/prototype/sass/components/html/inline-social-media.html b/web/themes/joinup/prototype/scss/components/html/inline-social-media.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/inline-social-media.html rename to web/themes/joinup/prototype/scss/components/html/inline-social-media.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--default-col-12.html b/web/themes/joinup/prototype/scss/components/html/listing-item--default-col-12.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--default-col-12.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--default-col-12.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--default-col-6.html b/web/themes/joinup/prototype/scss/components/html/listing-item--default-col-6.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--default-col-6.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--default-col-6.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--distribution-col-12.html b/web/themes/joinup/prototype/scss/components/html/listing-item--distribution-col-12.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--distribution-col-12.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--distribution-col-12.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--distribution-col-6.html b/web/themes/joinup/prototype/scss/components/html/listing-item--distribution-col-6.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--distribution-col-6.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--distribution-col-6.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--documentation.html b/web/themes/joinup/prototype/scss/components/html/listing-item--documentation.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--documentation.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--documentation.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--event-col-12.html b/web/themes/joinup/prototype/scss/components/html/listing-item--event-col-12.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--event-col-12.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--event-col-12.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--event-col-6.html b/web/themes/joinup/prototype/scss/components/html/listing-item--event-col-6.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--event-col-6.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--event-col-6.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--load-more.html b/web/themes/joinup/prototype/scss/components/html/listing-item--load-more.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--load-more.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--load-more.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--news-col-12.html b/web/themes/joinup/prototype/scss/components/html/listing-item--news-col-12.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--news-col-12.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--news-col-12.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--news-col-6.html b/web/themes/joinup/prototype/scss/components/html/listing-item--news-col-6.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--news-col-6.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--news-col-6.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--newsletter.html b/web/themes/joinup/prototype/scss/components/html/listing-item--newsletter.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--newsletter.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--newsletter.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--video-col-12.html b/web/themes/joinup/prototype/scss/components/html/listing-item--video-col-12.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--video-col-12.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--video-col-12.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing-item--video-col-6.html b/web/themes/joinup/prototype/scss/components/html/listing-item--video-col-6.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing-item--video-col-6.html rename to web/themes/joinup/prototype/scss/components/html/listing-item--video-col-6.html diff --git a/web/themes/joinup/prototype/sass/components/html/listing.html b/web/themes/joinup/prototype/scss/components/html/listing.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/listing.html rename to web/themes/joinup/prototype/scss/components/html/listing.html diff --git a/web/themes/joinup/prototype/sass/components/html/pager.html b/web/themes/joinup/prototype/scss/components/html/pager.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/pager.html rename to web/themes/joinup/prototype/scss/components/html/pager.html diff --git a/web/themes/joinup/prototype/sass/components/html/search-bar.html b/web/themes/joinup/prototype/scss/components/html/search-bar.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/search-bar.html rename to web/themes/joinup/prototype/scss/components/html/search-bar.html diff --git a/web/themes/joinup/prototype/sass/components/html/tab.html b/web/themes/joinup/prototype/scss/components/html/tab.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/tab.html rename to web/themes/joinup/prototype/scss/components/html/tab.html diff --git a/web/themes/joinup/prototype/sass/components/html/timeline.html b/web/themes/joinup/prototype/scss/components/html/timeline.html similarity index 100% rename from web/themes/joinup/prototype/sass/components/html/timeline.html rename to web/themes/joinup/prototype/scss/components/html/timeline.html diff --git a/web/themes/joinup/prototype/scss/layouts/_grid.scss b/web/themes/joinup/prototype/scss/layouts/_grid.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/_grid.scss @@ -0,0 +1 @@ + diff --git a/web/themes/joinup/prototype/scss/layouts/_layout.scss b/web/themes/joinup/prototype/scss/layouts/_layout.scss new file mode 100644 index 0000000000..49b2ae3a95 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/_layout.scss @@ -0,0 +1,26 @@ +h1, +h2, +h3, +span, +a, +div { + font-family: "Open Sans", sans-serif; + line-height: normal; +} + +div { + box-sizing: border-box; +} + +img { + max-width: 100%; + height: auto; +} + +.main-container { + width: 100%; + padding-left: 16px; + padding-right: 16px; + max-width: $container-desktop; + margin: 0 auto; +} diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section--content.sass b/web/themes/joinup/prototype/scss/layouts/sections/_section--content.scss similarity index 88% rename from web/themes/joinup/prototype/sass/layouts/sections/_section--content.sass rename to web/themes/joinup/prototype/scss/layouts/sections/_section--content.scss index dc6a799cca..64a57650e5 100644 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section--content.sass +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section--content.scss @@ -4,13 +4,13 @@ // Component // -------------------------------------------------- -.section--content - padding: 40px 0 +.section--content { + padding: 40px 0; +} // Elements // -------------------------------------------------- - // Modifiers // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/layouts/sections/_section--featured.scss b/web/themes/joinup/prototype/scss/layouts/sections/_section--featured.scss new file mode 100644 index 0000000000..dbe4802c81 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section--featured.scss @@ -0,0 +1,26 @@ +// Featured +// +// Featured component + +// Component +// -------------------------------------------------- +.section--featured { + .support-menu { + position: absolute; + top: 5px; + right: 65px; + } + + .anonymous-menu { + position: absolute; + top: 5px; + right: 20px; + + @include z-index(navigation); + } +} + +.section--featured-navy-blue { + text-align: center; + background-color: #27456b; +} diff --git a/web/themes/joinup/prototype/scss/layouts/sections/_section--footer.scss b/web/themes/joinup/prototype/scss/layouts/sections/_section--footer.scss new file mode 100644 index 0000000000..238a10e3b5 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section--footer.scss @@ -0,0 +1,39 @@ +// Footer +// +// Footer component + +// Component +// -------------------------------------------------- +.section--footer { + margin-top: auto; + + @include hidden-print; + + .footer__first { + background-color: $color-blue-default; + } + + .footer__second { + padding-top: 10px; + padding-bottom: 5px; + background-color: $color-blue-default; + } + + .footer__site-name { + margin-top: 0; + margin-bottom: 10px; + + img { + height: 30px; + width: auto; + } + } + + .footer__version { + a { + color: #acb7c4; + font-size: 0.85em; + text-decoration: none; + } + } +} diff --git a/web/themes/joinup/prototype/scss/layouts/sections/_section--header.scss b/web/themes/joinup/prototype/scss/layouts/sections/_section--header.scss new file mode 100644 index 0000000000..d25b172377 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section--header.scss @@ -0,0 +1,28 @@ +// Header +// +// Header component + +// Component +// -------------------------------------------------- +.section--header { + background-color: $color-blue-default; + + @include hidden-print; +} + +// Elements +// -------------------------------------------------- + +// Dependiencies +// -------------------------------------------------- +.section--header { + nav { + position: relative; + + @include z-index(navigation); + + &.block--small-nav { + @include z-index(header); + } + } +} diff --git a/web/themes/joinup/prototype/scss/layouts/sections/_section--sidebar-left.scss b/web/themes/joinup/prototype/scss/layouts/sections/_section--sidebar-left.scss new file mode 100644 index 0000000000..d3dcb4ae48 --- /dev/null +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section--sidebar-left.scss @@ -0,0 +1,70 @@ +// Section sidebar left +// +// Sidebar component + +// Component +// -------------------------------------------------- +.section--sidebar-left { + @include hidden-print; + + &:not(.section--sidebar-left--search) { + @include breakpoint(xxs, sm) { + margin: 0; + } + } +} + +// Elements +// -------------------------------------------------- +.section--sidebar-left--search { + min-width: 208px; + + .section--sidebar-left--search--wrapper { + background-color: #F4F5F7; + padding: 5px 20px 20px 20px; + + @include breakpoint(tablet) { + margin: 16px 0 0 0; + } + + + ul.item-list__checkbox { + margin-bottom: 10px; + + .mdl-checkbox__label { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + + span { + display: flex; + flex-direction: column; + flex-basis: 100%; + flex: 1; + + &.facet-item__value { + flex: 2; + } + + &.facet-item__count { + text-align: right; + } + } + } + } + + h2 { + font-size: 20px; + margin-bottom: 10px; + } + + h3 { + margin-bottom: 5px; + } + + select { + width: 100%; + } + } +} diff --git a/web/themes/joinup/prototype/sass/layouts/sections/_section.sass b/web/themes/joinup/prototype/scss/layouts/sections/_section.scss similarity index 85% rename from web/themes/joinup/prototype/sass/layouts/sections/_section.sass rename to web/themes/joinup/prototype/scss/layouts/sections/_section.scss index d803693c64..a1f93f2d4b 100644 --- a/web/themes/joinup/prototype/sass/layouts/sections/_section.sass +++ b/web/themes/joinup/prototype/scss/layouts/sections/_section.scss @@ -1,7 +1,8 @@ // Component // -------------------------------------------------- -.section - position: relative +.section { + position: relative; +} // Elements // -------------------------------------------------- diff --git a/web/themes/joinup/prototype/scss/variables/_variables.scss b/web/themes/joinup/prototype/scss/variables/_variables.scss new file mode 100644 index 0000000000..fb1a4a3718 --- /dev/null +++ b/web/themes/joinup/prototype/scss/variables/_variables.scss @@ -0,0 +1,95 @@ +// Colors +// -------------------------------------------------- +$color-base: #211b38; + +$color-grey-white: #fff; +$color-grey-lighter: #f4f6f7; +$color-grey-light: #e1e1e1; +$color-grey-medium: #707475; +$color-grey-bg: #e9edee; +$color-grey-input: #a0a1a2; +$color-grey-border: #c5c5c5; +$color-grey-filler: #dcdcdc; + +$color-blue-default: #27456b; +$color-blue-lighter: #32afff; +$color-blue-light: #184f85; +$color-blue-medium: #2875cf; +$color-blue-dark: #04213e; +$color-blue-slider: #0067a2; + +$color-yellow: #ffec00; +$color-orange: #ee8917; +$color-green: #51c77d; +$color-green-new: #498b7d; +$color-purple: #2a2348; +$color-error: #eb5b5c; +$color-warning: #ea9e50; +$color-info: #2875cf; +$color-success: #98c04c; + +// licence colors +$color-green-warm: #0aa198; +$color-beige-warm: #988a7f; +$color-red-warm: #d05655; +$color-blue-warm: #3486dc; +$color-grey-warm: #8897aa; +$color-orange-warm: #e5bc7a; + +// Layout +// -------------------------------------------------- +$container-desktop: 1600px; + +// Margin for form elements +$form-margin: 25px; +$form-large-margin: 40px; + +// Margin for tables +$table-margin: 16px; + +// Margin for fields +$field-margin: 10px; + +// Margin for tiles +$tile-margin: 15px; +$tile-margin-small: 5px; + +// Line height needed for fixed number of rows. +$row-height: 23px; +$row-height-small: 17px; + +// Typography +// -------------------------------------------------- +$font-size-base: 16px; +$font-size-large: 40px; +$font-size-medium: 20px; +$font-size-small: 14px; +$font-size-xsmall: 12px; + +$font-size-h1: 36px; +$font-size-h2: 24px; +$font-size-h3: 16px; +$font-size-h4: 13px; +$font-size-h5: 11px; + +$font-weight-thin: 300; +$font-weight: 400; +$font-weight-medium: 600; +$font-weight-bold: 700; + +// Breakpoints +// -------------------------------------------------- +$screen-lg: 1200px; +$screen-lg-min: $screen-lg; +$screen-md-max: $screen-lg - 1; +$screen-md: 992px; +$screen-md-min: $screen-md; +$screen-sm-max: $screen-md - 1; +$screen-sm: 840px; +$screen-sm-min: $screen-sm; +$screen-xs-max: $screen-sm - 1; +$screen-xs: 480px; +$screen-xs-min: $screen-xs; +$screen-xxs: 0; +$screen-xxs-min: $screen-xxs; +$screen-xxs-max: $screen-xs - 1; From 3b99aaf0f4070f996df0e2ae049362a2c98a4a0d Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 16 Mar 2020 12:49:43 +0200 Subject: [PATCH 228/957] ISAICP-5791: Fix 'TypeError: array_keys() expects parameter 1 to be array, null given' when no Honeypot forms are defined. --- .../tests/src/ExistingSite/JoinupExistingSiteTestBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php index 96034681ba..fae1df2fbf 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupExistingSiteTestBase.php @@ -128,7 +128,7 @@ protected function disableHoneypot(): void { $config_factory = \Drupal::configFactory(); $config = $config_factory->getEditable('honeypot.settings'); if (!isset($this->honeypotForms)) { - $this->honeypotForms = $config->get('form_settings'); + $this->honeypotForms = $config->get('form_settings') ?? []; } $config ->set('form_settings', array_fill_keys(array_keys($this->honeypotForms), FALSE)) From e0640eb352426a03c4c157cc89a2d55651a16b67 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 16 Mar 2020 12:51:10 +0200 Subject: [PATCH 229/957] ISAICP-5791: Use constants rather than magic strings for the cache context values. --- .../Cache/Context/EuLoginUserCacheContext.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php index 3975e101cc..5fecb052e0 100644 --- a/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php +++ b/web/modules/custom/eulogin/src/Cache/Context/EuLoginUserCacheContext.php @@ -22,6 +22,21 @@ */ class EuLoginUserCacheContext extends UserCacheContextBase implements CacheContextInterface { + /** + * A context value representing a user that has linked their EU Login account. + */ + const USER_IS_LINKED = 'y'; + + /** + * A context value representing a user that has not yet linked with EU Login. + */ + const USER_NOT_LINKED = 'n'; + + /** + * A context value representing an anonymous user. + */ + const USER_ANONYMOUS = '0'; + /** * The entity type manager service. * @@ -54,13 +69,13 @@ public static function getLabel() { */ public function getContext() { if ($this->user->isAnonymous()) { - return '0'; + return self::USER_ANONYMOUS; } /** @var \Drupal\user\UserInterface $account */ $account = $this->entityTypeManager->getStorage('user')->load($this->user->id()); - return !$account->get('eulogin_authname')->isEmpty() ? 'y' : 'n'; + return !$account->get('eulogin_authname')->isEmpty() ? self::USER_IS_LINKED : self::USER_NOT_LINKED; } /** From f8e659312c092a73c44a1317b691882116467f12 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 10 Mar 2020 08:57:43 +0200 Subject: [PATCH 230/957] ISAICP-5885: Bring phpunit.xml.dist up to date with the latest changes in core. --- phpunit.xml.dist | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 12f791cf3a..35ac48f57c 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -11,15 +11,8 @@ beStrictAboutOutputDuringTests="true" beStrictAboutChangesToGlobalState="true" checkForUnintentionallyCoveredCode="false" + printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter" verbose="true"> - @@ -35,12 +28,21 @@ + + + + - + + + From 31efbd4a6f266565c04c3db3dc09c99e0c745440 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 16 Mar 2020 15:53:22 +0200 Subject: [PATCH 231/957] ISAICP-5609: Allow source map generation. --- build.project.xml | 11 +++++++++++ build.properties | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/build.project.xml b/build.project.xml index e57933ae6b..26675455df 100644 --- a/build.project.xml +++ b/build.project.xml @@ -285,9 +285,20 @@ + + + + + + + + + + + diff --git a/build.properties b/build.properties index 483847492c..b55f1bfdc9 100644 --- a/build.properties +++ b/build.properties @@ -243,6 +243,10 @@ scssphp.css.output.file = ${scssphp.css.output.dir}/style.min.css # The code style. Can be compact, compressed, crunched, expanded, or nested. scssphp.style = compressed +# Whether to generate the source map. Developers may override this property in +# their build.properties.local and set the value to TRUE for debugging purposes. +scssphp.sourcemap = FALSE + # Analytics configuration # ----------------------- From 5dee1d6a771771b8dfb56252f05ca869c2a29fe1 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 16 Mar 2020 16:21:05 +0200 Subject: [PATCH 232/957] FRONT-809: Fix camelcase to lowercase in variables. --- web/themes/joinup/joinup_theme.theme | 43 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 85b0e4816f..0ee06d5137 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -230,10 +230,10 @@ function _joinup_is_create_form_route($route_name) { * Renderable array contains the author. */ function _joinup_theme_get_author(NodeInterface $node) { - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('user'); + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('user'); $author = $node->get('uid')->entity; - $author_inline = $viewBuilder->view($author, 'inline'); + $author_inline = $view_builder->view($author, 'inline'); return $author_inline; } @@ -966,11 +966,11 @@ function joinup_theme_preprocess_page_title__rdf_entity__asset_release(&$variabl } // Get the view builder service from the entity type manager. - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('rdf_entity'); + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('rdf_entity'); // Get the creation date field. $creation_date = $entity->get('created'); - $creation_date = $viewBuilder->viewField($creation_date, 'default'); + $creation_date = $view_builder->viewField($creation_date, 'default'); $variables['additional_content']['created'] = $creation_date; } @@ -982,13 +982,13 @@ function joinup_theme_preprocess_page_title__rdf_entity__asset_distribution(&$va $entity = $variables['entity']; // Get the view builder service from the entity type manager. - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('rdf_entity'); + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('rdf_entity'); // Get the file size and licence fields. $field_ad_file_size = $entity->field_ad_file_size; $field_ad_licence = $entity->field_ad_licence; - $field_ad_file_size = $viewBuilder->viewField($field_ad_file_size, 'default'); - $field_ad_licence = $viewBuilder->viewField($field_ad_licence, 'default'); + $field_ad_file_size = $view_builder->viewField($field_ad_file_size, 'default'); + $field_ad_licence = $view_builder->viewField($field_ad_licence, 'default'); $variables['additional_content']['field_ad_file_size'] = $field_ad_file_size; $variables['additional_content']['field_ad_licence'] = $field_ad_licence; @@ -1001,16 +1001,16 @@ function joinup_theme_preprocess_page_title__node__news(&$variables) { /** @var \Drupal\node\NodeInterface $node */ $node = $variables['entity']; - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('node'); - $field_news_headline = $viewBuilder->viewField($node->field_news_headline, 'default'); + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); + $field_news_headline = $view_builder->viewField($node->field_news_headline, 'default'); $variables['additional_content']['field_news_headline'] = $field_news_headline; $published = \Drupal::service('date.formatter')->format($node->published_at->published_at_or_created, 'date_only'); $variables['additional_content']['published'] = $published; - $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); - $variables['additional_content']['updated'] = $updateDate; + $update_date = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $update_date; $author_inline = _joinup_theme_get_author($node); $variables['additional_content']['author'] = $author_inline; @@ -1026,8 +1026,8 @@ function joinup_theme_preprocess_page_title__node__discussion(&$variables) { $published = \Drupal::service('date.formatter')->format($node->published_at->published_at_or_created, 'date_only'); $variables['additional_content']['published'] = $published; - $updateDate = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); - $variables['additional_content']['updated'] = $updateDate; + $update_date = \Drupal::service('date.formatter')->format($node->getChangedTime(), 'custom', 'd/m/Y'); + $variables['additional_content']['updated'] = $update_date; $author_inline = _joinup_theme_get_author($node); $variables['additional_content']['author'] = $author_inline; @@ -1069,7 +1069,6 @@ function joinup_theme_preprocess_page_title__node__document(&$variables) { $update_date = $date_formatter->format($node->getChangedTime(), 'custom', 'd/m/Y'); $variables['additional_content']['updated'] = $update_date; - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ $field_short_title = $view_builder->viewField($node->field_short_title, 'default'); $variables['additional_content']['field_short_title'] = $field_short_title; @@ -1179,12 +1178,12 @@ function joinup_theme_preprocess_page_title__node__event(&$variables) { /** @var \Drupal\node\NodeInterface $node */ $node = $variables['entity']; - /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $viewBuilder */ - $viewBuilder = \Drupal::entityTypeManager()->getViewBuilder('node'); + /* @var \Drupal\Core\Entity\EntityViewBuilderInterface $view_builder */ + $view_builder = \Drupal::entityTypeManager()->getViewBuilder('node'); // Get dates and location fields. - $field_event_date = $viewBuilder->viewField($node->get('field_event_date'), 'default'); - $field_event_location = $viewBuilder->viewField($node->get('field_location'), 'default'); + $field_event_date = $view_builder->viewField($node->get('field_event_date'), 'default'); + $field_event_location = $view_builder->viewField($node->get('field_location'), 'default'); $published = \Drupal::service('date.formatter')->format($node->published_at->published_at_or_created, 'date_only'); From 3925adfbdb45d6df294ca3e3d86daf08d0749649 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 16 Mar 2020 16:59:32 +0200 Subject: [PATCH 233/957] FRONT-809: More QA remarks fixes. --- .../joinup_community_content.behat.inc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc index 059aaae026..b1071bbaf0 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.behat.inc @@ -201,15 +201,17 @@ class JoinupCommunityContentSubContext extends DrupalSubContextBase implements D * @param string $bundle * The node label. * @param string $new_date - * The new date property. The format should be acceptable by the strtotime - * function. A full format example is "Thu, 26 Dec 2019 14:00:00 +0100". - * The above includes also "+0100" which represents the timezone. + * The new date property. The format should be acceptable by the strtotime() + * function. A full format example is "Thu, 26 Dec 2019 14:00:00 +0100". The + * above includes also "+0100" which represents the timezone. + * + * @see strtotime() * * @Given the :field_name date of the :title :bundle is :new_date */ public function updateNodeDateProperty(string $field_name, string $title, string $bundle, string $new_date): void { if (!($time = strtotime($new_date))) { - throw new Exception("{$new_date} could not be converted to string."); + throw new \Exception("{$new_date} could not be converted to string."); } $this->getNodeByTitle($title, $bundle) ->set($field_name, $time) From 689646d0b6e191e2a3c4d747fbb7af13d10f58c8 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 16 Mar 2020 15:42:01 +0200 Subject: [PATCH 234/957] ISAICP-5882: Relocating theming related code inside the theme. --- .../joinup_licence/joinup_licence.module | 47 --------------- web/themes/joinup/joinup_theme.theme | 57 +++++++++++++++---- 2 files changed, 45 insertions(+), 59 deletions(-) diff --git a/web/modules/custom/joinup_licence/joinup_licence.module b/web/modules/custom/joinup_licence/joinup_licence.module index 515bc85e14..9b1860410f 100644 --- a/web/modules/custom/joinup_licence/joinup_licence.module +++ b/web/modules/custom/joinup_licence/joinup_licence.module @@ -178,50 +178,3 @@ function joinup_licence_theme($existing, $type, $theme, $path) { ], ]; } - -/** - * Implements hook_preprocess_node(). - * - * Adds extension and file size to the available variables when rendering a - * document node. - * - * @todo Why is this in joinup_licence? What does this have to do with licences? - * @todo Update documentation, this is not retrieving extensions nor file sizes. - */ -function joinup_licence_preprocess_node(&$variables) { - /** @var \Drupal\node\NodeInterface $node */ - $node = $variables['node']; - - // Add bundle class in listing templates. - if ($variables['view_mode'] == 'view_mode_tile' || $variables['view_mode'] == 'view_mode_featured') { - $bundle_class = 'listing__card--' . str_replace('_', '-', $node->bundle()); - $variables['attributes']['class'][] = $bundle_class; - } - - // Getting the node creation from the node object. - if ($node->bundle() == 'news') { - $variables['created'] = \Drupal::service('date.formatter')->format($node->getCreatedTime(), 'date_only'); - } - - // @todo Consider moving the below logic into joinup_document. - if ($node->bundle() !== 'document' || $node->get('field_file')->isEmpty()) { - return; - } - - /** @var \Drupal\file\FileInterface $file */ - $file = $node->get('field_file')->first()->entity; - - // The document could reference an orphaned file entity. - if (empty($file)) { - return; - } - - $is_remote = \Drupal::service('file_url.handler')->isRemote($file); - - if (!$is_remote) { - $variables['extension'] = pathinfo($file->getFilename(), PATHINFO_EXTENSION); - } - else { - $variables['extension'] = t('External'); - } -} diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 2afe74b27b..bbdf57d026 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1957,27 +1957,60 @@ function joinup_theme_preprocess_message_digest(&$variables) { * * - Adds the site URL to use in nodes. * - Adds the group ID and label as data attributes in tiles. + * - Adds bundle class in listing templates for bundle specific theming. + * - Adds the created date to news articles. + * - Adds a variable indicating the attachment file type on documents. */ function joinup_theme_preprocess_node(&$variables) { + /** @var \Drupal\node\NodeInterface $node */ + $node = $variables['node']; + + // Add the site URL to use in nodes. $variables['site_url'] = \Drupal::request()->getSchemeAndHttpHost(); - if ($variables['view_mode'] !== 'view_mode_tile') { - return; + // Add the group ID and label as data attributes in tiles. + if ($variables['view_mode'] === 'view_mode_tile') { + /** @var \Drupal\rdf_entity\RdfInterface|null $parent */ + $parent = \Drupal::service('joinup_core.relations_manager')->getParent($node); + if ($parent) { + $variables['attributes']['data-drupal-parent-id'] = $parent->id(); + $variables['attributes']['data-drupal-parent-label'] = $parent->label(); + } + + // If the node is shared somewhere, attach the related library. + if ($node->hasField('field_shared_in') && !$node->get('field_shared_in')->isEmpty()) { + $variables['#attached']['library'][] = 'joinup_theme/shared_entity'; + } } - /** @var \Drupal\node\Entity\Node $node */ - $node = $variables['node']; + // Add bundle class in listing templates. + if ($variables['view_mode'] === 'view_mode_tile' || $variables['view_mode'] === 'view_mode_featured') { + $bundle_class = 'listing__card--' . str_replace('_', '-', $node->bundle()); + $variables['attributes']['class'][] = $bundle_class; + } - /** @var \Drupal\rdf_entity\RdfInterface|null $parent */ - $parent = \Drupal::service('joinup_core.relations_manager')->getParent($node); - if ($parent) { - $variables['attributes']['data-drupal-parent-id'] = $parent->id(); - $variables['attributes']['data-drupal-parent-label'] = $parent->label(); + // Add the created date to news articles. + if ($node->bundle() === 'news') { + $variables['created'] = \Drupal::service('date.formatter')->format($node->getCreatedTime(), 'date_only'); } - // If the node is shared somewhere, attach the related library. - if ($node->hasField('field_shared_in') && !$node->get('field_shared_in')->isEmpty()) { - $variables['#attached']['library'][] = 'joinup_theme/shared_entity'; + // Add a variable indicating the attachment file type on documents. + if ($node->bundle() === 'document' && !$node->get('field_file')->isEmpty()) { + /** @var \Drupal\file\FileInterface $file */ + $file = $node->get('field_file')->first()->entity; + + // The document could reference an orphaned file entity, so only proceed if + // we actually have a file. + if (!empty($file)) { + $is_remote = \Drupal::service('file_url.handler')->isRemote($file); + + if (!$is_remote) { + $variables['extension'] = pathinfo($file->getFilename(), PATHINFO_EXTENSION); + } + else { + $variables['extension'] = t('External'); + } + } } } From 8fc883795d582cceec989b044ddf4c696795d29a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 16 Mar 2020 20:22:56 +0200 Subject: [PATCH 235/957] The entity manager has been deprecated and will be removed in Drupal 9. --- composer.json | 2 +- composer.lock | 194 ++++++++++-------- tests/src/Traits/EntityTrait.php | 6 +- .../collection/src/CollectionLazyBuilders.php | 4 +- .../custom_page/custom_page.services.yml | 1 - .../src/Form/OgMenuInstanceForm.php | 12 +- .../src/Access/NodeRevisionAccessCheck.php | 4 +- .../joinup_core/src/Controller/FileFields.php | 8 +- .../GroupedRdfTaxonomyTermSelection.php | 6 +- .../RdfEntitySelection.php | 12 +- .../joinup_group/joinup_group.services.yml | 1 - .../joinup_group/src/Form/UserCancelForm.php | 14 +- .../src/Form/UserMultipleCancelConfirm.php | 16 +- .../src/Routing/RouteSubscriber.php | 2 + .../joinup_user/joinup_user.services.yml | 1 - .../OgCommentDefaultFormatter.php | 10 +- .../src/RevisionManager.php | 2 + .../state_machine_revisions.services.yml | 2 +- web/profiles/joinup/joinup.profile | 2 +- web/profiles/joinup/joinup.services.yml | 1 - 20 files changed, 171 insertions(+), 129 deletions(-) diff --git a/composer.json b/composer.json index f1376468b2..3441c04c7e 100644 --- a/composer.json +++ b/composer.json @@ -246,7 +246,7 @@ "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, "drupal/og_menu": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" + "Drupal 9 readiness: entity manager is deprecated @see https://www.drupal.org/project/og_menu/issues/3119437": "https://www.drupal.org/files/issues/2020-03-12/3119437-2.patch" }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", diff --git a/composer.lock b/composer.lock index 028cd9868a..0b1a7a3183 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": "73aa3bf8f180b39bb2cbba330e2ad304", + "content-hash": "6f4cc8a3f2ccfcc9f8ed59fa97dcd944", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.27", + "version": "3.133.37", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9" + "reference": "94ced25e191a2a951edd5d9195820bbd2c1d8567" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", - "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/94ced25e191a2a951edd5d9195820bbd2c1d8567", + "reference": "94ced25e191a2a951edd5d9195820bbd2c1d8567", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-02T19:20:19+00:00" + "time": "2020-03-16T18:10:35+00:00" }, { "name": "caxy/php-htmldiff", @@ -364,16 +364,16 @@ }, { "name": "composer/composer", - "version": "1.9.3", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b" + "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/1291a16ce3f48bfdeca39d64fca4875098af4d7b", - "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b", + "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011", + "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011", "shasum": "" }, "require": { @@ -386,17 +386,17 @@ "psr/log": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0" + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" }, "conflict": { "symfony/console": "2.8.38" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7", - "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^3.4" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -409,7 +409,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -440,7 +440,17 @@ "dependency", "package" ], - "time": "2020-02-04T11:58:49+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-03-13T19:34:27+00:00" }, { "name": "composer/installers", @@ -3160,16 +3170,16 @@ }, { "name": "drupal/core", - "version": "8.8.2", + "version": "8.8.3", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62" + "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/f997857003276c2ae6d27db30f0eab9c7dd10e62", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62", + "url": "https://api.github.com/repos/drupal/core/zipball/77971de6d6ade7366cdd3fadfc16c5d02e531446", + "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446", "shasum": "" }, "require": { @@ -3405,20 +3415,20 @@ "GPL-2.0-or-later" ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", - "time": "2020-02-01T19:51:15+00:00" + "time": "2020-03-04T18:01:37+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "8.8.2", + "version": "8.8.3", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "dca4b123a638d78bf77719632993e920de6cc426" + "reference": "984129ae3152d570c9448e52869f04a22fc75269" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/dca4b123a638d78bf77719632993e920de6cc426", - "reference": "dca4b123a638d78bf77719632993e920de6cc426", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/984129ae3152d570c9448e52869f04a22fc75269", + "reference": "984129ae3152d570c9448e52869f04a22fc75269", "shasum": "" }, "require": { @@ -3452,7 +3462,7 @@ "keywords": [ "drupal" ], - "time": "2019-10-09T02:55:24+00:00" + "time": "2020-02-21T09:36:23+00:00" }, { "name": "drupal/csv_serialization", @@ -3756,7 +3766,7 @@ "shasum": "109047e07a7e77528747d41044b6cf13f2671ac7" }, "require": { - "drupal/core": "*" + "drupal/core": "^8 || ^9" }, "type": "drupal-module", "extra": { @@ -5419,11 +5429,11 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "6dd3e391bb5f45d8752a9184bc714b4ae2a8c320" + "reference": "16c40e03a4274e1dd781ab9a02478b7e15aea5ef" }, "require": { "drupal/core": "*", - "drupal/og": "*" + "drupal/og": "^1.0.0-alpha4" }, "type": "drupal-module", "extra": { @@ -5431,15 +5441,15 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha3+11-dev", - "datestamp": "1545301380", + "version": "8.x-1.0-alpha3+13-dev", + "datestamp": "1584029947", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." } }, "patches_applied": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" + "Drupal 9 readiness: entity manager is deprecated @see https://www.drupal.org/project/og_menu/issues/3119437": "https://www.drupal.org/files/issues/2020-03-12/3119437-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5472,13 +5482,13 @@ "homepage": "https://www.drupal.org/user/655596" } ], - "description": "Drupal module to allow associating menus with og groups.", + "description": "Integrates Drupal menus with Organic Groups.", "homepage": "https://drupal.org/project/og_menu", "support": { - "source": "https://cgit.drupalcode.org/og_menu", + "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" }, - "time": "2019-12-02T19:38:32+00:00" + "time": "2020-03-12T16:23:32+00:00" }, { "name": "drupal/password_policy", @@ -9831,32 +9841,31 @@ }, { "name": "psy/psysh", - "version": "v0.9.12", + "version": "v0.10.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4" + "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e361c8b7e5114534078e0ce04ddc442b39018a3c", + "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1.*", "ext-json": "*", "ext-tokenizer": "*", - "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", - "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", - "php": ">=5.4.0", - "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", - "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" + "jakub-onderka/php-console-highlighter": "0.4.*|0.3.*", + "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", + "php": "^8.0 || ^7.0 || ^5.5.9", + "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", + "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "~2.15|~3.16", - "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" + "hoa/console": "~3.16|~2.15" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", @@ -9871,7 +9880,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.9.x-dev" + "dev-master": "0.10.x-dev" } }, "autoload": { @@ -9901,7 +9910,7 @@ "interactive", "shell" ], - "time": "2019-12-06T14:19:43+00:00" + "time": "2020-03-15T22:52:37+00:00" }, { "name": "ralouphie/getallheaders", @@ -10103,7 +10112,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -12579,35 +12588,38 @@ }, { "name": "behat/mink", - "version": "v1.7.1", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9" + "reference": "e1772aabb6b654464264a6cc72158c8b3409d8bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9", - "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/e1772aabb6b654464264a6cc72158c8b3409d8bc", + "reference": "e1772aabb6b654464264a6cc72158c8b3409d8bc", "shasum": "" }, "require": { "php": ">=5.3.1", - "symfony/css-selector": "~2.1|~3.0" + "symfony/css-selector": "^2.7|^3.0|^4.0|^5.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7|~3.0" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20", + "symfony/debug": "^2.7|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.4.38 || ^5.0.5" }, "suggest": { "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)", "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation", "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)", - "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)" + "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)", + "dmore/chrome-mink-driver": "fast and JS-enabled driver for any app (requires chromium or google chrome)" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -12633,20 +12645,20 @@ "testing", "web" ], - "time": "2016-03-05T08:26:18+00:00" + "time": "2020-03-11T15:26:34+00:00" }, { "name": "behat/mink-browserkit-driver", - "version": "1.3.3", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/minkphp/MinkBrowserKitDriver.git", - "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb" + "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", - "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", + "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/e3b90840022ebcd544c7b394a3c9597ae242cbee", + "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee", "shasum": "" }, "require": { @@ -12657,6 +12669,7 @@ }, "require-dev": { "mink/driver-testsuite": "dev-master", + "symfony/debug": "^2.7|^3.0|^4.0", "symfony/http-kernel": "~2.3|~3.0|~4.0" }, "type": "mink-driver", @@ -12689,7 +12702,7 @@ "browser", "testing" ], - "time": "2018-05-02T09:25:31+00:00" + "time": "2020-03-11T09:49:45+00:00" }, { "name": "behat/mink-extension", @@ -12807,16 +12820,16 @@ }, { "name": "behat/mink-selenium2-driver", - "version": "dev-master", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/minkphp/MinkSelenium2Driver.git", - "reference": "e2f7a8a781ac11d393394227a43e03e9a9e2b311" + "reference": "312a967dd527f28980cce40850339cd5316da092" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/e2f7a8a781ac11d393394227a43e03e9a9e2b311", - "reference": "e2f7a8a781ac11d393394227a43e03e9a9e2b311", + "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/312a967dd527f28980cce40850339cd5316da092", + "reference": "312a967dd527f28980cce40850339cd5316da092", "shasum": "" }, "require": { @@ -12864,7 +12877,7 @@ "testing", "webdriver" ], - "time": "2020-01-20T19:37:28+00:00" + "time": "2020-03-11T14:43:21+00:00" }, { "name": "behat/transliterator", @@ -14739,16 +14752,16 @@ }, { "name": "phpspec/prophecy", - "version": "v1.10.2", + "version": "v1.10.3", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9" + "reference": "451c3cd1418cf640de218914901e51b064abb093" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", "shasum": "" }, "require": { @@ -14798,7 +14811,7 @@ "spy", "stub" ], - "time": "2020-01-20T15:57:02+00:00" + "time": "2020-03-05T15:02:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -15858,6 +15871,20 @@ ], "description": "Symfony BrowserKit Component", "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": "2020-01-01T11:03:25+00:00" }, { @@ -15926,25 +15953,25 @@ }, { "name": "symfony/css-selector", - "version": "v3.4.38", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1" + "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee9b946e7223b11257329a054c64396b19d619e1", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", + "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -15975,7 +16002,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-02-04T09:01:01+00:00" }, { "name": "symfony/dom-crawler", @@ -16278,5 +16305,6 @@ }, "platform-overrides": { "php": "7.1.9" - } + }, + "plugin-api-version": "1.1.0" } diff --git a/tests/src/Traits/EntityTrait.php b/tests/src/Traits/EntityTrait.php index 9a82a17230..7e33b5df60 100644 --- a/tests/src/Traits/EntityTrait.php +++ b/tests/src/Traits/EntityTrait.php @@ -35,14 +35,14 @@ trait EntityTrait { * exist. */ protected static function getEntityByLabel(string $entity_type_id, string $label, string $bundle = NULL): EntityInterface { - $entity_manager = \Drupal::entityTypeManager(); + $entity_type_manager = \Drupal::entityTypeManager(); try { - $storage = $entity_manager->getStorage($entity_type_id); + $storage = $entity_type_manager->getStorage($entity_type_id); } catch (InvalidPluginDefinitionException $e) { throw new \RuntimeException('Storage not found', NULL, $e); } - $entity = $entity_manager->getDefinition($entity_type_id); + $entity = $entity_type_manager->getDefinition($entity_type_id); $query = $storage->getQuery() ->condition($entity->getKey('label'), $label) diff --git a/web/modules/custom/collection/src/CollectionLazyBuilders.php b/web/modules/custom/collection/src/CollectionLazyBuilders.php index 35bd522b85..fbb0ab9486 100644 --- a/web/modules/custom/collection/src/CollectionLazyBuilders.php +++ b/web/modules/custom/collection/src/CollectionLazyBuilders.php @@ -1,5 +1,7 @@ urlMatcher = $url_matcher; } @@ -86,7 +86,7 @@ public function __construct(EntityManagerInterface $entity_manager, QueryFactory */ public static function create(ContainerInterface $container) { return new static( - $container->get('entity.manager'), + $container->get('entity.repository'), $container->get('entity.query'), $container->get('plugin.manager.menu.link'), $container->get('menu.link_tree'), diff --git a/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php b/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php index 766ac99469..bc4ef35451 100644 --- a/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php +++ b/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php @@ -1,5 +1,7 @@ entityFieldManager = $entity_field_manager; diff --git a/web/modules/custom/joinup_core/src/Plugin/EntityReferenceSelection/GroupedRdfTaxonomyTermSelection.php b/web/modules/custom/joinup_core/src/Plugin/EntityReferenceSelection/GroupedRdfTaxonomyTermSelection.php index b0121741ec..74539effba 100644 --- a/web/modules/custom/joinup_core/src/Plugin/EntityReferenceSelection/GroupedRdfTaxonomyTermSelection.php +++ b/web/modules/custom/joinup_core/src/Plugin/EntityReferenceSelection/GroupedRdfTaxonomyTermSelection.php @@ -1,5 +1,7 @@ entityManager->getBundleInfo('taxonomy_term'); + $bundles = $this->entityTypeBundleInfo->getBundleInfo('taxonomy_term'); $handler_settings = $this->configuration['handler_settings']; $bundle_names = !empty($handler_settings['target_bundles']) ? $handler_settings['target_bundles'] : array_keys($bundles); foreach ($bundle_names as $bundle) { - $terms = $this->entityManager + $terms = $this->entityTypeManager ->getStorage('taxonomy_term') ->loadTree($bundle, 0, NULL, TRUE); if ($terms) { diff --git a/web/modules/custom/joinup_federation/src/Plugin/EntityReferenceSelection/RdfEntitySelection.php b/web/modules/custom/joinup_federation/src/Plugin/EntityReferenceSelection/RdfEntitySelection.php index 28046f063b..9ecfc173eb 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/EntityReferenceSelection/RdfEntitySelection.php +++ b/web/modules/custom/joinup_federation/src/Plugin/EntityReferenceSelection/RdfEntitySelection.php @@ -4,7 +4,7 @@ namespace Drupal\joinup_federation\Plugin\EntityReferenceSelection; -use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Session\AccountInterface; @@ -41,8 +41,8 @@ class RdfEntitySelection extends DefaultSelection { * The plugin_id for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. - * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager - * The entity manager service. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager service. * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler * The module handler service. * @param \Drupal\Core\Session\AccountInterface $current_user @@ -50,8 +50,8 @@ class RdfEntitySelection extends DefaultSelection { * @param \Drupal\joinup_federation\StagingCandidateGraphsInterface $staging_candidate_graphs * The staging candidate graphs service. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, StagingCandidateGraphsInterface $staging_candidate_graphs) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_manager, $module_handler, $current_user); + public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, StagingCandidateGraphsInterface $staging_candidate_graphs) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $module_handler, $current_user); $this->stagingCandidateGraphs = $staging_candidate_graphs; } @@ -63,7 +63,7 @@ public static function create(ContainerInterface $container, array $configuratio $configuration, $plugin_id, $plugin_definition, - $container->get('entity.manager'), + $container->get('entity_type.manager'), $container->get('module_handler'), $container->get('current_user'), $container->get('joinup_federation.staging_candidate_graphs') diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index 8211376ced..5402870654 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -10,7 +10,6 @@ services: lazy: true joinup_group.route_subscriber: class: Drupal\joinup_group\Routing\RouteSubscriber - arguments: ['@entity.manager'] tags: - { name: event_subscriber } joinup_group.transfer_ownership_subscriber: diff --git a/web/modules/custom/joinup_group/src/Form/UserCancelForm.php b/web/modules/custom/joinup_group/src/Form/UserCancelForm.php index 1184d45a8a..eb9f2d5706 100644 --- a/web/modules/custom/joinup_group/src/Form/UserCancelForm.php +++ b/web/modules/custom/joinup_group/src/Form/UserCancelForm.php @@ -1,9 +1,11 @@ groupManager = $group_manager; } @@ -49,7 +51,7 @@ public function __construct(EntityManagerInterface $entity_manager, EntityTypeBu */ public static function create(ContainerInterface $container) { return new static( - $container->get('entity.manager'), + $container->get('entity.repository'), $container->get('entity_type.bundle.info'), $container->get('datetime.time'), $container->get('joinup_group.group_manager') diff --git a/web/modules/custom/joinup_group/src/Form/UserMultipleCancelConfirm.php b/web/modules/custom/joinup_group/src/Form/UserMultipleCancelConfirm.php index 4f4cd45acf..b3aef3b590 100644 --- a/web/modules/custom/joinup_group/src/Form/UserMultipleCancelConfirm.php +++ b/web/modules/custom/joinup_group/src/Form/UserMultipleCancelConfirm.php @@ -1,8 +1,10 @@ groupManager = $joinup_group_manager; } @@ -50,8 +52,8 @@ public function __construct(PrivateTempStoreFactory $temp_store_factory, UserSto public static function create(ContainerInterface $container) { return new static( $container->get('tempstore.private'), - $container->get('entity.manager')->getStorage('user'), - $container->get('entity.manager'), + $container->get('entity_type.manager')->getStorage('user'), + $container->get('entity_type.manager'), $container->get('joinup_group.group_manager') ); } diff --git a/web/modules/custom/joinup_group/src/Routing/RouteSubscriber.php b/web/modules/custom/joinup_group/src/Routing/RouteSubscriber.php index d25a1858e6..8190d6b34c 100644 --- a/web/modules/custom/joinup_group/src/Routing/RouteSubscriber.php +++ b/web/modules/custom/joinup_group/src/Routing/RouteSubscriber.php @@ -1,5 +1,7 @@ get('current_user'), - $container->get('entity.manager'), + $container->get('entity_type.manager'), $container->get('entity.form_builder'), $container->get('current_route_match'), $container->get('database'), @@ -76,8 +78,8 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountInterface $current_user, EntityManagerInterface $entity_manager, EntityFormBuilderInterface $entity_form_builder, RouteMatchInterface $route_match, Connection $database, GroupTypeManager $group_type_manager, MembershipManagerInterface $membership_manager) { - parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $current_user, $entity_manager, $entity_form_builder, $route_match); + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountInterface $current_user, EntityTypeManagerInterface $entity_type_manager, EntityFormBuilderInterface $entity_form_builder, RouteMatchInterface $route_match, Connection $database, GroupTypeManager $group_type_manager, MembershipManagerInterface $membership_manager) { + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $current_user, $entity_type_manager, $entity_form_builder, $route_match); $this->database = $database; $this->groupTypeManager = $group_type_manager; $this->membershipManager = $membership_manager; diff --git a/web/modules/custom/state_machine_revisions/src/RevisionManager.php b/web/modules/custom/state_machine_revisions/src/RevisionManager.php index 5d30433a24..3f8d8e9702 100644 --- a/web/modules/custom/state_machine_revisions/src/RevisionManager.php +++ b/web/modules/custom/state_machine_revisions/src/RevisionManager.php @@ -1,5 +1,7 @@ getBundleInfo($entity_type); + $bundle_info = \Drupal::service('entity_type.bundle.info')->getBundleInfo($entity_type); $element['form']['#title'] = $bundle_info[$bundle]['label']; } } diff --git a/web/profiles/joinup/joinup.services.yml b/web/profiles/joinup/joinup.services.yml index d7ef363a4e..0fcf7b4603 100644 --- a/web/profiles/joinup/joinup.services.yml +++ b/web/profiles/joinup/joinup.services.yml @@ -10,7 +10,6 @@ services: lazy: true joinup.route_subscriber: class: Drupal\joinup\Routing\RouteSubscriber - arguments: ['@entity.manager'] tags: - { name: event_subscriber } joinup.uid_1_only_access: From bee3036d039eacf44b277119bb41e79b1cd97dc8 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 01:12:25 +0200 Subject: [PATCH 236/957] ISAICP-5410: Create and enable the digitaldocument schema metatag group. --- composer.json | 3 ++- composer.lock | 5 +++-- config/sync/core.extension.yml | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 4a42a4456a..26f79b9d73 100644 --- a/composer.json +++ b/composer.json @@ -263,7 +263,8 @@ "Allow bundle label plural variants @see https://github.com/ec-europa/rdf_entity/pull/12": "https://github.com/ec-europa/rdf_entity/compare/8.x-1.x...bd61c32c6f877f2c0376ec9aa213b89b6bcb19b8.diff" }, "drupal/schema_metatag": { - "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch" + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch", + "Add support for DigitalDocument @see https://www.drupal.org/project/schema_metatag/issues/3120153": "https://www.drupal.org/files/issues/2020-03-16/digital_document_group-D8-3.patch" }, "drupal/search_api": { "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", diff --git a/composer.lock b/composer.lock index 0be156d505..b4b64ce0d7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "8f272ee071f115467906885539d3e323", + "content-hash": "45ccbc3bec92d53324ef444362b48fdc", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -6257,7 +6257,8 @@ } }, "patches_applied": { - "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch" + "Split SchemaArticle and SchemaSocialMediaPosting @see https://www.drupal.org/project/schema_metatag/issues/3117434": "https://www.drupal.org/files/issues/2020-03-13/3117434-D8-8.patch", + "Add support for DigitalDocument @see https://www.drupal.org/project/schema_metatag/issues/3120153": "https://www.drupal.org/files/issues/2020-03-16/digital_document_group-D8-3.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 181671b693..b7df322263 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -127,6 +127,7 @@ module: redis: 0 rest: 0 schema_article: 0 + schema_digital_document: 0 schema_event: 0 schema_metatag: 0 schema_social_media_posting: 0 From 19e6630114f1f75cc0d73d8df65a0ac5b1578fe6 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 01:12:58 +0200 Subject: [PATCH 237/957] ISAICP-5410: Provide the default document tags. --- ...etatag.metatag_defaults.node__document.yml | 20 +++++++++++++++++++ ...etatag.metatag_defaults.node__document.yml | 19 ++++++++++++++++++ .../custom/joinup_seo/joinup_seo.info.yml | 1 + 3 files changed, 40 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.node__document.yml create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml diff --git a/config/sync/metatag.metatag_defaults.node__document.yml b/config/sync/metatag.metatag_defaults.node__document.yml new file mode 100644 index 0000000000..10eba1052f --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__document.yml @@ -0,0 +1,20 @@ +uuid: d6e97315-8ec4-4b3e-ab98-89669551b177 +langcode: en +status: true +dependencies: { } +id: node__document +label: 'Content: Document' +tags: + schema_digital_document_about: '[node:field_keywords]' + schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:12:"CreativeWork";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' + schema_digital_document_license: '[node:field_licence:target_id]' + schema_digital_document_type: DigitalDocument + schema_digital_document_is_accessible_for_free: 'True' + schema_digital_document_headline: '[node:title]' + schema_digital_document_date_published: '[node:field_document_publication_date:date:html_datetime]' + schema_digital_document_description: '[node:summary]' + schema_digital_document_name: '[node:title]' + schema_digital_document_date_modified: '[node:changed]' + schema_digital_document_main_entity_of_page: '[node:field_file:entity:url]' + schema_digital_document_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_digital_document_encoding_format: '[node:field_file:entity:mime]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml new file mode 100644 index 0000000000..399a88910c --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml @@ -0,0 +1,19 @@ +langcode: en +status: true +dependencies: { } +id: node__document +label: 'Content: Document' +tags: + schema_digital_document_about: '[node:field_keywords]' + schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:12:"CreativeWork";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' + schema_digital_document_license: '[node:field_licence:target_id]' + schema_digital_document_type: DigitalDocument + schema_digital_document_is_accessible_for_free: 'True' + schema_digital_document_headline: '[node:title]' + schema_digital_document_date_published: '[node:field_document_publication_date:date:html_datetime]' + schema_digital_document_description: '[node:summary]' + schema_digital_document_name: '[node:title]' + schema_digital_document_date_modified: '[node:changed]' + schema_digital_document_main_entity_of_page: '[node:field_file:entity:url]' + schema_digital_document_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_digital_document_encoding_format: '[node:field_file:entity:mime]' diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index e42a1aee65..24860a4445 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -15,6 +15,7 @@ config_devel: - metatag.metatag_defaults.global - metatag.metatag_defaults.node - metatag.metatag_defaults.node__discussion + - metatag.metatag_defaults.node__document - metatag.metatag_defaults.node__news - simple_sitemap.bundle_settings.default.node.custom_page - simple_sitemap.bundle_settings.default.node.discussion From f05da6187b35df85bdf70cf13e349d8e7494fe49 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 01:16:28 +0200 Subject: [PATCH 238/957] ISAICP-5410: Export default missing files to the joinup_seo module. --- .../metatag.metatag_defaults.node__event.yml | 15 +++++++++++++++ web/modules/custom/joinup_seo/joinup_seo.info.yml | 1 + 2 files changed, 16 insertions(+) create mode 100644 web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml new file mode 100644 index 0000000000..900aef1f0f --- /dev/null +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml @@ -0,0 +1,15 @@ +langcode: en +status: true +dependencies: { } +id: node__event +label: 'Content: Event' +tags: + schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' + schema_event_url: '[node:event_url]' + schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' + schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:40:"[node:field_event_online_location:0:uri]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' + schema_event_id: '[node:event_url]' + schema_event_type: Event + schema_event_description: '[node:summary]' + schema_event_name: '[node:title]' + schema_event_start_date: '[node:field_event_date:start_date:html_datetime]' diff --git a/web/modules/custom/joinup_seo/joinup_seo.info.yml b/web/modules/custom/joinup_seo/joinup_seo.info.yml index 24860a4445..2b243ced15 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.info.yml +++ b/web/modules/custom/joinup_seo/joinup_seo.info.yml @@ -16,6 +16,7 @@ config_devel: - metatag.metatag_defaults.node - metatag.metatag_defaults.node__discussion - metatag.metatag_defaults.node__document + - metatag.metatag_defaults.node__event - metatag.metatag_defaults.node__news - simple_sitemap.bundle_settings.default.node.custom_page - simple_sitemap.bundle_settings.default.node.discussion From 0ec23e447c575264eeea80eeb3d86503a404ce28 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 01:29:32 +0200 Subject: [PATCH 239/957] ISAICP-5410: Use MediaObject for the file instead of CreativeWork. --- config/sync/metatag.metatag_defaults.node__document.yml | 2 +- .../config/install/metatag.metatag_defaults.node__document.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__document.yml b/config/sync/metatag.metatag_defaults.node__document.yml index 10eba1052f..cbabf16677 100644 --- a/config/sync/metatag.metatag_defaults.node__document.yml +++ b/config/sync/metatag.metatag_defaults.node__document.yml @@ -6,7 +6,7 @@ id: node__document label: 'Content: Document' tags: schema_digital_document_about: '[node:field_keywords]' - schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:12:"CreativeWork";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' + schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' schema_digital_document_license: '[node:field_licence:target_id]' schema_digital_document_type: DigitalDocument schema_digital_document_is_accessible_for_free: 'True' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml index 399a88910c..8d5150529e 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml @@ -5,7 +5,7 @@ id: node__document label: 'Content: Document' tags: schema_digital_document_about: '[node:field_keywords]' - schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:12:"CreativeWork";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' + schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' schema_digital_document_license: '[node:field_licence:target_id]' schema_digital_document_type: DigitalDocument schema_digital_document_is_accessible_for_free: 'True' From f10cb80eb18861509bdffd40a8dea91619e08e5b Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 17 Mar 2020 10:01:59 +0200 Subject: [PATCH 240/957] ISAICP-5844: The new release of CAS Account Link includes our patch. --- composer.json | 8 +-- composer.lock | 183 +++++++++++++++++++++++++------------------------- 2 files changed, 91 insertions(+), 100 deletions(-) diff --git a/composer.json b/composer.json index 51960bf858..2c49f601c4 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "drupal/antibot": "^1.3", "drupal/cached_computed_field": "^1.0-beta5", "drupal/cas": "^1.6", - "drupal/cas_account_link": "^1.0", + "drupal/cas_account_link": "^1.0-alpha3", "drupal/cas_attributes": "dev-1.x", "drupal/changed_fields": "^3.2", "drupal/config_exclude": "dev-1.x", @@ -202,9 +202,6 @@ "drupal/cas": { "Allow a pre-login subscriber to set the reason for cancelling the login @see https://www.drupal.org/project/cas/issues/3111073": "https://www.drupal.org/files/issues/2020-02-04/3111073-2.patch" }, - "drupal/cas_account_link": { - "Allow subscribing to form validation @see https://www.drupal.org/project/cas_account_link/issues/3119811": "https://www.drupal.org/files/issues/2020-03-14/3119811-2.patch" - }, "drupal/config_devel": { "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch" }, @@ -248,9 +245,6 @@ "drupal/message_digest": { "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, - "drupal/og_menu": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" - }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", "'Field field_last_password_reset is unknown' while importing configuration on site without password_policy activated @see https://www.drupal.org/project/password_policy/issues/2771129": "https://www.drupal.org/files/issues/2019-08-15/2771129-100_0.patch", diff --git a/composer.lock b/composer.lock index 3ccc31dc0b..2aefb26a0e 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": "ff3136109930bd3a9f9e70193837975a", + "content-hash": "50bfe88bf9c717da986a1d08b3110e76", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.27", + "version": "3.133.37", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9" + "reference": "94ced25e191a2a951edd5d9195820bbd2c1d8567" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", - "reference": "5527195465ac42cb5127a60b84eb2d8dc3b0d5c9", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/94ced25e191a2a951edd5d9195820bbd2c1d8567", + "reference": "94ced25e191a2a951edd5d9195820bbd2c1d8567", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-02T19:20:19+00:00" + "time": "2020-03-16T18:10:35+00:00" }, { "name": "caxy/php-htmldiff", @@ -364,16 +364,16 @@ }, { "name": "composer/composer", - "version": "1.9.3", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b" + "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/1291a16ce3f48bfdeca39d64fca4875098af4d7b", - "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b", + "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011", + "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011", "shasum": "" }, "require": { @@ -386,17 +386,17 @@ "psr/log": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0" + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" }, "conflict": { "symfony/console": "2.8.38" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7", - "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^3.4" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -409,7 +409,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.10-dev" } }, "autoload": { @@ -440,7 +440,7 @@ "dependency", "package" ], - "time": "2020-02-04T11:58:49+00:00" + "time": "2020-03-13T19:34:27+00:00" }, { "name": "composer/installers", @@ -2692,17 +2692,17 @@ }, { "name": "drupal/cas_account_link", - "version": "1.0.0-alpha2", + "version": "1.0.0-alpha3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/cas_account_link.git", - "reference": "8.x-1.0-alpha2" + "reference": "8.x-1.0-alpha3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/cas_account_link-8.x-1.0-alpha2.zip", - "reference": "8.x-1.0-alpha2", - "shasum": "411cc20e64b30112329d52c027c93b9cb3221c99" + "url": "https://ftp.drupal.org/files/projects/cas_account_link-8.x-1.0-alpha3.zip", + "reference": "8.x-1.0-alpha3", + "shasum": "60a76887d3ad6ff9de665c5b16c77cd78479981a" }, "require": { "drupal/cas": "^1.6", @@ -2717,15 +2717,12 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha2", - "datestamp": "1578566287", + "version": "8.x-1.0-alpha3", + "datestamp": "1584429751", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" } - }, - "patches_applied": { - "Allow subscribing to form validation @see https://www.drupal.org/project/cas_account_link/issues/3119811": "https://www.drupal.org/files/issues/2020-03-14/3119811-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -3163,16 +3160,16 @@ }, { "name": "drupal/core", - "version": "8.8.2", + "version": "8.8.3", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62" + "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/f997857003276c2ae6d27db30f0eab9c7dd10e62", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62", + "url": "https://api.github.com/repos/drupal/core/zipball/77971de6d6ade7366cdd3fadfc16c5d02e531446", + "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446", "shasum": "" }, "require": { @@ -3408,20 +3405,20 @@ "GPL-2.0-or-later" ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", - "time": "2020-02-01T19:51:15+00:00" + "time": "2020-03-04T18:01:37+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "8.8.2", + "version": "8.8.3", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "dca4b123a638d78bf77719632993e920de6cc426" + "reference": "984129ae3152d570c9448e52869f04a22fc75269" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/dca4b123a638d78bf77719632993e920de6cc426", - "reference": "dca4b123a638d78bf77719632993e920de6cc426", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/984129ae3152d570c9448e52869f04a22fc75269", + "reference": "984129ae3152d570c9448e52869f04a22fc75269", "shasum": "" }, "require": { @@ -3455,7 +3452,7 @@ "keywords": [ "drupal" ], - "time": "2019-10-09T02:55:24+00:00" + "time": "2020-02-21T09:36:23+00:00" }, { "name": "drupal/csv_serialization", @@ -5422,11 +5419,11 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "6dd3e391bb5f45d8752a9184bc714b4ae2a8c320" + "reference": "16c40e03a4274e1dd781ab9a02478b7e15aea5ef" }, "require": { "drupal/core": "*", - "drupal/og": "*" + "drupal/og": "^1.0.0-alpha4" }, "type": "drupal-module", "extra": { @@ -5434,15 +5431,12 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha3+11-dev", - "datestamp": "1545301380", + "version": "8.x-1.0-alpha3+13-dev", + "datestamp": "1584029947", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." } - }, - "patches_applied": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5475,13 +5469,13 @@ "homepage": "https://www.drupal.org/user/655596" } ], - "description": "Drupal module to allow associating menus with og groups.", + "description": "Integrates Drupal menus with Organic Groups.", "homepage": "https://drupal.org/project/og_menu", "support": { - "source": "https://cgit.drupalcode.org/og_menu", + "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" }, - "time": "2019-12-02T19:38:32+00:00" + "time": "2020-03-12T16:23:32+00:00" }, { "name": "drupal/password_policy", @@ -9834,32 +9828,31 @@ }, { "name": "psy/psysh", - "version": "v0.9.12", + "version": "v0.10.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4" + "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", - "reference": "90da7f37568aee36b116a030c5f99c915267edd4", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e361c8b7e5114534078e0ce04ddc442b39018a3c", + "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1.*", "ext-json": "*", "ext-tokenizer": "*", - "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", - "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", - "php": ">=5.4.0", - "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", - "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" + "jakub-onderka/php-console-highlighter": "0.4.*|0.3.*", + "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", + "php": "^8.0 || ^7.0 || ^5.5.9", + "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", + "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "~2.15|~3.16", - "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" + "hoa/console": "~3.16|~2.15" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", @@ -9874,7 +9867,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.9.x-dev" + "dev-master": "0.10.x-dev" } }, "autoload": { @@ -9904,7 +9897,7 @@ "interactive", "shell" ], - "time": "2019-12-06T14:19:43+00:00" + "time": "2020-03-15T22:52:37+00:00" }, { "name": "ralouphie/getallheaders", @@ -10106,7 +10099,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -12582,35 +12575,38 @@ }, { "name": "behat/mink", - "version": "v1.7.1", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9" + "reference": "e1772aabb6b654464264a6cc72158c8b3409d8bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9", - "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/e1772aabb6b654464264a6cc72158c8b3409d8bc", + "reference": "e1772aabb6b654464264a6cc72158c8b3409d8bc", "shasum": "" }, "require": { "php": ">=5.3.1", - "symfony/css-selector": "~2.1|~3.0" + "symfony/css-selector": "^2.7|^3.0|^4.0|^5.0" }, "require-dev": { - "symfony/phpunit-bridge": "~2.7|~3.0" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20", + "symfony/debug": "^2.7|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.4.38 || ^5.0.5" }, "suggest": { "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)", "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation", "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)", - "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)" + "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)", + "dmore/chrome-mink-driver": "fast and JS-enabled driver for any app (requires chromium or google chrome)" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -12636,20 +12632,20 @@ "testing", "web" ], - "time": "2016-03-05T08:26:18+00:00" + "time": "2020-03-11T15:26:34+00:00" }, { "name": "behat/mink-browserkit-driver", - "version": "1.3.3", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/minkphp/MinkBrowserKitDriver.git", - "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb" + "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", - "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", + "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/e3b90840022ebcd544c7b394a3c9597ae242cbee", + "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee", "shasum": "" }, "require": { @@ -12660,6 +12656,7 @@ }, "require-dev": { "mink/driver-testsuite": "dev-master", + "symfony/debug": "^2.7|^3.0|^4.0", "symfony/http-kernel": "~2.3|~3.0|~4.0" }, "type": "mink-driver", @@ -12692,7 +12689,7 @@ "browser", "testing" ], - "time": "2018-05-02T09:25:31+00:00" + "time": "2020-03-11T09:49:45+00:00" }, { "name": "behat/mink-extension", @@ -12810,16 +12807,16 @@ }, { "name": "behat/mink-selenium2-driver", - "version": "dev-master", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/minkphp/MinkSelenium2Driver.git", - "reference": "e2f7a8a781ac11d393394227a43e03e9a9e2b311" + "reference": "312a967dd527f28980cce40850339cd5316da092" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/e2f7a8a781ac11d393394227a43e03e9a9e2b311", - "reference": "e2f7a8a781ac11d393394227a43e03e9a9e2b311", + "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/312a967dd527f28980cce40850339cd5316da092", + "reference": "312a967dd527f28980cce40850339cd5316da092", "shasum": "" }, "require": { @@ -12867,7 +12864,7 @@ "testing", "webdriver" ], - "time": "2020-01-20T19:37:28+00:00" + "time": "2020-03-11T14:43:21+00:00" }, { "name": "behat/transliterator", @@ -14742,16 +14739,16 @@ }, { "name": "phpspec/prophecy", - "version": "v1.10.2", + "version": "v1.10.3", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9" + "reference": "451c3cd1418cf640de218914901e51b064abb093" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", "shasum": "" }, "require": { @@ -14801,7 +14798,7 @@ "spy", "stub" ], - "time": "2020-01-20T15:57:02+00:00" + "time": "2020-03-05T15:02:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -15929,25 +15926,25 @@ }, { "name": "symfony/css-selector", - "version": "v3.4.38", + "version": "v4.4.5", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1" + "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ee9b946e7223b11257329a054c64396b19d619e1", - "reference": "ee9b946e7223b11257329a054c64396b19d619e1", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", + "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -15978,7 +15975,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "time": "2020-02-04T09:01:01+00:00" }, { "name": "symfony/dom-crawler", From 66e3790abf76cd6ed881b14906ab776c7ca704f6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 17 Mar 2020 10:06:41 +0200 Subject: [PATCH 241/957] Apply patch that prevents the AJAX callback to be needlessly invoked, preventing failures. --- composer.json | 3 +++ composer.lock | 42 +++++++++--------------------------------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/composer.json b/composer.json index 3441c04c7e..b3a8691fdd 100644 --- a/composer.json +++ b/composer.json @@ -224,6 +224,9 @@ "Config import creates 'Undefined index: uuid' notice @see https://www.drupal.org/project/drupal/issues/2863785": "https://www.drupal.org/files/issues/config_import_creates-2863785-2.patch", "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch" }, + "drupal/drupal-extension": { + "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" + }, "drupal/externalauth": { "Clean up linkExistingAccount method so it doesn't needless prefix username with provider name @see https://www.drupal.org/project/externalauth/issues/3104478": "https://www.drupal.org/files/issues/2020-01-08/3104478-3.patch" }, diff --git a/composer.lock b/composer.lock index 0b1a7a3183..6110bf7bbf 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": "6f4cc8a3f2ccfcc9f8ed59fa97dcd944", + "content-hash": "217c8da2b28dd21b2832f6f9a96d213d", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -2702,17 +2692,17 @@ }, { "name": "drupal/cas_account_link", - "version": "1.0.0-alpha2", + "version": "1.0.0-alpha3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/cas_account_link.git", - "reference": "8.x-1.0-alpha2" + "reference": "8.x-1.0-alpha3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/cas_account_link-8.x-1.0-alpha2.zip", - "reference": "8.x-1.0-alpha2", - "shasum": "411cc20e64b30112329d52c027c93b9cb3221c99" + "url": "https://ftp.drupal.org/files/projects/cas_account_link-8.x-1.0-alpha3.zip", + "reference": "8.x-1.0-alpha3", + "shasum": "60a76887d3ad6ff9de665c5b16c77cd78479981a" }, "require": { "drupal/cas": "^1.6", @@ -2727,8 +2717,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha2", - "datestamp": "1578566287", + "version": "8.x-1.0-alpha3", + "datestamp": "1584429751", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" @@ -3766,7 +3756,7 @@ "shasum": "109047e07a7e77528747d41044b6cf13f2671ac7" }, "require": { - "drupal/core": "^8 || ^9" + "drupal/core": "*" }, "type": "drupal-module", "extra": { @@ -15871,20 +15861,6 @@ ], "description": "Symfony BrowserKit Component", "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": "2020-01-01T11:03:25+00:00" }, { From 16542f87739a09dbcd4be7e7d4e016ffb4e4d481 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 17 Mar 2020 10:59:03 +0200 Subject: [PATCH 242/957] ISAICP-5609: Restore the description of the CSS compilation target. This is a 'main target' which is intended to be run by developers. Main targets need to have a description. --- build.project.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.project.xml b/build.project.xml index 26675455df..fe7936f054 100644 --- a/build.project.xml +++ b/build.project.xml @@ -283,7 +283,8 @@ - + From 4b27ce6bf0aabc2bc84904879492ac0526dcc7c3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 12:41:43 +0200 Subject: [PATCH 243/957] ISAICP-5410: Fix the date format for update time. --- config/sync/metatag.metatag_defaults.node__document.yml | 2 +- .../config/install/metatag.metatag_defaults.node__document.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__document.yml b/config/sync/metatag.metatag_defaults.node__document.yml index cbabf16677..59b902607f 100644 --- a/config/sync/metatag.metatag_defaults.node__document.yml +++ b/config/sync/metatag.metatag_defaults.node__document.yml @@ -14,7 +14,7 @@ tags: schema_digital_document_date_published: '[node:field_document_publication_date:date:html_datetime]' schema_digital_document_description: '[node:summary]' schema_digital_document_name: '[node:title]' - schema_digital_document_date_modified: '[node:changed]' + schema_digital_document_date_modified: '[node:changed:html_datetime]' schema_digital_document_main_entity_of_page: '[node:field_file:entity:url]' schema_digital_document_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' schema_digital_document_encoding_format: '[node:field_file:entity:mime]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml index 8d5150529e..185f31fd78 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__document.yml @@ -13,7 +13,7 @@ tags: schema_digital_document_date_published: '[node:field_document_publication_date:date:html_datetime]' schema_digital_document_description: '[node:summary]' schema_digital_document_name: '[node:title]' - schema_digital_document_date_modified: '[node:changed]' + schema_digital_document_date_modified: '[node:changed:html_datetime]' schema_digital_document_main_entity_of_page: '[node:field_file:entity:url]' schema_digital_document_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' schema_digital_document_encoding_format: '[node:field_file:entity:mime]' From 5c54e2fcea9051c6c870e5064f0f52d5dc9d6b32 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 12:43:34 +0200 Subject: [PATCH 244/957] ISAICP-5410: Allow the document publication date to be set in behat tests. --- .../joinup_document/joinup_document.behat.inc | 43 +++++++++++++------ web/profiles/joinup/joinup.behat.inc | 1 + 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/web/modules/custom/joinup_document/joinup_document.behat.inc b/web/modules/custom/joinup_document/joinup_document.behat.inc index a93fa08391..df3cd86a6a 100644 --- a/web/modules/custom/joinup_document/joinup_document.behat.inc +++ b/web/modules/custom/joinup_document/joinup_document.behat.inc @@ -5,6 +5,7 @@ * Contains \DocumentSubContext. */ +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope; @@ -49,24 +50,40 @@ class JoinupDocumentSubContext extends DrupalSubContextBase implements DrupalSub public static function massageDocumentFieldsBeforeNodeCreate(BeforeNodeCreateScope $scope) { $node = $scope->getEntity(); - if ($node->type !== 'document' || empty($node->file)) { + if ($node->type !== 'document') { return; } - $type = isset($node->{'file type'}) ? $node->{'file type'} : 'remote'; - if ($type !== 'remote') { - // If the file is local we want to copy it from the fixtures into the file - // system and register it in the DocumentSubContext so it can be cleaned - // up after the scenario ends. Perform a small dance to get access to the - // context class from inside this static callback. - /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ - $environment = $scope->getEnvironment(); - /** @var \DocumentSubContext $context */ - $context = $environment->getContext(self::class); - $node->file = $context->createFile($node->file)->id(); + if (!empty($node->file)) { + $type = isset($node->{'file type'}) ? $node->{'file type'} : 'remote'; + if ($type !== 'remote') { + // If the file is local we want to copy it from the fixtures into the file + // system and register it in the DocumentSubContext so it can be cleaned + // up after the scenario ends. Perform a small dance to get access to the + // context class from inside this static callback. + /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ + $environment = $scope->getEnvironment(); + /** @var \DocumentSubContext $context */ + $context = $environment->getContext(self::class); + $node->file = $context->createFile($node->file)->id(); + } + + unset($node->{'file type'}); } - unset($node->{'file type'}); + if (!empty($node->{'document publication date'})) { + /** @var \Drupal\Core\Datetime\DateFormatterInterface $date_formatter */ + $date_formatter = \Drupal::service('date.formatter'); + + if (isset($node->{'document publication date'})) { + $date = strtotime($node->{'document publication date'}); + if ($date === FALSE) { + throw new \Exception(sprintf('Invalid format for date specified: %s', $node->{'document publication date'})); + } + + $node->{'document publication date'} = $date_formatter->format($date, 'custom', DateTimeItemInterface::DATETIME_STORAGE_FORMAT); + } + } } /** diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 13ea2bcf5e..f9489b0b45 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -715,6 +715,7 @@ class JoinupSubContext extends DrupalSubContextBase { ], 'document' => [ 'document type' => 'field_type', + 'document publication date' => 'field_document_publication_date', 'file' => 'field_file', 'keywords' => 'field_keywords', 'licence' => 'field_licence', From f392a39c5c92bb90204ec60fbbe011fb0c38a2da Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 13:34:51 +0200 Subject: [PATCH 245/957] ISAICP-5410: Provide a test for the document case. --- tests/features/joinup_seo/document.feature | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/features/joinup_seo/document.feature diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature new file mode 100644 index 0000000000..074c57cd2e --- /dev/null +++ b/tests/features/joinup_seo/document.feature @@ -0,0 +1,65 @@ +@api @group-a +Feature: SEO for document content. + As an owner of the website + in order for my documents to be better visible on the web + I need proper metatag to be encapsulated in the html code. + + Scenario: Basic metatags are attached as JSON schema on the page. + Given collections: + | title | state | + | Joinup SEO document collection | validated | + And licence: + | uri | https://example.com/license1 | + | title | Some license | + | type | Public domain | + And users: + | Username | E-mail | First name | Family name | + | Joinup SEO author | joinup.seo@example.com | Scrapper | Jedi | + And document content: + | title | author | document type | document publication date | changed | keywords | short title | file type | file | body | licence | state | collection | + | SEO document | Joinup SEO author | document | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | key1, key2, key3 | SEO | upload | test.zip | Document test1.zip | Some license | validated | Joinup SEO document collection | + + When I visit the "SEO document" document + Then the metatag JSON should be attached in the page + And 1 metatag graph of type "DigitalDocument" should exist in the page + And the metatag graph of the item with "name" "SEO document" should have the following properties: + | property | value | + | @type | DigitalDocument | + | headline | SEO document | + | name | SEO document | + | license | https://example.com/license1 | + | description | Document test1.zip | + | datePublished | 2019-12-25T14:00:00+0100 | + | isAccessibleForFree | True | + | dateModified | 2020-01-01T13:00:00+0100 | + | mainEntityOfPage | $base_url$/sites/default/files/test$random_text$.zip | + # Adding numerical property values is turning the "about" property into an array comparison. + And the metatag graph of the item with "name" "SEO document" should have the following "about" properties: + | property | value | + | 0 | key1 | + | 1 | key2 | + | 2 | key3 | + And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: + | property | value | + | @type | MediaObject | + # $random_text$ can be any string that is appointed by the system and we + # cannot predict. In this case it is the random file name suffix before the file extension. + | @id | $base_url$/sites/default/files/test$random_text$.zip | + | name | test.zip | + | url | $base_url$/sites/default/files/test$random_text$.zip | + | datePublished | 2019-12-25T14:00:00+0100 | + And the metatag graph of the item with "name" "SEO document" should have the following "author" properties: + | property | value | + | @type | Person | + # The user id is only a number but we can be quite certain that this will be a url to the user since the + # $random_text$ does not include a / character. + | @id | $base_url$/user/$random_text$ | + | name | Scrapper Jedi | + | url | $base_url$/user/$random_text$ | + + When I click "Keep up to date" + Then I should see the "SEO document" tile + # No metatags are defined for the keep up to date page. + # No metatags JSON in general means also that the entity metatags of the + # news item is also not attached when the tile is present. + And the metatag JSON should not be attached in the page From 4ccd8ca7e9c17eb80e26e7a8b0a4a1cdf13daeba Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 14:31:06 +0200 Subject: [PATCH 246/957] ISAICP-5410: Support for external urls as well. --- config/sync/metatag.metatag_defaults.node__document.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node__document.yml b/config/sync/metatag.metatag_defaults.node__document.yml index 59b902607f..54a0af24a4 100644 --- a/config/sync/metatag.metatag_defaults.node__document.yml +++ b/config/sync/metatag.metatag_defaults.node__document.yml @@ -6,7 +6,7 @@ id: node__document label: 'Content: Document' tags: schema_digital_document_about: '[node:field_keywords]' - schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:28:"[node:field_file:entity:url]";s:4:"name";s:29:"[node:field_file:entity:name]";s:3:"url";s:28:"[node:field_file:entity:url]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' + schema_digital_document_associated_media: 'a:5:{s:5:"@type";s:11:"MediaObject";s:3:"@id";s:56:"[node:field_file:entity:url][node:field_file:entity:uri]";s:4:"name";s:62:"[node:field_file:entity:name][node:field_file:entity:filename]";s:3:"url";s:56:"[node:field_file:entity:url][node:field_file:entity:uri]";s:13:"datePublished";s:57:"[node:field_document_publication_date:date:html_datetime]";}' schema_digital_document_license: '[node:field_licence:target_id]' schema_digital_document_type: DigitalDocument schema_digital_document_is_accessible_for_free: 'True' @@ -15,6 +15,6 @@ tags: schema_digital_document_description: '[node:summary]' schema_digital_document_name: '[node:title]' schema_digital_document_date_modified: '[node:changed:html_datetime]' - schema_digital_document_main_entity_of_page: '[node:field_file:entity:url]' + schema_digital_document_main_entity_of_page: '[node:field_file:entity:url][node:field_file:entity:uri]' schema_digital_document_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' - schema_digital_document_encoding_format: '[node:field_file:entity:mime]' + schema_digital_document_encoding_format: '[node:field_file:entity:mime][node:field_file:entity:filemime]' From 56070e49be54ce4478bee3f2865335c831329004 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 14:33:44 +0200 Subject: [PATCH 247/957] ISAICP-5410: Extend the tests for the remote file url as well. --- tests/features/joinup_seo/document.feature | 32 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index 074c57cd2e..97ae325b4e 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -4,7 +4,7 @@ Feature: SEO for document content. in order for my documents to be better visible on the web I need proper metatag to be encapsulated in the html code. - Scenario: Basic metatags are attached as JSON schema on the page. + Background: Given collections: | title | state | | Joinup SEO document collection | validated | @@ -15,7 +15,9 @@ Feature: SEO for document content. And users: | Username | E-mail | First name | Family name | | Joinup SEO author | joinup.seo@example.com | Scrapper | Jedi | - And document content: + + Scenario: Basic metatags are attached as JSON schema on the page. + Given document content: | title | author | document type | document publication date | changed | keywords | short title | file type | file | body | licence | state | collection | | SEO document | Joinup SEO author | document | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | key1, key2, key3 | SEO | upload | test.zip | Document test1.zip | Some license | validated | Joinup SEO document collection | @@ -63,3 +65,29 @@ Feature: SEO for document content. # No metatags JSON in general means also that the entity metatags of the # news item is also not attached when the tile is present. And the metatag JSON should not be attached in the page + + Scenario: Metatags for remote URL in documents. + Given document content: + | title | author | document publication date | changed | file type | file | body | state | collection | + | SEO document | Joinup SEO author | Wed, 25 Dec 2019 13:00:00 +0100 | Wed, 01 Jan 2020 13:00:00 +0100 | remote | http://example.com/some-file-url.extension | Remote url example | validated | Joinup SEO document collection | + + When I visit the "SEO document" document + Then the metatag JSON should be attached in the page + And 1 metatag graph of type "DigitalDocument" should exist in the page + And the metatag graph of the item with "name" "SEO document" should have the following properties: + | property | value | + | @type | DigitalDocument | + | headline | SEO document | + | name | SEO document | + | description | Remote url example | + | datePublished | 2019-12-25T14:00:00+0100 | + | isAccessibleForFree | True | + | dateModified | 2020-01-01T13:00:00+0100 | + | mainEntityOfPage | http://example.com/some-file-url.extension | + And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: + | property | value | + | @type | MediaObject | + | @id | http://example.com/some-file-url.extension | + | name | some-file-url.extension | + | url | http://example.com/some-file-url.extension | + | datePublished | 2019-12-25T14:00:00+0100 | From ea1286036bb489d9e453d889dd489288b7c23bab Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 17 Mar 2020 14:43:20 +0200 Subject: [PATCH 248/957] ISAICP-5844: Use terminology with enhanced clarity. --- .../eulogin/joinup_eulogin.permissions.yml | 6 ++--- ...pEuLoginCasAccountLinkEventsSubscriber.php | 14 +++++++--- .../JoinupEuLoginKernelSubscriber.php | 16 ++++++------ .../src/ExistingSite/JoinupEuLoginTest.php | 26 +++++++++++++------ 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/web/modules/custom/eulogin/joinup_eulogin.permissions.yml b/web/modules/custom/eulogin/joinup_eulogin.permissions.yml index 52c0fb73ed..e216bf009f 100644 --- a/web/modules/custom/eulogin/joinup_eulogin.permissions.yml +++ b/web/modules/custom/eulogin/joinup_eulogin.permissions.yml @@ -1,4 +1,4 @@ -unlimited access: - title: 'Unlimited access' - description: 'Allows unlimited access for user not linked to an EU Login account.' +bypass limited access: + title: 'Bypass limited access' + description: 'Allows to bypass the access limitation imposed on users that are not linked to an EU Login account.' restrict access: true diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php index 0d78a1e485..bb75f54bef 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginCasAccountLinkEventsSubscriber.php @@ -47,7 +47,7 @@ public static function getSubscribedEvents(): array { ['setRandomPassword'], ['setMessageAndRedirect'], ], - CasAccountLinkEvents::VALIDATE => 'preventLinkingUnlimitedAccessAccounts', + CasAccountLinkEvents::VALIDATE => 'preventLinkingLimitedAccessBypassAccounts', ]; } @@ -120,7 +120,13 @@ public function setMessageAndRedirect(CasAccountLinkPostLinkEvent $event): void } /** - * Disallow linking accounts granted with 'unlimited access' permission. + * Disallow linking accounts that can bypass the limited access. + * + * The only users that can bypass the access limitation are accounts used for + * maintenance and demonstration purposes, such as UID 1, demo users, and + * other functional accounts. It does not make sense to link these accounts + * with EU Login since that service is intended to identify actual human EU + * citizens. * * @param \Drupal\cas_account_link\Event\Events\CasAccountLinkValidateEvent $event * The CAS Account Link validate event object. @@ -130,7 +136,7 @@ public function setMessageAndRedirect(CasAccountLinkPostLinkEvent $event): void * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * Thrown if the storage handler couldn't be loaded. */ - public function preventLinkingUnlimitedAccessAccounts(CasAccountLinkValidateEvent $event): void { + public function preventLinkingLimitedAccessBypassAccounts(CasAccountLinkValidateEvent $event): void { $form_state = $event->getFormState(); if ($form_state->getValue('account_exist') === 'no') { return; @@ -139,7 +145,7 @@ public function preventLinkingUnlimitedAccessAccounts(CasAccountLinkValidateEven /** @var \Drupal\user\UserInterface $account */ $account = $this->entityTypeManager->getStorage('user')->load($form_state->get('uid')); - if ($account->hasPermission('unlimited access')) { + if ($account->hasPermission('bypass limited access')) { $form_state->setErrorByName('login][name', $this->t('Linking the local %username user with an EU Login account is not allowed.', [ '%username' => $account->getDisplayName(), ])); diff --git a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php index abc12f8164..a54c4286fc 100644 --- a/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php +++ b/web/modules/custom/eulogin/src/Event/Subscriber/JoinupEuLoginKernelSubscriber.php @@ -104,7 +104,7 @@ public function setAccessDeniedCode(FilterResponseEvent $event): void { $route_match = $this->routeMatch->getRouteMatchFromRequest($event->getRequest()); if ($route_match->getRouteName() === 'joinup_eulogin.page.limited_access') { // For anonymous or EU Login users this page doesn't exist. - if ($this->userHasUnlimitedAccess()) { + if ($this->currentUserCanBypassLimitedAccess()) { throw new NotFoundHttpException(); } $event->getResponse()->setStatusCode(Response::HTTP_FORBIDDEN); @@ -123,7 +123,7 @@ public function redirectWhenNoAccess(GetResponseEvent $event): void { } // Allow anonymous or EU Login users. - if ($this->userHasUnlimitedAccess()) { + if ($this->currentUserCanBypassLimitedAccess()) { return; } @@ -199,19 +199,19 @@ protected function isRouteAllowed(): bool { } /** - * Checks if the current user has unlimited access. + * Checks if the current user can bypass limited access. * * @return bool - * TRUE if the current user has unlimited access. + * TRUE if the current user can bypass limited access. */ - protected function userHasUnlimitedAccess(): bool { - // A user has unlimited access if: + protected function currentUserCanBypassLimitedAccess(): bool { + // A user can bypass limited access if: // - is anonymous. return $this->currentUser->isAnonymous() // - or is an EU Login linked user. || $this->authmap->get($this->currentUser->id(), 'cas') - // - or is granted with 'unlimited access' permission. - || $this->currentUser->hasPermission('unlimited access'); + // - or is granted with 'bypass limited access' permission. + || $this->currentUser->hasPermission('bypass limited access'); } /** diff --git a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php index cbc8f425a5..4ec9009d25 100644 --- a/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php +++ b/web/modules/custom/eulogin/tests/src/ExistingSite/JoinupEuLoginTest.php @@ -125,27 +125,32 @@ public function testLimitedAccess(): void { $this->assertLimitedAccess('/keep-up-to-date'); $this->assertLimitedAccess('/search'); - // Check that the link to EU Login works. + // Check that the link to EU Login works. By clicking this link the user + // will be logged out of their Drupal account and will be ready to log in + // using EU Login. $this->clickLink('EU Login'); $assert->pageTextContains('Sign in to continue'); - // Check that the redirect to limited access page has not been cached. + // Check that the redirect to limited access page has not been cached. The + // user is now anonymous, so should be again able to access all pages. $this->assertAccess(''); $this->assertAccess('/collections'); $this->assertAccess('/solutions'); $this->assertAccess('/keep-up-to-date'); $this->assertAccess('/search'); - // Grant the user with 'unlimited access' permission. + // Log in as an special user with 'bypass limited access' permission. These + // users are intended for maintenance or demonstration purposes. $this->bypassReadOnlyConfig(); - $rid = $this->createRole(['unlimited access']); + $rid = $this->createRole(['bypass limited access']); $this->restoreReadOnlyConfig(); $this->account->addRole($rid); $this->account->save(); $this->drupalLogin($this->account); - // Try to navigate to pages that are not accessible to regular users. + // Try to navigate to pages that are not accessible to non-linked users. The + // users who can bypass limited access should be able to access these pages. $this->assertAccess(''); $this->assertAccess('/collections'); $this->assertAccess('/solutions'); @@ -177,11 +182,16 @@ public function testLimitedAccess(): void { } /** - * Tests that accounts with unlimited access cannot be linked with EU Login. + * Tests that special user accounts cannot be linked with EU Login. + * + * User accounts intended for maintenance and demonstration purposes (such as + * UID 1 and demo users) do not represent actual EU citizens so they should + * not be linked with EU Login. These users have the `bypass limited access` + * permission. */ - public function testUnlimitedAccessAccounts(): void { + public function testLimitedAccessBypassAccounts(): void { $this->bypassReadOnlyConfig(); - $local_account = $this->createUser(['unlimited access']); + $local_account = $this->createUser(['bypass limited access']); $this->restoreReadOnlyConfig(); $authname = $this->randomMachineName(); $pass = $this->randomString(); From 1284c22ac5898fe4397dc0b328601bc062abdb0e Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 14:46:15 +0200 Subject: [PATCH 249/957] ISAICP-5410: Phpcodesniffing. --- .../custom/joinup_document/joinup_document.behat.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_document/joinup_document.behat.inc b/web/modules/custom/joinup_document/joinup_document.behat.inc index df3cd86a6a..a65723f096 100644 --- a/web/modules/custom/joinup_document/joinup_document.behat.inc +++ b/web/modules/custom/joinup_document/joinup_document.behat.inc @@ -57,10 +57,10 @@ class JoinupDocumentSubContext extends DrupalSubContextBase implements DrupalSub if (!empty($node->file)) { $type = isset($node->{'file type'}) ? $node->{'file type'} : 'remote'; if ($type !== 'remote') { - // If the file is local we want to copy it from the fixtures into the file - // system and register it in the DocumentSubContext so it can be cleaned - // up after the scenario ends. Perform a small dance to get access to the - // context class from inside this static callback. + // If the file is local we want to copy it from the fixtures into the + // file system and register it in the DocumentSubContext so it can be + // cleaned up after the scenario ends. Perform a small dance to get + // access to the context class from inside this static callback. /** @var \Behat\Behat\Context\Environment\InitializedContextEnvironment $environment */ $environment = $scope->getEnvironment(); /** @var \DocumentSubContext $context */ From 33079236149ca6257107f950fa1f83c9c2ad68ac Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 16:30:04 +0200 Subject: [PATCH 250/957] ISAICP-5410: Use the CPHP version of timestamps instead of the local ones. --- tests/features/joinup_seo/document.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index 97ae325b4e..6fde72d47b 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -31,7 +31,7 @@ Feature: SEO for document content. | name | SEO document | | license | https://example.com/license1 | | description | Document test1.zip | - | datePublished | 2019-12-25T14:00:00+0100 | + | datePublished | 2019-12-25T13:00:00+0100 | | isAccessibleForFree | True | | dateModified | 2020-01-01T13:00:00+0100 | | mainEntityOfPage | $base_url$/sites/default/files/test$random_text$.zip | @@ -80,7 +80,7 @@ Feature: SEO for document content. | headline | SEO document | | name | SEO document | | description | Remote url example | - | datePublished | 2019-12-25T14:00:00+0100 | + | datePublished | 2019-12-25T13:00:00+0100 | | isAccessibleForFree | True | | dateModified | 2020-01-01T13:00:00+0100 | | mainEntityOfPage | http://example.com/some-file-url.extension | From 2bf66bade39db997c8262ef986813304ea32796f Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 17 Mar 2020 16:37:04 +0200 Subject: [PATCH 251/957] ISAICP-5410: Handle timezones in a generic way. --- tests/features/joinup_seo/document.feature | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index 6fde72d47b..11ea0b2ffc 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -31,9 +31,9 @@ Feature: SEO for document content. | name | SEO document | | license | https://example.com/license1 | | description | Document test1.zip | - | datePublished | 2019-12-25T13:00:00+0100 | + | datePublished | 2019-12-25T$timezone$:00:00+0100 | | isAccessibleForFree | True | - | dateModified | 2020-01-01T13:00:00+0100 | + | dateModified | 2020-01-01T$timezone$:00:00+0100 | | mainEntityOfPage | $base_url$/sites/default/files/test$random_text$.zip | # Adding numerical property values is turning the "about" property into an array comparison. And the metatag graph of the item with "name" "SEO document" should have the following "about" properties: @@ -49,7 +49,7 @@ Feature: SEO for document content. | @id | $base_url$/sites/default/files/test$random_text$.zip | | name | test.zip | | url | $base_url$/sites/default/files/test$random_text$.zip | - | datePublished | 2019-12-25T14:00:00+0100 | + | datePublished | 2019-12-25T$timezone$:00:00+0100 | And the metatag graph of the item with "name" "SEO document" should have the following "author" properties: | property | value | | @type | Person | @@ -80,9 +80,9 @@ Feature: SEO for document content. | headline | SEO document | | name | SEO document | | description | Remote url example | - | datePublished | 2019-12-25T13:00:00+0100 | + | datePublished | 2019-12-25T$timezone$:00:00+0100 | | isAccessibleForFree | True | - | dateModified | 2020-01-01T13:00:00+0100 | + | dateModified | 2020-01-01T$timezone$:00:00+0100 | | mainEntityOfPage | http://example.com/some-file-url.extension | And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: | property | value | @@ -90,4 +90,4 @@ Feature: SEO for document content. | @id | http://example.com/some-file-url.extension | | name | some-file-url.extension | | url | http://example.com/some-file-url.extension | - | datePublished | 2019-12-25T14:00:00+0100 | + | datePublished | 2019-12-25T$timezone$:00:00+0100 | From 532ff64d35d8dda9e9e6886081142f0fec68e15e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 17 Mar 2020 10:06:41 +0200 Subject: [PATCH 252/957] Apply patch that prevents the AJAX callback to be needlessly invoked, preventing failures. --- composer.json | 3 +++ composer.lock | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 320e34a064..3dee9543d2 100644 --- a/composer.json +++ b/composer.json @@ -226,6 +226,9 @@ "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch", "Pass current route parameters to the confirmation form route @see https://www.drupal.org/project/drupal/issues/2901412": "https://www.drupal.org/files/issues/2020-02-25/2901412-13.patch" }, + "drupal/drupal-extension": { + "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" + }, "drupal/externalauth": { "Clean up linkExistingAccount method so it doesn't needless prefix username with provider name @see https://www.drupal.org/project/externalauth/issues/3104478": "https://www.drupal.org/files/issues/2020-01-08/3104478-3.patch" }, diff --git a/composer.lock b/composer.lock index 25b11593ff..e0e205357a 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": "4384898d23480ad23585d2fe427015c7", + "content-hash": "a6a45ba148ca930808aaf4947dca3a5b", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -12579,16 +12579,16 @@ }, { "name": "behat/gherkin", - "version": "v4.6.1", + "version": "v4.6.2", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759" + "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/25bdcaf37898b4a939fa3031d5d753ced97e4759", - "reference": "25bdcaf37898b4a939fa3031d5d753ced97e4759", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/51ac4500c4dc30cbaaabcd2f25694299df666a31", + "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31", "shasum": "" }, "require": { @@ -12634,7 +12634,7 @@ "gherkin", "parser" ], - "time": "2020-02-27T11:29:57+00:00" + "time": "2020-03-17T14:03:26+00:00" }, { "name": "behat/mink", From 60858e9a140f3499bfd1e825af8d0c8ba7da9a18 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 18 Mar 2020 09:10:04 +0200 Subject: [PATCH 253/957] ISAICP-5870: Provide a requirement for the orphaned solutions. --- .../custom/joinup_core/joinup_core.install | 18 ++++++ .../joinup_core/src/RequirementsHelper.php | 58 +++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.install b/web/modules/custom/joinup_core/joinup_core.install index 13bdd44672..501780fd35 100644 --- a/web/modules/custom/joinup_core/joinup_core.install +++ b/web/modules/custom/joinup_core/joinup_core.install @@ -87,6 +87,24 @@ function joinup_core_requirements($phase) { 'value' => $error, ]; } + + // Ensure that no solutions are orphaned. + $requirements['joinup_core_no_orphaned_solutions'] = [ + 'title' => t('Orphaned solutions'), + 'description' => t('All solutions have an affiliated collection.'), + 'value' => t('All solutions have an affiliated collection.'), + ]; + + $results = \Drupal::service('joinup_core.requirements_helper')->getOrphanedSolutions(); + if (!empty($results)) { + $error = t('The following solutions were found without an affiliation: :errors', [ + ':errors' => implode("\n", array_values($results)), + ]); + $requirements['joinup_core_no_orphaned_solutions'] += [ + 'severity' => REQUIREMENT_ERROR, + 'value' => $error, + ]; + } } return $requirements; diff --git a/web/modules/custom/joinup_core/src/RequirementsHelper.php b/web/modules/custom/joinup_core/src/RequirementsHelper.php index df00099c32..d57363b2a9 100644 --- a/web/modules/custom/joinup_core/src/RequirementsHelper.php +++ b/web/modules/custom/joinup_core/src/RequirementsHelper.php @@ -5,6 +5,7 @@ namespace Drupal\joinup_core; use Drupal\Core\Database\Connection; +use Drupal\Driver\Database\joinup_sparql\Connection as SparqlConnection; /** * Implements helper methods related to the requirements. @@ -12,20 +13,30 @@ class RequirementsHelper { /** - * The connection class for the primary database storage. + * The SQL connection class for the primary database storage. * * @var \Drupal\Core\Database\Connection */ - protected $connection; + protected $sqlConnection; + + /** + * The SPARQL connection class. + * + * @var \Drupal\Driver\Database\joinup_sparql\Connection + */ + protected $sparqlConnection; /** * RequirementsHelper constructor. * * @param \Drupal\Core\Database\Connection $connection - * The connection class for the primary database storage. + * The SQL connection class for the primary database storage. + * @param \Drupal\Driver\Database\joinup_sparql\Connection $sparql + * The SPARQL connection class. */ - public function __construct(Connection $connection) { - $this->connection = $connection; + public function __construct(Connection $connection, SparqlConnection $sparql) { + $this->sqlConnection = $connection; + $this->sparqlConnection = $sparql; } /** @@ -74,7 +85,42 @@ public function getNodesWithProblematicRevisions(): array { WHERE nr.vid > n.vid GROUP BY nid, latest_vid QUERY; - return $this->connection->query($query)->fetchAllAssoc('nid'); + return $this->sqlConnection->query($query)->fetchAllAssoc('nid'); + } + + /** + * Returns solutions without an affiliated collection. + * + * As no solution should exist without a collection, the following method is + * used to query if any of them exists. + * + * @return array + * An array of solution label keyed by their IDs. + */ + public function getOrphanedSolutions(): array { + $query = << +FROM +FROM +FROM +WHERE { + ?solution_id a . + FILTER NOT EXISTS { + ?collection a ; + ?solution_id + } +} +QUERY; + + $return = []; + $results = $this->sparqlConnection->query($query); + if (!empty($results)) { + foreach ($results as $result) { + $return[$result->solution_id->getUri()] = $result->solution_id->getUri(); + } + } + return $return; } } From e3b14ca65313f1d095d9c4ff36a7a7b7b41a9187 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 18 Mar 2020 09:11:34 +0200 Subject: [PATCH 254/957] ISAICP-5870: Create a post update hook to delete the orphaned solutions. --- .../joinup_core/joinup_core.post_update.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 6682da0137..7f4b4a67e1 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1113,3 +1113,18 @@ function joinup_core_post_update_update_support_memberships(&$sandbox) { $sandbox['#finished'] = (float) $sandbox['count'] / (float) $sandbox['max']; return "Processed {$sandbox['count']} out of {$sandbox['max']} collections"; } + +/** + * Clears out some solutions tha are orphaned and not updated recently. + */ +function joinup_core_post_update_delete_orphaned_solutions() { + $solution_ids = [ + 'http://data.europa.eu/w21/b9f30715-8921-4b27-b906-a3fb9b72bf50', + 'http://data.europa.eu/w21/cac5e29b-d3f9-4a07-b348-6a34ec233dd6', + 'http://data.europa.eu/w21/0e51ed56-b06c-45cf-92d6-3612fdd2d0b4', + ]; + $storage = \Drupal::entityTypeManager()->getStorage('rdf_entity'); + foreach ($solution_ids as $solution_id) { + $storage->load($solution_id)->delete(); + } +} From 9bcd8063f5b3778382642e7632736d4c548977fd Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 11:30:30 +0200 Subject: [PATCH 255/957] ISAICP-5208: Use the current version of the deprecation checking tool. --- composer.json | 4 +- composer.lock | 652 ++++---------------------------------------------- 2 files changed, 47 insertions(+), 609 deletions(-) diff --git a/composer.json b/composer.json index db9efb97b7..b707389103 100644 --- a/composer.json +++ b/composer.json @@ -122,11 +122,11 @@ "jcalderonzumba/gastonjs": "^1.1@dev", "jcalderonzumba/mink-phantomjs-driver": "^0.3.3", "lovers-of-behat/table-extension": "^1.2.0", - "mglaman/phpstan-drupal": "^0.11.4", + "mglaman/phpstan-drupal": "~0.12", "mikey179/vfsstream": "~1.6", "pear/http_request2": "~2.3", "pfrenssen/phpcs-pre-push": "1.1", - "phpstan/phpstan-deprecation-rules": "^0.11.0", + "phpstan/phpstan-deprecation-rules": "~0.12", "phpunit/phpunit": "~6.5", "symfony/css-selector": "~2.8|~3.0|~4.0", "symfony/dom-crawler": "4.4.4", diff --git a/composer.lock b/composer.lock index 4b5fdf96d1..aa999e7fe7 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": "609b1584116dbf902cde31e39101a0bd", + "content-hash": "928d1bcc682fb777f9bb58504ad7c335", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -14463,57 +14463,6 @@ ], "time": "2016-12-01T10:57:30+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "1.2", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48", - "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48", - "shasum": "" - }, - "require": { - "ocramius/package-versions": "^1.2.0", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A wrapper for ocramius/package-versions to get pretty versions strings", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "time": "2018-06-13T13:22:40+00:00" - }, { "name": "lovers-of-behat/table-extension", "version": "1.2.0", @@ -14562,35 +14511,31 @@ }, { "name": "mglaman/phpstan-drupal", - "version": "0.11.14", + "version": "0.12.2", "source": { "type": "git", "url": "https://github.com/mglaman/phpstan-drupal.git", - "reference": "3458665f7bb579f700c1384d5bc05d879757f76c" + "reference": "bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/3458665f7bb579f700c1384d5bc05d879757f76c", - "reference": "3458665f7bb579f700c1384d5bc05d879757f76c", + "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9", + "reference": "bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9", "shasum": "" }, "require": { - "nette/di": "^3.0", + "nette/finder": "^2.5", "php": "^7.1", - "phpstan/phpstan": "~0.11.0", + "phpstan/phpstan": "^0.12.0", "symfony/yaml": "~3.4.5|^4.2", "webflo/drupal-finder": "^1.2" }, - "conflict": { - "phpstan/phpstan": ">=0.12", - "phpstan/phpstan-deprecation-rules": ">=0.12" - }, "require-dev": { "composer/installers": "^1.6", "drupal/core-recommended": "^8.8@alpha", "drush/drush": "^9.6", - "phpstan/phpstan-deprecation-rules": "~0.11.0", - "phpstan/phpstan-strict-rules": "~0.11.0", + "phpstan/phpstan-deprecation-rules": "~0.12.0", + "phpstan/phpstan-strict-rules": "^0.12.0", "phpunit/phpunit": "^7.5", "squizlabs/php_codesniffer": "^3.3" }, @@ -14641,7 +14586,7 @@ } ], "description": "Drupal extension and rules for PHPStan", - "time": "2019-12-10T15:17:37+00:00" + "time": "2020-01-27T20:01:01+00:00" }, { "name": "mikey179/vfsstream", @@ -14737,153 +14682,6 @@ ], "time": "2020-01-17T21:11:47+00:00" }, - { - "name": "nette/bootstrap", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/nette/bootstrap.git", - "reference": "b45a1e33b6a44beb307756522396551e5a9ff249" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/bootstrap/zipball/b45a1e33b6a44beb307756522396551e5a9ff249", - "reference": "b45a1e33b6a44beb307756522396551e5a9ff249", - "shasum": "" - }, - "require": { - "nette/di": "^3.0", - "nette/utils": "^3.0", - "php": ">=7.1" - }, - "conflict": { - "tracy/tracy": "<2.6" - }, - "require-dev": { - "latte/latte": "^2.2", - "nette/application": "^3.0", - "nette/caching": "^3.0", - "nette/database": "^3.0", - "nette/forms": "^3.0", - "nette/http": "^3.0", - "nette/mail": "^3.0", - "nette/robot-loader": "^3.0", - "nette/safe-stream": "^2.2", - "nette/security": "^3.0", - "nette/tester": "^2.0", - "tracy/tracy": "^2.6" - }, - "suggest": { - "nette/robot-loader": "to use Configurator::createRobotLoader()", - "tracy/tracy": "to use Configurator::enableTracy()" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.", - "homepage": "https://nette.org", - "keywords": [ - "bootstrapping", - "configurator", - "nette" - ], - "time": "2019-09-30T08:19:38+00:00" - }, - { - "name": "nette/di", - "version": "v3.0.3", - "source": { - "type": "git", - "url": "https://github.com/nette/di.git", - "reference": "77d69061cbf8f9cfb7363dd983136f51213d3e41" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/di/zipball/77d69061cbf8f9cfb7363dd983136f51213d3e41", - "reference": "77d69061cbf8f9cfb7363dd983136f51213d3e41", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "nette/neon": "^3.0", - "nette/php-generator": "^3.3.3", - "nette/robot-loader": "^3.2", - "nette/schema": "^1.0", - "nette/utils": "^3.1", - "php": ">=7.1" - }, - "conflict": { - "nette/bootstrap": "<3.0" - }, - "require-dev": { - "nette/tester": "^2.2", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.", - "homepage": "https://nette.org", - "keywords": [ - "compiled", - "di", - "dic", - "factory", - "ioc", - "nette", - "static" - ], - "time": "2020-01-20T12:14:54+00:00" - }, { "name": "nette/finder", "version": "v2.5.2", @@ -14947,247 +14745,6 @@ ], "time": "2020-01-03T20:35:40+00:00" }, - { - "name": "nette/neon", - "version": "v3.1.2", - "source": { - "type": "git", - "url": "https://github.com/nette/neon.git", - "reference": "3c3dcbc6bf6c80dc97b1fc4ba9a22ae67930fc0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/neon/zipball/3c3dcbc6bf6c80dc97b1fc4ba9a22ae67930fc0e", - "reference": "3c3dcbc6bf6c80dc97b1fc4ba9a22ae67930fc0e", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "ext-json": "*", - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🍸 Nette NEON: encodes and decodes NEON file format.", - "homepage": "https://ne-on.org", - "keywords": [ - "export", - "import", - "neon", - "nette", - "yaml" - ], - "time": "2020-03-04T11:47:04+00:00" - }, - { - "name": "nette/php-generator", - "version": "v3.3.4", - "source": { - "type": "git", - "url": "https://github.com/nette/php-generator.git", - "reference": "8fe7e699dca7db186f56d75800cb1ec32e39c856" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/8fe7e699dca7db186f56d75800cb1ec32e39c856", - "reference": "8fe7e699dca7db186f56d75800cb1ec32e39c856", - "shasum": "" - }, - "require": { - "nette/utils": "^2.4.2 || ^3.0", - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.4 features.", - "homepage": "https://nette.org", - "keywords": [ - "code", - "nette", - "php", - "scaffolding" - ], - "time": "2020-02-09T14:39:09+00:00" - }, - { - "name": "nette/robot-loader", - "version": "v3.2.3", - "source": { - "type": "git", - "url": "https://github.com/nette/robot-loader.git", - "reference": "726c462e73e739e965ec654a667407074cfe83c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/robot-loader/zipball/726c462e73e739e965ec654a667407074cfe83c0", - "reference": "726c462e73e739e965ec654a667407074cfe83c0", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "nette/finder": "^2.5 || ^3.0", - "nette/utils": "^3.0", - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "^2.0", - "phpstan/phpstan": "^0.12", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", - "homepage": "https://nette.org", - "keywords": [ - "autoload", - "class", - "interface", - "nette", - "trait" - ], - "time": "2020-02-28T13:10:07+00:00" - }, - { - "name": "nette/schema", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "febf71fb4052c824046f5a33f4f769a6e7fa0cb4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/febf71fb4052c824046f5a33f4f769a6e7fa0cb4", - "reference": "febf71fb4052c824046f5a33f4f769a6e7fa0cb4", - "shasum": "" - }, - "require": { - "nette/utils": "^3.1", - "php": ">=7.1" - }, - "require-dev": { - "nette/tester": "^2.2", - "phpstan/phpstan-nette": "^0.12", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": [] - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", - "keywords": [ - "config", - "nette" - ], - "time": "2020-01-06T22:52:48+00:00" - }, { "name": "nette/utils", "version": "v3.1.1", @@ -15266,56 +14823,6 @@ ], "time": "2020-02-09T14:10:55+00:00" }, - { - "name": "ocramius/package-versions", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0", - "php": "^7.1.0" - }, - "require-dev": { - "composer/composer": "^1.6.3", - "doctrine/coding-standard": "^5.0.1", - "ext-zip": "*", - "infection/infection": "^0.7.1", - "phpunit/phpunit": "^7.5.17" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-11-15T16:17:10+00:00" - }, { "name": "pear/http_request2", "version": "v2.3.0", @@ -15765,160 +15272,91 @@ ], "time": "2020-03-05T15:02:03+00:00" }, - { - "name": "phpstan/phpdoc-parser", - "version": "0.3.5", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "8c4ef2aefd9788238897b678a985e1d5c8df6db4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/8c4ef2aefd9788238897b678a985e1d5c8df6db4", - "reference": "8c4ef2aefd9788238897b678a985e1d5c8df6db4", - "shasum": "" - }, - "require": { - "php": "~7.1" - }, - "require-dev": { - "consistence/coding-standard": "^3.5", - "jakub-onderka/php-parallel-lint": "^0.9.2", - "phing/phing": "^2.16.0", - "phpstan/phpstan": "^0.10", - "phpunit/phpunit": "^6.3", - "slevomat/coding-standard": "^4.7.2", - "squizlabs/php_codesniffer": "^3.3.2", - "symfony/process": "^3.4 || ^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - }, - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "time": "2019-06-07T19:13:52+00:00" - }, { "name": "phpstan/phpstan", - "version": "0.11.19", + "version": "0.12.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "63cc502f6957b7f74efbac444b4cf219dcadffd7" + "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/63cc502f6957b7f74efbac444b4cf219dcadffd7", - "reference": "63cc502f6957b7f74efbac444b4cf219dcadffd7", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b2c37bda79fdb11d801ce208ce391cffc0f572e6", + "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6", "shasum": "" }, "require": { - "composer/xdebug-handler": "^1.3.0", - "jean85/pretty-package-versions": "^1.0.3", - "nette/bootstrap": "^2.4 || ^3.0", - "nette/di": "^2.4.7 || ^3.0", - "nette/neon": "^2.4.3 || ^3.0", - "nette/robot-loader": "^3.0.1", - "nette/schema": "^1.0", - "nette/utils": "^2.4.5 || ^3.0", - "nikic/php-parser": "^4.2.3", - "php": "~7.1", - "phpstan/phpdoc-parser": "^0.3.5", - "symfony/console": "~3.2 || ~4.0", - "symfony/finder": "~3.2 || ~4.0" - }, - "conflict": { - "symfony/console": "3.4.16 || 4.1.5" - }, - "require-dev": { - "brianium/paratest": "^2.0 || ^3.0", - "consistence/coding-standard": "^3.5", - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", - "ext-intl": "*", - "ext-mysqli": "*", - "ext-simplexml": "*", - "ext-soap": "*", - "ext-zip": "*", - "jakub-onderka/php-parallel-lint": "^1.0", - "localheinz/composer-normalize": "^1.1.0", - "phing/phing": "^2.16.0", - "phpstan/phpstan-deprecation-rules": "^0.11", - "phpstan/phpstan-php-parser": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.5.14 || ^8.0", - "slevomat/coding-standard": "^4.7.2", - "squizlabs/php_codesniffer": "^3.3.2" + "php": "^7.1" }, "bin": [ - "bin/phpstan" + "phpstan", + "phpstan.phar" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "0.11-dev" + "dev-master": "0.12-dev" } }, "autoload": { - "psr-4": { - "PHPStan\\": [ - "src/" - ] - } + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", - "time": "2019-10-22T20:20:22+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2020-03-17T15:39:11+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "0.11.2", + "version": "0.12.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "5685fe48873efc5af1f2cc95d9c1b8ae82c728fe" + "reference": "51d21a83b97e539e1fc56c1ce42ac0f187407fb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/5685fe48873efc5af1f2cc95d9c1b8ae82c728fe", - "reference": "5685fe48873efc5af1f2cc95d9c1b8ae82c728fe", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/51d21a83b97e539e1fc56c1ce42ac0f187407fb6", + "reference": "51d21a83b97e539e1fc56c1ce42ac0f187407fb6", "shasum": "" }, "require": { - "nikic/php-parser": "^4.0", "php": "~7.1", - "phpstan/phpstan": "^0.11.8" + "phpstan/phpstan": "^0.12" }, "require-dev": { "consistence/coding-standard": "^3.0.1", "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", "jakub-onderka/php-parallel-lint": "^1.0", + "localheinz/composer-normalize": "^1.3.0", "phing/phing": "^2.16.0", - "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^7.0", "slevomat/coding-standard": "^4.5.2" }, "type": "phpstan-extension", "extra": { "branch-alias": { - "dev-master": "0.11-dev" + "dev-master": "0.12-dev" }, "phpstan": { "includes": [ @@ -15936,7 +15374,7 @@ "MIT" ], "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", - "time": "2019-05-28T19:54:04+00:00" + "time": "2020-01-12T16:25:40+00:00" }, { "name": "phpunit/php-code-coverage", From 24414c91517c7dde0df941706cbad4d107c19d40 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 11:45:58 +0200 Subject: [PATCH 256/957] ISAICP-5208: Add a sanity check to CPHP that exits the build early when new deprecated code is added. --- build.continuousphp.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.continuousphp.xml b/build.continuousphp.xml index 760bcf84f6..65e3b9608f 100644 --- a/build.continuousphp.xml +++ b/build.continuousphp.xml @@ -113,4 +113,6 @@ sudo rsync -avz /opt/solr/search_api_solr/solr-conf/6.x/ /opt/solr/server/solr/d milliseconds="${sleep.milliseconds}"/> + + From 2c314ba81f516de384f88909f1b5edbb22b324e0 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 12:02:42 +0200 Subject: [PATCH 257/957] ISAICP-5208: Check all paths that contain deprecated code. --- build.project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.project.xml b/build.project.xml index 4d3fe8d028..9942df39da 100644 --- a/build.project.xml +++ b/build.project.xml @@ -627,7 +627,7 @@ depends="setup-virtuoso-permissions, purge-solr-backend, purge-virtuoso-backend, clean-redis-settings, disable-webtools-geocoding-cache, setup-config-sync-dir, install, ensure-search-api-solr-site-hash, setup-redis, import-rdf-fixtures, setup-dev, configure-apache-solr-drupal, configure-matomo-drupal, create-demo-users, enable-webtools-geocoding-cache, setup-mocked-newsroom-newsletter-subscriber, set-custom-error-handlers, start-cas-mock-server, enable-config-read-only" /> - + From aca3d716619d345e413bd7586863a555e5d4c344 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 12:30:42 +0200 Subject: [PATCH 258/957] ISAICP-5208: Call to deprecated method strtolower() of class Drupal\Component\Utility\Unicode. --- .../Constraint/UniqueFieldValueInBundleValidator.php | 7 ++++--- web/profiles/joinup/joinup.behat.inc | 3 +-- web/profiles/joinup/src/Controller/JoinupController.php | 5 +++-- web/themes/joinup/joinup_theme.theme | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/joinup_core/src/Plugin/Validation/Constraint/UniqueFieldValueInBundleValidator.php b/web/modules/custom/joinup_core/src/Plugin/Validation/Constraint/UniqueFieldValueInBundleValidator.php index 383bd87a38..0b45b97dc5 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Validation/Constraint/UniqueFieldValueInBundleValidator.php +++ b/web/modules/custom/joinup_core/src/Plugin/Validation/Constraint/UniqueFieldValueInBundleValidator.php @@ -1,8 +1,9 @@ context->addViolation($constraint->message, [ '%value' => $item->{$main_property}, - '@entity_type' => $entity->getEntityType()->getLowercaseLabel(), - '@field_name' => Unicode::strtolower($items->getFieldDefinition()->getLabel()), + '@entity_type' => $entity->getEntityType()->getSingularLabel(), + '@field_name' => mb_strtolower($items->getFieldDefinition()->getLabel()), ]); } } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index ef166b67ec..349db12bb1 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -12,7 +12,6 @@ use Behat\Gherkin\Node\TableNode; use Behat\Mink\Exception\ElementNotFoundException; use Drupal\comment\CommentInterface; use Drupal\comment\Entity\Comment; -use Drupal\Component\Utility\Unicode; use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\RevisionableInterface; @@ -1867,7 +1866,7 @@ class JoinupSubContext extends DrupalSubContextBase { */ public function assertHomepageStatistics(TableNode $statistics_table) { foreach ($statistics_table->getRowsHash() as $type => $expected_value) { - $wrapper_selector = Unicode::strtolower("stats__wrapper__$type"); + $wrapper_selector = mb_strtolower("stats__wrapper__$type"); $xpath = '//div[contains(concat(" ", normalize-space(@class), " "), " ' . $wrapper_selector . ' ")]//div[contains(concat(" ", normalize-space(@class), " "), " stats__text--upper ")]'; $element = $this->getSession()->getPage()->find('xpath', $xpath); Assert::assertEquals($expected_value, $element->getText()); diff --git a/web/profiles/joinup/src/Controller/JoinupController.php b/web/profiles/joinup/src/Controller/JoinupController.php index b3038d8aa7..5e05453c53 100644 --- a/web/profiles/joinup/src/Controller/JoinupController.php +++ b/web/profiles/joinup/src/Controller/JoinupController.php @@ -1,8 +1,9 @@ entityFormBuilder()->getForm($rdf_entity, 'propose'); $form['#title'] = $this->t('Propose @type', [ - '@type' => Unicode::strtolower($rdf_type->label()), + '@type' => mb_strtolower($rdf_type->label()), ]); return $form; } diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 0ce3ea5ed7..85a65643a1 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -5,6 +5,8 @@ * Functions to support theming in the Joinup theme. */ +declare(strict_types = 1); + use Drupal\Component\Serialization\Json; use Drupal\Component\Utility\Unicode; use Drupal\Core\Cache\Cache; @@ -837,7 +839,7 @@ function joinup_theme_preprocess_field(&$variables) { function joinup_theme_preprocess_field__comment(&$variables) { // Get entity url needed for login and register routes. $entity = $variables['element']['#object']; - $variables['entity_bundle'] = Unicode::strtolower($entity->type->entity->label()); + $variables['entity_bundle'] = mb_strtolower($entity->type->entity->label()); // Get the comment status from the entity itself. $comments_status = $variables['element']['#items']->status; From 0f6977f24569c25e22f752cb282c846dfd2187a5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 12:49:28 +0200 Subject: [PATCH 259/957] ISAICP-5208: Call to deprecated method url() of class Drupal\Core\Entity\EntityInterface. --- .../asset_distribution.behat.inc | 8 ++++++-- .../asset_release/asset_release.behat.inc | 16 ++++++++++------ .../custom/collection/collection.behat.inc | 8 +++++--- .../contact_information.behat.inc | 6 +++++- .../custom/custom_page/custom_page.behat.inc | 4 +++- .../joinup_discussion.behat.inc | 4 +++- .../joinup_document/joinup_document.behat.inc | 6 +++++- .../custom/joinup_event/joinup_event.behat.inc | 4 +++- .../joinup_licence/joinup_licence.behat.inc | 18 ++++++++++++------ .../custom/joinup_news/joinup_news.behat.inc | 6 +++++- .../custom/joinup_user/joinup_user.behat.inc | 4 +++- web/modules/custom/owner/owner.behat.inc | 10 +++++++--- web/modules/custom/solution/solution.behat.inc | 16 ++++++++++------ web/profiles/joinup/joinup.behat.inc | 8 ++++++-- 14 files changed, 83 insertions(+), 35 deletions(-) diff --git a/web/modules/custom/asset_distribution/asset_distribution.behat.inc b/web/modules/custom/asset_distribution/asset_distribution.behat.inc index e03ed9ba67..cd76c958ed 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.behat.inc +++ b/web/modules/custom/asset_distribution/asset_distribution.behat.inc @@ -47,11 +47,13 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal * @When I visit (the homepage of )the :asset_distribution distribution * @When I go to (the homepage of )the :asset_distribution asset distribution * @When I visit (the homepage of )the :asset_distribution asset distribution + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitDistribution(string $asset_distribution): void { /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ $entity = $this->getAssetDistributionByName($asset_distribution); - $this->visitPath($entity->url()); + $this->visitPath($entity->toUrl()->toString()); } /** @@ -62,11 +64,13 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal * * @When I go to the :asset_distribution asset distribution edit form * @When I visit the :asset_distribution asset distribution edit form + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitEditAssetDistribution(string $asset_distribution): void { /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ $entity = $this->getAssetDistributionByName($asset_distribution); - $path = $entity->url('edit-form'); + $path = $entity->toUrl('edit-form')->toString(); $this->visitPath($path); } diff --git a/web/modules/custom/asset_release/asset_release.behat.inc b/web/modules/custom/asset_release/asset_release.behat.inc index ff0df0df13..0b89c43c3d 100644 --- a/web/modules/custom/asset_release/asset_release.behat.inc +++ b/web/modules/custom/asset_release/asset_release.behat.inc @@ -41,10 +41,13 @@ class AssetReleaseSubContext extends DrupalSubContextBase implements DrupalSubCo * * @When I go to (the homepage of )the :asset_release release * @When I visit (the homepage of )the :asset_release release + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitRelease(string $asset_release): void { - $asset_release = $this->getAssetReleaseByName($asset_release); - $this->visitPath($asset_release->url()); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getAssetReleaseByName($asset_release); + $this->visitPath($entity->toUrl()->toString()); } /** @@ -55,12 +58,13 @@ class AssetReleaseSubContext extends DrupalSubContextBase implements DrupalSubCo * * @When I go to the :release release edit form * @When I visit the :release release edit form + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitEditAssetDistribution(string $release): void { - /** @var \Drupal\rdf_entity\Entity\Rdf $release */ - $release = $this->getAssetReleaseByName($release); - $path = $release->url('edit-form'); - $this->visitPath($path); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getAssetReleaseByName($release); + $this->visitPath($entity->toUrl('edit-form')->toString()); } /** diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 190f39e468..7d7a22f298 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -99,11 +99,13 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * * @When I go to (the homepage of )the :collection collection * @When I visit (the homepage of )the :collection collection + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitCollection(string $collection): void { - /** @var \Drupal\rdf_entity\Entity\Rdf $collection */ - $collection = $this->getCollectionByName($collection); - $this->visitPath($collection->url()); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getCollectionByName($collection); + $this->visitPath($entity->toUrl()->toString()); } /** diff --git a/web/modules/custom/contact_information/contact_information.behat.inc b/web/modules/custom/contact_information/contact_information.behat.inc index 2272776147..139d56b5fe 100644 --- a/web/modules/custom/contact_information/contact_information.behat.inc +++ b/web/modules/custom/contact_information/contact_information.behat.inc @@ -5,6 +5,8 @@ * Contains \ContactInformationSubContext. */ +declare(strict_types = 1); + use Behat\Gherkin\Node\TableNode; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; @@ -38,11 +40,13 @@ class ContactInformationSubContext extends DrupalSubContextBase implements Drupa * @When I visit (the homepage of )the :label contact * @When I go to the :label contact information page * @When I visit the :label contact information page + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitContactInformationPage($label) { /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ $entity = $this->getRdfEntityByLabel($label, 'contact_information'); - $this->visitPath($entity->url()); + $this->visitPath($entity->toUrl()->toString()); } /** diff --git a/web/modules/custom/custom_page/custom_page.behat.inc b/web/modules/custom/custom_page/custom_page.behat.inc index a64e2fc77d..9d1f12a41f 100644 --- a/web/modules/custom/custom_page/custom_page.behat.inc +++ b/web/modules/custom/custom_page/custom_page.behat.inc @@ -79,11 +79,13 @@ class CustomPageSubContext extends DrupalSubContextBase implements DrupalSubCont * * @When I go to the :title custom page * @When I visit the :title custom page + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitCustomPage(string $title): void { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, 'custom_page'); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } /** diff --git a/web/modules/custom/joinup_discussion/joinup_discussion.behat.inc b/web/modules/custom/joinup_discussion/joinup_discussion.behat.inc index aa3222c084..17b976c712 100644 --- a/web/modules/custom/joinup_discussion/joinup_discussion.behat.inc +++ b/web/modules/custom/joinup_discussion/joinup_discussion.behat.inc @@ -28,11 +28,13 @@ class JoinupDiscussionSubContext extends DrupalSubContextBase implements DrupalS * * @When I go to the :title discussion * @When I visit the :title discussion + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitDiscussion(string $title): void { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, 'discussion'); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } /** diff --git a/web/modules/custom/joinup_document/joinup_document.behat.inc b/web/modules/custom/joinup_document/joinup_document.behat.inc index 416ca82045..0b9727dce7 100644 --- a/web/modules/custom/joinup_document/joinup_document.behat.inc +++ b/web/modules/custom/joinup_document/joinup_document.behat.inc @@ -5,6 +5,8 @@ * Contains \DocumentSubContext. */ +declare(strict_types = 1); + use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope; @@ -30,11 +32,13 @@ class JoinupDocumentSubContext extends DrupalSubContextBase implements DrupalSub * * @When I go to the :title document * @When I visit the :title document + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitDocument($title) { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, 'document'); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } /** diff --git a/web/modules/custom/joinup_event/joinup_event.behat.inc b/web/modules/custom/joinup_event/joinup_event.behat.inc index ffdfa320b4..5a6ce7aef2 100644 --- a/web/modules/custom/joinup_event/joinup_event.behat.inc +++ b/web/modules/custom/joinup_event/joinup_event.behat.inc @@ -36,11 +36,13 @@ class JoinupEventSubContext extends DrupalSubContextBase { * * @When I go to the :title event * @When I visit the :title event + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitEvent(string $title): void { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, 'event'); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } /** diff --git a/web/modules/custom/joinup_licence/joinup_licence.behat.inc b/web/modules/custom/joinup_licence/joinup_licence.behat.inc index cf3d396901..fc25852b6c 100644 --- a/web/modules/custom/joinup_licence/joinup_licence.behat.inc +++ b/web/modules/custom/joinup_licence/joinup_licence.behat.inc @@ -5,6 +5,8 @@ * Contains \LicenceSubContext. */ +declare(strict_types = 1); + use Behat\Gherkin\Node\TableNode; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; @@ -38,11 +40,13 @@ class JoinupLicenceSubContext extends DrupalSubContextBase implements DrupalSubC * * @When I go to (the homepage of )the :licence licence * @When I visit (the homepage of )the :licence licence + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitLicence($licence) { - /** @var \Drupal\rdf_entity\Entity\Rdf $licence */ - $licence = $this->getLicenceByName($licence); - $this->visitPath($licence->url()); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getLicenceByName($licence); + $this->visitPath($entity->toUrl()->toString()); } /** @@ -55,11 +59,13 @@ class JoinupLicenceSubContext extends DrupalSubContextBase implements DrupalSubC * * @When I go to (the homepage of )the :licence licence in the :format serialisation. * @When I visit (the homepage of )the :licence licence in the :format serialisation. + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitLicenceWithFormat($licence, $format) { - /** @var \Drupal\rdf_entity\Entity\Rdf $collection */ - $licence = $this->getLicenceByName($licence); - $this->visitPath($licence->url('canonical', ['query' => ['_format' => $format]])); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getLicenceByName($licence); + $this->visitPath($entity->toUrl('canonical', ['query' => ['_format' => $format]])->toString()); } /** diff --git a/web/modules/custom/joinup_news/joinup_news.behat.inc b/web/modules/custom/joinup_news/joinup_news.behat.inc index 9940180f6a..a9fca53052 100644 --- a/web/modules/custom/joinup_news/joinup_news.behat.inc +++ b/web/modules/custom/joinup_news/joinup_news.behat.inc @@ -5,6 +5,8 @@ * Contains \NewsSubContext. */ +declare(strict_types = 1); + use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; use Drupal\joinup\Traits\NodeTrait; @@ -24,11 +26,13 @@ class JoinupNewsSubContext extends DrupalSubContextBase implements DrupalSubCont * * @When I go to the :title news * @When I visit the :title news + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitNewsPage($title) { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, 'news'); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } } diff --git a/web/modules/custom/joinup_user/joinup_user.behat.inc b/web/modules/custom/joinup_user/joinup_user.behat.inc index 3c0cbc50d6..34faf97529 100644 --- a/web/modules/custom/joinup_user/joinup_user.behat.inc +++ b/web/modules/custom/joinup_user/joinup_user.behat.inc @@ -35,9 +35,11 @@ class JoinupUserSubContext extends DrupalSubContextBase implements DrupalSubCont * * @When I go to the (public )profile of :user * @When I visit the (public )profile of :user + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitUserPublicProfile(string $user): void { - $this->visitPath($this->getUserByName($user)->url()); + $this->visitPath($this->getUserByName($user)->toUrl()->toString()); } /** diff --git a/web/modules/custom/owner/owner.behat.inc b/web/modules/custom/owner/owner.behat.inc index 54404fe846..0b57d24807 100644 --- a/web/modules/custom/owner/owner.behat.inc +++ b/web/modules/custom/owner/owner.behat.inc @@ -5,6 +5,8 @@ * Contains \OwnerSubContext. */ +declare(strict_types = 1); + use Behat\Gherkin\Node\TableNode; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; @@ -183,11 +185,13 @@ class OwnerSubContext extends DrupalSubContextBase implements DrupalSubContextIn * * @When I go to (the homepage of )the :owner owner * @When I visit (the homepage of )the :owner owner + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitOwner($owner) { - /** @var \Drupal\rdf_entity\Entity\Rdf $owner */ - $owner = $this->getRdfEntityByLabel($owner, 'owner'); - $this->visitPath($owner->url()); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getRdfEntityByLabel($owner, 'owner'); + $this->visitPath($entity->toUrl()->toString()); } } diff --git a/web/modules/custom/solution/solution.behat.inc b/web/modules/custom/solution/solution.behat.inc index 32b317c388..c844b07777 100644 --- a/web/modules/custom/solution/solution.behat.inc +++ b/web/modules/custom/solution/solution.behat.inc @@ -84,11 +84,13 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex * @When I go to (the homepage of )the :solution solution * @When I visit (the homepage of )the :solution solution * @Given I am on (the homepage of )the :solution solution + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitSolution($solution) { - /** @var \Drupal\rdf_entity\Entity\Rdf $solution */ - $solution = $this->getSolutionByName($solution); - $this->visitPath($solution->url()); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getSolutionByName($solution); + $this->visitPath($entity->toUrl()->toString()); } /** @@ -99,11 +101,13 @@ class SolutionSubContext extends DrupalSubContextBase implements DrupalSubContex * * @When I go to the :solution solution edit form * @When I visit the :solution solution edit form + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitEditSolution($solution) { - /** @var \Drupal\rdf_entity\Entity\Rdf $solution */ - $solution = $this->getSolutionByName($solution); - $path = $solution->url('edit-form'); + /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ + $entity = $this->getSolutionByName($solution); + $path = $entity->toUrl('edit-form')->toString(); $this->visitPath($path); } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 349db12bb1..f738433300 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -449,11 +449,13 @@ class JoinupSubContext extends DrupalSubContextBase { * * @When I go to the :bundle (content ) :title edit screen * @When I visit the :bundle (content ) :title edit screen + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitNodeEditForm($bundle, $title) { /** @var \Drupal\node\NodeInterface $node */ $node = $this->getNodeByTitle($title, $bundle); - $this->visitPath($node->url('edit-form')); + $this->visitPath($node->toUrl('edit-form')->toString()); } /** @@ -469,11 +471,13 @@ class JoinupSubContext extends DrupalSubContextBase { * * @When I go to the content page of the type :type with the title :title * @When I visit the content page of the type :type with the title :title + * + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function visitNodePage($type, $title) { /** @var \Drupal\node\Entity\Node $node */ $node = $this->getNodeByTitle($title, $type); - $this->visitPath($node->url()); + $this->visitPath($node->toUrl()->toString()); } /** From 1f6ac807fbdf9f7994c98999b57c7d94a47cfdc3 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 13:00:08 +0200 Subject: [PATCH 260/957] ISAICP-5208: Call to deprecated function pager_default_initialize(). --- .../Field/FieldFormatter/SearchFormatter.php | 18 +++++++++++++++--- .../joinup/src/Form/SolutionsByLicenceForm.php | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/search_api_field/src/Plugin/Field/FieldFormatter/SearchFormatter.php b/web/modules/custom/search_api_field/src/Plugin/Field/FieldFormatter/SearchFormatter.php index 64e739aa83..2609af08fe 100644 --- a/web/modules/custom/search_api_field/src/Plugin/Field/FieldFormatter/SearchFormatter.php +++ b/web/modules/custom/search_api_field/src/Plugin/Field/FieldFormatter/SearchFormatter.php @@ -12,6 +12,7 @@ use Drupal\Core\Field\FormatterBase; use Drupal\Core\Logger\LoggerChannelInterface; use Drupal\Core\Logger\RfcLogLevel; +use Drupal\Core\Pager\PagerManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Utility\Error; use Drupal\search_api\IndexInterface; @@ -72,6 +73,13 @@ class SearchFormatter extends FormatterBase implements ContainerFactoryPluginInt */ protected $request; + /** + * The pager manager. + * + * @var \Drupal\Core\Pager\PagerManagerInterface + */ + protected $pagerManager; + /** * Constructs a SearchFormatter object. * @@ -99,8 +107,10 @@ class SearchFormatter extends FormatterBase implements ContainerFactoryPluginInt * The filter plugin manager. * @param \Drupal\Core\Logger\LoggerChannelInterface $logger * The search_api logger channel. + * @param \Drupal\Core\Pager\PagerManagerInterface $pager_manager + * The pager manager. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, Request $request, ParseModePluginManager $parse_mode_manager, FilterPluginManagerInterface $filter_plugin_manager, LoggerChannelInterface $logger) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, Request $request, ParseModePluginManager $parse_mode_manager, FilterPluginManagerInterface $filter_plugin_manager, LoggerChannelInterface $logger, PagerManagerInterface $pager_manager) { parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); $this->entityTypeManager = $entity_type_manager; @@ -108,6 +118,7 @@ public function __construct($plugin_id, $plugin_definition, FieldDefinitionInter $this->parseModeManager = $parse_mode_manager; $this->request = $request; $this->logger = $logger; + $this->pagerManager = $pager_manager; } /** @@ -126,7 +137,8 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('request_stack')->getCurrentRequest(), $container->get('plugin.manager.search_api.parse_mode'), $container->get('plugin.manager.search_api_field.filter'), - $container->get('logger.channel.search_api') + $container->get('logger.channel.search_api'), + $container->get('pager.manager') ); } @@ -301,7 +313,7 @@ protected function renderSearchResults(ResultSetInterface $result, $limit): arra ]; // Build pager. - pager_default_initialize($result->getResultCount(), $limit); + $this->pagerManager->createPager($result->getResultCount(), $limit); } else { $build['#no_results_found'] = [ diff --git a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php index d3deaa2e67..4e59e73025 100644 --- a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php +++ b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php @@ -6,6 +6,7 @@ use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Pager\PagerManagerInterface; use Drupal\Core\Url; use Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface; use Drupal\sparql_entity_storage\Entity\Query\Sparql\SparqlArg; @@ -28,6 +29,13 @@ class SolutionsByLicenceForm extends FormBase { */ protected $connection; + /** + * The pager manager. + * + * @var \Drupal\Core\Pager\PagerManagerInterface + */ + protected $pagerManager; + /** * {@inheritdoc} */ @@ -40,9 +48,12 @@ public function getFormId() { * * @param \Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface $connection * The SPARQL connection. + * @param \Drupal\Core\Pager\PagerManagerInterface $pagerManager + * The pager manager. */ - public function __construct(ConnectionInterface $connection) { + public function __construct(ConnectionInterface $connection, PagerManagerInterface $pagerManager) { $this->connection = $connection; + $this->pagerManager = $pagerManager; } /** @@ -50,7 +61,8 @@ public function __construct(ConnectionInterface $connection) { */ public static function create(ContainerInterface $container) { return new static( - $container->get('sparql_endpoint') + $container->get('sparql_endpoint'), + $container->get('pager.manager') ); } @@ -77,7 +89,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { $licence_id = $form_state->getValue('licence_option'); $results = $this->connection->query($this->getCountQuery($licence_id)); $total = reset($results)->total->getValue(); - $page = pager_default_initialize($total, self::ITEMS_PER_PAGE); + $page = $this->pagerManager->createPager($total, self::ITEMS_PER_PAGE)->getCurrentPage(); $offset = $page * self::ITEMS_PER_PAGE; $items = $this->connection->query($this->getQuery($offset, $licence_id)); From 9a615d3499945bfd91338f29a56850c3e8ce954a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 13:04:19 +0200 Subject: [PATCH 261/957] ISAICP-5208: Call to deprecated method getLinkGenerator() of class Drupal\Core\Form\FormBase. --- .../src/Form/SolutionsByLicenceForm.php | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php index 4e59e73025..27b6766a75 100644 --- a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php +++ b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php @@ -8,6 +8,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Pager\PagerManagerInterface; use Drupal\Core\Url; +use Drupal\Core\Utility\LinkGeneratorInterface; use Drupal\sparql_entity_storage\Database\Driver\sparql\ConnectionInterface; use Drupal\sparql_entity_storage\Entity\Query\Sparql\SparqlArg; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -36,6 +37,13 @@ class SolutionsByLicenceForm extends FormBase { */ protected $pagerManager; + /** + * The link generator. + * + * @var \Drupal\Core\Utility\LinkGeneratorInterface + */ + protected $linkGenerator; + /** * {@inheritdoc} */ @@ -50,10 +58,13 @@ public function getFormId() { * The SPARQL connection. * @param \Drupal\Core\Pager\PagerManagerInterface $pagerManager * The pager manager. + * @param \Drupal\Core\Utility\LinkGeneratorInterface $linkGenerator + * The link generator. */ - public function __construct(ConnectionInterface $connection, PagerManagerInterface $pagerManager) { + public function __construct(ConnectionInterface $connection, PagerManagerInterface $pagerManager, LinkGeneratorInterface $linkGenerator) { $this->connection = $connection; $this->pagerManager = $pagerManager; + $this->linkGenerator = $linkGenerator; } /** @@ -62,7 +73,8 @@ public function __construct(ConnectionInterface $connection, PagerManagerInterfa public static function create(ContainerInterface $container) { return new static( $container->get('sparql_endpoint'), - $container->get('pager.manager') + $container->get('pager.manager'), + $container->get('link_generator') ); } @@ -103,8 +115,8 @@ public function buildForm(array $form, FormStateInterface $form_state) { ]); $rows[] = [ - $this->getLinkGenerator()->generate($item->licence_label, $licence_url), - $this->getLinkGenerator()->generate($item->solution_label, $solution_url), + $this->linkGenerator->generate($item->licence_label, $licence_url), + $this->linkGenerator->generate($item->solution_label, $solution_url), ]; } From a5c79f835f0cf6bd37a5ed3b84170227a985e8eb Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 13:26:16 +0200 Subject: [PATCH 262/957] ISAICP-5208: Call to deprecated function drupal_set_message(). --- .../src/Form/AdmsValidatorForm.php | 4 ++-- .../custom/joinup_core/joinup_core.module | 2 +- .../src/Form/RdfEntityUriWebConverterForm.php | 4 +++- .../src/Plugin/Action/ChangeGroupAction.php | 2 +- .../joinup_discussion.services.yml | 2 +- .../EventSubscriber/InvitationSubscriber.php | 21 ++++++++++++++----- .../src/Form/InviteToDiscussionForm.php | 2 +- .../BooleanFieldToggleController.php | 4 +++- .../joinup_group/joinup_group.services.yml | 2 +- .../TransferGroupOwnershipSubscriber.php | 15 +++++++++++-- .../src/Form/InviteToGroupForm.php | 2 +- .../custom/joinup_user/joinup_user.module | 4 +++- web/modules/custom/solution/solution.module | 2 +- .../src/Controller/PinEntityController.php | 4 ++-- 14 files changed, 49 insertions(+), 21 deletions(-) diff --git a/web/modules/custom/adms_validator/src/Form/AdmsValidatorForm.php b/web/modules/custom/adms_validator/src/Form/AdmsValidatorForm.php index 4c07c8e76b..9c5148590f 100644 --- a/web/modules/custom/adms_validator/src/Form/AdmsValidatorForm.php +++ b/web/modules/custom/adms_validator/src/Form/AdmsValidatorForm.php @@ -135,10 +135,10 @@ public function validateForm(array &$form, FormStateInterface $form_state) { $this->sparql->query("CLEAR GRAPH <$uri>"); if ($schema_errors->isSuccessful()) { - drupal_set_message($this->t('No errors found during validation.')); + $this->messenger()->addMessage($this->t('No errors found during validation.')); } else { - drupal_set_message($this->t('%count schema error(s) were found while validating.', ['%count' => $schema_errors->errorCount()]), 'warning'); + $this->messenger()->addMessage($this->t('%count schema error(s) were found while validating.', ['%count' => $schema_errors->errorCount()]), 'warning'); } $form_state->set('validation_errors', $schema_errors); } diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 6539d88b88..a9d4301a52 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -311,7 +311,7 @@ function joinup_core_rdf_entity_view(array &$build, EntityInterface $entity, Ent } $link = Link::fromTextAndUrl(t('here'), $url)->toString(); - drupal_set_message(t('You are viewing the published version. To view the latest draft version, click @here.', [ + \Drupal::messenger()->addMessage(t('You are viewing the published version. To view the latest draft version, click @here.', [ '@here' => $link, ]), 'warning'); } diff --git a/web/modules/custom/joinup_core/src/Form/RdfEntityUriWebConverterForm.php b/web/modules/custom/joinup_core/src/Form/RdfEntityUriWebConverterForm.php index bdb6aaaf34..c518c01b7c 100644 --- a/web/modules/custom/joinup_core/src/Form/RdfEntityUriWebConverterForm.php +++ b/web/modules/custom/joinup_core/src/Form/RdfEntityUriWebConverterForm.php @@ -1,5 +1,7 @@ messenger()->addMessage($id); } } diff --git a/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php b/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php index 33f19f745a..e9094d50b6 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php +++ b/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php @@ -226,7 +226,7 @@ public function executeMultiple(array $nodes) { '#theme' => 'item_list', '#items' => $message_group, ]; - drupal_set_message($this->renderer->render($list), $type); + $this->messenger()->addMessage($this->renderer->render($list), $type); } } } diff --git a/web/modules/custom/joinup_discussion/joinup_discussion.services.yml b/web/modules/custom/joinup_discussion/joinup_discussion.services.yml index 3a78171f2c..f6badbe3f4 100644 --- a/web/modules/custom/joinup_discussion/joinup_discussion.services.yml +++ b/web/modules/custom/joinup_discussion/joinup_discussion.services.yml @@ -6,7 +6,7 @@ services: - { name: cache.context } joinup_discussion.invitation_subscriber: class: Drupal\joinup_discussion\EventSubscriber\InvitationSubscriber - arguments: ['@joinup_subscription.discussion_subscription'] + arguments: ['@joinup_subscription.discussion_subscription', '@messenger'] tags: - { name: event_subscriber } joinup_discussion.subscribed_discussion: diff --git a/web/modules/custom/joinup_discussion/src/EventSubscriber/InvitationSubscriber.php b/web/modules/custom/joinup_discussion/src/EventSubscriber/InvitationSubscriber.php index 1a82436467..bd408a8bdb 100644 --- a/web/modules/custom/joinup_discussion/src/EventSubscriber/InvitationSubscriber.php +++ b/web/modules/custom/joinup_discussion/src/EventSubscriber/InvitationSubscriber.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_discussion\EventSubscriber; +use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\joinup_invite\Event\InvitationEventInterface; use Drupal\joinup_invite\Event\InvitationEvents; @@ -25,14 +26,24 @@ class InvitationSubscriber implements EventSubscriberInterface { */ protected $joinupSubscription; + /** + * The messenger. + * + * @var \Drupal\Core\Messenger\MessengerInterface + */ + protected $messenger; + /** * Constructs a new InvitationSubscriber. * * @param \Drupal\joinup_subscription\JoinupDiscussionSubscriptionInterface $joinupSubscription * The subscription service. + * @param \Drupal\Core\Messenger\MessengerInterface $messenger + * The messenger. */ - public function __construct(JoinupDiscussionSubscriptionInterface $joinupSubscription) { + public function __construct(JoinupDiscussionSubscriptionInterface $joinupSubscription, MessengerInterface $messenger) { $this->joinupSubscription = $joinupSubscription; + $this->messenger = $messenger; } /** @@ -64,14 +75,14 @@ public function acceptInvitation(InvitationEventInterface $event) : void { try { $result = $this->joinupSubscription->subscribe($invitation->getRecipient(), $invitation->getEntity(), 'subscribe_discussions'); if ($result) { - drupal_set_message($this->t('You have been subscribed to this discussion.')); + $this->messenger->addMessage($this->t('You have been subscribed to this discussion.')); } else { - drupal_set_message($this->t('Your subscription request could not be processed. Please try again later.')); + $this->messenger->addMessage($this->t('Your subscription request could not be processed. Please try again later.')); } } catch (UserAlreadySubscribedException $e) { - drupal_set_message($this->t('You were already subscribed to this discussion.')); + $this->messenger->addMessage($this->t('You were already subscribed to this discussion.')); } } @@ -92,7 +103,7 @@ public function rejectInvitation(InvitationEventInterface $event) : void { // After an invitation to participate in a discussion has been rejected we // should unsubscribe the user and show them a success message. $this->joinupSubscription->unsubscribe($invitation->getRecipient(), $invitation->getEntity(), 'subscribe_discussions'); - drupal_set_message($this->t('You have rejected the invitation to this discussion.')); + $this->messenger->addMessage($this->t('You have rejected the invitation to this discussion.')); } } diff --git a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php index d5afb808ea..f3284c1361 100644 --- a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php +++ b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php @@ -270,7 +270,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { default: throw new \Exception("Unknown result type '$result'."); } - drupal_set_message($message, $type); + $this->messenger()->addMessage($message, $type); } } diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index a204e9fc6f..141013fa83 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -1,5 +1,7 @@ t($message, [ + $this->messenger()->addMessage($this->t($message, [ '@bundle' => $entity->get($entity->getEntityType()->getKey('bundle'))->entity->label(), '%title' => $entity->label(), ])); diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index 72cc203b2f..4fe42c884e 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -14,7 +14,7 @@ services: - { name: event_subscriber } joinup_group.transfer_ownership_subscriber: class: Drupal\joinup_group\EventSubscriber\TransferGroupOwnershipSubscriber - arguments: ['@current_user', '@tempstore.private'] + arguments: ['@current_user', '@tempstore.private', '@messenger'] tags: - name: event_subscriber joinup_group.group.access_check: diff --git a/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php b/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php index e8ac131f12..4d20b6514c 100644 --- a/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php +++ b/web/modules/custom/joinup_group/src/EventSubscriber/TransferGroupOwnershipSubscriber.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_group\EventSubscriber; +use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\TempStore\PrivateTempStoreFactory; use Drupal\Core\Url; @@ -36,6 +37,13 @@ class TransferGroupOwnershipSubscriber implements EventSubscriberInterface { */ protected $tempStore; + /** + * The messenger. + * + * @var \Drupal\Core\Messenger\MessengerInterface + */ + protected $messenger; + /** * Constructs a new event subscriber. * @@ -43,10 +51,13 @@ class TransferGroupOwnershipSubscriber implements EventSubscriberInterface { * The current user service. * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $tempstore_factory * The user private tempstore factory. + * @param \Drupal\Core\Messenger\MessengerInterface $messenger + * The messenger. */ - public function __construct(AccountInterface $current_user, PrivateTempStoreFactory $tempstore_factory) { + public function __construct(AccountInterface $current_user, PrivateTempStoreFactory $tempstore_factory, MessengerInterface $messenger) { $this->currentUser = $current_user; $this->tempStore = $tempstore_factory->get('joinup_transfer_group_ownership'); + $this->messenger = $messenger; } /** @@ -78,7 +89,7 @@ public function alterRedirection(FilterResponseEvent $event): void { if (!empty($data['messages'])) { foreach ($data['messages'] as $severity => $messages) { foreach ($messages as $message) { - drupal_set_message($message, $severity); + $this->messenger->addMessage($message, $severity); } } $membership = OgMembership::load($data['membership']); diff --git a/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php b/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php index 186c0978a0..d6c43318f5 100644 --- a/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php +++ b/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php @@ -119,7 +119,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $membership->save(); } - drupal_set_message($this->t('Successfully added the role %role to the selected users.', [ + $this->messenger()->addMessage($this->t('Successfully added the role %role to the selected users.', [ '%role' => $role->label(), ])); $form_state->setRedirect('entity.rdf_entity.member_overview', [ diff --git a/web/modules/custom/joinup_user/joinup_user.module b/web/modules/custom/joinup_user/joinup_user.module index 7c4f473b8b..159d14a95f 100644 --- a/web/modules/custom/joinup_user/joinup_user.module +++ b/web/modules/custom/joinup_user/joinup_user.module @@ -5,6 +5,8 @@ * Main functions and hook implementations of the Joinup user module. */ +declare(strict_types = 1); + use Drupal\Component\Render\PlainTextOutput; use Drupal\Component\Utility\Xss; use Drupal\Core\Entity\EntityTypeInterface; @@ -362,7 +364,7 @@ function joinup_user_search_api_query_search_api_field_field_user_content_alter( if (count($groups) > 100) { $subset = array_chunk($groups, 100); $groups = reset($subset); - drupal_set_message(t('You are a member of high number of collections and/or solutions.
The results displayed here are limited to the content of the first 100 groups.'), 'warning'); + \Drupal::messenger()->addMessage(t('You are a member of high number of collections and/or solutions.
The results displayed here are limited to the content of the first 100 groups.'), 'warning'); } $or = $query->createConditionGroup('OR'); diff --git a/web/modules/custom/solution/solution.module b/web/modules/custom/solution/solution.module index 2622503b9e..7de5f1be51 100644 --- a/web/modules/custom/solution/solution.module +++ b/web/modules/custom/solution/solution.module @@ -148,7 +148,7 @@ function solution_form_rdf_entity_solution_edit_form_alter(array &$form, FormSta } if (!\Drupal::service('solution.title_duplicate_helper')->titleIsUnique($form_state->getFormObject()->getEntity())) { - drupal_set_message(t('A solution with the same name exists in a different collection.'), 'warning'); + \Drupal::messenger()->addMessage(t('A solution with the same name exists in a different collection.'), 'warning'); } } diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index 2a32a1055e..9afd569aae 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -84,7 +84,7 @@ public static function create(ContainerInterface $container) { public function pin(ContentEntityInterface $entity, RdfInterface $group) { $this->pinService->setEntityPinned($entity, $group, TRUE); - drupal_set_message($this->t('@bundle %title has been pinned in the @group_bundle %group.', [ + $this->messenger()->addMessage($this->t('@bundle %title has been pinned in the @group_bundle %group.', [ '@bundle' => $entity->get($entity->getEntityType()->getKey('bundle'))->entity->label(), '%title' => $entity->label(), '@group_bundle' => $group->bundle(), @@ -108,7 +108,7 @@ public function pin(ContentEntityInterface $entity, RdfInterface $group) { public function unpin(ContentEntityInterface $entity, RdfInterface $group) { $this->pinService->setEntityPinned($entity, $group, FALSE); - drupal_set_message($this->t('@bundle %title has been unpinned in the @group_bundle %group.', [ + $this->messenger()->addMessage($this->t('@bundle %title has been unpinned in the @group_bundle %group.', [ '@bundle' => $entity->get($entity->getEntityType()->getKey('bundle'))->entity->label(), '%title' => $entity->label(), '@group_bundle' => $group->bundle(), From 44c4491b0252a4ae37a3e2058bb0cad5c6cc855f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 14:15:54 +0200 Subject: [PATCH 263/957] ISAICP-5208: Update missing namespaces. --- build.project.xml | 2 +- composer.json | 7 +++++++ composer.lock | 5 +++++ .../custom/stats/tests/src/Kernel/RefreshCountersTest.php | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/build.project.xml b/build.project.xml index 9942df39da..2a9d801cc5 100644 --- a/build.project.xml +++ b/build.project.xml @@ -627,7 +627,7 @@ depends="setup-virtuoso-permissions, purge-solr-backend, purge-virtuoso-backend, clean-redis-settings, disable-webtools-geocoding-cache, setup-config-sync-dir, install, ensure-search-api-solr-site-hash, setup-redis, import-rdf-fixtures, setup-dev, configure-apache-solr-drupal, configure-matomo-drupal, create-demo-users, enable-webtools-geocoding-cache, setup-mocked-newsroom-newsletter-subscriber, set-custom-error-handlers, start-cas-mock-server, enable-config-read-only" /> - + diff --git a/composer.json b/composer.json index d3133e92f1..c14f120ba1 100644 --- a/composer.json +++ b/composer.json @@ -163,21 +163,28 @@ "web/modules/custom/contact_form/contact_form.behat.inc", "web/modules/custom/contact_information/contact_information.behat.inc", "web/modules/custom/custom_page/custom_page.behat.inc", + "web/modules/custom/eulogin/joinup_eulogin.behat.inc", + "web/modules/custom/isa2_analytics/isa2_analytics.behat.inc", + "web/modules/custom/joinup_communities/eupl/eupl.behat.inc", "web/modules/custom/joinup_communities/tallinn/tallinn.behat.inc", "web/modules/custom/joinup_community_content/joinup_community_content.behat.inc", "web/modules/custom/joinup_core/joinup_core.behat.inc", "web/modules/custom/joinup_discussion/joinup_discussion.behat.inc", "web/modules/custom/joinup_document/joinup_document.behat.inc", "web/modules/custom/joinup_event/joinup_event.behat.inc", + "web/modules/custom/joinup_front_page/joinup_front_page.behat.inc", + "web/modules/custom/joinup_group/joinup_group.behat.inc", "web/modules/custom/joinup_invite/joinup_invite.behat.inc", "web/modules/custom/joinup_licence/joinup_licence.behat.inc", "web/modules/custom/joinup_news/joinup_news.behat.inc", "web/modules/custom/joinup_newsletter/joinup_newsletter.behat.inc", "web/modules/custom/joinup_notification/joinup_notification.behat.inc", "web/modules/custom/joinup_search/joinup_search.behat.inc", + "web/modules/custom/joinup_seo/joinup_seo.behat.inc", "web/modules/custom/joinup_sparql/driver/joinup_sparql/Connection.php", "web/modules/custom/joinup_subscription/joinup_subscription.behat.inc", "web/modules/custom/joinup_user/joinup_user.behat.inc", + "web/modules/custom/legal/joinup_legal.behat.inc", "web/modules/custom/moderation/moderation.behat.inc", "web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc", "web/modules/custom/owner/owner.behat.inc", diff --git a/composer.lock b/composer.lock index 7e75840b29..2520794c80 100644 --- a/composer.lock +++ b/composer.lock @@ -13836,6 +13836,11 @@ "phpspec/phpspec": "~2.0 || ~4.0" }, "type": "behat-extension", + "extra": { + "patches_applied": { + "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" + } + }, "autoload": { "psr-0": { "Drupal\\Drupal": "src/", diff --git a/web/modules/custom/stats/tests/src/Kernel/RefreshCountersTest.php b/web/modules/custom/stats/tests/src/Kernel/RefreshCountersTest.php index 3041642d76..c27c8b345a 100644 --- a/web/modules/custom/stats/tests/src/Kernel/RefreshCountersTest.php +++ b/web/modules/custom/stats/tests/src/Kernel/RefreshCountersTest.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\Tests\joinup_stats_test\Kernel; +namespace Drupal\Tests\joinup_stats\Kernel; use Drupal\field\Entity\FieldConfig; use Drupal\file\Entity\File; From c8046cd3763d36b5cbf12971f97f9496022dee56 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 14:51:36 +0200 Subject: [PATCH 264/957] ISAICP-5208: Let's apply strict typing in the theme some other time. --- web/themes/joinup/joinup_theme.theme | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 85a65643a1..d1b58ce738 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -5,8 +5,6 @@ * Functions to support theming in the Joinup theme. */ -declare(strict_types = 1); - use Drupal\Component\Serialization\Json; use Drupal\Component\Utility\Unicode; use Drupal\Core\Cache\Cache; From a0bba537c8d0dbdd59d754a81195fbfa74b79b67 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:00:32 +0200 Subject: [PATCH 265/957] ISAICP-5208: Call to deprecated method getToState() of class Drupal\state_machine\Event\WorkflowTransitionEvent. --- .../src/EventSubscriber/WorkflowTransitionEventSubscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/state_machine_revisions/src/EventSubscriber/WorkflowTransitionEventSubscriber.php b/web/modules/custom/state_machine_revisions/src/EventSubscriber/WorkflowTransitionEventSubscriber.php index ea4e2d8e6e..97e20946f2 100644 --- a/web/modules/custom/state_machine_revisions/src/EventSubscriber/WorkflowTransitionEventSubscriber.php +++ b/web/modules/custom/state_machine_revisions/src/EventSubscriber/WorkflowTransitionEventSubscriber.php @@ -57,7 +57,7 @@ public function handleRevision(WorkflowTransitionEvent $event) { $entity = $event->getEntity(); // Verify if the new state is marked as published state. - $is_published_state = $this->isPublishedState($event->getToState(), $event->getWorkflow()); + $is_published_state = $this->isPublishedState($event->getTransition()->getToState(), $event->getWorkflow()); if ($entity instanceof EntityPublishedInterface) { $entity->setPublished($is_published_state); } From cfb13431e0bd20589a04f3b6a7a74f365c2e972f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:02:43 +0200 Subject: [PATCH 266/957] ISAICP-5208: Call to deprecated method getLowercaseLabel() of class Drupal\Core\Entity\EntityTypeInterface. --- .../Validation/Constraint/UniqueSolutionTitleValidator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/solution/src/Plugin/Validation/Constraint/UniqueSolutionTitleValidator.php b/web/modules/custom/solution/src/Plugin/Validation/Constraint/UniqueSolutionTitleValidator.php index 1c47625940..8e50f3e50c 100644 --- a/web/modules/custom/solution/src/Plugin/Validation/Constraint/UniqueSolutionTitleValidator.php +++ b/web/modules/custom/solution/src/Plugin/Validation/Constraint/UniqueSolutionTitleValidator.php @@ -71,7 +71,7 @@ public function validate($items, Constraint $constraint): void { if (!$this->solutionTitleHelper->titleIsUniqueWithinAffiliation($solution)) { $this->context->addViolation($constraint->message, [ '%value' => $item->value, - '@entity_type' => $solution->getEntityType()->getLowercaseLabel(), + '@entity_type' => $solution->getEntityType()->getSingularLabel(), '@field_name' => $items->getFieldDefinition()->getLabel(), ]); } From 33eb2ebf0adb94a2333ccaac17dbbc3856f4d661 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:07:35 +0200 Subject: [PATCH 267/957] ISAICP-5208: Interface Drupal\search_api_field\Plugin\FilterPluginInterface extends deprecated interface Drupal\Component\Plugin\ConfigurablePluginInterface. --- .../search_api_field/src/Plugin/FilterPluginBase.php | 7 ------- .../search_api_field/src/Plugin/FilterPluginInterface.php | 4 ++-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/web/modules/custom/search_api_field/src/Plugin/FilterPluginBase.php b/web/modules/custom/search_api_field/src/Plugin/FilterPluginBase.php index 7b1495e03b..786b5e7e6e 100644 --- a/web/modules/custom/search_api_field/src/Plugin/FilterPluginBase.php +++ b/web/modules/custom/search_api_field/src/Plugin/FilterPluginBase.php @@ -40,11 +40,4 @@ public function defaultConfiguration(): array { return []; } - /** - * {@inheritdoc} - */ - public function calculateDependencies(): array { - return []; - } - } diff --git a/web/modules/custom/search_api_field/src/Plugin/FilterPluginInterface.php b/web/modules/custom/search_api_field/src/Plugin/FilterPluginInterface.php index c71537dfcc..eaccfb69af 100644 --- a/web/modules/custom/search_api_field/src/Plugin/FilterPluginInterface.php +++ b/web/modules/custom/search_api_field/src/Plugin/FilterPluginInterface.php @@ -4,14 +4,14 @@ namespace Drupal\search_api_field\Plugin; -use Drupal\Component\Plugin\ConfigurablePluginInterface; +use Drupal\Component\Plugin\ConfigurableInterface; use Drupal\Core\Plugin\PluginFormInterface; use Drupal\search_api\Query\ConditionSetInterface; /** * Interface definition for search api field filters plugins. */ -interface FilterPluginInterface extends PluginFormInterface, ConfigurablePluginInterface { +interface FilterPluginInterface extends PluginFormInterface, ConfigurableInterface { /** * Applies the filter configuration to the search query. From 433b72cdf9d980bf0ee5450582a0341be1e9e6ac Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:10:57 +0200 Subject: [PATCH 268/957] ISAICP-5208: Call to deprecated method link() of class Drupal\Core\Entity\EntityInterface. --- .../src/Controller/LicenceOverviewController.php | 9 ++++++++- .../custom/rdf_demo/src/Controller/RdfDemoController.php | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_licence/src/Controller/LicenceOverviewController.php b/web/modules/custom/joinup_licence/src/Controller/LicenceOverviewController.php index db22293f2a..97a9420d19 100644 --- a/web/modules/custom/joinup_licence/src/Controller/LicenceOverviewController.php +++ b/web/modules/custom/joinup_licence/src/Controller/LicenceOverviewController.php @@ -1,5 +1,7 @@ link(); + $row['id'] = $entity->toLink()->toString(); $row['rid'] = $entity->bundle(); return $row; } diff --git a/web/modules/custom/rdf_demo/src/Controller/RdfDemoController.php b/web/modules/custom/rdf_demo/src/Controller/RdfDemoController.php index cfe883e850..ab02ae1297 100644 --- a/web/modules/custom/rdf_demo/src/Controller/RdfDemoController.php +++ b/web/modules/custom/rdf_demo/src/Controller/RdfDemoController.php @@ -16,6 +16,10 @@ class RdfDemoController extends ControllerBase { * * @return array * A simple render array. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + * @throws \Drupal\Core\Entity\EntityMalformedException */ public function repositories(): array { /** @var \Drupal\sparql_entity_storage\SparqlEntityStorage $entity_storage */ @@ -30,7 +34,7 @@ public function repositories(): array { $list = ['#theme' => 'item_list']; /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ foreach ($entities as $entity) { - $list['#items'][] = ['#markup' => $entity->link()]; + $list['#items'][] = ['#markup' => $entity->toLink()->toString()]; } // @todo Find out why paging is not working... From cd79d866e64317da0367548b4a49fa4ceac14c8e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:25:18 +0200 Subject: [PATCH 269/957] ISAICP-5208: Usage of deprecated trait Drupal\DrupalExtension\ScenarioTagTrait in class OeNewsroomNewsletterSubContext. --- .../oe_newsroom_newsletter.behat.inc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc b/web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc index b7cc0f8788..9f94ffafe7 100644 --- a/web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc +++ b/web/modules/custom/oe_newsroom_newsletter/oe_newsroom_newsletter.behat.inc @@ -8,7 +8,7 @@ declare(strict_types = 1); use Drupal\DrupalExtension\Context\DrupalSubContextBase; -use Drupal\DrupalExtension\ScenarioTagTrait; +use Drupal\DrupalExtension\TagTrait; use Drupal\joinup\Traits\ConfigReadOnlyTrait; use Drupal\oe_newsroom_newsletter\NewsletterSubscriber\MockNewsletterSubscriber; use PHPUnit\Framework\Assert; @@ -19,7 +19,7 @@ use PHPUnit\Framework\Assert; class OeNewsroomNewsletterSubContext extends DrupalSubContextBase { use ConfigReadOnlyTrait; - use ScenarioTagTrait; + use TagTrait; /** * The newsletter subscriber that was originally configured. @@ -53,9 +53,7 @@ class OeNewsroomNewsletterSubContext extends DrupalSubContextBase { * developer is alerted if this tag is forgotten to be added to the scenario. */ protected function assertNewsletterTagPresent(): void { - // @todo Change this to use TagTrait once ScenarioTagTrait is deprecated. - // @see https://github.com/jhedstrom/drupalextension/pull/510 - $tags = $this->getScenario()->getTags(); + $tags = $this->getTags(); Assert::assertTrue(in_array('newsroom_newsletter', $tags)); } From 5bd847135a0823b01e37af7d97d04353e7b1d660 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:32:24 +0200 Subject: [PATCH 270/957] ISAICP-5208: Fix 'Argument 1 passed to ContactInformationSubContext::assertRdfEntityCount() must be of the type int'. --- .../custom/contact_information/contact_information.behat.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/contact_information/contact_information.behat.inc b/web/modules/custom/contact_information/contact_information.behat.inc index 139d56b5fe..285741622b 100644 --- a/web/modules/custom/contact_information/contact_information.behat.inc +++ b/web/modules/custom/contact_information/contact_information.behat.inc @@ -143,7 +143,7 @@ class ContactInformationSubContext extends DrupalSubContextBase implements Drupa * * @Then I should have :number contact information(s) */ - public function assertContactInformationCount($number) { + public function assertContactInformationCount(int $number): void { $this->assertRdfEntityCount($number, 'contact_information'); } From 41be043086c797618781623add075646be45bdb3 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 15:43:57 +0200 Subject: [PATCH 271/957] ISAICP-5208: Call to deprecated function file_unmanaged_copy(). --- tests/src/Traits/FileTrait.php | 4 +++- .../demo_content/demo_content.services.yml | 2 +- .../src/EventSubscriber/ImportSubscriber.php | 17 +++++++++++++++-- .../custom/joinup_group/joinup_group.module | 5 +++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tests/src/Traits/FileTrait.php b/tests/src/Traits/FileTrait.php index 57c84f843b..070315c55d 100644 --- a/tests/src/Traits/FileTrait.php +++ b/tests/src/Traits/FileTrait.php @@ -1,5 +1,7 @@ copy($path, $uri); $file = File::create(['uri' => $destination, 'filename' => $filename]); $file->save(); diff --git a/web/modules/custom/demo_content/demo_content.services.yml b/web/modules/custom/demo_content/demo_content.services.yml index 9615037a29..5960bf71c3 100644 --- a/web/modules/custom/demo_content/demo_content.services.yml +++ b/web/modules/custom/demo_content/demo_content.services.yml @@ -1,6 +1,6 @@ services: demo_content.import: class: Drupal\demo_content\EventSubscriber\ImportSubscriber - arguments: ['@config.factory', '@path.alias_storage'] + arguments: ['@config.factory', '@path.alias_storage', '@file_system'] tags: - { name: event_subscriber } diff --git a/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php b/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php index 250aebb6ba..68af69ea85 100644 --- a/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php +++ b/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php @@ -1,8 +1,11 @@ configFactory = $config_factory; $this->pathAliasStorage = $path_alias_storage; + $this->fileSystem = $file_system; } /** @@ -69,7 +82,7 @@ public function entitiesImport(Event $event) { if ($entity->get($field_name)) { $file_path = $directory . $file_name; if (is_file($file_path)) { - if ($file_path = file_unmanaged_copy($file_path)) { + if ($file_path = $this->fileSystem->copy($file_path, 'public://')) { $file = File::create(['uri' => $file_path]); $file->save(); $entity->set($field_name, $file->id()); diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module index 587b01e073..755a85b7a5 100644 --- a/web/modules/custom/joinup_group/joinup_group.module +++ b/web/modules/custom/joinup_group/joinup_group.module @@ -206,6 +206,7 @@ function joinup_group_rdf_entity_presave(EntityInterface $entity) { 'banner' => ['field_ar_banner', 'field_is_banner'], ]; + $file_system = \Drupal::service('file_system'); $fixtures_path = drupal_get_path('module', 'joinup_group') . '/fixtures/images/'; foreach ($field_data as $field_type => $fields) { foreach ($fields as $field) { @@ -213,8 +214,8 @@ function joinup_group_rdf_entity_presave(EntityInterface $entity) { // Get files without the . and .. directories. $files = array_slice(scandir($fixtures_path . $field_type), 2); $random = array_rand($files); - $file_path = \Drupal::service('file_system')->realpath($fixtures_path . $field_type . '/' . $files[$random]); - $file_path = file_unmanaged_copy($file_path, 'public://'); + $file_path = $file_system->realpath($fixtures_path . $field_type . '/' . $files[$random]); + $file_path = $file_system->copy($file_path, 'public://'); $file = File::create(['uri' => $file_path]); $file->save(); $entity->set($field, $file->id()); From 1265c84c851c5391219d8e211e189bea2b98846a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:19:49 +0200 Subject: [PATCH 272/957] ISAICP-5208: Fix 'Type error: Argument 1 passed to ::assertRdfEntityCount() must be of the type integer'. --- web/modules/custom/joinup_licence/joinup_licence.behat.inc | 2 +- web/modules/custom/owner/owner.behat.inc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_licence/joinup_licence.behat.inc b/web/modules/custom/joinup_licence/joinup_licence.behat.inc index fc25852b6c..58310465f7 100644 --- a/web/modules/custom/joinup_licence/joinup_licence.behat.inc +++ b/web/modules/custom/joinup_licence/joinup_licence.behat.inc @@ -203,7 +203,7 @@ class JoinupLicenceSubContext extends DrupalSubContextBase implements DrupalSubC * * @Then I should have :number licence(s) */ - public function assertLicenceCount($number) { + public function assertLicenceCount(int $number): void { $this->assertRdfEntityCount($number, 'licence'); } diff --git a/web/modules/custom/owner/owner.behat.inc b/web/modules/custom/owner/owner.behat.inc index 0b57d24807..0cf54b941e 100644 --- a/web/modules/custom/owner/owner.behat.inc +++ b/web/modules/custom/owner/owner.behat.inc @@ -102,7 +102,7 @@ class OwnerSubContext extends DrupalSubContextBase implements DrupalSubContextIn * * @Then I should have :number owner/owners */ - public function assertOwnerCount($number) { + public function assertOwnerCount(int $number): void { $this->assertRdfEntityCount($number, 'owner'); } From fbc3442cfc3e2c8ca064558afec5bd33097f4458 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:21:55 +0200 Subject: [PATCH 273/957] ISAICP-5208: Call to deprecated function datetime_date_default_time(). --- .../Field/FieldFormatter/CondensedDateRangeFormatter.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php index 6361ca6739..7aa7309616 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldFormatter/CondensedDateRangeFormatter.php @@ -1,5 +1,7 @@ getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default. - datetime_date_default_time($date); + $date->setDefaultDateTime(); } // Create the ISO date in Universal Time. From 88c3db5599818ff3cce5c672656bd2e3b7f7f202 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:26:00 +0200 Subject: [PATCH 274/957] ISAICP-5208: Call to deprecated function file_uri_target(). --- web/modules/custom/joinup_core/joinup_core.module | 3 ++- web/modules/custom/joinup_core/joinup_core.post_update.php | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index a9d4301a52..88560398a5 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -19,6 +19,7 @@ use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\StreamWrapper\StreamWrapperManager; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Template\Attribute; use Drupal\joinup_community_content\CommunityContentHelper; @@ -442,7 +443,7 @@ function joinup_core_file_delete(EntityInterface $entity) { return; } - $path = 'base:/' . \Drupal::service('stream_wrapper.public')->getDirectoryPath() . '/' . file_uri_target($uri); + $path = 'base:/' . \Drupal::service('stream_wrapper.public')->getDirectoryPath() . '/' . StreamWrapperManager::getTarget($uri); // Delete all redirects targeting this path. redirect_delete_by_path($path); diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 6682da0137..36482b5f9f 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -5,10 +5,13 @@ * Post update functions for the Joinup core module. */ +declare(strict_types = 1); + use Drupal\Core\Database\Database; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Serialization\Yaml; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\StreamWrapper\StreamWrapperManager; use Drupal\file\Entity\File; use Drupal\og\Entity\OgRole; use Drupal\rdf_entity\RdfInterface; @@ -66,7 +69,7 @@ function joinup_core_post_update_move_contact_form_attachments() { if (!file_exists($attachment->getFileUri())) { continue; } - $target = file_uri_target($attachment->getFileUri()); + $target = StreamWrapperManager::getTarget($attachment->getFileUri()); $uri = "private://$target"; $destination_dir = $file_system->dirname($uri); if (!file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY)) { From b8d6cd0a3b067f19e663ebf21bd58b843a4d20be Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:28:05 +0200 Subject: [PATCH 275/957] ISAICP-5208: Call to deprecated function file_unmanaged_delete_recursive(). --- web/modules/custom/joinup_core/joinup_core.post_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 36482b5f9f..404dbd2a1f 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -82,7 +82,7 @@ function joinup_core_post_update_move_contact_form_attachments() { } // Finally, remove the empty public://contact_form directory. - file_unmanaged_delete_recursive('public://contact_form'); + $file_system->deleteRecursive('public://contact_form'); } /** From 005e184df760a4fa4ec851587ffe7822bcbdc073 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:28:47 +0200 Subject: [PATCH 276/957] ISAICP-5208: Call to deprecated function file_prepare_directory(). --- web/modules/custom/joinup_core/joinup_core.post_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 404dbd2a1f..877204952a 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -72,7 +72,7 @@ function joinup_core_post_update_move_contact_form_attachments() { $target = StreamWrapperManager::getTarget($attachment->getFileUri()); $uri = "private://$target"; $destination_dir = $file_system->dirname($uri); - if (!file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY)) { + if (!$file_system->prepareDirectory($destination_dir, FILE_CREATE_DIRECTORY)) { throw new \RuntimeException("Cannot create directory '$destination_dir'."); } if (!file_move($attachment, $uri)) { From 8846fa70bfea9b5586818b8e503ad9ad58fb0a6f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:30:28 +0200 Subject: [PATCH 277/957] ISAICP-5208: Call to deprecated constant FILE_CREATE_DIRECTORY. --- web/modules/custom/joinup_core/joinup_core.post_update.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 877204952a..68a7e547f8 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -8,6 +8,7 @@ declare(strict_types = 1); use Drupal\Core\Database\Database; +use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Serialization\Yaml; use Drupal\Core\Session\AccountInterface; @@ -72,7 +73,7 @@ function joinup_core_post_update_move_contact_form_attachments() { $target = StreamWrapperManager::getTarget($attachment->getFileUri()); $uri = "private://$target"; $destination_dir = $file_system->dirname($uri); - if (!$file_system->prepareDirectory($destination_dir, FILE_CREATE_DIRECTORY)) { + if (!$file_system->prepareDirectory($destination_dir, FileSystemInterface::CREATE_DIRECTORY)) { throw new \RuntimeException("Cannot create directory '$destination_dir'."); } if (!file_move($attachment, $uri)) { From 3b3093ceec7645642729503125ad456100384350 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:32:05 +0200 Subject: [PATCH 278/957] ISAICP-5208: Call to deprecated method uriScheme() of class Drupal\Core\File\FileSystemInterface. --- web/modules/custom/joinup_core/joinup_core.module | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 88560398a5..dffde89d71 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -433,12 +433,9 @@ function joinup_core_element_info_alter(array &$info) { * source file entity is deleted, thus we're fulfilling this task here. */ function joinup_core_file_delete(EntityInterface $entity) { - /** @var \Drupal\Core\File\FileSystemInterface $file_system */ - $file_system = \Drupal::service('file_system'); - /** @var \Drupal\file\FileInterface $entity */ $uri = $entity->getFileUri(); - $scheme = $file_system->uriScheme($uri); + $scheme = StreamWrapperManager::getScheme($uri); if ($scheme !== 'public') { return; } From 42628fe3d7c65c296bd56674dacbac39ee53af6e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 16:34:29 +0200 Subject: [PATCH 279/957] ISAICP-5208: Call to deprecated function user_delete(). --- web/modules/custom/demo_users/demo_users.install | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/demo_users/demo_users.install b/web/modules/custom/demo_users/demo_users.install index 3b67390334..1f74140bab 100644 --- a/web/modules/custom/demo_users/demo_users.install +++ b/web/modules/custom/demo_users/demo_users.install @@ -5,6 +5,8 @@ * Install, update and uninstall functions for the Demo users module. */ +declare(strict_types = 1); + /** * Implements hook_uninstall(). */ @@ -15,8 +17,9 @@ function demo_users_uninstall() { $content = file_get_contents($uri); $decoded = \Drupal::service('serializer')->decode($content, 'hal_json'); $name = $decoded['name'][0]['value']; + /** @var \Drupal\user\UserInterface $user */ if ($user = user_load_by_name($name)) { - user_delete($user->id()); + $user->delete(); } } } From 4220c59e04078681865143c761010a58b601900b Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 17:00:12 +0200 Subject: [PATCH 280/957] ISAICP-5208: Call to deprecated function file_scan_directory(). --- web/modules/custom/demo_users/demo_users.install | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/demo_users/demo_users.install b/web/modules/custom/demo_users/demo_users.install index 1f74140bab..90d1bea48d 100644 --- a/web/modules/custom/demo_users/demo_users.install +++ b/web/modules/custom/demo_users/demo_users.install @@ -11,9 +11,11 @@ declare(strict_types = 1); * Implements hook_uninstall(). */ function demo_users_uninstall() { + /** @var \Drupal\Core\File\FileSystemInterface $file_system */ + $file_system = \Drupal::service('file_system'); // Deletes demo users. $path = drupal_get_path('module', 'demo_content') . '/content/user'; - foreach (array_keys(file_scan_directory($path, '|\.json$|')) as $uri) { + foreach (array_keys($file_system->scanDirectory($path, '|\.json$|')) as $uri) { $content = file_get_contents($uri); $decoded = \Drupal::service('serializer')->decode($content, 'hal_json'); $name = $decoded['name'][0]['value']; From 36ef0c326f9457f89db3bc73f95f92f7ca60a0e7 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 17:05:51 +0200 Subject: [PATCH 281/957] ISAICP-5208: Parameter $path_alias_storage of method Drupal\demo_content\EventSubscriber\ImportSubscriber::__construct() has typehint with deprecated interface Drupal\Core\Path\AliasStorageInterface. --- .../demo_content/demo_content.services.yml | 2 +- .../src/EventSubscriber/ImportSubscriber.php | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/web/modules/custom/demo_content/demo_content.services.yml b/web/modules/custom/demo_content/demo_content.services.yml index 5960bf71c3..c9153fe716 100644 --- a/web/modules/custom/demo_content/demo_content.services.yml +++ b/web/modules/custom/demo_content/demo_content.services.yml @@ -1,6 +1,6 @@ services: demo_content.import: class: Drupal\demo_content\EventSubscriber\ImportSubscriber - arguments: ['@config.factory', '@path.alias_storage', '@file_system'] + arguments: ['@config.factory', '@entity_type.manager', '@file_system'] tags: - { name: event_subscriber } diff --git a/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php b/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php index 68af69ea85..2603254fa8 100644 --- a/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php +++ b/web/modules/custom/demo_content/src/EventSubscriber/ImportSubscriber.php @@ -5,9 +5,9 @@ namespace Drupal\demo_content\EventSubscriber; use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Language\LanguageInterface; -use Drupal\Core\Path\AliasStorageInterface; use Drupal\file\Entity\File; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\Event; @@ -25,11 +25,11 @@ class ImportSubscriber implements EventSubscriberInterface { protected $configFactory; /** - * The path alias storage service. + * The entity type manager. * - * @var \Drupal\Core\Path\AliasStorageInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $pathAliasStorage; + protected $entityTypeManager; /** * The file system service. @@ -43,14 +43,14 @@ class ImportSubscriber implements EventSubscriberInterface { * * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory service. - * @param \Drupal\Core\Path\AliasStorageInterface $path_alias_storage - * The path alias storage service. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. * @param \Drupal\Core\File\FileSystemInterface $file_system * The file system service. */ - public function __construct(ConfigFactoryInterface $config_factory, AliasStorageInterface $path_alias_storage, FileSystemInterface $file_system) { + public function __construct(ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, FileSystemInterface $file_system) { $this->configFactory = $config_factory; - $this->pathAliasStorage = $path_alias_storage; + $this->entityTypeManager = $entity_type_manager; $this->fileSystem = $file_system; } @@ -70,6 +70,7 @@ public static function getSubscribedEvents() { * The event element. Contains the entities and the module. */ public function entitiesImport(Event $event) { + $path_alias_storage = $this->entityTypeManager->getStorage('path_alias'); $file_mapping = $this->configFactory->get('demo_content.settings')->get('file_mappings'); $imported = $event->getImportedEntities(); $directory = drupal_get_path('module', 'demo_content') . '/fixtures/files/'; @@ -94,7 +95,7 @@ public function entitiesImport(Event $event) { $entity->save(); if ($uuid === 'c0bac256-c243-4440-bd31-b2b988375f5b') { - $this->pathAliasStorage->save('/legal/document/legal_notice', '/joinup/legal-notice', LanguageInterface::LANGCODE_NOT_SPECIFIED); + $path_alias_storage->save('/legal/document/legal_notice', '/joinup/legal-notice', LanguageInterface::LANGCODE_NOT_SPECIFIED); } } } From d8382c514422c7b69c45050ec6571f823d8c7825 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 17:56:16 +0200 Subject: [PATCH 282/957] ISAICP-5208: Parameter $entity_query_factory of method Drupal\custom_page\Form\OgMenuInstanceForm::__construct() has typehint with deprecated class Drupal\Core\Entity\Query\QueryFactory. --- composer.json | 2 +- composer.lock | 12 ++++++------ .../custom_page/src/Form/OgMenuInstanceForm.php | 16 +++++++++------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index e84d96df5b..5434e0dc5a 100644 --- a/composer.json +++ b/composer.json @@ -290,7 +290,7 @@ "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, "drupal/og_menu": { - "Drupal 9 readiness: entity manager is deprecated @see https://www.drupal.org/project/og_menu/issues/3119437": "https://www.drupal.org/files/issues/2020-03-12/3119437-2.patch" + "Drupal 9 readiness: deprecated code report @see https://www.drupal.org/project/og_menu/issues/3120584": "https://www.drupal.org/files/issues/2020-03-18/3120584-2.patch" }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", diff --git a/composer.lock b/composer.lock index 08bf92cb3c..b4f2f64861 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": "aa66ba06e47267d7392fcd1025129a0d", + "content-hash": "f8fdf24ae019e07a35d34431f5fe0a0b", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -5488,7 +5488,7 @@ "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "16c40e03a4274e1dd781ab9a02478b7e15aea5ef" + "reference": "29b5d7470a07fa96cbf7eb46a65895872be17d9e" }, "require": { "drupal/core": "*", @@ -5500,15 +5500,15 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha3+13-dev", - "datestamp": "1584029947", + "version": "8.x-1.0-alpha3+14-dev", + "datestamp": "1584030229", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." } }, "patches_applied": { - "Drupal 9 readiness: entity manager is deprecated @see https://www.drupal.org/project/og_menu/issues/3119437": "https://www.drupal.org/files/issues/2020-03-12/3119437-2.patch" + "Drupal 9 readiness: deprecated code report @see https://www.drupal.org/project/og_menu/issues/3120584": "https://www.drupal.org/files/issues/2020-03-18/3120584-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5547,7 +5547,7 @@ "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" }, - "time": "2020-03-12T16:23:32+00:00" + "time": "2020-03-18T15:10:03+00:00" }, { "name": "drupal/password_policy", diff --git a/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php b/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php index 9de4e943dd..834e8c1dee 100644 --- a/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php +++ b/web/modules/custom/custom_page/src/Form/OgMenuInstanceForm.php @@ -1,11 +1,12 @@ urlMatcher = $url_matcher; } @@ -87,11 +89,11 @@ public function __construct(EntityRepositoryInterface $entity_repository, QueryF public static function create(ContainerInterface $container) { return new static( $container->get('entity.repository'), - $container->get('entity.query'), $container->get('plugin.manager.menu.link'), $container->get('menu.link_tree'), $container->get('link_generator'), $container->get('og.access'), + $container->get('url_generator'), $container->get('router.no_access_checks') ); } From f3575d9e2da591da9ab427683c6fcb555cce8d46 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 18 Mar 2020 21:22:20 +0200 Subject: [PATCH 283/957] ISAICP-5208: Update dependencies. --- composer.json | 5 +---- composer.lock | 57 ++++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/composer.json b/composer.json index 5434e0dc5a..c33ccdfd1f 100644 --- a/composer.json +++ b/composer.json @@ -49,7 +49,7 @@ "drupal/message_notify": "~1.1", "drupal/meta_entity": "^1.0", "drupal/og": "^1.0", - "drupal/og_menu": "dev-1.x", + "drupal/og_menu": "^1.0-alpha4", "drupal/password_policy": "^3.0-alpha5", "drupal/pathauto": "~1.5", "drupal/persistent_login": "~1.1", @@ -289,9 +289,6 @@ "drupal/message_digest": { "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, - "drupal/og_menu": { - "Drupal 9 readiness: deprecated code report @see https://www.drupal.org/project/og_menu/issues/3120584": "https://www.drupal.org/files/issues/2020-03-18/3120584-2.patch" - }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", "'Field field_last_password_reset is unknown' while importing configuration on site without password_policy activated @see https://www.drupal.org/project/password_policy/issues/2771129": "https://www.drupal.org/files/issues/2019-08-15/2771129-100_0.patch", diff --git a/composer.lock b/composer.lock index b4f2f64861..69de0ecf4a 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": "f8fdf24ae019e07a35d34431f5fe0a0b", + "content-hash": "465393c2140d6d131f037f045092368c", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.38", + "version": "3.133.39", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "5ec9442162d83f94918bc17136a2b674a04784e5" + "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5ec9442162d83f94918bc17136a2b674a04784e5", - "reference": "5ec9442162d83f94918bc17136a2b674a04784e5", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0e3b9e497bd39063cb504115c726d369d8f4d455", + "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-17T18:16:01+00:00" + "time": "2020-03-18T18:13:04+00:00" }, { "name": "caxy/php-htmldiff", @@ -3160,16 +3160,16 @@ }, { "name": "drupal/core", - "version": "8.8.3", + "version": "8.8.4", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446" + "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/77971de6d6ade7366cdd3fadfc16c5d02e531446", - "reference": "77971de6d6ade7366cdd3fadfc16c5d02e531446", + "url": "https://api.github.com/repos/drupal/core/zipball/34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", + "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", "shasum": "" }, "require": { @@ -3406,20 +3406,20 @@ "GPL-2.0-or-later" ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", - "time": "2020-03-04T18:01:37+00:00" + "time": "2020-03-18T16:26:33+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "8.8.3", + "version": "8.8.4", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "984129ae3152d570c9448e52869f04a22fc75269" + "reference": "4825cb5234c28dff79ad298db582dfb23ff4ca59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/984129ae3152d570c9448e52869f04a22fc75269", - "reference": "984129ae3152d570c9448e52869f04a22fc75269", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/4825cb5234c28dff79ad298db582dfb23ff4ca59", + "reference": "4825cb5234c28dff79ad298db582dfb23ff4ca59", "shasum": "" }, "require": { @@ -3453,7 +3453,7 @@ "keywords": [ "drupal" ], - "time": "2020-02-21T09:36:23+00:00" + "time": "2020-03-10T10:15:17+00:00" }, { "name": "drupal/csv_serialization", @@ -5484,14 +5484,20 @@ }, { "name": "drupal/og_menu", - "version": "dev-1.x", + "version": "1.0.0-alpha4", "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "29b5d7470a07fa96cbf7eb46a65895872be17d9e" + "reference": "8.x-1.0-alpha4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/og_menu-8.x-1.0-alpha4.zip", + "reference": "8.x-1.0-alpha4", + "shasum": "14934bc85722000ece34d5e2dc563cfc2d741e05" }, "require": { - "drupal/core": "*", + "drupal/core": "^8 || ^9", "drupal/og": "^1.0.0-alpha4" }, "type": "drupal-module", @@ -5500,15 +5506,12 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha3+14-dev", - "datestamp": "1584030229", + "version": "8.x-1.0-alpha4", + "datestamp": "1584557490", "security-coverage": { "status": "not-covered", - "message": "Dev releases are not covered by Drupal security advisories." + "message": "Alpha releases are not covered by Drupal security advisories." } - }, - "patches_applied": { - "Drupal 9 readiness: deprecated code report @see https://www.drupal.org/project/og_menu/issues/3120584": "https://www.drupal.org/files/issues/2020-03-18/3120584-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5546,8 +5549,7 @@ "support": { "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" - }, - "time": "2020-03-18T15:10:03+00:00" + } }, { "name": "drupal/password_policy", @@ -16839,7 +16841,6 @@ "drupal/config_ignore": 20, "drupal/config_update": 20, "drupal/matomo_reporting_api": 20, - "drupal/og_menu": 20, "drupal/phingdrushtask": 20, "drupal/swiftmailer": 20, "drupal/view_unpublished": 15, From 909070c3740fa84d3d2b03eb563bde84bb2c34f3 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 09:44:38 +0200 Subject: [PATCH 284/957] ISAICP-5208: Raise the minimum requirement of Drupal to 8.8.4. --- composer.json | 4 ++-- composer.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index c33ccdfd1f..477d0ee853 100644 --- a/composer.json +++ b/composer.json @@ -23,8 +23,8 @@ "drupal/config_ignore": "dev-3.x", "drupal/config_readonly": "^1.0", "drupal/config_update": "dev-1.x", - "drupal/core": "^8.8.1", - "drupal/core-composer-scaffold": "^8.8.1", + "drupal/core": "^8.8.4", + "drupal/core-composer-scaffold": "^8.8.4", "drupal/diff": "~1.0", "drupal/digital_size_formatter": "^1.0-alpha1", "drupal/editor_file": "~1.4", diff --git a/composer.lock b/composer.lock index 69de0ecf4a..e6684d8a86 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": "465393c2140d6d131f037f045092368c", + "content-hash": "3208e99b9406944ef112da2fabc0d19f", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -10356,7 +10356,7 @@ "reference": "master" }, "type": "library", - "time": "2020-02-13T14:54:04+00:00" + "time": "2019-03-13T23:53:42+00:00" }, { "name": "stack/builder", From 2097714a3b6eb9ec24c35f372e7c545772f96a01 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 09:54:27 +0200 Subject: [PATCH 285/957] ISAICP-5897: Hotfix: SA-CORE-2020-001. --- composer.json | 9 +++---- composer.lock | 71 +++++++++++++++++++++++++++------------------------ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/composer.json b/composer.json index 4d9b0b3228..6cafcbb464 100644 --- a/composer.json +++ b/composer.json @@ -22,8 +22,8 @@ "drupal/config_ignore": "dev-2.x", "drupal/config_readonly": "^1.0", "drupal/config_update": "dev-1.x", - "drupal/core": "^8.8.1", - "drupal/core-composer-scaffold": "^8.8.1", + "drupal/core": "^8.8.4", + "drupal/core-composer-scaffold": "^8.8.4", "drupal/diff": "~1.0", "drupal/digital_size_formatter": "^1.0-alpha1", "drupal/ds": "^3.5", @@ -49,7 +49,7 @@ "drupal/message_notify": "~1.1", "drupal/meta_entity": "^1.0", "drupal/og": "^1.0", - "drupal/og_menu": "dev-1.x", + "drupal/og_menu": "^1.0-alpha4", "drupal/password_policy": "^3.0-alpha5", "drupal/pathauto": "~1.5", "drupal/persistent_login": "~1.1", @@ -244,9 +244,6 @@ "drupal/message_digest": { "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, - "drupal/og_menu": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" - }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", "'Field field_last_password_reset is unknown' while importing configuration on site without password_policy activated @see https://www.drupal.org/project/password_policy/issues/2771129": "https://www.drupal.org/files/issues/2019-08-15/2771129-100_0.patch", diff --git a/composer.lock b/composer.lock index 2588b16ee4..8cdd1b4117 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": "6d3281939fd4f08272fed99614527068", + "content-hash": "1efc9f787c5ecdb948eee76aad52d7e8", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -2949,8 +2949,8 @@ "dev-2.x": "2.x-dev" }, "drupal": { - "version": "8.x-2.1+8-dev", - "datestamp": "1575757684", + "version": "8.x-2.1+9-dev", + "datestamp": "1575758886", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." @@ -3102,16 +3102,16 @@ }, { "name": "drupal/core", - "version": "8.8.2", + "version": "8.8.4", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62" + "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/f997857003276c2ae6d27db30f0eab9c7dd10e62", - "reference": "f997857003276c2ae6d27db30f0eab9c7dd10e62", + "url": "https://api.github.com/repos/drupal/core/zipball/34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", + "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", "shasum": "" }, "require": { @@ -3347,20 +3347,20 @@ "GPL-2.0-or-later" ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", - "time": "2020-02-01T19:51:15+00:00" + "time": "2020-03-18T16:26:33+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "8.8.2", + "version": "8.8.4", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", - "reference": "dca4b123a638d78bf77719632993e920de6cc426" + "reference": "4825cb5234c28dff79ad298db582dfb23ff4ca59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/dca4b123a638d78bf77719632993e920de6cc426", - "reference": "dca4b123a638d78bf77719632993e920de6cc426", + "url": "https://api.github.com/repos/drupal/core-composer-scaffold/zipball/4825cb5234c28dff79ad298db582dfb23ff4ca59", + "reference": "4825cb5234c28dff79ad298db582dfb23ff4ca59", "shasum": "" }, "require": { @@ -3394,7 +3394,7 @@ "keywords": [ "drupal" ], - "time": "2019-10-09T02:55:24+00:00" + "time": "2020-03-10T10:15:17+00:00" }, { "name": "drupal/csv_serialization", @@ -5430,15 +5430,21 @@ }, { "name": "drupal/og_menu", - "version": "dev-1.x", + "version": "1.0.0-alpha4", "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "6dd3e391bb5f45d8752a9184bc714b4ae2a8c320" + "reference": "8.x-1.0-alpha4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/og_menu-8.x-1.0-alpha4.zip", + "reference": "8.x-1.0-alpha4", + "shasum": "14934bc85722000ece34d5e2dc563cfc2d741e05" }, "require": { - "drupal/core": "*", - "drupal/og": "*" + "drupal/core": "^8 || ^9", + "drupal/og": "^1.0.0-alpha4" }, "type": "drupal-module", "extra": { @@ -5446,15 +5452,12 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha3+11-dev", - "datestamp": "1545301380", + "version": "8.x-1.0-alpha4", + "datestamp": "1584557490", "security-coverage": { "status": "not-covered", - "message": "Dev releases are not covered by Drupal security advisories." + "message": "Alpha releases are not covered by Drupal security advisories." } - }, - "patches_applied": { - "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5487,13 +5490,12 @@ "homepage": "https://www.drupal.org/user/655596" } ], - "description": "Drupal module to allow associating menus with og groups.", + "description": "Integrates Drupal menus with Organic Groups.", "homepage": "https://drupal.org/project/og_menu", "support": { - "source": "https://cgit.drupalcode.org/og_menu", + "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" - }, - "time": "2019-12-02T19:38:32+00:00" + } }, { "name": "drupal/password_policy", @@ -6635,7 +6637,7 @@ }, "drupal": { "version": "8.x-1.0-rc1", - "datestamp": "1542124077", + "datestamp": "1582902575", "security-coverage": { "status": "not-covered", "message": "RC releases are not covered by Drupal security advisories." @@ -10116,7 +10118,7 @@ "reference": "master" }, "type": "library", - "time": "2019-04-02T18:33:21+00:00" + "time": "2019-03-13T23:53:42+00:00" }, { "name": "stack/builder", @@ -12560,9 +12562,6 @@ "extra": { "branch-alias": { "dev-master": "4.4-dev" - }, - "patches_applied": { - "Correctly filter features, now that the base path is correctly set": "https://github.com/Behat/Gherkin/compare/v4.6.0...a7d84eb6ba245ea268a304312d14660788bf6c29.patch" } }, "autoload": { @@ -13486,6 +13485,10 @@ "name": "See contributors", "homepage": "https://www.drupal.org/node/3236/committers" }, + { + "name": "pcambra", + "homepage": "https://www.drupal.org/user/122101" + }, { "name": "salvis", "homepage": "https://www.drupal.org/user/82964" @@ -16267,7 +16270,6 @@ "drupal/config_ignore": 20, "drupal/config_update": 20, "drupal/matomo_reporting_api": 20, - "drupal/og_menu": 20, "drupal/phingdrushtask": 20, "drupal/swiftmailer": 20, "drupal/view_unpublished": 15, @@ -16290,5 +16292,6 @@ }, "platform-overrides": { "php": "7.1.9" - } + }, + "plugin-api-version": "1.1.0" } From 1ca94e13f6b5b944f5ebd0443b308168d2c5daac Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 10:17:04 +0200 Subject: [PATCH 286/957] ISAICP-5897: New code brings also some config diffs. Update the sync version. --- ...ay.entity_legal_document_version.legal_notice.default.yml | 1 + .../core.entity_form_display.node.custom_page.default.yml | 2 +- .../core.entity_form_display.node.discussion.default.yml | 2 +- .../sync/core.entity_form_display.node.document.default.yml | 2 +- config/sync/core.entity_form_display.node.event.default.yml | 2 +- config/sync/core.entity_form_display.node.news.default.yml | 2 +- .../core.entity_form_display.node.newsletter.default.yml | 2 ++ config/sync/core.entity_form_display.node.video.default.yml | 2 ++ .../core.entity_form_display.rdf_entity.solution.default.yml | 1 + config/sync/core.entity_form_display.user.user.default.yml | 5 +++++ config/sync/core.entity_form_display.user.user.register.yml | 4 ++++ ...e.entity_form_display.user.user.subscription_settings.yml | 5 +++++ 12 files changed, 25 insertions(+), 5 deletions(-) diff --git a/config/sync/core.entity_form_display.entity_legal_document_version.legal_notice.default.yml b/config/sync/core.entity_form_display.entity_legal_document_version.legal_notice.default.yml index 03894e40b8..52d745a48e 100644 --- a/config/sync/core.entity_form_display.entity_legal_document_version.legal_notice.default.yml +++ b/config/sync/core.entity_form_display.entity_legal_document_version.legal_notice.default.yml @@ -19,6 +19,7 @@ content: rows: 9 summary_rows: 3 placeholder: '' + show_summary: false third_party_settings: { } region: content hidden: { } diff --git a/config/sync/core.entity_form_display.node.custom_page.default.yml b/config/sync/core.entity_form_display.node.custom_page.default.yml index 18a6ba321d..c14b319994 100644 --- a/config/sync/core.entity_form_display.node.custom_page.default.yml +++ b/config/sync/core.entity_form_display.node.custom_page.default.yml @@ -15,7 +15,6 @@ dependencies: - custom_page - file - image - - publication_date - text id: node.custom_page.default targetEntityType: node @@ -29,6 +28,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.discussion.default.yml b/config/sync/core.entity_form_display.node.discussion.default.yml index 9ad28d492f..e79263e43e 100644 --- a/config/sync/core.entity_form_display.node.discussion.default.yml +++ b/config/sync/core.entity_form_display.node.discussion.default.yml @@ -19,7 +19,6 @@ dependencies: - comment - file - joinup_core - - publication_date - text id: node.discussion.default targetEntityType: node @@ -33,6 +32,7 @@ content: rows: 5 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.document.default.yml b/config/sync/core.entity_form_display.node.document.default.yml index 716a6bbd17..3206cb24ba 100644 --- a/config/sync/core.entity_form_display.node.document.default.yml +++ b/config/sync/core.entity_form_display.node.document.default.yml @@ -25,7 +25,6 @@ dependencies: - datetime - file_url - joinup_core - - publication_date - text id: node.document.default targetEntityType: node @@ -39,6 +38,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.event.default.yml b/config/sync/core.entity_form_display.node.event.default.yml index 3f7c8226df..263bdf9d8b 100644 --- a/config/sync/core.entity_form_display.node.event.default.yml +++ b/config/sync/core.entity_form_display.node.event.default.yml @@ -37,7 +37,6 @@ dependencies: - image - joinup_core - link - - publication_date - text third_party_settings: field_group: @@ -67,6 +66,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.news.default.yml b/config/sync/core.entity_form_display.node.news.default.yml index b115c562dc..0eda013164 100644 --- a/config/sync/core.entity_form_display.node.news.default.yml +++ b/config/sync/core.entity_form_display.node.news.default.yml @@ -27,7 +27,6 @@ dependencies: - image - joinup_core - link - - publication_date - text id: node.news.default targetEntityType: node @@ -41,6 +40,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.newsletter.default.yml b/config/sync/core.entity_form_display.node.newsletter.default.yml index 3f40665816..d413fd519d 100644 --- a/config/sync/core.entity_form_display.node.newsletter.default.yml +++ b/config/sync/core.entity_form_display.node.newsletter.default.yml @@ -9,6 +9,7 @@ dependencies: - node.type.newsletter module: - allowed_formats + - publication_date - text _core: default_config_hash: aB_z4NQK-KhuRJ8iQK1bFBdHLDiHq_RYRDeooAstzVs @@ -24,6 +25,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.node.video.default.yml b/config/sync/core.entity_form_display.node.video.default.yml index d599edccb4..8994f3ddcb 100644 --- a/config/sync/core.entity_form_display.node.video.default.yml +++ b/config/sync/core.entity_form_display.node.video.default.yml @@ -13,6 +13,7 @@ dependencies: module: - allowed_formats - comment + - publication_date - text - video_embed_field _core: @@ -29,6 +30,7 @@ content: rows: 9 placeholder: '' summary_rows: 3 + show_summary: false third_party_settings: allowed_formats: hide_help: '0' diff --git a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml index db756d0b15..5f4b3aa47c 100644 --- a/config/sync/core.entity_form_display.rdf_entity.solution.default.yml +++ b/config/sync/core.entity_form_display.rdf_entity.solution.default.yml @@ -26,6 +26,7 @@ dependencies: - field.field.rdf_entity.solution.field_is_pinned_in - 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 diff --git a/config/sync/core.entity_form_display.user.user.default.yml b/config/sync/core.entity_form_display.user.user.default.yml index 64e19f042f..523325ddd8 100644 --- a/config/sync/core.entity_form_display.user.user.default.yml +++ b/config/sync/core.entity_form_display.user.user.default.yml @@ -101,6 +101,11 @@ content: region: content settings: { } third_party_settings: { } + legal_legal_notice: + weight: -4 + settings: { } + third_party_settings: { } + region: content path: type: path weight: 9 diff --git a/config/sync/core.entity_form_display.user.user.register.yml b/config/sync/core.entity_form_display.user.user.register.yml index cdfae47c99..9eb2593471 100644 --- a/config/sync/core.entity_form_display.user.user.register.yml +++ b/config/sync/core.entity_form_display.user.user.register.yml @@ -4,6 +4,9 @@ status: true dependencies: config: - core.entity_form_mode.user.register + - 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 @@ -14,6 +17,7 @@ dependencies: - field.field.user.user.field_user_photo - field.field.user.user.field_user_professional_domain module: + - path - user id: user.user.register targetEntityType: user diff --git a/config/sync/core.entity_form_display.user.user.subscription_settings.yml b/config/sync/core.entity_form_display.user.user.subscription_settings.yml index b27dd5ed1d..4de19ba068 100644 --- a/config/sync/core.entity_form_display.user.user.subscription_settings.yml +++ b/config/sync/core.entity_form_display.user.user.subscription_settings.yml @@ -29,6 +29,11 @@ content: settings: { } third_party_settings: { } region: content + legal_legal_notice: + weight: -4 + settings: { } + third_party_settings: { } + region: content hidden: account: true field_last_password_reset: true From 103025eae7c8d00532bad79c2b03b0f96031d014 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 11:01:56 +0200 Subject: [PATCH 287/957] ISAICP-5870: Fix bug preventing non-affiliated solutions from being reported. --- .../custom/joinup_core/joinup_core.install | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.install b/web/modules/custom/joinup_core/joinup_core.install index 501780fd35..3b1d9a5df8 100644 --- a/web/modules/custom/joinup_core/joinup_core.install +++ b/web/modules/custom/joinup_core/joinup_core.install @@ -89,22 +89,23 @@ function joinup_core_requirements($phase) { } // Ensure that no solutions are orphaned. - $requirements['joinup_core_no_orphaned_solutions'] = [ - 'title' => t('Orphaned solutions'), - 'description' => t('All solutions have an affiliated collection.'), - 'value' => t('All solutions have an affiliated collection.'), - ]; - $results = \Drupal::service('joinup_core.requirements_helper')->getOrphanedSolutions(); if (!empty($results)) { - $error = t('The following solutions were found without an affiliation: :errors', [ + $value = t('The following solutions were found without an affiliation: :errors', [ ':errors' => implode("\n", array_values($results)), ]); - $requirements['joinup_core_no_orphaned_solutions'] += [ - 'severity' => REQUIREMENT_ERROR, - 'value' => $error, - ]; + $severity = REQUIREMENT_ERROR; + } + else { + $value = t('All solutions have an affiliated collection.'); + $severity = REQUIREMENT_OK; } + $requirements['joinup_core_no_orphaned_solutions'] = [ + 'title' => t('Orphaned solutions'), + 'description' => t('All solutions should have an affiliated collection.'), + 'severity' => $severity, + 'value' => $value, + ]; } return $requirements; From 5b8aae66a8a60bac823374ad9c07e9b880645a8f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 11:15:14 +0200 Subject: [PATCH 288/957] ISAICP-5897: Downgrade og_menu back to 6dd3e39. --- composer.json | 5 ++++- composer.lock | 28 +++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 6cafcbb464..3a6402415b 100644 --- a/composer.json +++ b/composer.json @@ -49,7 +49,7 @@ "drupal/message_notify": "~1.1", "drupal/meta_entity": "^1.0", "drupal/og": "^1.0", - "drupal/og_menu": "^1.0-alpha4", + "drupal/og_menu": "dev-1.x#6dd3e391bb5f45d8752a9184bc714b4ae2a8c320", "drupal/password_policy": "^3.0-alpha5", "drupal/pathauto": "~1.5", "drupal/persistent_login": "~1.1", @@ -244,6 +244,9 @@ "drupal/message_digest": { "Provide a Behat step definition to check that the digest for a user is empty @see https://www.drupal.org/project/message_digest/issues/3088774#comment-13315655": "https://www.drupal.org/files/issues/2019-10-18/3088774-2.patch" }, + "drupal/og_menu": { + "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" + }, "drupal/password_policy": { "Do not override the default user entity view. @see https://www.drupal.org/node/2650192": "https://www.drupal.org/files/issues/properly_place_fields-2650192-4-D8.patch", "'Field field_last_password_reset is unknown' while importing configuration on site without password_policy activated @see https://www.drupal.org/project/password_policy/issues/2771129": "https://www.drupal.org/files/issues/2019-08-15/2771129-100_0.patch", diff --git a/composer.lock b/composer.lock index 8cdd1b4117..4c99b85efd 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": "1efc9f787c5ecdb948eee76aad52d7e8", + "content-hash": "d37e3f8eb713018f5f2bbbc7a1cbb58a", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -5430,17 +5430,11 @@ }, { "name": "drupal/og_menu", - "version": "1.0.0-alpha4", + "version": "dev-1.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/og_menu.git", - "reference": "8.x-1.0-alpha4" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/og_menu-8.x-1.0-alpha4.zip", - "reference": "8.x-1.0-alpha4", - "shasum": "14934bc85722000ece34d5e2dc563cfc2d741e05" + "reference": "6dd3e391bb5f45d8752a9184bc714b4ae2a8c320" }, "require": { "drupal/core": "^8 || ^9", @@ -5452,12 +5446,15 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha4", - "datestamp": "1584557490", + "version": "8.x-1.0-alpha3+16-dev", + "datestamp": "1584556915", "security-coverage": { "status": "not-covered", - "message": "Alpha releases are not covered by Drupal security advisories." + "message": "Dev releases are not covered by Drupal security advisories." } + }, + "patches_applied": { + "Passing the full account object is deprecated in OG 8.x-1.0-alpha4 @see https://www.drupal.org/project/og_menu/issues/3069870": "https://www.drupal.org/files/issues/2019-07-24/3069870-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5495,7 +5492,8 @@ "support": { "source": "https://git.drupalcode.org/project/og_menu", "issues": "https://drupal.org/project/issues/og_menu" - } + }, + "time": "2019-12-02T19:38:32+00:00" }, { "name": "drupal/password_policy", @@ -12562,6 +12560,9 @@ "extra": { "branch-alias": { "dev-master": "4.4-dev" + }, + "patches_applied": { + "Correctly filter features, now that the base path is correctly set": "https://github.com/Behat/Gherkin/compare/v4.6.0...a7d84eb6ba245ea268a304312d14660788bf6c29.patch" } }, "autoload": { @@ -16270,6 +16271,7 @@ "drupal/config_ignore": 20, "drupal/config_update": 20, "drupal/matomo_reporting_api": 20, + "drupal/og_menu": 20, "drupal/phingdrushtask": 20, "drupal/swiftmailer": 20, "drupal/view_unpublished": 15, From 86c907c0e5db195a0e3e899871d1d5106170a71b Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 13:00:53 +0200 Subject: [PATCH 289/957] ISAICP-5208: Replace tabs with spaces in phpstan.neon. --- phpstan.neon | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 021caa830a..8f27a42b65 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,12 +1,12 @@ parameters: - customRulesetUsed: true - reportUnmatchedIgnoredErrors: false - # Ignore phpstan-drupal extension's rules. - ignoreErrors: - - '#\Drupal calls should be avoided in classes, use dependency injection instead#' - - '#Plugin definitions cannot be altered.#' - - '#Missing cache backend declaration for performance.#' - - '#Plugin manager has cache backend specified but does not declare cache tags.#' + customRulesetUsed: true + reportUnmatchedIgnoredErrors: false + # Ignore phpstan-drupal extension's rules. + ignoreErrors: + - '#\Drupal calls should be avoided in classes, use dependency injection instead#' + - '#Plugin definitions cannot be altered.#' + - '#Missing cache backend declaration for performance.#' + - '#Plugin manager has cache backend specified but does not declare cache tags.#' includes: - - vendor/mglaman/phpstan-drupal/extension.neon - - vendor/phpstan/phpstan-deprecation-rules/rules.neon + - vendor/mglaman/phpstan-drupal/extension.neon + - vendor/phpstan/phpstan-deprecation-rules/rules.neon From ba3e8e088143701409a77aabf7adfa271403a3a8 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 13:05:34 +0200 Subject: [PATCH 290/957] ISAICP-5208: Followup: un-ignore '#\Drupal calls should be avoided in classes, use dependency injection instead#' rule. --- phpstan.neon | 1 + 1 file changed, 1 insertion(+) diff --git a/phpstan.neon b/phpstan.neon index 8f27a42b65..4bfcac8628 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,6 +3,7 @@ parameters: reportUnmatchedIgnoredErrors: false # Ignore phpstan-drupal extension's rules. ignoreErrors: + # TODO: Remove un-ignore this rule in ISAICP-5899. - '#\Drupal calls should be avoided in classes, use dependency injection instead#' - '#Plugin definitions cannot be altered.#' - '#Missing cache backend declaration for performance.#' From e323481dcc55b6d95262319a427ee88ac88ce01d Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 13:06:43 +0200 Subject: [PATCH 291/957] ISAICP-5208: Un-ignore '#Plugin definitions cannot be altered.#' rule. --- phpstan.neon | 1 - 1 file changed, 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index 4bfcac8628..1667fb8d9a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,7 +5,6 @@ parameters: ignoreErrors: # TODO: Remove un-ignore this rule in ISAICP-5899. - '#\Drupal calls should be avoided in classes, use dependency injection instead#' - - '#Plugin definitions cannot be altered.#' - '#Missing cache backend declaration for performance.#' - '#Plugin manager has cache backend specified but does not declare cache tags.#' includes: From e678d6244eba8a419bc174ee38399b7b5fe78e5f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 13:07:30 +0200 Subject: [PATCH 292/957] ISAICP-5208: Un-ignore '#Missing cache backend declaration for performance.#' rule. --- phpstan.neon | 1 - 1 file changed, 1 deletion(-) diff --git a/phpstan.neon b/phpstan.neon index 1667fb8d9a..c7f0d86ef7 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,7 +5,6 @@ parameters: ignoreErrors: # TODO: Remove un-ignore this rule in ISAICP-5899. - '#\Drupal calls should be avoided in classes, use dependency injection instead#' - - '#Missing cache backend declaration for performance.#' - '#Plugin manager has cache backend specified but does not declare cache tags.#' includes: - vendor/mglaman/phpstan-drupal/extension.neon From ec366b676b18ba4881e649e43223cf060fdfa632 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 13:08:21 +0200 Subject: [PATCH 293/957] ISAICP-5208: Un-ignore '#Plugin manager has cache backend specified but does not declare cache tags.#' rule. --- phpstan.neon | 1 - .../src/JoinupFederationAdms2ConvertPassPluginManager.php | 4 +++- .../src/Plugin/ArbitraryFacetManager.php | 4 +++- .../search_api_field/src/Plugin/FilterPluginManager.php | 4 +++- .../src/WorkflowStatePermissionPluginManager.php | 4 +++- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index c7f0d86ef7..89b0af41c5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,7 +5,6 @@ parameters: ignoreErrors: # TODO: Remove un-ignore this rule in ISAICP-5899. - '#\Drupal calls should be avoided in classes, use dependency injection instead#' - - '#Plugin manager has cache backend specified but does not declare cache tags.#' includes: - vendor/mglaman/phpstan-drupal/extension.neon - vendor/phpstan/phpstan-deprecation-rules/rules.neon diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationAdms2ConvertPassPluginManager.php b/web/modules/custom/joinup_federation/src/JoinupFederationAdms2ConvertPassPluginManager.php index 6623712ed4..3ca15324e8 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationAdms2ConvertPassPluginManager.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationAdms2ConvertPassPluginManager.php @@ -29,7 +29,9 @@ class JoinupFederationAdms2ConvertPassPluginManager extends DefaultPluginManager public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) { parent::__construct('Plugin/Adms2ConvertPass', $namespaces, $module_handler, JoinupFederationAdms2ConvertPassInterface::class, Adms2ConvertPass::class); $this->alterInfo('adms2_convert_pass_info'); - $this->setCacheBackend($cache_backend, 'adms2_convert_pass_plugins'); + $this->setCacheBackend($cache_backend, 'adms2_convert_pass_plugins', [ + 'adms2_convert_pass_plugins', + ]); } /** diff --git a/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/Plugin/ArbitraryFacetManager.php b/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/Plugin/ArbitraryFacetManager.php index 9211f47154..d18f740caa 100644 --- a/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/Plugin/ArbitraryFacetManager.php +++ b/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/Plugin/ArbitraryFacetManager.php @@ -26,7 +26,9 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac parent::__construct('Plugin/ArbitraryFacet', $namespaces, $module_handler, 'Drupal\search_api_arbitrary_facet\Plugin\ArbitraryFacetInterface', 'Drupal\search_api_arbitrary_facet\Annotation\ArbitraryFacet'); $this->alterInfo('search_api_arbitrary_facet_arbitrary_facet_info'); - $this->setCacheBackend($cache_backend, 'search_api_arbitrary_facet_arbitrary_facet_plugins'); + $this->setCacheBackend($cache_backend, 'search_api_arbitrary_facet_arbitrary_facet_plugins', [ + 'search_api_arbitrary_facet_arbitrary_facet_plugins', + ]); } } diff --git a/web/modules/custom/search_api_field/src/Plugin/FilterPluginManager.php b/web/modules/custom/search_api_field/src/Plugin/FilterPluginManager.php index aa14434afe..5ffb418fbf 100644 --- a/web/modules/custom/search_api_field/src/Plugin/FilterPluginManager.php +++ b/web/modules/custom/search_api_field/src/Plugin/FilterPluginManager.php @@ -37,7 +37,9 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac parent::__construct('Plugin/SearchApiField/Filter', $namespaces, $module_handler, FilterPluginInterface::class, SearchApiFieldFilter::class); $this->alterInfo('search_api_field_filter_info'); - $this->setCacheBackend($cache_backend, 'search_api_field_filter_plugins'); + $this->setCacheBackend($cache_backend, 'search_api_field_filter_plugins', [ + 'search_api_field_filter_plugins', + ]); } /** diff --git a/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionPluginManager.php b/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionPluginManager.php index 2f3ad76468..ba674e485f 100644 --- a/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionPluginManager.php +++ b/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionPluginManager.php @@ -28,7 +28,9 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac parent::__construct('Plugin/WorkflowStatePermission', $namespaces, $module_handler, '\Drupal\workflow_state_permission\WorkflowStatePermissionPluginInterface', 'Drupal\workflow_state_permission\Annotation\WorkflowStatePermission'); $this->alterInfo('workflow_state_permission_plugin_info'); - $this->setCacheBackend($cache_backend, 'workflow_state_permission_plugin'); + $this->setCacheBackend($cache_backend, 'workflow_state_permission_plugin', [ + 'workflow_state_permission_plugin', + ]); } } From 53b3fc733346df304d53eecf4fc1e0960e11e700 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 14:07:13 +0200 Subject: [PATCH 294/957] ISAICP-5692: Move JoinupRelationManager to a more fitting module. --- web/modules/custom/custom_page/custom_page.module | 2 +- web/modules/custom/joinup_core/README.md | 2 +- .../custom/joinup_core/joinup_core.services.yml | 2 +- .../src/ProxyClass/JoinupRelationManager.php | 8 ++++---- .../src/JoinupRelationManager.php | 13 +++++-------- 5 files changed, 12 insertions(+), 15 deletions(-) rename web/modules/custom/{joinup_core => joinup_group}/src/JoinupRelationManager.php (95%) diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 798139ab92..b55e41cf76 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -172,7 +172,7 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc return AccessResult::neutral(); } - /** @var \Drupal\joinup_core\JoinupRelationManager $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); $parent = $relation_manager->getParent($node); // Let parentless nodes (e.g. newsletters) be handled by the core access. diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 35f4d9aa23..ea586bb965 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -53,7 +53,7 @@ function joinup_news_workflow_selector(EntityInterface $entity) { if ($entity->bundle() != 'news') { throw new Exception('This method can only be called for document entities'); } - /** @var \Drupal\joinup_core\JoinupRelationManager $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); $moderation = $relation_manager->getParentModeration($entity); $moderation_type = $moderation == 1 ? 'pre_moderated' : 'post_moderated'; diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index a47cb7014c..014daa7a44 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -14,7 +14,7 @@ services: tags: - name: event_subscriber joinup_core.relations_manager: - class: Drupal\joinup_core\JoinupRelationManager + class: Drupal\joinup_group\JoinupRelationManager arguments: ['@og.membership_manager', '@entity_type.manager'] lazy: true joinup_core.workflow.helper: diff --git a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php b/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php index 4deef8e56f..3123f22332 100644 --- a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php +++ b/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php @@ -2,13 +2,13 @@ // @codingStandardsIgnoreFile /** - * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_core\JoinupRelationManager' "modules/custom/joinup_core/src". + * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_group\JoinupRelationManager' "modules/custom/joinup_core/src". */ namespace Drupal\joinup_core\ProxyClass { /** - * Provides a proxy class for \Drupal\joinup_core\JoinupRelationManager. + * Provides a proxy class for \Drupal\joinup_group\JoinupRelationManager. * * @see \Drupal\Component\ProxyBuilder */ @@ -27,7 +27,7 @@ class JoinupRelationManager implements \Drupal\joinup_core\JoinupRelationManager /** * The real proxied service, after it was lazy loaded. * - * @var \Drupal\joinup_core\JoinupRelationManager + * @var \Drupal\joinup_group\JoinupRelationManager */ protected $service; @@ -72,7 +72,7 @@ protected function lazyLoadItself() */ public static function create(\Symfony\Component\DependencyInjection\ContainerInterface $container) { - \Drupal\joinup_core\JoinupRelationManager::create($container); + \Drupal\joinup_group\JoinupRelationManager::create($container); } /** diff --git a/web/modules/custom/joinup_core/src/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/JoinupRelationManager.php similarity index 95% rename from web/modules/custom/joinup_core/src/JoinupRelationManager.php rename to web/modules/custom/joinup_group/src/JoinupRelationManager.php index 304a270050..df3eb8da8d 100644 --- a/web/modules/custom/joinup_core/src/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/JoinupRelationManager.php @@ -2,12 +2,16 @@ declare(strict_types = 1); -namespace Drupal\joinup_core; +namespace Drupal\joinup_group; +use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException; +use Drupal\Component\Plugin\Exception\PluginNotFoundException; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_core\JoinupRelationManagerInterface; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgMembershipInterface; use Drupal\og\OgRoleInterface; @@ -16,13 +20,6 @@ /** * Service to manage relations for the group content entities. - * - * @todo This module depends on functionality provided by a number of modules - * such as Collection and Solution that depend on joinup_core themselves. This - * causes a circular dependency. It should be moved to the installation - * profile. - * - * @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-4543 */ class JoinupRelationManager implements JoinupRelationManagerInterface, ContainerInjectionInterface { From a75914a9818556eb36eef1e395f5c0b967584836 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 14:13:58 +0200 Subject: [PATCH 295/957] ISAICP-5692: Move the JoinupRelationManager proxy class to a more fitting module. --- .../src/ProxyClass/JoinupRelationManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename web/modules/custom/{joinup_core => joinup_group}/src/ProxyClass/JoinupRelationManager.php (98%) diff --git a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php similarity index 98% rename from web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php rename to web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php index 3123f22332..847c1a9194 100644 --- a/web/modules/custom/joinup_core/src/ProxyClass/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php @@ -2,10 +2,10 @@ // @codingStandardsIgnoreFile /** - * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_group\JoinupRelationManager' "modules/custom/joinup_core/src". + * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_group\JoinupRelationManager' "modules/custom/joinup_group/src". */ -namespace Drupal\joinup_core\ProxyClass { +namespace Drupal\joinup_group\ProxyClass { /** * Provides a proxy class for \Drupal\joinup_group\JoinupRelationManager. From 74b566002daa05a877e24f175817b19fe3e236a8 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 14:15:33 +0200 Subject: [PATCH 296/957] ISAICP-5692: Move the JoinupRelationManagerInterface to a more fitting module. --- .../custom/contact_information/contact_information.module | 2 +- .../ContactInformationWorkflowStatePermission.php | 6 +++--- .../joinup_community_content.module | 2 +- .../joinup_community_content.tokens.inc | 2 +- web/modules/custom/joinup_core/src/Guard/NodeGuard.php | 6 +++--- .../joinup_core/src/NodeWorkflowAccessControlHandler.php | 5 +++-- .../src/Controller/BooleanFieldToggleController.php | 6 +++--- web/modules/custom/joinup_group/joinup_group.tokens.inc | 2 +- web/modules/custom/joinup_group/src/Form/ShareForm.php | 6 +++--- .../custom/joinup_group/src/JoinupRelationManager.php | 1 - .../src/JoinupRelationManagerInterface.php | 2 +- .../joinup_group/src/ProxyClass/JoinupRelationManager.php | 2 +- .../src/EventSubscriber/CommunityContentSubscriber.php | 4 ++-- .../src/EventSubscriber/NotificationSubscriberBase.php | 6 +++--- .../src/Plugin/search_api/processor/JoinupEntityStatus.php | 6 +++--- .../simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php | 6 +++--- .../joinup/src/Controller/GroupAdministratorsController.php | 6 +++--- web/profiles/joinup/src/Controller/PinEntityController.php | 6 +++--- web/profiles/joinup/src/PinService.php | 6 +++--- 19 files changed, 41 insertions(+), 41 deletions(-) rename web/modules/custom/{joinup_core => joinup_group}/src/JoinupRelationManagerInterface.php (99%) diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index ce3899013c..98c0d2ce40 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -141,7 +141,7 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // entities by a simple reference field. // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. - /** @var \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); if ($groups = $relation_manager->getContactInformationRelatedGroups($entity)) { $group = reset($groups); diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index bcbfc8004c..2bfeab0760 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -9,7 +9,7 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\rdf_entity\RdfInterface; @@ -37,7 +37,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo /** * The relation manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -66,7 +66,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo * The plugin implementation definition. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The config factory. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager * The relation manager service. * @param \Drupal\og\MembershipManagerInterface $membership_manager * The membership manager service. diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 4e0fe7965d..d7d286687a 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -110,7 +110,7 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { throw new Exception('This function can only be called for community content apart from discussion.'); } - /** @var \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); $moderation = $relation_manager->getParentModeration($entity); return $moderation == NodeWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index 1c0fb03e9d..d81f55c898 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -55,7 +55,7 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], break; case 'path-to-community-content': - /** @var \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); $path_parts = []; diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php index bbd46cc392..21e8c88eb1 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php @@ -7,7 +7,7 @@ use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\state_machine\Guard\GuardInterface; use Drupal\state_machine\Plugin\Workflow\WorkflowInterface; @@ -29,7 +29,7 @@ class NodeGuard implements GuardInterface { /** * The relation manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -67,7 +67,7 @@ class NodeGuard implements GuardInterface { * The classes inheriting this class, should also ensure that they set the * protected variable $transitions to be used by the ::allowed() method. * - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager * The relation manager service. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The configuration factory service. diff --git a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php index 32d25b0710..5803382c51 100644 --- a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; use Drupal\og\Entity\OgMembership; @@ -83,7 +84,7 @@ class NodeWorkflowAccessControlHandler { /** * The discussions relation manager. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -122,7 +123,7 @@ class NodeWorkflowAccessControlHandler { * The entity type manager service. * @param \Drupal\og\MembershipManagerInterface $og_membership_manager * The OG membership manager service. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager * The relation manager service. * @param \Drupal\Core\Session\AccountInterface $current_user * The current logged in user. diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 141013fa83..45b7617e1e 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -7,7 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\ContentEntityInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -24,14 +24,14 @@ class BooleanFieldToggleController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; /** * Instantiates a new SiteFeatureController object. * - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager * The Joinup relation manager. */ public function __construct(JoinupRelationManagerInterface $relationManager) { diff --git a/web/modules/custom/joinup_group/joinup_group.tokens.inc b/web/modules/custom/joinup_group/joinup_group.tokens.inc index 31db7babd0..e74dfbddde 100644 --- a/web/modules/custom/joinup_group/joinup_group.tokens.inc +++ b/web/modules/custom/joinup_group/joinup_group.tokens.inc @@ -44,7 +44,7 @@ function joinup_group_tokens(string $type, array $tokens, array $data, array $op } $token_service = \Drupal::token(); - /** @var \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager */ + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ $relation_manager = \Drupal::service('joinup_core.relations_manager'); if (isset($tokens['parent_collection'])) { $original = $tokens['parent_collection']; diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 110ad52d20..f1610c4b1f 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -14,7 +14,7 @@ use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgRoleManagerInterface; use Drupal\sparql_entity_storage\SparqlEntityStorage; @@ -29,7 +29,7 @@ abstract class ShareForm extends ShareFormBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -48,7 +48,7 @@ abstract class ShareForm extends ShareFormBase { * The current user account. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger service. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager * The Joinup relation manager. */ public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupRelationManagerInterface $relation_manager) { diff --git a/web/modules/custom/joinup_group/src/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/JoinupRelationManager.php index df3eb8da8d..978bfe8f19 100644 --- a/web/modules/custom/joinup_group/src/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/JoinupRelationManager.php @@ -11,7 +11,6 @@ use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgMembershipInterface; use Drupal\og\OgRoleInterface; diff --git a/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php b/web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php similarity index 99% rename from web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php rename to web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php index c68faca52b..8a8fe9f76c 100644 --- a/web/modules/custom/joinup_core/src/JoinupRelationManagerInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core; +namespace Drupal\joinup_group; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; diff --git a/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php index 847c1a9194..15feae1b63 100644 --- a/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php @@ -12,7 +12,7 @@ * * @see \Drupal\Component\ProxyBuilder */ - class JoinupRelationManager implements \Drupal\joinup_core\JoinupRelationManagerInterface, \Drupal\Core\DependencyInjection\ContainerInjectionInterface + class JoinupRelationManager implements \Drupal\joinup_group\JoinupRelationManagerInterface, \Drupal\Core\DependencyInjection\ContainerInjectionInterface { use \Drupal\Core\DependencyInjection\DependencySerializationTrait; diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index c71945aa7d..0666fd7083 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -9,7 +9,7 @@ use Drupal\Core\Entity\EntityTypeManager; use Drupal\Core\Session\AccountProxy; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_core\WorkflowHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; @@ -85,7 +85,7 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $joinup_core_relations_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinup_core_relations_manager * The relation manager service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 2a053e75e9..753ed2b15f 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -9,7 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountProxy; use Drupal\Core\Url; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; @@ -91,7 +91,7 @@ abstract class NotificationSubscriberBase { /** * The relation manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -117,7 +117,7 @@ abstract class NotificationSubscriberBase { * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $joinup_core_relations_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinup_core_relations_manager * The relation manager service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message delivery service. diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 7f473f9ce0..b59c6ac8ff 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -4,7 +4,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginFormInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\node\NodeInterface; use Drupal\rdf_entity\RdfInterface; use Drupal\search_api\IndexInterface; @@ -32,7 +32,7 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf /** * The relation manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -45,7 +45,7 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf * The plugin_id for the plugin instance. * @param array $plugin_definition * The plugin implementation definition. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager * The relation manager service. */ public function __construct(array $configuration, $plugin_id, array $plugin_definition, JoinupRelationManagerInterface $relation_manager) { diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index 324b5deb92..b205f2162d 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -7,7 +7,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Query\QueryInterface; use Drupal\Core\Language\LanguageManagerInterface; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\simple_sitemap\EntityHelper; use Drupal\simple_sitemap\Logger; use Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\EntityUrlGenerator; @@ -30,7 +30,7 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { /** * The Joinup relation manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; @@ -55,7 +55,7 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * The sitemap entity helper service. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager $url_generator_manager * The url generator manager service. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relation_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager * The joinup relation manager service. */ public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_manager) { diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index fb75d4c478..fd796fed0b 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -16,7 +16,7 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\csv_serialization\Encoder\CsvEncoder; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\og\GroupTypeManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; @@ -42,7 +42,7 @@ class GroupAdministratorsController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $joinupRelationManager; @@ -65,7 +65,7 @@ class GroupAdministratorsController extends ControllerBase { * * @param \Drupal\og\GroupTypeManager $groupTypeManager * The OG group type manager. - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $joinupRelationManager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinupRelationManager * The Joinup relation manager. * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityTypeBundleInfo * The entity type bundle info service. diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index 9afd569aae..be5e274820 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -11,7 +11,7 @@ use Drupal\Core\Session\AccountInterface; use Drupal\joinup\PinServiceInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\og\OgAccessInterface; use Drupal\rdf_entity\RdfInterface; @@ -39,14 +39,14 @@ class PinEntityController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; /** * Instantiates a new PinEntityController object. * - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager * The Joinup relation manager. * @param \Drupal\og\OgAccessInterface $ogAccess * The OG access service. diff --git a/web/profiles/joinup/src/PinService.php b/web/profiles/joinup/src/PinService.php index b803bec9bc..81672aea02 100644 --- a/web/profiles/joinup/src/PinService.php +++ b/web/profiles/joinup/src/PinService.php @@ -7,7 +7,7 @@ use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_core\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupRelationManagerInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\rdf_entity\RdfInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -27,14 +27,14 @@ class PinService implements PinServiceInterface, ContainerInjectionInterface { /** * The relations manager service. * - * @var \Drupal\joinup_core\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ protected $relationManager; /** * Constructs a PinService service. * - * @param \Drupal\joinup_core\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager * The relations manager service. */ public function __construct(JoinupRelationManagerInterface $relationManager) { From baea9957e13bbfc9b24f0126b6a22ee7ac388260 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 14:19:47 +0200 Subject: [PATCH 297/957] ISAICP-5692: Rename the service ID to match the new name for the service class. --- .../custom/contact_information/contact_information.module | 2 +- .../ContactInformationWorkflowStatePermission.php | 2 +- web/modules/custom/custom_page/custom_page.module | 2 +- .../joinup_community_content.module | 2 +- .../joinup_community_content.tokens.inc | 2 +- web/modules/custom/joinup_core/README.md | 2 +- web/modules/custom/joinup_core/joinup_core.services.yml | 8 ++------ .../joinup_discussion/src/Form/InviteToDiscussionForm.php | 2 +- .../src/Controller/BooleanFieldToggleController.php | 2 +- web/modules/custom/joinup_group/joinup_group.services.yml | 4 ++++ web/modules/custom/joinup_group/joinup_group.tokens.inc | 2 +- web/modules/custom/joinup_group/src/Form/ShareForm.php | 2 +- .../joinup_notification/joinup_notification.services.yml | 2 +- .../Plugin/search_api/processor/JoinupEntityStatus.php | 2 +- .../UrlGenerator/JoinupUrlGeneratorBase.php | 2 +- web/profiles/joinup/joinup.services.yml | 2 +- .../src/Controller/GroupAdministratorsController.php | 2 +- .../joinup/src/Controller/PinEntityController.php | 2 +- web/profiles/joinup/src/PinService.php | 2 +- web/themes/joinup/joinup_theme.theme | 2 +- 20 files changed, 24 insertions(+), 24 deletions(-) diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 98c0d2ce40..5c6eb2ea94 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -142,7 +142,7 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); if ($groups = $relation_manager->getContactInformationRelatedGroups($entity)) { $group = reset($groups); $membership = \Drupal::service('og.membership_manager')->getMembership($group, $account->id()); diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index 2bfeab0760..52a42af93d 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -90,7 +90,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('config.factory'), - $container->get('joinup_core.relations_manager'), + $container->get('joinup_group.relation_info'), $container->get('og.membership_manager'), $container->get('joinup_core.workflow.helper') ); diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index b55e41cf76..15003eb0f5 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -173,7 +173,7 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc } /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); $parent = $relation_manager->getParent($node); // Let parentless nodes (e.g. newsletters) be handled by the core access. if (empty($parent)) { diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index d7d286687a..35394c0150 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -111,7 +111,7 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { } /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); $moderation = $relation_manager->getParentModeration($entity); return $moderation == NodeWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; } diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index d81f55c898..6bca6fd2ad 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -56,7 +56,7 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], case 'path-to-community-content': /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); $path_parts = []; if ($parent = $relation_manager->getParent($node)) { diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index ea586bb965..6321c78160 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -54,7 +54,7 @@ function joinup_news_workflow_selector(EntityInterface $entity) { throw new Exception('This method can only be called for document entities'); } /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); $moderation = $relation_manager->getParentModeration($entity); $moderation_type = $moderation == 1 ? 'pre_moderated' : 'post_moderated'; return "node:news:$moderation_type"; diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index 014daa7a44..a5ce0bdb1b 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -1,22 +1,18 @@ services: joinup_core.fulfillment_guard: class: Drupal\joinup_core\Guard\NodeGuard - arguments: ['@joinup_core.relations_manager', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] + arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } joinup_core.joinup_version: class: Drupal\joinup_core\JoinupVersion joinup_core.node_workflow_access: class: Drupal\joinup_core\NodeWorkflowAccessControlHandler - arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_core.relations_manager', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] + arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_group.relation_info', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] joinup_core.og_subscriber: class: Drupal\joinup_core\EventSubscriber\JoinupCoreOgSubscriber tags: - name: event_subscriber - joinup_core.relations_manager: - class: Drupal\joinup_group\JoinupRelationManager - arguments: ['@og.membership_manager', '@entity_type.manager'] - lazy: true joinup_core.workflow.helper: class: Drupal\joinup_core\WorkflowHelper arguments: ['@current_user', '@account_switcher', '@entity_field.manager', '@og.membership_manager', '@workflow_state_permission.workflow_state_permission'] diff --git a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php index f3284c1361..2528e71cd3 100644 --- a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php +++ b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php @@ -296,7 +296,7 @@ public function access(AccountProxyInterface $account, NodeInterface $node = NUL // user is a facilitator), or the author of the discussion itself. $user = $account->getAccount(); /** @var \Drupal\rdf_entity\Entity\Rdf $group */ - $group = \Drupal::service('joinup_core.relations_manager')->getParent($node); + $group = \Drupal::service('joinup_group.relation_info')->getParent($node); $is_group_administrator = $user->hasPermission('administer groups'); $is_owner = $user->id() == $node->getOwnerId(); diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 45b7617e1e..206df55476 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -43,7 +43,7 @@ public function __construct(JoinupRelationManagerInterface $relationManager) { */ public static function create(ContainerInterface $container) { return new static( - $container->get('joinup_core.relations_manager') + $container->get('joinup_group.relation_info') ); } diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index 4fe42c884e..c1cfa05878 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -8,6 +8,10 @@ services: class: Drupal\joinup_group\JoinupGroupManager arguments: ['@og.membership_manager', '@entity_type.manager'] lazy: true + joinup_group.relation_info: + class: Drupal\joinup_group\JoinupRelationManager + arguments: ['@og.membership_manager', '@entity_type.manager'] + lazy: true joinup_group.route_subscriber: class: Drupal\joinup_group\Routing\RouteSubscriber tags: diff --git a/web/modules/custom/joinup_group/joinup_group.tokens.inc b/web/modules/custom/joinup_group/joinup_group.tokens.inc index e74dfbddde..6218b05369 100644 --- a/web/modules/custom/joinup_group/joinup_group.tokens.inc +++ b/web/modules/custom/joinup_group/joinup_group.tokens.inc @@ -45,7 +45,7 @@ function joinup_group_tokens(string $type, array $tokens, array $data, array $op $token_service = \Drupal::token(); /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_core.relations_manager'); + $relation_manager = \Drupal::service('joinup_group.relation_info'); if (isset($tokens['parent_collection'])) { $original = $tokens['parent_collection']; $parent_solution = $rdf_entity; diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index f1610c4b1f..85d2438b97 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -67,7 +67,7 @@ public static function create(ContainerInterface $container) { $container->get('og.role_manager'), $container->get('current_user'), $container->get('messenger'), - $container->get('joinup_core.relations_manager') + $container->get('joinup_group.relation_info') ); } diff --git a/web/modules/custom/joinup_notification/joinup_notification.services.yml b/web/modules/custom/joinup_notification/joinup_notification.services.yml index b0b0e95092..87d6e48d89 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.services.yml +++ b/web/modules/custom/joinup_notification/joinup_notification.services.yml @@ -7,7 +7,7 @@ services: arguments: ['@message_notify.sender'] joinup_notification.notification_subscriber_base: abstract: true - arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_core.workflow.helper', '@joinup_core.relations_manager', '@joinup_notification.message_delivery'] + arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_core.workflow.helper', '@joinup_group.relation_info', '@joinup_notification.message_delivery'] joinup_notification.community_content.subscriber: class: Drupal\joinup_notification\EventSubscriber\CommunityContentSubscriber parent: joinup_notification.notification_subscriber_base diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index b59c6ac8ff..93600d5c2b 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -61,7 +61,7 @@ public static function create(ContainerInterface $container, array $configuratio $configuration, $plugin_id, $plugin_definition, - $container->get('joinup_core.relations_manager') + $container->get('joinup_group.relation_info') ); } diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index b205f2162d..1aaf203402 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -78,7 +78,7 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('entity_type.manager'), $container->get('simple_sitemap.entity_helper'), $container->get('plugin.manager.simple_sitemap.url_generator'), - $container->get('joinup_core.relations_manager') + $container->get('joinup_group.relation_info') ); } diff --git a/web/profiles/joinup/joinup.services.yml b/web/profiles/joinup/joinup.services.yml index 0fcf7b4603..7559227ed0 100644 --- a/web/profiles/joinup/joinup.services.yml +++ b/web/profiles/joinup/joinup.services.yml @@ -6,7 +6,7 @@ services: - { name: 'cache.context'} joinup.pin_service: class: Drupal\joinup\PinService - arguments: ['@joinup_core.relations_manager'] + arguments: ['@joinup_group.relation_info'] lazy: true joinup.route_subscriber: class: Drupal\joinup\Routing\RouteSubscriber diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index fd796fed0b..01078727f3 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -85,7 +85,7 @@ public function __construct(GroupTypeManager $groupTypeManager, JoinupRelationMa public static function create(ContainerInterface $container) { return new static( $container->get('og.group_type_manager'), - $container->get('joinup_core.relations_manager'), + $container->get('joinup_group.relation_info'), $container->get('entity_type.bundle.info'), $container->get('current_route_match') ); diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index be5e274820..2d33c8d856 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -64,7 +64,7 @@ public function __construct(JoinupRelationManagerInterface $relationManager, OgA */ public static function create(ContainerInterface $container) { return new static( - $container->get('joinup_core.relations_manager'), + $container->get('joinup_group.relation_info'), $container->get('og.access'), $container->get('joinup.pin_service') ); diff --git a/web/profiles/joinup/src/PinService.php b/web/profiles/joinup/src/PinService.php index 81672aea02..4285c38506 100644 --- a/web/profiles/joinup/src/PinService.php +++ b/web/profiles/joinup/src/PinService.php @@ -46,7 +46,7 @@ public function __construct(JoinupRelationManagerInterface $relationManager) { */ public static function create(ContainerInterface $container) { return new static( - $container->get('joinup_core.relations_manager') + $container->get('joinup_group.relation_info') ); } diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index d1b58ce738..3d3e07f0ca 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1986,7 +1986,7 @@ function joinup_theme_preprocess_node(&$variables) { // Add the group ID and label as data attributes in tiles. if ($variables['view_mode'] === 'view_mode_tile') { /** @var \Drupal\rdf_entity\RdfInterface|null $parent */ - $parent = \Drupal::service('joinup_core.relations_manager')->getParent($node); + $parent = \Drupal::service('joinup_group.relation_info')->getParent($node); if ($parent) { $variables['attributes']['data-drupal-parent-id'] = $parent->id(); $variables['attributes']['data-drupal-parent-label'] = $parent->label(); From b77d1fe57611bb889f2d89f303672abd2e2801cf Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 16:13:32 +0200 Subject: [PATCH 298/957] ISAICP-5692: Use the more correct terminology 'relation info' rather than 'relation manager'. The service only provides information about group relationships, it does not allow to manage them. --- .../contact_information.module | 10 ++++--- ...tactInformationWorkflowStatePermission.php | 14 +++++----- .../custom/custom_page/custom_page.module | 8 +++--- .../joinup_community_content.module | 6 ++--- .../joinup_community_content.tokens.inc | 8 +++--- web/modules/custom/joinup_core/README.md | 10 +++---- .../src/NodeWorkflowAccessControlHandler.php | 27 +++++++------------ .../joinup_group/joinup_group.tokens.inc | 6 ++--- .../joinup_group/src/Form/ShareForm.php | 16 +++++------ .../src/EventSubscriber/CommentSubscriber.php | 2 +- .../CommunityContentSubscriber.php | 8 +++--- .../DistributionRdfSubscriber.php | 2 +- .../NotificationSubscriberBase.php | 14 +++++----- .../EventSubscriber/ReleaseRdfSubscriber.php | 2 +- .../processor/JoinupEntityStatus.php | 16 ++++++----- .../UrlGenerator/JoinupUrlGeneratorBase.php | 14 +++++----- 16 files changed, 82 insertions(+), 81 deletions(-) diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 5c6eb2ea94..e61c6293ee 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -5,6 +5,8 @@ * Provides functionality for the contact information module. */ +declare(strict_types = 1); + use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; @@ -141,12 +143,12 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // entities by a simple reference field. // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); - if ($groups = $relation_manager->getContactInformationRelatedGroups($entity)) { + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); + if ($groups = $relation_info->getContactInformationRelatedGroups($entity)) { $group = reset($groups); $membership = \Drupal::service('og.membership_manager')->getMembership($group, $account->id()); - if ($membership && $membership->hasPermission("delete contact_information rdf entity")) { + if ($membership && $membership->hasPermission('delete contact_information rdf entity')) { return AccessResult::allowed(); } } diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index 52a42af93d..19bf787837 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -35,11 +35,11 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo protected $configFactory; /** - * The relation manager service. + * The relation info service. * * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ - protected $relationManager; + protected $relationInfo; /** * The membership manager service. @@ -66,17 +66,17 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo * The plugin implementation definition. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The config factory. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager - * The relation manager service. + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * The relation info service. * @param \Drupal\og\MembershipManagerInterface $membership_manager * The membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper class. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, JoinupRelationManagerInterface $relation_manager, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, JoinupRelationManagerInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->configFactory = $configFactory; - $this->relationManager = $relation_manager; + $this->relationInfo = $relation_info; $this->membershipManager = $membership_manager; $this->workflowHelper = $workflow_helper; } @@ -154,7 +154,7 @@ protected function userHasOwnAnyRoles(RdfInterface $entity, AccountInterface $ac } } - foreach ($this->relationManager->getContactInformationRelatedGroups($entity) as $group) { + foreach ($this->relationInfo->getContactInformationRelatedGroups($entity) as $group) { $membership = $this->membershipManager->getMembership($group, $account->id()); if (empty($membership)) { continue; diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 15003eb0f5..535549329c 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -5,6 +5,8 @@ * Main functions and hook implementations of the custom page module. */ +declare(strict_types = 1); + use Drupal\Core\Access\AccessResult; use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\EntityInterface; @@ -172,9 +174,9 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc return AccessResult::neutral(); } - /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); - $parent = $relation_manager->getParent($node); + /** @var \Drupal\joinup_group\JoinupRelationManager $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); + $parent = $relation_info->getParent($node); // Let parentless nodes (e.g. newsletters) be handled by the core access. if (empty($parent)) { return AccessResult::neutral(); diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 35394c0150..2869bdf8db 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -110,9 +110,9 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { throw new Exception('This function can only be called for community content apart from discussion.'); } - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); - $moderation = $relation_manager->getParentModeration($entity); + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); + $moderation = $relation_info->getParentModeration($entity); return $moderation == NodeWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; } diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index 6bca6fd2ad..55d98c3c05 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -5,6 +5,8 @@ * Builds placeholder replacement tokens for community content related data. */ +declare(strict_types = 1); + use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Url; @@ -55,11 +57,11 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], break; case 'path-to-community-content': - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); $path_parts = []; - if ($parent = $relation_manager->getParent($node)) { + if ($parent = $relation_info->getParent($node)) { $bubbleable_metadata->addCacheableDependency($parent); /** @var \Drupal\rdf_entity\RdfInterface $collection */ if ($parent->bundle() === 'solution' && $collection = $parent->collection->first()->entity) { diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 6321c78160..5019a18012 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -53,9 +53,9 @@ function joinup_news_workflow_selector(EntityInterface $entity) { if ($entity->bundle() != 'news') { throw new Exception('This method can only be called for document entities'); } - /** @var \Drupal\joinup_group\JoinupRelationManager $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); - $moderation = $relation_manager->getParentModeration($entity); + /** @var \Drupal\joinup_group\JoinupRelationManager $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); + $moderation = $relation_info->getParentModeration($entity); $moderation_type = $moderation == 1 ? 'pre_moderated' : 'post_moderated'; return "node:news:$moderation_type"; } @@ -144,14 +144,14 @@ into the class. For example, in the joinup_news module, this is the constructor: ``` public function __construct( EntityTypeManagerInterface $entityTypeManager, - JoinupRelationManager $relationManager, + JoinupRelationManager $relationInfo, MembershipManagerInterface $ogMembershipManager, ConfigFactoryInterface $configFactory, AccountInterface $currentUser ) { parent::__construct( $entityTypeManager, - $relationManager, + $relationInfo, $ogMembershipManager, $configFactory, $currentUser diff --git a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php index 5803382c51..b389e5e270 100644 --- a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php @@ -82,11 +82,11 @@ class NodeWorkflowAccessControlHandler { protected $membershipManager; /** - * The discussions relation manager. + * The group relation info service. * * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ - protected $relationManager; + protected $relationInfo; /** * The current logged in user. @@ -110,21 +110,14 @@ class NodeWorkflowAccessControlHandler { protected $workflowHelper; /** - * The permission scheme stored in configuration. - * - * @var \Drupal\Core\Config\ImmutableConfig - */ - protected $permissionScheme; - - /** - * Constructs a JoinupDocumentRelationManager object. + * Constructs a new NodeWorkflowAccessControlHandler. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager service. * @param \Drupal\og\MembershipManagerInterface $og_membership_manager * The OG membership manager service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager - * The relation manager service. + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * The group relation info service. * @param \Drupal\Core\Session\AccountInterface $current_user * The current logged in user. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory @@ -132,10 +125,10 @@ class NodeWorkflowAccessControlHandler { * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, JoinupRelationManagerInterface $relation_manager, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, JoinupRelationManagerInterface $relation_info, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { $this->entityTypeManager = $entity_type_manager; $this->membershipManager = $og_membership_manager; - $this->relationManager = $relation_manager; + $this->relationInfo = $relation_info; $this->currentUser = $current_user; $this->workflowHelper = $workflow_helper; $this->configFactory = $config_factory; @@ -196,13 +189,13 @@ public function entityAccess(EntityInterface $entity, $operation, AccountInterfa return $this->entityDeleteAccess($entity, $account); case 'post comments': - $parent_state = $this->relationManager->getParentState($entity); + $parent_state = $this->relationInfo->getParentState($entity); $entity_state = $this->getEntityState($entity); // Commenting on content of an archived group is not allowed. if ($parent_state === 'archived' || $entity_state === 'archived') { return AccessResult::forbidden(); } - $parent = $this->relationManager->getParent($entity); + $parent = $this->relationInfo->getParent($entity); $membership = $this->membershipManager->getMembership($parent, $account->id()); if ($membership instanceof OgMembership) { return AccessResult::allowedIf($membership->hasPermission($operation)); @@ -377,7 +370,7 @@ protected function getEntityState(NodeInterface $entity): string { * The content creation option value. */ protected function getParentContentCreationOption(NodeInterface $entity): string { - $parent = $this->relationManager->getParent($entity); + $parent = $this->relationInfo->getParent($entity); $field_name = $this->getParentContentCreationFieldName($parent); return $parent->{$field_name}->value; } diff --git a/web/modules/custom/joinup_group/joinup_group.tokens.inc b/web/modules/custom/joinup_group/joinup_group.tokens.inc index 6218b05369..6264fc03f6 100644 --- a/web/modules/custom/joinup_group/joinup_group.tokens.inc +++ b/web/modules/custom/joinup_group/joinup_group.tokens.inc @@ -44,13 +44,13 @@ function joinup_group_tokens(string $type, array $tokens, array $data, array $op } $token_service = \Drupal::token(); - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager */ - $relation_manager = \Drupal::service('joinup_group.relation_info'); + /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + $relation_info = \Drupal::service('joinup_group.relation_info'); if (isset($tokens['parent_collection'])) { $original = $tokens['parent_collection']; $parent_solution = $rdf_entity; if ($rdf_entity->bundle() !== 'solution') { - $parent_solution = $relation_manager->getParent($rdf_entity); + $parent_solution = $relation_info->getParent($rdf_entity); } if (empty($parent_solution) || $parent_solution->collection->isEmpty()) { diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 85d2438b97..43206c56e7 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -27,14 +27,14 @@ abstract class ShareForm extends ShareFormBase { /** - * The Joinup relation manager. + * The group relation info service. * * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ - protected $relationManager; + protected $relationInfo; /** - * Constructs a new ShareContentFormBase object. + * Constructs a new ShareForm. * * @param \Drupal\sparql_entity_storage\SparqlEntityStorage $sparql_storage * The RDF entity storage. @@ -48,12 +48,12 @@ abstract class ShareForm extends ShareFormBase { * The current user account. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager - * The Joinup relation manager. + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * The group relation info service. */ - public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupRelationManagerInterface $relation_manager) { + public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupRelationManagerInterface $relation_info) { parent::__construct($sparql_storage, $rdf_builder, $membership_manager, $role_manager, $current_user, $messenger); - $this->relationManager = $relation_manager; + $this->relationInfo = $relation_info; } /** @@ -252,7 +252,7 @@ protected function getShareableCollections(): array { */ protected function getExcludedParent(): ?RdfInterface { if ($this->entity->getEntityTypeId() === 'node') { - return $this->relationManager->getParent($this->entity); + return $this->relationInfo->getParent($this->entity); } else { return $this->entity->get('collection')->isEmpty() ? NULL : $this->entity->get('collection')->first()->entity; diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php index f27192fef7..641d6a4b5c 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php @@ -65,7 +65,7 @@ protected function initialize(NotificationEvent $event) { $this->group = $this->parent; } elseif ($this->groupTypeManager->isGroupContent($this->parent->getEntityTypeId(), $this->parent->bundle())) { - $this->group = $this->relationManager->getParent($this->parent); + $this->group = $this->relationInfo->getParent($this->parent); } } } diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 0666fd7083..556e9957c5 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -85,15 +85,15 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinup_core_relations_manager + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info * The relation manager service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. * @param \Drupal\state_machine_revisions\RevisionManagerInterface $revision_manager * The revision manager service. */ - public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupRelationManagerInterface $joinup_core_relations_manager, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { - parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $joinup_core_relations_manager, $message_delivery); + public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupRelationManagerInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { + parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $relation_info, $message_delivery); $this->revisionManager = $revision_manager; } @@ -271,7 +271,7 @@ protected function generateArguments(EntityInterface $entity): array { $arguments['@entity:hasPublished:status'] = $this->hasPublished ? 'an update of the' : 'a new'; // Add arguments related to the parent collection or solution. - $parent = $this->relationManager->getParent($entity); + $parent = $this->relationInfo->getParent($entity); if (!empty($parent)) { $arguments += MessageArgumentGenerator::getGroupArguments($parent); diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php index 8450fadc5f..a2adcbea0d 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php @@ -192,7 +192,7 @@ protected function generateArguments(EntityInterface $entity): array { // Add arguments related to the parent collection or solution. $parent = $entity->parent->entity; - $solution = (!empty($parent) && $parent->bundle() === 'solution') ? $parent : $this->relationManager->getParent($entity); + $solution = (!empty($parent) && $parent->bundle() === 'solution') ? $parent : $this->relationInfo->getParent($entity); if (!empty($parent) && $parent->bundle() === 'asset_release') { // Some legacy releases exist without a version. Thus, a check for // existence is needed. diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 753ed2b15f..6674df741e 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -89,11 +89,11 @@ abstract class NotificationSubscriberBase { protected $workflowHelper; /** - * The relation manager service. + * The relation info service. * * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ - protected $relationManager; + protected $relationInfo; /** * The message delivery service. @@ -117,19 +117,19 @@ abstract class NotificationSubscriberBase { * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinup_core_relations_manager - * The relation manager service. + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * The relation info service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message delivery service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupRelationManagerInterface $joinup_core_relations_manager, JoinupMessageDeliveryInterface $message_delivery) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupRelationManagerInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery) { $this->entityTypeManager = $entity_type_manager; $this->configFactory = $config_factory; $this->currentUser = $current_user; $this->groupTypeManager = $og_group_type_manager; $this->membershipManager = $og_membership_manager; $this->workflowHelper = $joinup_core_workflow_helper; - $this->relationManager = $joinup_core_relations_manager; + $this->relationInfo = $relation_info; $this->messageDelivery = $message_delivery; } @@ -280,7 +280,7 @@ protected function getRecipientIdsByRole($role_id) { */ protected function getRecipientIdsByOgRole(EntityInterface $entity, OgRoleInterface $role): array { if (!$this->groupTypeManager->isGroup($entity->getEntityTypeId(), $entity->bundle())) { - $entity = $this->relationManager->getParent($entity); + $entity = $this->relationInfo->getParent($entity); } if (empty($entity)) { return []; diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php index 814efc5ba1..e2d28f9ef2 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php @@ -308,7 +308,7 @@ protected function generateArguments(EntityInterface $entity): array { $arguments['@entity:field_isr_release_number'] = !empty($entity->get('field_isr_release_number')->first()->value) ? $entity->get('field_isr_release_number')->first()->value : ''; // Add arguments related to the parent collection or solution. - $parent = $this->relationManager->getParent($entity); + $parent = $this->relationInfo->getParent($entity); if (!empty($parent)) { $arguments += MessageArgumentGenerator::getGroupArguments($parent); if (empty($arguments['@actor:role'])) { diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 93600d5c2b..9f2876c0fc 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -1,5 +1,7 @@ relationManager = $relation_manager; + $this->relationInfo = $relation_info; } /** @@ -110,7 +112,7 @@ public function alterIndexedItems(array &$items) { $inverse = $this->getConfiguration()['inverse']; $enabled = TRUE; if ($object instanceof NodeInterface) { - $parent = $this->relationManager->getParent($object); + $parent = $this->relationInfo->getParent($object); // Check if empty to avoid exceptions. // The entity can be published only if the parent entity is published. if (empty($parent) || !$parent->isPublished()) { diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index 1aaf203402..d0e7152957 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -28,11 +28,11 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { protected $urlGeneratorManager; /** - * The Joinup relation manager service. + * The Joinup group relation info service. * * @var \Drupal\joinup_group\JoinupRelationManagerInterface */ - protected $relationManager; + protected $relationInfo; /** * Constructs a JoinupUrlGeneratorBase object. @@ -55,13 +55,13 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * The sitemap entity helper service. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager $url_generator_manager * The url generator manager service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_manager - * The joinup relation manager service. + * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * The joinup group relation info service. */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_manager) { + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_info) { parent::__construct($configuration, $plugin_id, $plugin_definition, $generator, $logger, $language_manager, $entity_type_manager, $entityHelper, $url_generator_manager); $this->urlGeneratorManager = $url_generator_manager; - $this->relationManager = $relation_manager; + $this->relationInfo = $relation_info; } /** @@ -150,7 +150,7 @@ protected function processDataSet($data_set) { // In case the entity type is a node, we also need to also take into account // the status of the parent. if ($entity->getEntityTypeId() === 'node') { - $parent = $this->relationManager->getParent($entity); + $parent = $this->relationInfo->getParent($entity); if (empty($parent) || !$parent->isPublished()) { return FALSE; } From 92a08a73280318c40133c1a2f3d52da36a44ea64 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 16:24:24 +0200 Subject: [PATCH 299/957] ISAICP-5692: Rename service that provides information about group relationships. --- .../custom/contact_information/contact_information.module | 2 +- .../ContactInformationWorkflowStatePermission.php | 8 ++++---- web/modules/custom/custom_page/custom_page.module | 2 +- .../joinup_community_content.module | 2 +- .../joinup_community_content.tokens.inc | 2 +- web/modules/custom/joinup_core/src/Guard/NodeGuard.php | 8 ++++---- .../joinup_core/src/NodeWorkflowAccessControlHandler.php | 8 ++++---- .../src/Controller/BooleanFieldToggleController.php | 8 ++++---- web/modules/custom/joinup_group/joinup_group.tokens.inc | 2 +- web/modules/custom/joinup_group/src/Form/ShareForm.php | 8 ++++---- ...nupRelationManager.php => JoinupGroupRelationInfo.php} | 2 +- ...Interface.php => JoinupGroupRelationInfoInterface.php} | 2 +- ...nupRelationManager.php => JoinupGroupRelationInfo.php} | 6 +++--- .../src/EventSubscriber/CommunityContentSubscriber.php | 6 +++--- .../src/EventSubscriber/NotificationSubscriberBase.php | 8 ++++---- .../Plugin/search_api/processor/JoinupEntityStatus.php | 8 ++++---- .../UrlGenerator/JoinupUrlGeneratorBase.php | 8 ++++---- .../src/Controller/GroupAdministratorsController.php | 8 ++++---- .../joinup/src/Controller/PinEntityController.php | 8 ++++---- web/profiles/joinup/src/PinService.php | 8 ++++---- 20 files changed, 57 insertions(+), 57 deletions(-) rename web/modules/custom/joinup_group/src/{JoinupRelationManager.php => JoinupGroupRelationInfo.php} (98%) rename web/modules/custom/joinup_group/src/{JoinupRelationManagerInterface.php => JoinupGroupRelationInfoInterface.php} (98%) rename web/modules/custom/joinup_group/src/ProxyClass/{JoinupRelationManager.php => JoinupGroupRelationInfo.php} (94%) diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index e61c6293ee..55c75991ec 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -143,7 +143,7 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // entities by a simple reference field. // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); if ($groups = $relation_info->getContactInformationRelatedGroups($entity)) { $group = reset($groups); diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index 19bf787837..73dbd482ac 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -9,7 +9,7 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\rdf_entity\RdfInterface; @@ -37,7 +37,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo /** * The relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -66,14 +66,14 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo * The plugin implementation definition. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The config factory. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The relation info service. * @param \Drupal\og\MembershipManagerInterface $membership_manager * The membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper class. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, JoinupRelationManagerInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, JoinupGroupRelationInfoInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->configFactory = $configFactory; $this->relationInfo = $relation_info; diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 535549329c..92b110b4a6 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -174,7 +174,7 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc return AccessResult::neutral(); } - /** @var \Drupal\joinup_group\JoinupRelationManager $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $parent = $relation_info->getParent($node); // Let parentless nodes (e.g. newsletters) be handled by the core access. diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 2869bdf8db..34953680b2 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -110,7 +110,7 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { throw new Exception('This function can only be called for community content apart from discussion.'); } - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $moderation = $relation_info->getParentModeration($entity); return $moderation == NodeWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index 55d98c3c05..421a2d82d9 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -57,7 +57,7 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], break; case 'path-to-community-content': - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $path_parts = []; diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php index 21e8c88eb1..56ac2313f5 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php @@ -7,7 +7,7 @@ use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\state_machine\Guard\GuardInterface; use Drupal\state_machine\Plugin\Workflow\WorkflowInterface; @@ -29,7 +29,7 @@ class NodeGuard implements GuardInterface { /** * The relation manager service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationManager; @@ -67,7 +67,7 @@ class NodeGuard implements GuardInterface { * The classes inheriting this class, should also ensure that they set the * protected variable $transitions to be used by the ::allowed() method. * - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager * The relation manager service. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The configuration factory service. @@ -78,7 +78,7 @@ class NodeGuard implements GuardInterface { * @param \Drupal\workflow_state_permission\WorkflowStatePermissionInterface $workflowStatePermission * The workflow state permission service. */ - public function __construct(JoinupRelationManagerInterface $relationManager, ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { + public function __construct(JoinupGroupRelationInfoInterface $relationManager, ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { $this->relationManager = $relationManager; $this->currentUser = $currentUser; $this->workflowHelper = $workflow_helper; diff --git a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php index b389e5e270..9c0c798fce 100644 --- a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php @@ -10,7 +10,7 @@ use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; use Drupal\og\Entity\OgMembership; @@ -84,7 +84,7 @@ class NodeWorkflowAccessControlHandler { /** * The group relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -116,7 +116,7 @@ class NodeWorkflowAccessControlHandler { * The entity type manager service. * @param \Drupal\og\MembershipManagerInterface $og_membership_manager * The OG membership manager service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The group relation info service. * @param \Drupal\Core\Session\AccountInterface $current_user * The current logged in user. @@ -125,7 +125,7 @@ class NodeWorkflowAccessControlHandler { * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, JoinupRelationManagerInterface $relation_info, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, JoinupGroupRelationInfoInterface $relation_info, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { $this->entityTypeManager = $entity_type_manager; $this->membershipManager = $og_membership_manager; $this->relationInfo = $relation_info; diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 206df55476..5c658fd607 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -7,7 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\ContentEntityInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -24,17 +24,17 @@ class BooleanFieldToggleController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationManager; /** * Instantiates a new SiteFeatureController object. * - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager * The Joinup relation manager. */ - public function __construct(JoinupRelationManagerInterface $relationManager) { + public function __construct(JoinupGroupRelationInfoInterface $relationManager) { $this->relationManager = $relationManager; } diff --git a/web/modules/custom/joinup_group/joinup_group.tokens.inc b/web/modules/custom/joinup_group/joinup_group.tokens.inc index 6264fc03f6..a768f099e2 100644 --- a/web/modules/custom/joinup_group/joinup_group.tokens.inc +++ b/web/modules/custom/joinup_group/joinup_group.tokens.inc @@ -44,7 +44,7 @@ function joinup_group_tokens(string $type, array $tokens, array $data, array $op } $token_service = \Drupal::token(); - /** @var \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); if (isset($tokens['parent_collection'])) { $original = $tokens['parent_collection']; diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 43206c56e7..6847e36b5f 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -14,7 +14,7 @@ use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgRoleManagerInterface; use Drupal\sparql_entity_storage\SparqlEntityStorage; @@ -29,7 +29,7 @@ abstract class ShareForm extends ShareFormBase { /** * The group relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -48,10 +48,10 @@ abstract class ShareForm extends ShareFormBase { * The current user account. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The group relation info service. */ - public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupRelationManagerInterface $relation_info) { + public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupGroupRelationInfoInterface $relation_info) { parent::__construct($sparql_storage, $rdf_builder, $membership_manager, $role_manager, $current_user, $messenger); $this->relationInfo = $relation_info; } diff --git a/web/modules/custom/joinup_group/src/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php similarity index 98% rename from web/modules/custom/joinup_group/src/JoinupRelationManager.php rename to web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 978bfe8f19..3843217bfb 100644 --- a/web/modules/custom/joinup_group/src/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -20,7 +20,7 @@ /** * Service to manage relations for the group content entities. */ -class JoinupRelationManager implements JoinupRelationManagerInterface, ContainerInjectionInterface { +class JoinupGroupRelationInfo implements JoinupGroupRelationInfoInterface, ContainerInjectionInterface { /** * The entity type manager. diff --git a/web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php similarity index 98% rename from web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php rename to web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 8a8fe9f76c..d3b266de00 100644 --- a/web/modules/custom/joinup_group/src/JoinupRelationManagerInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -12,7 +12,7 @@ /** * An interface for Joinup relation manager services. */ -interface JoinupRelationManagerInterface { +interface JoinupGroupRelationInfoInterface { /** * Retrieves the parent of the entity. diff --git a/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php b/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php similarity index 94% rename from web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php rename to web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php index 15feae1b63..3cc53d6119 100644 --- a/web/modules/custom/joinup_group/src/ProxyClass/JoinupRelationManager.php +++ b/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php @@ -12,7 +12,7 @@ * * @see \Drupal\Component\ProxyBuilder */ - class JoinupRelationManager implements \Drupal\joinup_group\JoinupRelationManagerInterface, \Drupal\Core\DependencyInjection\ContainerInjectionInterface + class JoinupGroupRelationInfo implements \Drupal\joinup_group\JoinupGroupRelationInfoInterface, \Drupal\Core\DependencyInjection\ContainerInjectionInterface { use \Drupal\Core\DependencyInjection\DependencySerializationTrait; @@ -27,7 +27,7 @@ class JoinupRelationManager implements \Drupal\joinup_group\JoinupRelationManage /** * The real proxied service, after it was lazy loaded. * - * @var \Drupal\joinup_group\JoinupRelationManager + * @var \Drupal\joinup_group\JoinupGroupRelationInfo */ protected $service; @@ -72,7 +72,7 @@ protected function lazyLoadItself() */ public static function create(\Symfony\Component\DependencyInjection\ContainerInterface $container) { - \Drupal\joinup_group\JoinupRelationManager::create($container); + \Drupal\joinup_group\JoinupGroupRelationInfo::create($container); } /** diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 556e9957c5..ecf593aa5c 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -9,7 +9,7 @@ use Drupal\Core\Entity\EntityTypeManager; use Drupal\Core\Session\AccountProxy; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; @@ -85,14 +85,14 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The relation manager service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. * @param \Drupal\state_machine_revisions\RevisionManagerInterface $revision_manager * The revision manager service. */ - public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupRelationManagerInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { + public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupGroupRelationInfoInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $relation_info, $message_delivery); $this->revisionManager = $revision_manager; } diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 6674df741e..8c748031a3 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -9,7 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountProxy; use Drupal\Core\Url; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; @@ -91,7 +91,7 @@ abstract class NotificationSubscriberBase { /** * The relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -117,12 +117,12 @@ abstract class NotificationSubscriberBase { * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The relation info service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message delivery service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupRelationManagerInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupGroupRelationInfoInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery) { $this->entityTypeManager = $entity_type_manager; $this->configFactory = $config_factory; $this->currentUser = $current_user; diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 9f2876c0fc..0ddd7e0aaf 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -6,7 +6,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginFormInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\node\NodeInterface; use Drupal\rdf_entity\RdfInterface; use Drupal\search_api\IndexInterface; @@ -34,7 +34,7 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf /** * The relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -47,10 +47,10 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf * The plugin_id for the plugin instance. * @param array $plugin_definition * The plugin implementation definition. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The relation info service. */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, JoinupRelationManagerInterface $relation_info) { + public function __construct(array $configuration, $plugin_id, array $plugin_definition, JoinupGroupRelationInfoInterface $relation_info) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->relationInfo = $relation_info; } diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index d0e7152957..9667d9d876 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -7,7 +7,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Query\QueryInterface; use Drupal\Core\Language\LanguageManagerInterface; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\simple_sitemap\EntityHelper; use Drupal\simple_sitemap\Logger; use Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\EntityUrlGenerator; @@ -30,7 +30,7 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { /** * The Joinup group relation info service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationInfo; @@ -55,10 +55,10 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * The sitemap entity helper service. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager $url_generator_manager * The url generator manager service. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relation_info + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info * The joinup group relation info service. */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupRelationManagerInterface $relation_info) { + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupGroupRelationInfoInterface $relation_info) { parent::__construct($configuration, $plugin_id, $plugin_definition, $generator, $logger, $language_manager, $entity_type_manager, $entityHelper, $url_generator_manager); $this->urlGeneratorManager = $url_generator_manager; $this->relationInfo = $relation_info; diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index 01078727f3..b2d60bc9d7 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -16,7 +16,7 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\csv_serialization\Encoder\CsvEncoder; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\og\GroupTypeManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; @@ -42,7 +42,7 @@ class GroupAdministratorsController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $joinupRelationManager; @@ -65,14 +65,14 @@ class GroupAdministratorsController extends ControllerBase { * * @param \Drupal\og\GroupTypeManager $groupTypeManager * The OG group type manager. - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $joinupRelationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $joinupRelationManager * The Joinup relation manager. * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityTypeBundleInfo * The entity type bundle info service. * @param \Drupal\Core\Routing\RouteMatchInterface $routeMatch * The current route match service. */ - public function __construct(GroupTypeManager $groupTypeManager, JoinupRelationManagerInterface $joinupRelationManager, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { + public function __construct(GroupTypeManager $groupTypeManager, JoinupGroupRelationInfoInterface $joinupRelationManager, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { $this->groupTypeManager = $groupTypeManager; $this->joinupRelationManager = $joinupRelationManager; $this->entityTypeBundleInfo = $entityTypeBundleInfo; diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index 2d33c8d856..0345a25483 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -11,7 +11,7 @@ use Drupal\Core\Session\AccountInterface; use Drupal\joinup\PinServiceInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\og\OgAccessInterface; use Drupal\rdf_entity\RdfInterface; @@ -39,21 +39,21 @@ class PinEntityController extends ControllerBase { /** * The Joinup relation manager. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationManager; /** * Instantiates a new PinEntityController object. * - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager * The Joinup relation manager. * @param \Drupal\og\OgAccessInterface $ogAccess * The OG access service. * @param \Drupal\joinup\PinServiceInterface $pinService * The pin service. */ - public function __construct(JoinupRelationManagerInterface $relationManager, OgAccessInterface $ogAccess, PinServiceInterface $pinService) { + public function __construct(JoinupGroupRelationInfoInterface $relationManager, OgAccessInterface $ogAccess, PinServiceInterface $pinService) { $this->relationManager = $relationManager; $this->ogAccess = $ogAccess; $this->pinService = $pinService; diff --git a/web/profiles/joinup/src/PinService.php b/web/profiles/joinup/src/PinService.php index 4285c38506..1ea2db9676 100644 --- a/web/profiles/joinup/src/PinService.php +++ b/web/profiles/joinup/src/PinService.php @@ -7,7 +7,7 @@ use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_group\JoinupRelationManagerInterface; +use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\rdf_entity\RdfInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -27,17 +27,17 @@ class PinService implements PinServiceInterface, ContainerInjectionInterface { /** * The relations manager service. * - * @var \Drupal\joinup_group\JoinupRelationManagerInterface + * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ protected $relationManager; /** * Constructs a PinService service. * - * @param \Drupal\joinup_group\JoinupRelationManagerInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager * The relations manager service. */ - public function __construct(JoinupRelationManagerInterface $relationManager) { + public function __construct(JoinupGroupRelationInfoInterface $relationManager) { $this->relationManager = $relationManager; } From 91eeaddf070ee6b84b5b2a280041eb7f50682007 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 16:33:18 +0200 Subject: [PATCH 300/957] ISAICP-5692: Update code that was referencing the old name of the group relation info service. --- web/modules/custom/joinup_core/README.md | 4 ++-- .../custom/joinup_core/src/Guard/NodeGuard.php | 14 +++++++------- .../Controller/BooleanFieldToggleController.php | 12 ++++++------ .../custom/joinup_group/joinup_group.services.yml | 2 +- .../custom/joinup_group/src/Form/ShareFormBase.php | 2 +- .../src/ProxyClass/JoinupGroupRelationInfo.php | 4 ++-- .../Controller/GroupAdministratorsController.php | 14 +++++++------- .../joinup/src/Controller/PinEntityController.php | 14 +++++++------- web/profiles/joinup/src/PinService.php | 12 ++++++------ 9 files changed, 39 insertions(+), 39 deletions(-) diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 5019a18012..187324bdd9 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -53,7 +53,7 @@ function joinup_news_workflow_selector(EntityInterface $entity) { if ($entity->bundle() != 'news') { throw new Exception('This method can only be called for document entities'); } - /** @var \Drupal\joinup_group\JoinupRelationManager $relation_info */ + /** @var \Drupal\joinup_group\JoinupGroupRelationInfo $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $moderation = $relation_info->getParentModeration($entity); $moderation_type = $moderation == 1 ? 'pre_moderated' : 'post_moderated'; @@ -144,7 +144,7 @@ into the class. For example, in the joinup_news module, this is the constructor: ``` public function __construct( EntityTypeManagerInterface $entityTypeManager, - JoinupRelationManager $relationInfo, + JoinupGroupRelationInfoInterface $relationInfo, MembershipManagerInterface $ogMembershipManager, ConfigFactoryInterface $configFactory, AccountInterface $currentUser diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php index 56ac2313f5..d8abfddafd 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php @@ -27,11 +27,11 @@ class NodeGuard implements GuardInterface { protected $currentUser; /** - * The relation manager service. + * The relation info service. * * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ - protected $relationManager; + protected $relationInfo; /** * The allowed transitions array. @@ -67,8 +67,8 @@ class NodeGuard implements GuardInterface { * The classes inheriting this class, should also ensure that they set the * protected variable $transitions to be used by the ::allowed() method. * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager - * The relation manager service. + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo + * The relation info service. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The configuration factory service. * @param \Drupal\Core\Session\AccountInterface $currentUser @@ -78,8 +78,8 @@ class NodeGuard implements GuardInterface { * @param \Drupal\workflow_state_permission\WorkflowStatePermissionInterface $workflowStatePermission * The workflow state permission service. */ - public function __construct(JoinupGroupRelationInfoInterface $relationManager, ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { - $this->relationManager = $relationManager; + public function __construct(JoinupGroupRelationInfoInterface $relationInfo, ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { + $this->relationInfo = $relationInfo; $this->currentUser = $currentUser; $this->workflowHelper = $workflow_helper; $this->permissionScheme = $configFactory->get('joinup_community_content.permission_scheme'); @@ -104,7 +104,7 @@ public function allowed(WorkflowTransition $transition, WorkflowInterface $workf public function allowedCreate(WorkflowTransition $transition, WorkflowInterface $workflow, EntityInterface $entity) { $permission_scheme = $this->permissionScheme->get('create'); $workflow_id = $workflow->getId(); - $content_creation = (string) $this->relationManager->getParentContentCreationOption($entity); + $content_creation = (string) $this->relationInfo->getParentContentCreationOption($entity); if (!isset($permission_scheme[$workflow_id][$content_creation][$transition->getId()])) { return FALSE; diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 5c658fd607..9e5dda83de 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -22,20 +22,20 @@ class BooleanFieldToggleController extends ControllerBase { /** - * The Joinup relation manager. + * The Joinup group relation info service. * * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ - protected $relationManager; + protected $relationInfo; /** * Instantiates a new SiteFeatureController object. * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo * The Joinup relation manager. */ - public function __construct(JoinupGroupRelationInfoInterface $relationManager) { - $this->relationManager = $relationManager; + public function __construct(JoinupGroupRelationInfoInterface $relationInfo) { + $this->relationInfo = $relationInfo; } /** @@ -113,7 +113,7 @@ protected function getRedirect(ContentEntityInterface $entity) { $redirect = $entity->toUrl(); } else { - $redirect = $this->relationManager->getParent($entity)->toUrl(); + $redirect = $this->relationInfo->getParent($entity)->toUrl(); } return $this->redirect($redirect->getRouteName(), $redirect->getRouteParameters()); diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index c1cfa05878..aac00615f0 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -9,7 +9,7 @@ services: arguments: ['@og.membership_manager', '@entity_type.manager'] lazy: true joinup_group.relation_info: - class: Drupal\joinup_group\JoinupRelationManager + class: Drupal\joinup_group\JoinupGroupRelationInfo arguments: ['@og.membership_manager', '@entity_type.manager'] lazy: true joinup_group.route_subscriber: diff --git a/web/modules/custom/joinup_group/src/Form/ShareFormBase.php b/web/modules/custom/joinup_group/src/Form/ShareFormBase.php index 12f4f887a7..a2a5900b5e 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareFormBase.php +++ b/web/modules/custom/joinup_group/src/Form/ShareFormBase.php @@ -193,7 +193,7 @@ protected function getPermissionForAction(string $action): string { */ protected function getExcludedParent(): ?RdfInterface { if ($this->entity->getEntityTypeId() === 'node') { - return $this->relationManager->getParent($this->entity); + return $this->relationInfo->getParent($this->entity); } else { return $this->entity->get('collection')->isEmpty() ? NULL : $this->entity->get('collection')->first()->entity; diff --git a/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php index 3cc53d6119..a8830c3139 100644 --- a/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php @@ -2,13 +2,13 @@ // @codingStandardsIgnoreFile /** - * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_group\JoinupRelationManager' "modules/custom/joinup_group/src". + * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\joinup_group\JoinupGroupRelationInfo' "modules/custom/joinup_group/src". */ namespace Drupal\joinup_group\ProxyClass { /** - * Provides a proxy class for \Drupal\joinup_group\JoinupRelationManager. + * Provides a proxy class for \Drupal\joinup_group\JoinupGroupRelationInfo. * * @see \Drupal\Component\ProxyBuilder */ diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index b2d60bc9d7..13bcc632da 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -40,11 +40,11 @@ class GroupAdministratorsController extends ControllerBase { protected $groupTypeManager; /** - * The Joinup relation manager. + * The Joinup group relation info service. * * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ - protected $joinupRelationManager; + protected $relationInfo; /** * The entity type bundle info service. @@ -65,16 +65,16 @@ class GroupAdministratorsController extends ControllerBase { * * @param \Drupal\og\GroupTypeManager $groupTypeManager * The OG group type manager. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $joinupRelationManager - * The Joinup relation manager. + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo + * The Joinup group relation info service. * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityTypeBundleInfo * The entity type bundle info service. * @param \Drupal\Core\Routing\RouteMatchInterface $routeMatch * The current route match service. */ - public function __construct(GroupTypeManager $groupTypeManager, JoinupGroupRelationInfoInterface $joinupRelationManager, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { + public function __construct(GroupTypeManager $groupTypeManager, JoinupGroupRelationInfoInterface $relationInfo, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { $this->groupTypeManager = $groupTypeManager; - $this->joinupRelationManager = $joinupRelationManager; + $this->relationInfo = $relationInfo; $this->entityTypeBundleInfo = $entityTypeBundleInfo; $this->routeMatch = $routeMatch; } @@ -375,7 +375,7 @@ protected function getAdministrativeCollectionMemberships(): array { // Since this is a moderator-only feature that is rarely used we don't need // to worry about the potential performance impact of loading a large number // of memberships. - $collection_ids = $this->joinupRelationManager->getCollectionIds(); + $collection_ids = $this->relationInfo->getCollectionIds(); if (empty($collection_ids)) { return []; diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index 0345a25483..a2cfe8f94a 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -37,24 +37,24 @@ class PinEntityController extends ControllerBase { protected $pinService; /** - * The Joinup relation manager. + * The Joinup group relation info service. * * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ - protected $relationManager; + protected $relationInfo; /** * Instantiates a new PinEntityController object. * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager - * The Joinup relation manager. + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo + * The Joinup group relation info service. * @param \Drupal\og\OgAccessInterface $ogAccess * The OG access service. * @param \Drupal\joinup\PinServiceInterface $pinService * The pin service. */ - public function __construct(JoinupGroupRelationInfoInterface $relationManager, OgAccessInterface $ogAccess, PinServiceInterface $pinService) { - $this->relationManager = $relationManager; + public function __construct(JoinupGroupRelationInfoInterface $relationInfo, OgAccessInterface $ogAccess, PinServiceInterface $pinService) { + $this->relationInfo = $relationInfo; $this->ogAccess = $ogAccess; $this->pinService = $pinService; } @@ -190,7 +190,7 @@ protected function getGroups(ContentEntityInterface $entity) { $groups = $entity->get('collection')->referencedEntities(); } elseif (CommunityContentHelper::isCommunityContent($entity)) { - $groups = [$this->relationManager->getParent($entity)]; + $groups = [$this->relationInfo->getParent($entity)]; } $list = []; diff --git a/web/profiles/joinup/src/PinService.php b/web/profiles/joinup/src/PinService.php index 1ea2db9676..38e8c554e7 100644 --- a/web/profiles/joinup/src/PinService.php +++ b/web/profiles/joinup/src/PinService.php @@ -25,20 +25,20 @@ class PinService implements PinServiceInterface, ContainerInjectionInterface { const SOLUTION_PIN_FIELD = 'field_is_pinned_in'; /** - * The relations manager service. + * The group relations info service. * * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface */ - protected $relationManager; + protected $relationInfo; /** * Constructs a PinService service. * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationManager + * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo * The relations manager service. */ - public function __construct(JoinupGroupRelationInfoInterface $relationManager) { - $this->relationManager = $relationManager; + public function __construct(JoinupGroupRelationInfoInterface $relationInfo) { + $this->relationInfo = $relationInfo; } /** @@ -109,7 +109,7 @@ public function getGroupsWherePinned(ContentEntityInterface $entity) { return $entity->get(self::SOLUTION_PIN_FIELD)->referencedEntities(); } elseif (CommunityContentHelper::isCommunityContent($entity) && $entity->isSticky()) { - return [$this->relationManager->getParent($entity)]; + return [$this->relationInfo->getParent($entity)]; } return []; From 5f5bc5568136d40a8d461e9f9761fda8f508c717 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 17:31:46 +0200 Subject: [PATCH 301/957] ISAICP-5692: The NodeGuard guards community content so it belongs in joinup_community_content. This also solves a circular dependency between joinup_group and joinup_core. --- .../joinup_community_content.services.yml | 5 +++++ web/modules/custom/joinup_core/README.md | 2 +- web/modules/custom/joinup_core/joinup_core.services.yml | 5 ----- web/modules/custom/joinup_core/src/Guard/NodeGuard.php | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index 88a49bb73d..3142f13dd8 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -9,3 +9,8 @@ services: arguments: ['@entity_type.manager', '@joinup_notification.message_delivery', '@logger.factory'] tags: - { name: 'event_subscriber' } + joinup_community_content.fulfillment_guard: + class: Drupal\joinup_community_content\Guard\NodeGuard + arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] + tags: + - { name: state_machine.guard, group: community_content } diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 187324bdd9..fd6959040e 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -134,7 +134,7 @@ settings](../joinup_news/config/install/joinup_news.settings) file. ### The guard class The `Guard class` will take care of the allowed transitions. This class is now centralized and the base class exists in joinup_core. This class is -`Drupal\joinup_core\Guard\NodeGuard`. The guard classes of the community content +`Drupal\joinup_community_content\Guard\NodeGuard`. The guard classes of the community content should extend this class and make use of the `allowed()` method -if possible- without overriding it. The only thing needed to be done in the guard class, is to load the diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index a5ce0bdb1b..1d1aa7817b 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -1,9 +1,4 @@ services: - joinup_core.fulfillment_guard: - class: Drupal\joinup_core\Guard\NodeGuard - arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] - tags: - - { name: state_machine.guard, group: community_content } joinup_core.joinup_version: class: Drupal\joinup_core\JoinupVersion joinup_core.node_workflow_access: diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php index d8abfddafd..709039800b 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_core/src/Guard/NodeGuard.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Guard; +namespace Drupal\joinup_community_content\Guard; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityInterface; @@ -15,7 +15,7 @@ use Drupal\workflow_state_permission\WorkflowStatePermissionInterface; /** - * Guard class for the transitions of nodes. + * Guard class for the transitions of community content. */ class NodeGuard implements GuardInterface { From c124d0d158b96aadd10cbd70663d5368fd52e787 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 17:44:57 +0200 Subject: [PATCH 302/957] ISAICP-5692: Move NodeWorkflowAccessControlHandler into the right module. This solves a circular dependency between joinup_group and joinup_core. --- .../joinup_community_content.module | 2 +- .../joinup_community_content.services.yml | 3 +++ .../src/NodeWorkflowAccessControlHandler.php | 3 ++- .../CommunityContentWorkflowStatePermission.php | 2 +- web/modules/custom/joinup_core/README.md | 2 +- web/modules/custom/joinup_core/joinup_core.module | 2 +- web/modules/custom/joinup_core/joinup_core.services.yml | 3 --- .../src/Controller/CommunityContentController.php | 8 ++++---- .../tests/src/ExistingSite/NodeWorkflowTestBase.php | 4 ++-- 9 files changed, 15 insertions(+), 14 deletions(-) rename web/modules/custom/{joinup_core => joinup_community_content}/src/NodeWorkflowAccessControlHandler.php (99%) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 34953680b2..71b8c877ed 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -13,7 +13,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\Url; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_core\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; /** * Implements hook_entity_extra_field_info(). diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index 3142f13dd8..fc565aca6c 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -14,3 +14,6 @@ services: arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } + joinup_community_content.node_workflow_access: + class: Drupal\joinup_community_content\NodeWorkflowAccessControlHandler + arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_group.relation_info', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] diff --git a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php similarity index 99% rename from web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php rename to web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php index 9c0c798fce..244a96d8bd 100644 --- a/web/modules/custom/joinup_core/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core; +namespace Drupal\joinup_community_content; use Drupal\Core\Access\AccessResult; use Drupal\Core\Config\ConfigFactoryInterface; @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; diff --git a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php index 4ad7d82f6e..b805a32c85 100644 --- a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php +++ b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php @@ -10,7 +10,7 @@ use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_core\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\workflow_state_permission\WorkflowStatePermissionPluginInterface; diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index fd6959040e..5eaa8418f0 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -195,7 +195,7 @@ base will integrate with the rest. The way this is achieved is by creating a handler that will invoke all other handlers and finally approve or reject the operation access. -The handler is `Drupal\joinup_core\NodeWorkflowAccessControlHandler` and is also +The handler is `Drupal\joinup_community_content\NodeWorkflowAccessControlHandler` and is also hosted in joinup_core. joinup_core also handles the invocation of this class using the `hook_node_access`. diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index dffde89d71..316feb9357 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -150,7 +150,7 @@ function joinup_core_node_access(NodeInterface $entity, string $operation, Accou if (!CommunityContentHelper::isCommunityContent($entity)) { return AccessResult::neutral(); } - return \Drupal::service('joinup_core.node_workflow_access')->entityAccess($entity, $operation, $account); + return \Drupal::service('joinup_community_content.node_workflow_access')->entityAccess($entity, $operation, $account); } /** diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index 1d1aa7817b..fd3923720d 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -1,9 +1,6 @@ services: joinup_core.joinup_version: class: Drupal\joinup_core\JoinupVersion - joinup_core.node_workflow_access: - class: Drupal\joinup_core\NodeWorkflowAccessControlHandler - arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_group.relation_info', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] joinup_core.og_subscriber: class: Drupal\joinup_core\EventSubscriber\JoinupCoreOgSubscriber tags: diff --git a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php index ef29b3517d..094c5d84a7 100644 --- a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php +++ b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php @@ -7,7 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; use Drupal\og\OgAccessInterface; use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\rdf_entity\RdfInterface; @@ -30,7 +30,7 @@ abstract class CommunityContentController extends ControllerBase { /** * The node workflow access control handler. * - * @var \Drupal\joinup_core\NodeWorkflowAccessControlHandler + * @var \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler */ protected $workflowAccessControlHandler; @@ -39,7 +39,7 @@ abstract class CommunityContentController extends ControllerBase { * * @param \Drupal\og\OgAccessInterface $og_access * The OG access handler. - * @param \Drupal\joinup_core\NodeWorkflowAccessControlHandler $workflow_access_control_handler + * @param \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler $workflow_access_control_handler * The node workflow access control handler. */ public function __construct(OgAccessInterface $og_access, NodeWorkflowAccessControlHandler $workflow_access_control_handler) { @@ -53,7 +53,7 @@ public function __construct(OgAccessInterface $og_access, NodeWorkflowAccessCont public static function create(ContainerInterface $container) { return new static( $container->get('og.access'), - $container->get('joinup_core.node_workflow_access') + $container->get('joinup_community_content.node_workflow_access') ); } diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php index e697a2ed3e..176bb7b2b5 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php @@ -81,7 +81,7 @@ abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { * just a bundle due to the need to check extra information regarding the * group that the entity belongs to. * - * @var \Drupal\joinup_core\NodeWorkflowAccessControlHandler + * @var \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler */ protected $workflowAccess; @@ -91,7 +91,7 @@ abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { public function setUp(): void { parent::setUp(); - $this->workflowAccess = \Drupal::service('joinup_core.node_workflow_access'); + $this->workflowAccess = \Drupal::service('joinup_community_content.node_workflow_access'); $this->userOwner = $this->createUser(); $this->userAnonymous = new AnonymousUserSession(); $this->userAuthenticated = $this->createUser(); From 2d93b8d37e16c5567e6dd8793fd8484207a93342 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 19 Mar 2020 18:03:42 +0200 Subject: [PATCH 303/957] ISAICP-5692: Update tests that fail due to services shifting around. --- .../tests/src/Kernel/CustomTokensTest.php | 1 + web/modules/custom/joinup_group/joinup_group.module | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php index 1e94a86eec..6f0c05ea98 100644 --- a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php +++ b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php @@ -24,6 +24,7 @@ class CustomTokensTest extends TokenReplaceKernelTestBase { 'comment', 'diff', 'joinup_community_content', + 'joinup_group', 'message_notify', 'node', 'og', diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module index 755a85b7a5..a1f63def03 100644 --- a/web/modules/custom/joinup_group/joinup_group.module +++ b/web/modules/custom/joinup_group/joinup_group.module @@ -56,8 +56,10 @@ function joinup_group_entity_type_alter(array &$entity_types) { // Override the delete form to disallow deletion of groups with children. /** @var \Drupal\Core\Entity\ContentEntityTypeInterface $rdf_entity_type */ - $rdf_entity_type = $entity_types['rdf_entity']; - $rdf_entity_type->setFormClass('delete', RdfDeleteForm::class); + if (array_key_exists('rdf_entity', $entity_types)) { + $rdf_entity_type = $entity_types['rdf_entity']; + $rdf_entity_type->setFormClass('delete', RdfDeleteForm::class); + } } /** From 97604fec56c69aba3be5539612aecdf3cbf3386e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 09:24:45 +0200 Subject: [PATCH 304/957] ISAICP-5692: Deduplicate constant. --- .../src/ExistingSite/NodeWorkflowTestBase.php | 24 +++++++++---------- .../ExistingSite/DiscussionWorkflowTest.php | 13 +++++----- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php index 176bb7b2b5..677fa76aff 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php @@ -5,6 +5,7 @@ namespace Drupal\Tests\joinup_core\ExistingSite; use Drupal\Core\Session\AnonymousUserSession; +use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; use Drupal\joinup_group\ContentCreationOptions; use Drupal\node\Entity\Node; use Drupal\og\Entity\OgRole; @@ -21,9 +22,6 @@ abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { use NodeCreationTrait; - const PRE_MODERATION = 1; - const POST_MODERATION = 0; - /** * A user assigned as an owner to document entities. * @@ -306,7 +304,7 @@ protected function deleteOperationTest(): void { protected function createAccessProvider(): array { return [ 'collection' => [ - self::PRE_MODERATION => [ + NodeWorkflowAccessControlHandler::PRE_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -364,7 +362,7 @@ protected function createAccessProvider(): array { ], ], ], - self::POST_MODERATION => [ + NodeWorkflowAccessControlHandler::POST_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -418,7 +416,7 @@ protected function createAccessProvider(): array { ], ], 'solution' => [ - self::PRE_MODERATION => [ + NodeWorkflowAccessControlHandler::PRE_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -456,7 +454,7 @@ protected function createAccessProvider(): array { ], ], ], - self::POST_MODERATION => [ + NodeWorkflowAccessControlHandler::POST_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -640,7 +638,7 @@ protected function viewAccessProvider(): array { */ protected function updateAccessProvider(): array { $data = [ - self::PRE_MODERATION => [ + NodeWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => [ 'draft', @@ -713,7 +711,7 @@ protected function updateAccessProvider(): array { ], ], ], - self::POST_MODERATION => [ + NodeWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => [ 'draft', @@ -819,7 +817,7 @@ protected function updateAccessProvider(): array { protected function deleteAccessProvider(): array { return [ 'collection' => [ - self::PRE_MODERATION => [ + NodeWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -851,7 +849,7 @@ protected function deleteAccessProvider(): array { ], ], ], - self::POST_MODERATION => [ + NodeWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -882,7 +880,7 @@ protected function deleteAccessProvider(): array { ], ], 'solution' => [ - self::PRE_MODERATION => [ + NodeWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -914,7 +912,7 @@ protected function deleteAccessProvider(): array { ], ], ], - self::POST_MODERATION => [ + NodeWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ diff --git a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php index bd56305ed5..e33fd7d962 100644 --- a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php +++ b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php @@ -4,6 +4,7 @@ namespace Drupal\Tests\joinup_discussion\ExistingSite; +use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; use Drupal\Tests\joinup_core\ExistingSite\NodeWorkflowTestBase; /** @@ -33,7 +34,7 @@ protected function getEntityBundle(): string { protected function createAccessProvider(): array { $return = parent::createAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($return[$bundle][self::PRE_MODERATION]); + unset($return[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); } return $return; } @@ -64,9 +65,9 @@ protected function viewAccessProvider(): array { protected function updateAccessProvider(): array { $data = parent::updateAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($data[$bundle][self::PRE_MODERATION]); + unset($data[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); foreach (['userModerator', 'userOgFacilitator'] as $user) { - $data[$bundle][self::POST_MODERATION]['validated']['any'][$user][] = 'archived'; + $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['validated']['any'][$user][] = 'archived'; } } @@ -79,9 +80,9 @@ protected function updateAccessProvider(): array { protected function deleteAccessProvider(): array { $data = parent::deleteAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($data[$bundle][self::PRE_MODERATION]); - $data[$bundle][self::POST_MODERATION]['archived']['own'] = TRUE; - $data[$bundle][self::POST_MODERATION]['archived']['any'] = [ + unset($data[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); + $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['archived']['own'] = TRUE; + $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['archived']['any'] = [ 'userModerator', 'userOgFacilitator', ]; From da22956db524d5ee2d9a4527c0f2efafae545df9 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 09:26:04 +0200 Subject: [PATCH 305/957] ISAICP-5692: Remove PHPStorm cruft. --- .../joinup_federation/src/JoinupFederationHashGenerator.php | 2 -- .../joinup_front_page/src/FrontPageMenuHelperInterface.php | 2 -- web/modules/custom/joinup_group/src/JoinupGroupManager.php | 2 -- .../Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php | 2 -- 4 files changed, 8 deletions(-) diff --git a/web/modules/custom/joinup_federation/src/JoinupFederationHashGenerator.php b/web/modules/custom/joinup_federation/src/JoinupFederationHashGenerator.php index c820280eda..3b4c30423d 100644 --- a/web/modules/custom/joinup_federation/src/JoinupFederationHashGenerator.php +++ b/web/modules/custom/joinup_federation/src/JoinupFederationHashGenerator.php @@ -12,8 +12,6 @@ /** * Helper class to generate a hash containing all data of an rdf entity. - * - * @package Drupal\joinup_federation */ class JoinupFederationHashGenerator { diff --git a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php index d6e6c76a3c..76e704794c 100644 --- a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php +++ b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php @@ -10,8 +10,6 @@ /** * Interface FrontPageMenuHelperInterface. - * - * @package Drupal\joinup_front_page */ interface FrontPageMenuHelperInterface { diff --git a/web/modules/custom/joinup_group/src/JoinupGroupManager.php b/web/modules/custom/joinup_group/src/JoinupGroupManager.php index 5798aadf46..cc42417ef4 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupManager.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupManager.php @@ -15,8 +15,6 @@ /** * Helper methods related to the Joinup groups. - * - * @package Drupal\joinup_group */ class JoinupGroupManager implements JoinupGroupManagerInterface { diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php index 5238866db4..28119e31d8 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/SitemapType/LatestNewsSitemapType.php @@ -9,8 +9,6 @@ /** * A sitemap type that includes generators related to latest news. * - * @package Drupal\joinup_seo\Plugin\simple_sitemap\SitemapType - * * @SitemapType( * id = "latest_news", * label = @Translation("Latest news"), From ade28550a84a2c1cea631f090bb04b9855857f24 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 09:32:16 +0200 Subject: [PATCH 306/957] ISAICP-5692: Move the test base class for community content workflows into the correct module. --- .../tests/src/ExistingSite/NodeWorkflowTestBase.php | 3 ++- .../tests/src/ExistingSite/DiscussionWorkflowTest.php | 2 +- .../tests/src/ExistingSite/DocumentWorkflowTest.php | 2 +- .../joinup_event/tests/src/ExistingSite/EventWorkflowTest.php | 2 +- .../joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) rename web/modules/custom/{joinup_core => joinup_community_content}/tests/src/ExistingSite/NodeWorkflowTestBase.php (99%) diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php similarity index 99% rename from web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php rename to web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php index 677fa76aff..6030bae72e 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\Tests\joinup_core\ExistingSite; +namespace Drupal\Tests\joinup_community_content\ExistingSite; use Drupal\Core\Session\AnonymousUserSession; use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; @@ -11,6 +11,7 @@ use Drupal\og\Entity\OgRole; use Drupal\og\OgGroupAudienceHelper; use Drupal\rdf_entity\RdfInterface; +use Drupal\Tests\joinup_core\ExistingSite\JoinupWorkflowExistingSiteTestBase; use weitzman\DrupalTestTraits\Entity\NodeCreationTrait; /** diff --git a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php index e33fd7d962..55e43407ac 100644 --- a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php +++ b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php @@ -5,7 +5,7 @@ namespace Drupal\Tests\joinup_discussion\ExistingSite; use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; -use Drupal\Tests\joinup_core\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the discussion node. diff --git a/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php b/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php index 5eb60ce497..2fd5f4e3f9 100644 --- a/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php +++ b/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php @@ -4,7 +4,7 @@ namespace Drupal\Tests\joinup_document\ExistingSite; -use Drupal\Tests\joinup_core\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the document node. diff --git a/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php b/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php index 68044c63fa..1494171224 100644 --- a/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php +++ b/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php @@ -4,7 +4,7 @@ namespace Drupal\Tests\joinup_event\ExistingSite; -use Drupal\Tests\joinup_core\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the event node. diff --git a/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php b/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php index cde8572153..472cd6db48 100644 --- a/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php +++ b/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php @@ -4,7 +4,7 @@ namespace Drupal\Tests\joinup_news\ExistingSite; -use Drupal\Tests\joinup_core\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the news node. From 53789a1375b9cdbb09a66758128c25f0f7947bfc Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 09:35:29 +0200 Subject: [PATCH 307/957] ISAICP-5692: Rename classes that deal exclusively with community content to make clear that they do so. --- .../joinup_community_content.module | 4 +-- .../joinup_community_content.services.yml | 4 +-- ...tyContentWorkflowAccessControlHandler.php} | 4 +-- ...ommunityContentWorkflowStatePermission.php | 4 +-- ...p => CommunityContentWorkflowTestBase.php} | 28 +++++++++---------- web/modules/custom/joinup_core/README.md | 2 +- .../custom/joinup_core/joinup_core.module | 2 +- .../Controller/CommunityContentController.php | 10 +++---- .../ExistingSite/DiscussionWorkflowTest.php | 18 ++++++------ .../src/ExistingSite/DocumentWorkflowTest.php | 4 +-- .../src/ExistingSite/EventWorkflowTest.php | 4 +-- .../src/ExistingSite/NewsWorkflowTest.php | 4 +-- 12 files changed, 44 insertions(+), 44 deletions(-) rename web/modules/custom/joinup_community_content/src/{NodeWorkflowAccessControlHandler.php => CommunityContentWorkflowAccessControlHandler.php} (99%) rename web/modules/custom/joinup_community_content/tests/src/ExistingSite/{NodeWorkflowTestBase.php => CommunityContentWorkflowTestBase.php} (96%) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 71b8c877ed..0c3b990629 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -13,7 +13,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; use Drupal\Core\Url; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; /** * Implements hook_entity_extra_field_info(). @@ -113,7 +113,7 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $moderation = $relation_info->getParentModeration($entity); - return $moderation == NodeWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; + return $moderation == CommunityContentWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; } /** diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index fc565aca6c..fc80be9e6b 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -14,6 +14,6 @@ services: arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } - joinup_community_content.node_workflow_access: - class: Drupal\joinup_community_content\NodeWorkflowAccessControlHandler + joinup_community_content.community_content_workflow_access: + class: Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_group.relation_info', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] diff --git a/web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php similarity index 99% rename from web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php rename to web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index 244a96d8bd..015221a8b4 100644 --- a/web/modules/custom/joinup_community_content/src/NodeWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -30,7 +30,7 @@ * * @see joinup_community_content.permission_scheme.yml */ -class NodeWorkflowAccessControlHandler { +class CommunityContentWorkflowAccessControlHandler { /** * The state field machine name. @@ -111,7 +111,7 @@ class NodeWorkflowAccessControlHandler { protected $workflowHelper; /** - * Constructs a new NodeWorkflowAccessControlHandler. + * Constructs a new CommunityContentWorkflowAccessControlHandler. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager service. diff --git a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php index b805a32c85..732e395c14 100644 --- a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php +++ b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php @@ -10,7 +10,7 @@ use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\workflow_state_permission\WorkflowStatePermissionPluginInterface; @@ -103,7 +103,7 @@ public function isStateUpdatePermitted(AccountInterface $account, EntityInterfac $permission_scheme = $this->configFactory->get('joinup_community_content.permission_scheme')->get('update'); $access = FALSE; - $workflow_id = $entity->{NodeWorkflowAccessControlHandler::STATE_FIELD}->first()->getWorkflow()->getId(); + $workflow_id = $entity->{CommunityContentWorkflowAccessControlHandler::STATE_FIELD}->first()->getWorkflow()->getId(); $matrix = $permission_scheme[$workflow_id][$to_state][$from_state] ?? NULL; if (!empty($matrix) && $this->workflowHelper->userHasOwnAnyRoles($entity, $account, $matrix)) { $access = TRUE; diff --git a/web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php similarity index 96% rename from web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php rename to web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php index 6030bae72e..02bb18429d 100644 --- a/web/modules/custom/joinup_community_content/tests/src/ExistingSite/NodeWorkflowTestBase.php +++ b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php @@ -5,7 +5,7 @@ namespace Drupal\Tests\joinup_community_content\ExistingSite; use Drupal\Core\Session\AnonymousUserSession; -use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; use Drupal\joinup_group\ContentCreationOptions; use Drupal\node\Entity\Node; use Drupal\og\Entity\OgRole; @@ -19,7 +19,7 @@ * * @group rdf_entity */ -abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { +abstract class CommunityContentWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { use NodeCreationTrait; @@ -80,7 +80,7 @@ abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { * just a bundle due to the need to check extra information regarding the * group that the entity belongs to. * - * @var \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler + * @var \Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler */ protected $workflowAccess; @@ -90,7 +90,7 @@ abstract class NodeWorkflowTestBase extends JoinupWorkflowExistingSiteTestBase { public function setUp(): void { parent::setUp(); - $this->workflowAccess = \Drupal::service('joinup_community_content.node_workflow_access'); + $this->workflowAccess = \Drupal::service('joinup_community_content.community_content_workflow_access'); $this->userOwner = $this->createUser(); $this->userAnonymous = new AnonymousUserSession(); $this->userAuthenticated = $this->createUser(); @@ -305,7 +305,7 @@ protected function deleteOperationTest(): void { protected function createAccessProvider(): array { return [ 'collection' => [ - NodeWorkflowAccessControlHandler::PRE_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::PRE_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -363,7 +363,7 @@ protected function createAccessProvider(): array { ], ], ], - NodeWorkflowAccessControlHandler::POST_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::POST_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -417,7 +417,7 @@ protected function createAccessProvider(): array { ], ], 'solution' => [ - NodeWorkflowAccessControlHandler::PRE_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::PRE_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -455,7 +455,7 @@ protected function createAccessProvider(): array { ], ], ], - NodeWorkflowAccessControlHandler::POST_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::POST_MODERATION => [ ContentCreationOptions::FACILITATORS => [ 'userModerator' => [ 'draft', @@ -639,7 +639,7 @@ protected function viewAccessProvider(): array { */ protected function updateAccessProvider(): array { $data = [ - NodeWorkflowAccessControlHandler::PRE_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => [ 'draft', @@ -712,7 +712,7 @@ protected function updateAccessProvider(): array { ], ], ], - NodeWorkflowAccessControlHandler::POST_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => [ 'draft', @@ -818,7 +818,7 @@ protected function updateAccessProvider(): array { protected function deleteAccessProvider(): array { return [ 'collection' => [ - NodeWorkflowAccessControlHandler::PRE_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -850,7 +850,7 @@ protected function deleteAccessProvider(): array { ], ], ], - NodeWorkflowAccessControlHandler::POST_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -881,7 +881,7 @@ protected function deleteAccessProvider(): array { ], ], 'solution' => [ - NodeWorkflowAccessControlHandler::PRE_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::PRE_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ @@ -913,7 +913,7 @@ protected function deleteAccessProvider(): array { ], ], ], - NodeWorkflowAccessControlHandler::POST_MODERATION => [ + CommunityContentWorkflowAccessControlHandler::POST_MODERATION => [ 'draft' => [ 'own' => TRUE, 'any' => [ diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index 5eaa8418f0..cf3c36d90a 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -195,7 +195,7 @@ base will integrate with the rest. The way this is achieved is by creating a handler that will invoke all other handlers and finally approve or reject the operation access. -The handler is `Drupal\joinup_community_content\NodeWorkflowAccessControlHandler` and is also +The handler is `Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler` and is also hosted in joinup_core. joinup_core also handles the invocation of this class using the `hook_node_access`. diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 316feb9357..8dc61da13b 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -150,7 +150,7 @@ function joinup_core_node_access(NodeInterface $entity, string $operation, Accou if (!CommunityContentHelper::isCommunityContent($entity)) { return AccessResult::neutral(); } - return \Drupal::service('joinup_community_content.node_workflow_access')->entityAccess($entity, $operation, $account); + return \Drupal::service('joinup_community_content.community_content_workflow_access')->entityAccess($entity, $operation, $account); } /** diff --git a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php index 094c5d84a7..efc99e6930 100644 --- a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php +++ b/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php @@ -7,7 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; use Drupal\og\OgAccessInterface; use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\rdf_entity\RdfInterface; @@ -30,7 +30,7 @@ abstract class CommunityContentController extends ControllerBase { /** * The node workflow access control handler. * - * @var \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler + * @var \Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler */ protected $workflowAccessControlHandler; @@ -39,10 +39,10 @@ abstract class CommunityContentController extends ControllerBase { * * @param \Drupal\og\OgAccessInterface $og_access * The OG access handler. - * @param \Drupal\joinup_community_content\NodeWorkflowAccessControlHandler $workflow_access_control_handler + * @param \Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler $workflow_access_control_handler * The node workflow access control handler. */ - public function __construct(OgAccessInterface $og_access, NodeWorkflowAccessControlHandler $workflow_access_control_handler) { + public function __construct(OgAccessInterface $og_access, CommunityContentWorkflowAccessControlHandler $workflow_access_control_handler) { $this->ogAccess = $og_access; $this->workflowAccessControlHandler = $workflow_access_control_handler; } @@ -53,7 +53,7 @@ public function __construct(OgAccessInterface $og_access, NodeWorkflowAccessCont public static function create(ContainerInterface $container) { return new static( $container->get('og.access'), - $container->get('joinup_community_content.node_workflow_access') + $container->get('joinup_community_content.community_content_workflow_access') ); } diff --git a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php index 55e43407ac..9fb0f200e1 100644 --- a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php +++ b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php @@ -4,15 +4,15 @@ namespace Drupal\Tests\joinup_discussion\ExistingSite; -use Drupal\joinup_community_content\NodeWorkflowAccessControlHandler; -use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; +use Drupal\Tests\joinup_community_content\ExistingSite\CommunityContentWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the discussion node. * * @group joinup_discussion */ -class DiscussionWorkflowTest extends NodeWorkflowTestBase { +class DiscussionWorkflowTest extends CommunityContentWorkflowTestBase { /** * {@inheritdoc} @@ -34,7 +34,7 @@ protected function getEntityBundle(): string { protected function createAccessProvider(): array { $return = parent::createAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($return[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); + unset($return[$bundle][CommunityContentWorkflowAccessControlHandler::PRE_MODERATION]); } return $return; } @@ -65,9 +65,9 @@ protected function viewAccessProvider(): array { protected function updateAccessProvider(): array { $data = parent::updateAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($data[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); + unset($data[$bundle][CommunityContentWorkflowAccessControlHandler::PRE_MODERATION]); foreach (['userModerator', 'userOgFacilitator'] as $user) { - $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['validated']['any'][$user][] = 'archived'; + $data[$bundle][CommunityContentWorkflowAccessControlHandler::POST_MODERATION]['validated']['any'][$user][] = 'archived'; } } @@ -80,9 +80,9 @@ protected function updateAccessProvider(): array { protected function deleteAccessProvider(): array { $data = parent::deleteAccessProvider(); foreach (['collection', 'solution'] as $bundle) { - unset($data[$bundle][NodeWorkflowAccessControlHandler::PRE_MODERATION]); - $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['archived']['own'] = TRUE; - $data[$bundle][NodeWorkflowAccessControlHandler::POST_MODERATION]['archived']['any'] = [ + unset($data[$bundle][CommunityContentWorkflowAccessControlHandler::PRE_MODERATION]); + $data[$bundle][CommunityContentWorkflowAccessControlHandler::POST_MODERATION]['archived']['own'] = TRUE; + $data[$bundle][CommunityContentWorkflowAccessControlHandler::POST_MODERATION]['archived']['any'] = [ 'userModerator', 'userOgFacilitator', ]; diff --git a/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php b/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php index 2fd5f4e3f9..9f50187421 100644 --- a/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php +++ b/web/modules/custom/joinup_document/tests/src/ExistingSite/DocumentWorkflowTest.php @@ -4,14 +4,14 @@ namespace Drupal\Tests\joinup_document\ExistingSite; -use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\CommunityContentWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the document node. * * @group workflow */ -class DocumentWorkflowTest extends NodeWorkflowTestBase { +class DocumentWorkflowTest extends CommunityContentWorkflowTestBase { /** * {@inheritdoc} diff --git a/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php b/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php index 1494171224..061e7a0119 100644 --- a/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php +++ b/web/modules/custom/joinup_event/tests/src/ExistingSite/EventWorkflowTest.php @@ -4,14 +4,14 @@ namespace Drupal\Tests\joinup_event\ExistingSite; -use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\CommunityContentWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the event node. * * @group workflow */ -class EventWorkflowTest extends NodeWorkflowTestBase { +class EventWorkflowTest extends CommunityContentWorkflowTestBase { /** * {@inheritdoc} diff --git a/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php b/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php index 472cd6db48..eab86d40e7 100644 --- a/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php +++ b/web/modules/custom/joinup_news/tests/src/ExistingSite/NewsWorkflowTest.php @@ -4,14 +4,14 @@ namespace Drupal\Tests\joinup_news\ExistingSite; -use Drupal\Tests\joinup_community_content\ExistingSite\NodeWorkflowTestBase; +use Drupal\Tests\joinup_community_content\ExistingSite\CommunityContentWorkflowTestBase; /** * Tests CRUD operations and workflow transitions for the news node. * * @group workflow */ -class NewsWorkflowTest extends NodeWorkflowTestBase { +class NewsWorkflowTest extends CommunityContentWorkflowTestBase { /** * {@inheritdoc} From 9931564bc4806186b5159fac9a440883084ff594 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 10:00:24 +0200 Subject: [PATCH 308/957] ISAICP-5692: Solve circular dependency between joinup_community_content and joinup_core. --- .../joinup_community_content.module | 13 +++++++++++++ web/modules/custom/joinup_core/joinup_core.module | 13 ------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 0c3b990629..cfa6be0d41 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -7,13 +7,16 @@ declare(strict_types = 1); +use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; +use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; use Drupal\joinup_community_content\CommunityContentHelper; use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; +use Drupal\node\NodeInterface; /** * Implements hook_entity_extra_field_info(). @@ -48,6 +51,16 @@ function joinup_community_content_node_view(array &$build, EntityInterface $enti ]; } +/** + * Implements hook_node_access(). + */ +function joinup_community_content_node_access(NodeInterface $entity, string $operation, AccountInterface $account): AccessResult { + if (!CommunityContentHelper::isCommunityContent($entity)) { + return AccessResult::neutral(); + } + return \Drupal::service('joinup_community_content.community_content_workflow_access')->entityAccess($entity, $operation, $account); +} + /** * Implements hook_form_BASE_FORM_ID_alter(). */ diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 8dc61da13b..139153943e 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -8,7 +8,6 @@ declare(strict_types = 1); use Drupal\Component\Utility\Html; -use Drupal\Core\Access\AccessResult; use Drupal\Core\Cache\Cache; use Drupal\Core\Database\Query\AlterableInterface; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; @@ -18,11 +17,9 @@ use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; -use Drupal\Core\Session\AccountInterface; use Drupal\Core\StreamWrapper\StreamWrapperManager; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Template\Attribute; -use Drupal\joinup_community_content\CommunityContentHelper; use Drupal\joinup_core\Element\Datetime; use Drupal\joinup_core\Entity\Controller\JoinupRdfListBuilder; use Drupal\node\NodeInterface; @@ -143,16 +140,6 @@ function joinup_core_form_rdf_entity_form_alter(&$form, FormStateInterface $form } } -/** - * Implements hook_node_access(). - */ -function joinup_core_node_access(NodeInterface $entity, string $operation, AccountInterface $account): AccessResult { - if (!CommunityContentHelper::isCommunityContent($entity)) { - return AccessResult::neutral(); - } - return \Drupal::service('joinup_community_content.community_content_workflow_access')->entityAccess($entity, $operation, $account); -} - /** * Implements hook_entity_base_field_info(). * From 1f1d68abd0c86f4dbf88764730eb5190191025d6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 10:01:03 +0200 Subject: [PATCH 309/957] ISAICP-5692: PHPStorm keeps insisting that this is better. --- .../joinup_community_content/joinup_community_content.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index cfa6be0d41..27395b3a5c 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -219,7 +219,7 @@ function joinup_community_content_translate_facet_arguments(array $arguments) { ]; foreach ($arguments as &$argument) { - list($facet_id, $value) = explode(':', $argument, 2); + [$facet_id, $value] = explode(':', $argument, 2); if (array_key_exists($facet_id, $mapping)) { $argument = implode(':', [$mapping[$facet_id], $value]); } From 232099caf27f8465ec2c7dadbb6e768b02671af8 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 10:04:28 +0200 Subject: [PATCH 310/957] ISAICP-5692: Clean up outdated terminology. --- .../src/Controller/BooleanFieldToggleController.php | 2 +- .../joinup_group/src/JoinupGroupRelationInfoInterface.php | 2 +- .../src/EventSubscriber/CommunityContentSubscriber.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 9e5dda83de..7ef0a3fd29 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -32,7 +32,7 @@ class BooleanFieldToggleController extends ControllerBase { * Instantiates a new SiteFeatureController object. * * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo - * The Joinup relation manager. + * The Joinup group relation info service. */ public function __construct(JoinupGroupRelationInfoInterface $relationInfo) { $this->relationInfo = $relationInfo; diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index d3b266de00..0bf5f66779 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -10,7 +10,7 @@ use Drupal\rdf_entity\RdfInterface; /** - * An interface for Joinup relation manager services. + * An interface for services that provide information about group relations. */ interface JoinupGroupRelationInfoInterface { diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index ecf593aa5c..8e53e09df1 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -86,7 +86,7 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper * The workflow helper service. * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The relation manager service. + * The Joinup group relation info service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. * @param \Drupal\state_machine_revisions\RevisionManagerInterface $revision_manager From 2480ce805c6e09791591592b02516f4a81086d3e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 10:12:08 +0200 Subject: [PATCH 311/957] ISAICP-5692: Move the guard class for community content into the right module and give it a better name. --- .../joinup_community_content.services.yml | 2 +- .../src/Guard/CommunityContentGuard.php} | 4 ++-- web/modules/custom/joinup_core/README.md | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename web/modules/custom/{joinup_core/src/Guard/NodeGuard.php => joinup_community_content/src/Guard/CommunityContentGuard.php} (97%) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index fc80be9e6b..8a494eb6be 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -10,7 +10,7 @@ services: tags: - { name: 'event_subscriber' } joinup_community_content.fulfillment_guard: - class: Drupal\joinup_community_content\Guard\NodeGuard + class: Drupal\joinup_community_content\Guard\CommunityContentGuard arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } diff --git a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php similarity index 97% rename from web/modules/custom/joinup_core/src/Guard/NodeGuard.php rename to web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php index 709039800b..284d9f2cd8 100644 --- a/web/modules/custom/joinup_core/src/Guard/NodeGuard.php +++ b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php @@ -17,7 +17,7 @@ /** * Guard class for the transitions of community content. */ -class NodeGuard implements GuardInterface { +class CommunityContentGuard implements GuardInterface { /** * The current logged in user. @@ -62,7 +62,7 @@ class NodeGuard implements GuardInterface { protected $workflowStatePermission; /** - * Instantiates the NodeGuard service. + * Constructs a new CommunityContentGuard service. * * The classes inheriting this class, should also ensure that they set the * protected variable $transitions to be used by the ::allowed() method. diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index cf3c36d90a..e313d03839 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -134,7 +134,7 @@ settings](../joinup_news/config/install/joinup_news.settings) file. ### The guard class The `Guard class` will take care of the allowed transitions. This class is now centralized and the base class exists in joinup_core. This class is -`Drupal\joinup_community_content\Guard\NodeGuard`. The guard classes of the community content +`Drupal\joinup_community_content\Guard\CommunityContentGuard`. The guard classes of the community content should extend this class and make use of the `allowed()` method -if possible- without overriding it. The only thing needed to be done in the guard class, is to load the @@ -160,11 +160,11 @@ public function __construct( ->get('joinup_news.settings')->get('transitions'); } ``` -The `$this->transitions` is the array defined in the `NodeGuard` class and is +The `$this->transitions` is the array defined in the `CommunityContentGuard` class and is used in the `allowed()` method so it needs to be populated otherwise the functionality will break. -By default the checks taking place in the `NodeGuard` class are (by sequence): +By default the checks taking place in the `CommunityContentGuard` class are (by sequence): * if the transition array is not populated (as described above), no transitions are allowed; * if the passed user has the admin permission on the entity type, all From 1c8b4138e752c141191153ff2a07de3c0ed40d64 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 11:27:25 +0200 Subject: [PATCH 312/957] ISAICP-5692: Move the CommunityContentController into the right module. --- .../custom_page/src/Controller/CustomPageController.php | 2 +- .../src/Controller/CommunityContentController.php | 4 ++-- .../joinup_discussion/src/Controller/DiscussionController.php | 2 +- .../joinup_document/src/Controller/DocumentController.php | 2 +- .../custom/joinup_event/src/Controller/EventController.php | 2 +- .../custom/joinup_news/src/Controller/NewsController.php | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename web/modules/custom/{joinup_core => joinup_community_content}/src/Controller/CommunityContentController.php (97%) diff --git a/web/modules/custom/custom_page/src/Controller/CustomPageController.php b/web/modules/custom/custom_page/src/Controller/CustomPageController.php index 5c360c1aeb..d83dd386bd 100644 --- a/web/modules/custom/custom_page/src/Controller/CustomPageController.php +++ b/web/modules/custom/custom_page/src/Controller/CustomPageController.php @@ -8,7 +8,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_core\Controller\CommunityContentController; +use Drupal\joinup_community_content\Controller\CommunityContentController; use Drupal\og_menu\OgMenuInstanceInterface; use Drupal\rdf_entity\RdfInterface; diff --git a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php b/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php similarity index 97% rename from web/modules/custom/joinup_core/src/Controller/CommunityContentController.php rename to web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php index efc99e6930..f277ed1a7f 100644 --- a/web/modules/custom/joinup_core/src/Controller/CommunityContentController.php +++ b/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Controller; +namespace Drupal\joinup_community_content\Controller; use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; @@ -35,7 +35,7 @@ abstract class CommunityContentController extends ControllerBase { protected $workflowAccessControlHandler; /** - * Constructs an CommunityContentController. + * Constructs a CommunityContentController. * * @param \Drupal\og\OgAccessInterface $og_access * The OG access handler. diff --git a/web/modules/custom/joinup_discussion/src/Controller/DiscussionController.php b/web/modules/custom/joinup_discussion/src/Controller/DiscussionController.php index aad2fec3e2..39403aa297 100644 --- a/web/modules/custom/joinup_discussion/src/Controller/DiscussionController.php +++ b/web/modules/custom/joinup_discussion/src/Controller/DiscussionController.php @@ -4,7 +4,7 @@ namespace Drupal\joinup_discussion\Controller; -use Drupal\joinup_core\Controller\CommunityContentController; +use Drupal\joinup_community_content\Controller\CommunityContentController; /** * Controller that handles the form to add discussion to a collection. diff --git a/web/modules/custom/joinup_document/src/Controller/DocumentController.php b/web/modules/custom/joinup_document/src/Controller/DocumentController.php index 516f83f3cd..734e0a9227 100644 --- a/web/modules/custom/joinup_document/src/Controller/DocumentController.php +++ b/web/modules/custom/joinup_document/src/Controller/DocumentController.php @@ -4,7 +4,7 @@ namespace Drupal\joinup_document\Controller; -use Drupal\joinup_core\Controller\CommunityContentController; +use Drupal\joinup_community_content\Controller\CommunityContentController; /** * Controller that handles the form to add document to a collection. diff --git a/web/modules/custom/joinup_event/src/Controller/EventController.php b/web/modules/custom/joinup_event/src/Controller/EventController.php index b89cb0d5c5..cd4a4805dc 100644 --- a/web/modules/custom/joinup_event/src/Controller/EventController.php +++ b/web/modules/custom/joinup_event/src/Controller/EventController.php @@ -4,7 +4,7 @@ namespace Drupal\joinup_event\Controller; -use Drupal\joinup_core\Controller\CommunityContentController; +use Drupal\joinup_community_content\Controller\CommunityContentController; /** * Controller that handles the form to add event to a collection. diff --git a/web/modules/custom/joinup_news/src/Controller/NewsController.php b/web/modules/custom/joinup_news/src/Controller/NewsController.php index 91def27c7b..6dafdb4862 100644 --- a/web/modules/custom/joinup_news/src/Controller/NewsController.php +++ b/web/modules/custom/joinup_news/src/Controller/NewsController.php @@ -4,7 +4,7 @@ namespace Drupal\joinup_news\Controller; -use Drupal\joinup_core\Controller\CommunityContentController; +use Drupal\joinup_community_content\Controller\CommunityContentController; /** * Controller that handles the form to add news to a collection or a solution. From 10303ad6be064a75ada1bafbce570af200e4c127 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 11:29:25 +0200 Subject: [PATCH 313/957] ISAICP-5692: The joinup_user module no longer depends on joinup_core. --- web/modules/custom/joinup_user/joinup_user.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_user/joinup_user.info.yml b/web/modules/custom/joinup_user/joinup_user.info.yml index 0aa32e2c77..71f854385c 100644 --- a/web/modules/custom/joinup_user/joinup_user.info.yml +++ b/web/modules/custom/joinup_user/joinup_user.info.yml @@ -5,7 +5,6 @@ core: 8.x package: Joinup dependencies: - 'drupal:user' - - 'joinup:joinup_core' - 'joinup:search_api_field' - 'message:message' - 'og:og' From cc5ea5ed85eea3cbda5d96d7646df991fb55ce6e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 12:29:11 +0200 Subject: [PATCH 314/957] ISAICP-5692: Type hint the workflow helper to help in discoverability and linting. --- web/modules/custom/collection/collection.module | 4 +++- .../custom/contact_information/contact_information.module | 4 +++- web/modules/custom/owner/owner.module | 4 +++- web/modules/custom/solution/solution.module | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/collection/collection.module b/web/modules/custom/collection/collection.module index d64e65da39..0d72c7c77f 100644 --- a/web/modules/custom/collection/collection.module +++ b/web/modules/custom/collection/collection.module @@ -138,7 +138,9 @@ function collection_rdf_entity_access(EntityInterface $entity, $operation, Accou break; case 'edit': - $allowed_transitions = \Drupal::service('joinup_core.workflow.helper')->getAvailableTransitions($entity, $account); + /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + $allowed_transitions = $workflow_helper->getAvailableTransitions($entity, $account); return empty($allowed_transitions) ? AccessResult::forbidden() : AccessResult::allowed(); default: diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 55c75991ec..7080048091 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -134,7 +134,9 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati } } elseif ($operation == 'edit') { - $available_target_states = \Drupal::service('joinup_core.workflow.helper')->getAvailableTargetStates($entity, $account); + /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + $available_target_states = $workflow_helper->getAvailableTargetStates($entity, $account); return empty($available_target_states) ? AccessResult::forbidden() : AccessResult::allowed(); } // Use an elseif to avoid checking memberships for anonymous users. diff --git a/web/modules/custom/owner/owner.module b/web/modules/custom/owner/owner.module index 29a85e5336..5340438123 100644 --- a/web/modules/custom/owner/owner.module +++ b/web/modules/custom/owner/owner.module @@ -167,7 +167,9 @@ function owner_rdf_entity_access(EntityInterface $entity, $operation, AccountInt switch ($operation) { case 'edit': - $allowed_states = \Drupal::service('joinup_core.workflow.helper')->getAvailableTargetStates($entity, $account); + /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + $allowed_states = $workflow_helper->getAvailableTargetStates($entity, $account); return AccessResult::forbiddenIf(empty($allowed_states)); } // Revoke access to canonical route for anonymous users. diff --git a/web/modules/custom/solution/solution.module b/web/modules/custom/solution/solution.module index 7de5f1be51..cd53182b12 100644 --- a/web/modules/custom/solution/solution.module +++ b/web/modules/custom/solution/solution.module @@ -168,7 +168,9 @@ function solution_rdf_entity_access(EntityInterface $entity, $operation, Account } if ($operation == 'edit') { - $allowed_transitions = \Drupal::service('joinup_core.workflow.helper')->getAvailableTransitions($entity, $account); + /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + $allowed_transitions = $workflow_helper->getAvailableTransitions($entity, $account); if (empty($allowed_transitions)) { return AccessResult::forbidden(); } From 5fdc7dbc4b371579cc66a851c984c38a41e4ed0b Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 20 Mar 2020 12:49:20 +0200 Subject: [PATCH 315/957] ISAICP-5901: Provide a test to reproduce the regression error. --- .../add_document.collection.feature | 3 +++ tests/src/Traits/TraversingTrait.php | 25 +++++++++++-------- web/profiles/joinup/joinup.behat.inc | 21 ++++++++++------ 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/tests/features/joinup_document/add_document.collection.feature b/tests/features/joinup_document/add_document.collection.feature index c44ac951c4..a569903bc7 100644 --- a/tests/features/joinup_document/add_document.collection.feature +++ b/tests/features/joinup_document/add_document.collection.feature @@ -60,6 +60,9 @@ Feature: "Add document" visibility options. | Title | An amazing document | | Short title | Amazing document | And I select "Document" from "Type" + # Regression test: Document is successfully displayed even when a publication date is not set. + And I clear the date of the "Publication date" widget + And I clear the time of the "Publication date" widget Then I upload the file "test.zip" to "Upload a new file or enter a URL" And I press "Save as draft" Then I should see the error message "Description field is required." diff --git a/tests/src/Traits/TraversingTrait.php b/tests/src/Traits/TraversingTrait.php index 5aa30685dd..cd98b2f3fd 100644 --- a/tests/src/Traits/TraversingTrait.php +++ b/tests/src/Traits/TraversingTrait.php @@ -359,10 +359,12 @@ protected static function getFacetIdFromAlias(string $alias): string { * * @param string $field * The date range field name. - * @param string $date - * The sub-field name. Either "start" or "end". * @param string $component * The sub-field component. Either "date" or "time". + * @param string $date + * (optional) The sub-field name. Either "start" or "end". If left empty, it + * is assumed that the field is a simple datetime field and not a range, + * thus, the date or time components are looked in the whole field. * * @return \Behat\Mink\Element\NodeElement * The date or time component element. @@ -370,7 +372,7 @@ protected static function getFacetIdFromAlias(string $alias): string { * @throws \Exception * Thrown when the date range field is not found. */ - protected function findDateRangeComponent(string $field, string $date, string $component): NodeElement { + protected function findDateRangeComponent(string $field, string $component, string $date = NULL): NodeElement { /** @var \Behat\Mink\Element\NodeElement $fieldset */ $fieldset = $this->getSession()->getPage()->find('named', ['fieldset', $field]); @@ -378,16 +380,19 @@ protected function findDateRangeComponent(string $field, string $date, string $c throw new \Exception("The '$field' field was not found."); } - $date = ucfirst($date) . ' date'; - /** @var \Behat\Mink\Element\NodeElement $element */ - $element = $fieldset->find('xpath', '//h4[text()="' . $date . '"]//following-sibling::div[1]'); - - if (!$element) { - throw new \Exception("The '$date' sub-field of the '$field' field was not found."); + if ($date !== NULL) { + $date = ucfirst($date) . ' date'; + /** @var \Behat\Mink\Element\NodeElement $element */ + $element = $fieldset->find('xpath', '//h4[text()="' . $date . '"]//following-sibling::div[1]'); + if (!$element) { + throw new \Exception("The '$date' sub-field of the '$field' field was not found."); + } + } + else { + $element = $fieldset; } $component_node = $element->findField(ucfirst($component)); - if (!$component_node) { throw new \Exception("The '$component' component for the '$field' '$element' was not found."); } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index f738433300..6d6ce9abae 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -846,20 +846,22 @@ class JoinupSubContext extends DrupalSubContextBase { * * @param string $field * The date range field name. - * @param string $date - * The sub-field name. Either "start" or "end". * @param string $component * The sub-field component. Either "date" or "time". * @param string $value * The field value. + * @param string $date + * (optional) The sub-field name. Either "start" or "end". If left empty, it + * is assumed that the field is a simple datetime field and not a range, + * thus, the date or time components are looked in the whole field. * * @throws \Exception * Thrown when the date range field is not found. * * @When I fill the :date :component of the :field widget with :value */ - public function fillDateRangeField($field, $date, $component, $value) { - $element = $this->findDateRangeComponent($field, $date, $component); + public function fillDateRangeField($field, $component, $value, $date = NULL) { + $element = $this->findDateRangeComponent($field, $component, $date); $element->setValue($value); } @@ -868,18 +870,21 @@ class JoinupSubContext extends DrupalSubContextBase { * * @param string $field * The date range field name. - * @param string $date - * The sub-field name. Either "start" or "end". * @param string $component * The sub-field component. Either "date" or "time". + * @param string $date + * (optional) The sub-field name. Either "start" or "end". If left empty, it + * is assumed that the field is a simple datetime field and not a range, + * thus, the date or time components are looked in the whole field. * * @throws \Exception * Thrown when the date range field is not found. * * @When I clear the :date :component of the :field widget + * @When I clear the :component of the :field widget */ - public function clearDateRangeField($field, $date, $component) { - $element = $this->findDateRangeComponent($field, $date, $component); + public function clearDateRangeField($field, $component, $date = NULL) { + $element = $this->findDateRangeComponent($field, $component, $date); $element->setValue(''); } From 4013aa4d6a9a71eacd39bd53251e2f1097c90cef Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 20 Mar 2020 12:54:03 +0200 Subject: [PATCH 316/957] ISAICP-5901: Ensure that the value is set before trying to convert it. --- web/themes/joinup/joinup_theme.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index d1b58ce738..7d9ba5806f 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1064,7 +1064,7 @@ function joinup_theme_preprocess_page_title__node__document(&$variables) { // The raw value allowed to properly display the field above with any class // or configuration applied but still have the value to compare to the changed // date in the Twig template. - $variables['additional_content']['field_document_publication_date_raw'] = $date_formatter->format(strtotime($publication_date_value), 'custom', 'd/m/Y'); + $variables['additional_content']['field_document_publication_date_raw'] = empty($publication_date_value) ? '' : $date_formatter->format(strtotime($publication_date_value), 'custom', 'd/m/Y'); $update_date = $date_formatter->format($node->getChangedTime(), 'custom', 'd/m/Y'); $variables['additional_content']['updated'] = $update_date; From eb743124ac2ac24d05f9daa0d8c7528f1e62fffe Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 13:19:53 +0200 Subject: [PATCH 317/957] ISAICP-5692: The asset_distribution module no longer depends on joinup_core. --- .../custom/asset_distribution/asset_distribution.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/asset_distribution/asset_distribution.info.yml b/web/modules/custom/asset_distribution/asset_distribution.info.yml index 85e07822ad..b62862b52f 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.info.yml +++ b/web/modules/custom/asset_distribution/asset_distribution.info.yml @@ -13,7 +13,6 @@ dependencies: - 'drupal:views' - 'field_group:field_group' - 'file_url:file_url' - - 'joinup:joinup_core' - 'joinup:joinup_user' - 'joinup:rdf_schema_field_validation' - 'rdf_entity:rdf_entity' From b0d3a0be9466ae975d0cb1535e8f777a28211117 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 13:21:17 +0200 Subject: [PATCH 318/957] ISAICP-5692: The custom_page module no longer depends on joinup_core. --- web/modules/custom/custom_page/custom_page.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/custom_page/custom_page.info.yml b/web/modules/custom/custom_page/custom_page.info.yml index 951e45ada5..11b45af9bd 100644 --- a/web/modules/custom/custom_page/custom_page.info.yml +++ b/web/modules/custom/custom_page/custom_page.info.yml @@ -9,7 +9,6 @@ dependencies: - 'drupal:path' - 'drupal:user' - 'joinup:joinup_community_content' - - 'joinup:joinup_core' - 'joinup:joinup_group' - 'joinup:search_api_field' - 'og:og' From 527a64a5edd10d02d80133f910ec6a1ac01ebd82 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 13:22:43 +0200 Subject: [PATCH 319/957] ISAICP-5692: The joinup_front_page module no longer depends on joinup_core. --- web/modules/custom/joinup_front_page/joinup_front_page.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml index 9e1d0676d8..ff41e7902f 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml +++ b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml @@ -5,7 +5,6 @@ core: 8.x package: Joinup dependencies: - - 'joinup:joinup_core' - 'joinup:joinup_group' - 'menu_admin_per_menu:menu_admin_per_menu' From 26f2d3e0ad1d1010598cab99b589a5a4df9008bf Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 13:23:25 +0200 Subject: [PATCH 320/957] ISAICP-5692: The joinup_invite module no longer depends on joinup_core. --- web/modules/custom/joinup_invite/joinup_invite.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_invite/joinup_invite.info.yml b/web/modules/custom/joinup_invite/joinup_invite.info.yml index 5babe8cf8f..83cb0b62f4 100644 --- a/web/modules/custom/joinup_invite/joinup_invite.info.yml +++ b/web/modules/custom/joinup_invite/joinup_invite.info.yml @@ -4,7 +4,6 @@ description: A light invitation system for joinup. core: 8.x package: Joinup dependencies: - - joinup:joinup_core - joinup:joinup_notification - joinup:joinup_subscription - og:og From ff313a31333cdd79c0340d694c13410b613cb968 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 15:13:21 +0200 Subject: [PATCH 321/957] ISAICP-5692: Update documentation. --- .../joinup_group/src/JoinupGroupRelationInfoInterface.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 0bf5f66779..65f264c4ef 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -34,8 +34,8 @@ public function getParent(EntityInterface $entity): ?RdfInterface; * * @return int * The moderation status. Can be one of the following values: - * - NodeWorkflowAccessControlHandler::PRE_MODERATION - * - NodeWorkflowAccessControlHandler::POST_MODERATION + * - CommunityContentWorkflowAccessControlHandler::PRE_MODERATION + * - CommunityContentWorkflowAccessControlHandler::POST_MODERATION */ public function getParentModeration(EntityInterface $entity): ?int; From 01e73f11a1d46790698d7c722cf0ec14c717f7b6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 15:43:55 +0200 Subject: [PATCH 322/957] ISAICP-5902: Create a new module that will contain shared code related to workflows. --- web/modules/custom/joinup_workflow/joinup_workflow.info.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 web/modules/custom/joinup_workflow/joinup_workflow.info.yml diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.info.yml b/web/modules/custom/joinup_workflow/joinup_workflow.info.yml new file mode 100644 index 0000000000..717e714530 --- /dev/null +++ b/web/modules/custom/joinup_workflow/joinup_workflow.info.yml @@ -0,0 +1,6 @@ +name: Joinup Workflow +type: module +description: Shared code for handling workflows in Joinup. +package: Joinup +core: 8.x +core_version_requirement: ^8 || ^9 From d647ea62d948bfb8748755f6e5efaa7bdf257e54 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 15:46:48 +0200 Subject: [PATCH 323/957] ISAICP-5902: Move the CurrentWorkflowStateWidget into the new joinup_workflow module. --- .../Field/FieldType/CurrentWorkflowStateFieldItemList.php | 2 +- .../Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) rename web/modules/custom/{joinup_core => joinup_workflow}/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php (97%) diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php index fea7176d53..46fb1ecf2c 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php @@ -20,7 +20,7 @@ class CurrentWorkflowStateFieldItemList extends FieldItemList { protected function computeValue() { // We don't need to compute an initial value since the values are set by the // widget. Just set an empty value. - // @see \Drupal\joinup_core\Plugin\Field\FieldWidget\CurrentWorkflowStateWidget::validateFormElement() + // @see \Drupal\joinup_workflow\Plugin\Field\FieldWidget\CurrentWorkflowStateWidget::validateFormElement() $this->list[0] = $this->createItem(0, ''); } diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php similarity index 97% rename from web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php rename to web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php index 6b832785a1..3e635e07c3 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php @@ -1,6 +1,8 @@ Date: Fri, 20 Mar 2020 15:51:02 +0200 Subject: [PATCH 324/957] ISAICP-5902: Move the CurrentWorkflowStateFieldItemList into the new joinup_workflow module. --- .../src/Plugin/Field/FieldType/CurrentWorkflowState.php | 2 +- .../Field/FieldType/CurrentWorkflowStateFieldItemList.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename web/modules/custom/{joinup_core => joinup_workflow}/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php (91%) diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php index cb56ad34f8..ccf590b290 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php +++ b/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php @@ -19,7 +19,7 @@ * label = @Translation("Current workflow state"), * description = @Translation("Computed field that shows the current workflow state."), * no_ui = TRUE, - * list_class = "\Drupal\joinup_core\Plugin\Field\FieldType\CurrentWorkflowStateFieldItemList", + * list_class = "\Drupal\joinup_workflow\Plugin\Field\FieldType\CurrentWorkflowStateFieldItemList", * default_widget = "current_workflow_state_widget", * default_formatter = "current_workflow_state_field_formatter" * ) diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php similarity index 91% rename from web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php rename to web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php index 46fb1ecf2c..6e049e32a3 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowStateFieldItemList.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Plugin\Field\FieldType; +namespace Drupal\joinup_workflow\Plugin\Field\FieldType; use Drupal\Core\Field\FieldItemList; use Drupal\Core\TypedData\ComputedItemListTrait; From 57634cce5085bd07f107925d0677dc6673919eba Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 15:53:26 +0200 Subject: [PATCH 325/957] ISAICP-5902: Move the CurrentWorkflowState into the new joinup_workflow module. --- .../src/Plugin/Field/FieldType/CurrentWorkflowState.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename web/modules/custom/{joinup_core => joinup_workflow}/src/Plugin/Field/FieldType/CurrentWorkflowState.php (96%) diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowState.php similarity index 96% rename from web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php rename to web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowState.php index ccf590b290..92eb2c0e92 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldType/CurrentWorkflowState.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldType/CurrentWorkflowState.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Plugin\Field\FieldType; +namespace Drupal\joinup_workflow\Plugin\Field\FieldType; use Drupal\Component\Utility\Random; use Drupal\Core\Field\FieldDefinitionInterface; From 0efa35f54ac5de0a9afbddde613a99f66e42c57c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 20 Mar 2020 16:01:25 +0200 Subject: [PATCH 326/957] ISAICP-5902: Move remaining code related to the CurrentWorkflowState field into joinup_workflow. --- .../config/schema/joinup_core.schema.yml | 14 -------- .../custom/joinup_core/joinup_core.module | 14 -------- .../config/schema/joinup_core.schema.yml | 13 +++++++ .../joinup_workflow/joinup_workflow.module | 35 +++++++++++++++++++ 4 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml create mode 100644 web/modules/custom/joinup_workflow/joinup_workflow.module diff --git a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml index 939b423914..5c42004880 100644 --- a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml +++ b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml @@ -36,20 +36,6 @@ field.formatter.settings.daterange_condensed: type: date_format label: 'Different years format' -field.widget.settings.current_workflow_state_widget: - type: mapping - label: 'Field widget format settings for the current workflow state field.' - mapping: - title: - type: string - label: 'The title to use for the field widget.' - title_display: - type: string - label: 'The setting that determines how the field widget title is displayed.' - show_for_new_entities: - type: boolean - label: 'The setting that allows to show the widget on entity creation forms.' - field.widget.settings.email_legacy_multicardinality: type: field.widget.settings.email_default diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 139153943e..66419881de 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -18,7 +18,6 @@ use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; use Drupal\Core\StreamWrapper\StreamWrapperManager; -use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Template\Attribute; use Drupal\joinup_core\Element\Datetime; use Drupal\joinup_core\Entity\Controller\JoinupRdfListBuilder; @@ -143,11 +142,6 @@ function joinup_core_form_rdf_entity_form_alter(&$form, FormStateInterface $form /** * Implements hook_entity_base_field_info(). * - * - Provides a base field that displays the current workflow state on nodes and - * RDF entities. This field is intended to be used on edit forms which use the - * set of buttons to perform the workflow state transitions. When these - * buttons are used the current workflow state is not indicated, so this field - * can be used to expose this information. * - Provides a 'report' field on community content pages that can be used to * report inappropriate content. * - Provides a 'path' field only for the 'rdf_entity' entities. @@ -155,14 +149,6 @@ function joinup_core_form_rdf_entity_form_alter(&$form, FormStateInterface $form function joinup_core_entity_base_field_info(EntityTypeInterface $entity_type) { $fields = []; - if ($entity_type->id() === 'rdf_entity' || $entity_type->id() === 'node') { - $fields['current_workflow_state'] = BaseFieldDefinition::create('current_workflow_state') - ->setLabel(new TranslatableMarkup('Current workflow state')) - ->setDisplayOptions('form', ['type' => 'hidden']) - ->setDisplayConfigurable('form', TRUE) - ->setComputed(TRUE); - } - // Add a 'report' field to community content entities. Currently all node // types are community content. if ($entity_type->id() === 'node') { diff --git a/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml b/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml new file mode 100644 index 0000000000..36ec8593d2 --- /dev/null +++ b/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml @@ -0,0 +1,13 @@ +field.widget.settings.current_workflow_state_widget: + type: mapping + label: 'Field widget format settings for the current workflow state field.' + mapping: + title: + type: string + label: 'The title to use for the field widget.' + title_display: + type: string + label: 'The setting that determines how the field widget title is displayed.' + show_for_new_entities: + type: boolean + label: 'The setting that allows to show the widget on entity creation forms.' diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module new file mode 100644 index 0000000000..67a185d9e1 --- /dev/null +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -0,0 +1,35 @@ +id() === 'rdf_entity' || $entity_type->id() === 'node') { + $fields['current_workflow_state'] = BaseFieldDefinition::create('current_workflow_state') + ->setLabel(new TranslatableMarkup('Current workflow state')) + ->setDisplayOptions('form', ['type' => 'hidden']) + ->setDisplayConfigurable('form', TRUE) + ->setComputed(TRUE); + } + + return $fields; +} From b86a5e368018168147b8d43d453abab9a990173f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 22:09:07 +0200 Subject: [PATCH 327/957] ISAICP-5874: Switch from role to permission-based access. --- config/sync/user.role.administrator.yml | 1 + config/sync/user.role.moderator.yml | 1 + .../sync/views.view.asset_distribution_downloads.yml | 12 ++++-------- .../asset_distribution.permissions.yml | 3 +++ .../views.view.asset_distribution_downloads.yml | 12 ++++-------- .../config/install/user.role.administrator.yml | 1 + .../config/install/user.role.moderator.yml | 1 + 7 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 web/modules/custom/asset_distribution/asset_distribution.permissions.yml diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 2ee72af83c..cddece8d43 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -9,6 +9,7 @@ label: Administrator weight: 4 is_admin: false permissions: + - 'access distribution reports' - 'administer account settings' - 'administer redirects' - 'edit collection rdf entity' diff --git a/config/sync/user.role.moderator.yml b/config/sync/user.role.moderator.yml index ab2d437a8d..00b259dff9 100644 --- a/config/sync/user.role.moderator.yml +++ b/config/sync/user.role.moderator.yml @@ -9,6 +9,7 @@ is_admin: false permissions: - 'access contact form messages' - 'access dashboard' + - 'access distribution reports' - 'access draft community content' - 'access joinup reports' - 'access messages overview' diff --git a/config/sync/views.view.asset_distribution_downloads.yml b/config/sync/views.view.asset_distribution_downloads.yml index 068c901eb3..04e0b46361 100644 --- a/config/sync/views.view.asset_distribution_downloads.yml +++ b/config/sync/views.view.asset_distribution_downloads.yml @@ -4,8 +4,6 @@ status: true dependencies: config: - system.menu.admin - - user.role.administrator - - user.role.moderator module: - asset_distribution - file @@ -27,11 +25,9 @@ display: position: 0 display_options: access: - type: role + type: perm options: - role: - moderator: moderator - administrator: administrator + perm: 'access distribution reports' cache: type: tag options: { } @@ -556,7 +552,7 @@ display: - 'languages:language_content' - 'languages:language_interface' - url.query_args - - user.roles + - user.permissions tags: { } page_1: display_plugin: page @@ -587,5 +583,5 @@ display: - 'languages:language_content' - 'languages:language_interface' - url.query_args - - user.roles + - user.permissions tags: { } diff --git a/web/modules/custom/asset_distribution/asset_distribution.permissions.yml b/web/modules/custom/asset_distribution/asset_distribution.permissions.yml new file mode 100644 index 0000000000..ae42873bfe --- /dev/null +++ b/web/modules/custom/asset_distribution/asset_distribution.permissions.yml @@ -0,0 +1,3 @@ +access distribution reports: + title: 'Access distribution reports' + restrict access: true diff --git a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml index fbb271a8ee..e802862e28 100644 --- a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml +++ b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml @@ -3,8 +3,6 @@ status: true dependencies: config: - system.menu.admin - - user.role.administrator - - user.role.moderator module: - asset_distribution - file @@ -24,11 +22,9 @@ display: position: 0 display_options: access: - type: role + type: perm options: - role: - moderator: moderator - administrator: administrator + perm: 'access distribution reports' cache: type: tag options: { } @@ -553,7 +549,7 @@ display: - 'languages:language_content' - 'languages:language_interface' - url.query_args - - user.roles + - user.permissions tags: { } page_1: display_plugin: page @@ -584,5 +580,5 @@ display: - 'languages:language_content' - 'languages:language_interface' - url.query_args - - user.roles + - user.permissions tags: { } diff --git a/web/modules/custom/joinup_user/config/install/user.role.administrator.yml b/web/modules/custom/joinup_user/config/install/user.role.administrator.yml index 088e969f89..1938dd3f8e 100644 --- a/web/modules/custom/joinup_user/config/install/user.role.administrator.yml +++ b/web/modules/custom/joinup_user/config/install/user.role.administrator.yml @@ -6,6 +6,7 @@ label: Administrator weight: 4 is_admin: false permissions: + - 'access distribution reports' - 'administer account settings' - 'administer redirects' - 'edit collection rdf entity' diff --git a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml index fd6d7179c7..ca758b3a7b 100644 --- a/web/modules/custom/joinup_user/config/install/user.role.moderator.yml +++ b/web/modules/custom/joinup_user/config/install/user.role.moderator.yml @@ -8,6 +8,7 @@ is_admin: false permissions: - 'access contact form messages' - 'access dashboard' + - 'access distribution reports' - 'access draft community content' - 'access joinup reports' - 'access messages overview' From 47d9dc7f014669b6946c4fdde4b1307f3d7d7d44 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 19 Mar 2020 22:12:37 +0200 Subject: [PATCH 328/957] ISAICP-5874: Move the menu item under 'Reporting' parent. --- config/sync/views.view.asset_distribution_downloads.yml | 4 ++-- .../custom/asset_distribution/asset_distribution.behat.inc | 2 +- .../install/views.view.asset_distribution_downloads.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config/sync/views.view.asset_distribution_downloads.yml b/config/sync/views.view.asset_distribution_downloads.yml index 04e0b46361..8a3ddcf427 100644 --- a/config/sync/views.view.asset_distribution_downloads.yml +++ b/config/sync/views.view.asset_distribution_downloads.yml @@ -561,13 +561,13 @@ display: position: 1 display_options: display_extenders: { } - path: admin/statistics/distribution-downloads + path: admin/reporting/distribution-downloads menu: type: normal title: 'Distribution downloads' description: '' expanded: false - parent: system.admin + parent: joinup.admin_reporting weight: 50 context: '0' menu_name: admin diff --git a/web/modules/custom/asset_distribution/asset_distribution.behat.inc b/web/modules/custom/asset_distribution/asset_distribution.behat.inc index cd76c958ed..af36ed40d8 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.behat.inc +++ b/web/modules/custom/asset_distribution/asset_distribution.behat.inc @@ -521,7 +521,7 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal * @When I go to the distribution downloads page */ public function goToDistributionDownloadsPage(): void { - $this->visitPath('admin/statistics/distribution-downloads'); + $this->visitPath('admin/reporting/distribution-downloads'); } /** diff --git a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml index e802862e28..28828e4baa 100644 --- a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml +++ b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml @@ -558,13 +558,13 @@ display: position: 1 display_options: display_extenders: { } - path: admin/statistics/distribution-downloads + path: admin/reporting/distribution-downloads menu: type: normal title: 'Distribution downloads' description: '' expanded: false - parent: system.admin + parent: joinup.admin_reporting weight: 50 context: '0' menu_name: admin From cdb6def020729d5e58bb74374147c7edb1bff379 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 20 Mar 2020 10:42:04 +0200 Subject: [PATCH 329/957] ISAICP-5874: Add a 'CSV Export' views display. --- ...iews.view.asset_distribution_downloads.yml | 54 +++++++++++++++++-- ...iews.view.asset_distribution_downloads.yml | 54 +++++++++++++++++-- 2 files changed, 102 insertions(+), 6 deletions(-) diff --git a/config/sync/views.view.asset_distribution_downloads.yml b/config/sync/views.view.asset_distribution_downloads.yml index 8a3ddcf427..89dd4ce18b 100644 --- a/config/sync/views.view.asset_distribution_downloads.yml +++ b/config/sync/views.view.asset_distribution_downloads.yml @@ -6,8 +6,12 @@ dependencies: - system.menu.admin module: - asset_distribution + - csv_serialization - file + - rest + - serialization - user + - views_data_export _core: default_config_hash: mneZWznSw4-uXX0ixH6W-D3uWnK_WhcQIwEsrGmISSA id: asset_distribution_downloads @@ -528,7 +532,7 @@ display: empty: true tokenize: false content: - value: 'No events found.' + value: 'No distributions found.' format: content_editor plugin_id: text relationships: @@ -554,9 +558,53 @@ display: - url.query_args - user.permissions tags: { } - page_1: + csv_export: + display_plugin: data_export + id: csv_export + display_title: 'CSV Export' + position: 2 + display_options: + display_extenders: { } + path: admin/reporting/distribution-downloads/csv + filename: distributions.csv + automatic_download: true + store_in_public_file_directory: false + redirect_to_display: page + custom_redirect_path: false + include_query_params: true + displays: + page: page + default: '0' + auth: + - cookie + export_method: batch + export_batch_size: 500 + style: + type: data_export + options: + formats: + csv: csv + csv_settings: + delimiter: ',' + enclosure: '"' + escape_char: \ + strip_tags: true + trim: true + encoding: utf8 + utf8_bom: '0' + use_serializer_encode_only: false + display_description: '' + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - request_format + - user.permissions + tags: { } + page: display_plugin: page - id: page_1 + id: page display_title: Page position: 1 display_options: diff --git a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml index 28828e4baa..1d34f4e134 100644 --- a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml +++ b/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml @@ -5,8 +5,12 @@ dependencies: - system.menu.admin module: - asset_distribution + - csv_serialization - file + - rest + - serialization - user + - views_data_export id: asset_distribution_downloads label: 'Distribution downloads' module: views @@ -525,7 +529,7 @@ display: empty: true tokenize: false content: - value: 'No events found.' + value: 'No distributions found.' format: content_editor plugin_id: text relationships: @@ -551,9 +555,53 @@ display: - url.query_args - user.permissions tags: { } - page_1: + csv_export: + display_plugin: data_export + id: csv_export + display_title: 'CSV Export' + position: 2 + display_options: + display_extenders: { } + path: admin/reporting/distribution-downloads/csv + filename: distributions.csv + automatic_download: true + store_in_public_file_directory: false + redirect_to_display: page + custom_redirect_path: false + include_query_params: true + displays: + page: page + default: '0' + auth: + - cookie + export_method: batch + export_batch_size: 500 + style: + type: data_export + options: + formats: + csv: csv + csv_settings: + delimiter: ',' + enclosure: '"' + escape_char: \ + strip_tags: true + trim: true + encoding: utf8 + utf8_bom: '0' + use_serializer_encode_only: false + display_description: '' + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - request_format + - user.permissions + tags: { } + page: display_plugin: page - id: page_1 + id: page display_title: Page position: 1 display_options: From 5c79132ea93c94a923cc167a9b2203c45f59a550 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 21 Mar 2020 18:32:08 +0200 Subject: [PATCH 330/957] ISAICP-5874: Allow creation of distribution download events for testing. --- .../asset_distribution.behat.inc | 69 +++++++++++++++---- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/web/modules/custom/asset_distribution/asset_distribution.behat.inc b/web/modules/custom/asset_distribution/asset_distribution.behat.inc index af36ed40d8..69ae62d16e 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.behat.inc +++ b/web/modules/custom/asset_distribution/asset_distribution.behat.inc @@ -9,13 +9,15 @@ declare(strict_types = 1); use Behat\Gherkin\Node\TableNode; use Behat\Mink\Element\NodeElement; +use Drupal\asset_distribution\Entity\DownloadEvent; use Drupal\Component\Utility\UrlHelper; +use Drupal\Core\Session\AnonymousUserSession; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; +use Drupal\file_url\FileUrlHandler; use Drupal\joinup\Traits\EntityReferenceTrait; use Drupal\joinup\Traits\FileTrait; use Drupal\joinup\Traits\RdfEntityTrait; -use Drupal\file_url\FileUrlHandler; use Drupal\joinup\Traits\SearchTrait; use Drupal\meta_entity\Entity\MetaEntity; use Drupal\rdf_entity\RdfInterface; @@ -31,11 +33,11 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal use EntityReferenceTrait; /** - * Test asset distributions. + * Test entities. * - * @var \Drupal\rdf_entity\Entity\Rdf[] + * @var \Drupal\Core\Entity\ContentEntityInterface[][] */ - protected $assetDistributions = []; + protected $entities = []; /** * Navigates to the canonical page display of an asset distribution. @@ -161,7 +163,7 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal } $asset_distribution = $this->createRdfEntity('asset_distribution', $values); - $this->assetDistributions[$asset_distribution->id()] = $asset_distribution; + $this->entities['rdf_entity'][$asset_distribution->id()] = $asset_distribution; return $asset_distribution; } @@ -211,8 +213,8 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal public function deleteAssetDistribution(string $asset_distribution): void { /** @var \Drupal\rdf_entity\Entity\Rdf $entity */ $entity = $this->getAssetDistributionByName($asset_distribution); - if (isset($this->assetDistributions[$entity->id()])) { - unset($this->assetDistributions[$entity->id()]); + if (isset($this->entities['rdf_entity'][$entity->id()])) { + unset($this->entities['rdf_entity'][$entity->id()]); } $entity->skip_notification = TRUE; $entity->delete(); @@ -271,12 +273,12 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal } /** - * Remove any created asset distributions. + * Remove any created test entities. * * @AfterScenario */ - public function cleanAssetDistributions(): void { - if (empty($this->assetDistributions)) { + public function cleanTestingEntities(): void { + if (empty($this->entities)) { return; } @@ -284,12 +286,15 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal // feature to commit the index after every query. $this->disableCommitOnUpdate(); - // Remove any asset distributions that were created. - foreach ($this->assetDistributions as $asset_distribution) { - $asset_distribution->skip_notification = TRUE; - $asset_distribution->delete(); + foreach ($this->entities as $entities) { + if (!empty($entities)) { + foreach ($entities as $entity) { + $entity->skip_notification = TRUE; + $entity->delete(); + } + } } - $this->assetDistributions = []; + $this->entities = []; $this->enableCommitOnUpdate(); } @@ -487,6 +492,40 @@ class AssetDistributionSubContext extends DrupalSubContextBase implements Drupal $element->clickLink($link); } + /** + * Creates distribution download events. + * + * Table format: + * @codingStandardsIgnoreStart + * | user | distribution | + * | Anonymous | Distro one | + * | Nickolas Underwood | Distro two | + * @codingStandardsIgnoreEnd + * If the user is a valid email, it's considered to be an anonymous user. + * + * @param \Behat\Gherkin\Node\TableNode $table + * The entries list. + * + * @Given the following distribution download events: + */ + public function downloadEvents(TableNode $table): void { + foreach ($table->getColumnsHash() as $row) { + $distribution = $this->getRdfEntityByLabel($row['distribution'], 'asset_distribution'); + /** @var \Drupal\file\FileInterface $file */ + $file = FileUrlHandler::urlToFile($distribution->get('field_ad_access_url')->target_id); + $account = \Drupal::service('email.validator')->isValid($row['user']) ? new AnonymousUserSession() : user_load_by_name($row['user']); + $mail = $account->isAnonymous() ? $row['user'] : $account->getEmail(); + $entity = DownloadEvent::create([ + 'uid' => $account->id(), + 'mail' => $mail, + 'file' => $file->id(), + ]); + $entity->save(); + $this->entities['download_event'][$entity->id()] = $entity; + } + + } + /** * Asserts the entries in the download event table. * From da20826fbe1b9acc0169ccdbe85764c787d119fa Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 20 Mar 2020 16:36:06 +0200 Subject: [PATCH 331/957] ISAICP-5874: Test coverage. --- .../asset_distribution/track_download.feature | 36 ++++++++++++ tests/features/authentication.feature | 31 +++++++++- tests/features/bootstrap/FeatureContext.php | 56 +++++++++++++++++++ 3 files changed, 120 insertions(+), 3 deletions(-) diff --git a/tests/features/asset_distribution/track_download.feature b/tests/features/asset_distribution/track_download.feature index 96a438693b..6f4cdce495 100644 --- a/tests/features/asset_distribution/track_download.feature +++ b/tests/features/asset_distribution/track_download.feature @@ -105,3 +105,39 @@ Feature: Asset distribution editing. | Marianne Sherburne | marianne.herburne@example.com | Changelog | | Marianne Sherburne | marianne.herburne@example.com | OpenBSD images | | Anonymous (not verified) | trackme@example.com | OpenBSD images | + + Scenario: Tests the CSV download. + Given users: + | Username | E-mail | + | user1 | user1@example.com | + | user2 | user2@example.com | + And the following solution: + | title | Solution | + | state | validated | + And the following distributions: + | title | parent | access url | + | Distribution 1 | Solution | text.pdf | + | Distribution 2 | Solution | test.zip | + | Distribution 3 | Solution | test1.zip | + And the following distribution download events: + | distribution | user | + | Distribution 1 | visitor@example.com | + | Distribution 1 | user1 | + | Distribution 2 | user2 | + | Distribution 3 | anon@example.com | + | Distribution 3 | user1 | + + Given I am logged in as a moderator + And I go to the distribution downloads page + + When I click "Download CSV" + And I wait for the batch process to finish + Then I should see the success message "Export complete. Download the file here if file is not automatically downloaded." + And I should see the link "here" + And the file downloaded from the "here" link contains the following strings: + | ID,User,Email,"File name",Distribution,Created | + | ,"Anonymous (not verified)",visitor@example.com,text.pdf,"Distribution 1", | + | ,user1,user1@example.com,text.pdf,"Distribution 1", | + | ,user2,user2@example.com,test.zip,"Distribution 2", | + | ,"Anonymous (not verified)",anon@example.com,test1.zip,"Distribution 3", | + | ,user1,user1@example.com,test1.zip,"Distribution 3", | \ No newline at end of file diff --git a/tests/features/authentication.feature b/tests/features/authentication.feature index 8716d735fb..83294110cd 100644 --- a/tests/features/authentication.feature +++ b/tests/features/authentication.feature @@ -30,6 +30,7 @@ Feature: User authentication | admin/legal-notice | | admin/legal-notice/add | | admin/people | + | admin/reporting/distribution-downloads | | admin/reporting/export-user-list | | admin/reporting/group-administrators/rdf_entity/collection | | admin/reporting/group-administrators/rdf_entity/collection/csv | @@ -59,6 +60,15 @@ Feature: User authentication | rdf_entity/add/solution | | user/subscriptions | + Scenario Outline: Anonymous user cannot access restricted non-HTML URLs. + Given I am not logged in + When I go to "" + Then the response status code should be 403 + + Examples: + | path | + | admin/reporting/distribution-downloads/csv | + @api Scenario Outline: Authenticated user can access pages they are authorized to Given I am logged in as a user with the "authenticated" role @@ -86,6 +96,7 @@ Feature: User authentication | admin/legal-notice | | admin/legal-notice/add | | admin/people | + | admin/reporting/distribution-downloads | | admin/reporting/export-user-list | | admin/reporting/group-administrators/rdf_entity/collection | | admin/reporting/group-administrators/rdf_entity/collection/csv | @@ -113,6 +124,16 @@ Feature: User authentication | rdf_entity/add/owner | | rdf_entity/add/solution | + @api + Scenario Outline: Authenticated user cannot access restricted non-HTML URLs. + Given I am logged in as a user with the "authenticated" role + When I go to "" + Then the response status code should be 403 + + Examples: + | path | + | admin/reporting/distribution-downloads/csv | + @api Scenario Outline: Moderator can access pages they are authorized to Given I am logged in as a user with the "moderator" role @@ -124,6 +145,8 @@ Feature: User authentication | admin/content/rdf | | admin/legal-notice | | admin/legal-notice/add | + | admin/reporting/distribution-downloads | + | admin/reporting/distribution-downloads/csv | | admin/reporting/export-user-list | | admin/reporting/group-administrators/rdf_entity/collection | | admin/reporting/group-administrators/rdf_entity/collection/csv | @@ -171,9 +194,11 @@ Feature: User authentication Then I visit "" Examples: - | path | - | admin/config/search/redirect | - | collections | + | path | + | admin/config/search/redirect | + | admin/reporting/distribution-downloads | + | admin/reporting/distribution-downloads/csv | + | collections | @api Scenario Outline: Administrator cannot access pages intended for site building and development diff --git a/tests/features/bootstrap/FeatureContext.php b/tests/features/bootstrap/FeatureContext.php index 0a28048516..b0719c0f32 100644 --- a/tests/features/bootstrap/FeatureContext.php +++ b/tests/features/bootstrap/FeatureContext.php @@ -13,6 +13,7 @@ use Behat\Mink\Driver\Selenium2Driver; use Behat\Mink\Element\NodeElement; use Behat\Mink\Element\TraversableElement; +use Behat\Mink\Exception\ElementNotFoundException; use Behat\Mink\Exception\ExpectationException; use Behat\Mink\Exception\ResponseTextException; use Drupal\Component\Serialization\Yaml; @@ -34,6 +35,7 @@ use Drupal\joinup_core\JoinupVersionInterface; use LoversOfBehat\TableExtension\Hook\Scope\AfterTableFetchScope; use PHPUnit\Framework\Assert; +use PHPUnit\Framework\ExpectationFailedException; use WebDriver\Exception; use WebDriver\Key; @@ -1810,4 +1812,58 @@ public function setJoinupVersion(string $version): void { Cache::invalidateTags(['rendered']); } + /** + * Asserts that a file downloaded from a link contains a list of strings. + * + * IMPORTANT NOTE: This step definition is not performing any file access + * check. The file content is read directly from the file system. The user + * access to the file should be tested in separate Behat steps. + * + * @param string $link_label + * The link from where to download the file. + * @param \Behat\Gherkin\Node\TableNode $strings_table + * A table with a single column. Each row contains a string. + * + * @throws \Exception + * If the link has no href attribute or the file content cannot be loaded. + * + * @Then the file downloaded from the :link_label link contains the following strings: + */ + public function assertDownloadedFileContainsStrings(string $link_label, TableNode $strings_table): void { + if (!$link = $this->getSession()->getPage()->findLink($link_label)) { + throw new ElementNotFoundException($this->getSession()->getDriver(), 'Link', NULL, $link_label); + } + if (!$url = $link->getAttribute('href')) { + throw new \Exception("The link '${link_label}' misses an 'href' attribute."); + } + + // Get the path part from the URL. + $path = trim(parse_url($url, PHP_URL_PATH), '/'); + + // Drupal private file. + if (strpos($path, 'system/files') === 0) { + $path = Settings::get('file_private_path') . '/' . substr($path, 12); + } + // Webserver accessible file. + else { + $path = DRUPAL_ROOT . "/{$path}"; + } + + if (($content = file_get_contents($path)) === FALSE) { + throw new \Exception("Cannot read '{$path}' file."); + } + + if (!$content) { + throw new \Exception("The downloaded file has no content."); + } + + $not_found = array_filter($strings_table->getColumn(0), function (string $text) use ($content): bool { + return strpos($content, $text) === FALSE; + }); + + if ($not_found) { + throw new ExpectationFailedException("Following strings were not found in the downloaded file:\n- " . implode("\n- ", $not_found)); + } + } + } From cc9edd20fa4cd1404625ba64dd7509c78b64d452 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 21 Mar 2020 09:39:31 +0200 Subject: [PATCH 332/957] ISAICP-5874: Fix kernel test. --- .../custom/asset_distribution/asset_distribution.info.yml | 1 + .../views.view.asset_distribution_downloads.yml | 0 2 files changed, 1 insertion(+) rename web/modules/custom/asset_distribution/config/{install => optional}/views.view.asset_distribution_downloads.yml (100%) diff --git a/web/modules/custom/asset_distribution/asset_distribution.info.yml b/web/modules/custom/asset_distribution/asset_distribution.info.yml index 85e07822ad..10e50aadd2 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.info.yml +++ b/web/modules/custom/asset_distribution/asset_distribution.info.yml @@ -44,4 +44,5 @@ config_devel: - field.storage.rdf_entity.field_ad_repr_technique - rdf_entity.rdfentity.asset_distribution - sparql_entity_storage.mapping.rdf_entity.asset_distribution + optional: - views.view.asset_distribution_downloads diff --git a/web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml b/web/modules/custom/asset_distribution/config/optional/views.view.asset_distribution_downloads.yml similarity index 100% rename from web/modules/custom/asset_distribution/config/install/views.view.asset_distribution_downloads.yml rename to web/modules/custom/asset_distribution/config/optional/views.view.asset_distribution_downloads.yml From 11fba551f97e9735ec98744beabeed8beeb1e265 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 10:58:53 +0200 Subject: [PATCH 333/957] ISAICP-5692: Remove JoinupGroupRelationInfoInterface::getParentState() and replace it with a more generally useful JoinupGroupHelper::getState(). --- ...ityContentWorkflowAccessControlHandler.php | 8 +++++-- .../joinup_group/src/JoinupGroupHelper.php | 23 +++++++++++++++++-- .../src/JoinupGroupRelationInfo.php | 14 ----------- .../src/JoinupGroupRelationInfoInterface.php | 11 --------- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index 015221a8b4..7b608315da 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -11,11 +11,13 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; use Drupal\og\Entity\OgMembership; use Drupal\og\MembershipManagerInterface; +use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\rdf_entity\RdfInterface; /** @@ -190,13 +192,15 @@ public function entityAccess(EntityInterface $entity, $operation, AccountInterfa return $this->entityDeleteAccess($entity, $account); case 'post comments': - $parent_state = $this->relationInfo->getParentState($entity); + $parent = $entity->get(OgGroupAudienceHelperInterface::DEFAULT_FIELD)->entity; + $parent_state = JoinupGroupHelper::getState($parent); $entity_state = $this->getEntityState($entity); + // Commenting on content of an archived group is not allowed. if ($parent_state === 'archived' || $entity_state === 'archived') { return AccessResult::forbidden(); } - $parent = $this->relationInfo->getParent($entity); + $membership = $this->membershipManager->getMembership($parent, $account->id()); if ($membership instanceof OgMembership) { return AccessResult::allowedIf($membership->hasPermission($operation)); diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index a7114a68d7..6068fcda39 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -14,14 +14,20 @@ class JoinupGroupHelper { /** * Group bundles. - * - * @var string[] */ const GROUP_BUNDLES = [ 'collection' => 'collection', 'solution' => 'solution', ]; + /** + * Workflow state field machine names per group bundle. + */ + const GROUP_STATE_FIELDS = [ + 'collection' => 'field_ar_state', + 'solution' => 'field_is_state', + ]; + /** * Returns whether the entity is one of the rdf groups. * @@ -62,6 +68,19 @@ public static function isSolution(EntityInterface $entity): bool { return self::isRdfEntityOfBundle($entity, 'solution'); } + /** + * Returns the workflow state for the given group. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The group for which to return the workflow state. + * + * @return string + * The workflow state. + */ + public static function getState(EntityInterface $entity): string { + return $entity->{self::GROUP_STATE_FIELDS[$entity->bundle()]}->first()->value; + } + /** * Returns whether the entity is an rdf entity of a specific bundle. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 3843217bfb..59f10551b4 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -88,20 +88,6 @@ public function getParentModeration(EntityInterface $entity): ?int { return (int) $moderation; } - /** - * {@inheritdoc} - */ - public function getParentState(EntityInterface $entity): string { - $parent = $this->getParent($entity); - $field_array = [ - 'collection' => 'field_ar_state', - 'solution' => 'field_is_state', - ]; - - $state = $parent->{$field_array[$parent->bundle()]}->first()->value; - return $state; - } - /** * {@inheritdoc} */ diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 65f264c4ef..372598492e 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -39,17 +39,6 @@ public function getParent(EntityInterface $entity): ?RdfInterface; */ public function getParentModeration(EntityInterface $entity): ?int; - /** - * Retrieves the state of the parent. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group content entity. - * - * @return string - * The state of the parent entity. - */ - public function getParentState(EntityInterface $entity): string; - /** * Retrieves the content creation option of the parent entity. * From 648a046729e2bd8cf0c1319c60811f1ac26227e5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 11:13:25 +0200 Subject: [PATCH 334/957] ISAICP-5692: Use the new JoinupGroupHelper::getState() method where possible. --- web/modules/custom/joinup_group/joinup_group.module | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module index a1f63def03..2a22a40357 100644 --- a/web/modules/custom/joinup_group/joinup_group.module +++ b/web/modules/custom/joinup_group/joinup_group.module @@ -89,9 +89,8 @@ function joinup_group_form_rdf_entity_form_alter(&$form, FormStateInterface $for */ function joinup_group_propose_message_submit(&$form, FormStateInterface $form_state) { $form_object = $form_state->getFormObject(); - $fields = ['collection' => 'field_ar_state', 'solution' => 'field_is_state']; $entity = $form_object->getEntity(); - $state = $entity->get($fields[$entity->bundle()])->value; + $state = JoinupGroupHelper::getState($entity); if ($state === 'proposed') { \Drupal::messenger()->addStatus(t('Thank you for proposing a @entity_label. Your request is currently pending approval by the site administrator.', ['@entity_label' => $entity->get('rid')->entity->getSingularLabel()])); From 5ef7a12c3cd5259efe12ca7189ae1a3ca8a6553e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 11:31:13 +0200 Subject: [PATCH 335/957] ISAICP-5692: Replace JoinupGroupRelationInfo::getParentModeration() with the more generally useful JoinupGroupHelper::getModeration(). --- .../joinup_community_content.module | 4 +++- .../joinup_group/src/JoinupGroupHelper.php | 23 +++++++++++++++++++ .../src/JoinupGroupRelationInfo.php | 17 -------------- .../src/JoinupGroupRelationInfoInterface.php | 13 ----------- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 27395b3a5c..894d7dd434 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -16,6 +16,7 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\Url; use Drupal\joinup_community_content\CommunityContentHelper; use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\node\NodeInterface; /** @@ -125,7 +126,8 @@ function joinup_community_content_workflow_selector(EntityInterface $entity) { /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); - $moderation = $relation_info->getParentModeration($entity); + $parent_entity = $relation_info->getParent($entity); + $moderation = JoinupGroupHelper::getModeration($parent_entity); return $moderation == CommunityContentWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; } diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index 6068fcda39..e267cae903 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -20,6 +20,14 @@ class JoinupGroupHelper { 'solution' => 'solution', ]; + /** + * Content moderation field machine names per group bundle. + */ + const GROUP_MODERATION_FIELDS = [ + 'collection' => 'field_ar_moderation', + 'solution' => 'field_is_moderation', + ]; + /** * Workflow state field machine names per group bundle. */ @@ -68,6 +76,21 @@ public static function isSolution(EntityInterface $entity): bool { return self::isRdfEntityOfBundle($entity, 'solution'); } + /** + * Returns the content moderation status for the given group. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The group for which to return the content moderation value. + * + * @return int + * The content moderation status. Can be one of the following values: + * - CommunityContentWorkflowAccessControlHandler::PRE_MODERATION + * - CommunityContentWorkflowAccessControlHandler::POST_MODERATION + */ + public static function getModeration(EntityInterface $entity): int { + return (int) $entity->{self::GROUP_MODERATION_FIELDS[$entity->bundle()]}->first()->value; + } + /** * Returns the workflow state for the given group. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 59f10551b4..44c7e2d469 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -71,23 +71,6 @@ public function getParent(EntityInterface $entity): ?RdfInterface { return reset($groups['rdf_entity']); } - /** - * {@inheritdoc} - */ - public function getParentModeration(EntityInterface $entity): ?int { - $parent = $this->getParent($entity); - if (!$parent) { - return NULL; - } - $field_array = [ - 'collection' => 'field_ar_moderation', - 'solution' => 'field_is_moderation', - ]; - - $moderation = $parent->{$field_array[$parent->bundle()]}->value; - return (int) $moderation; - } - /** * {@inheritdoc} */ diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 372598492e..f672d1d080 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -26,19 +26,6 @@ interface JoinupGroupRelationInfoInterface { */ public function getParent(EntityInterface $entity): ?RdfInterface; - /** - * Retrieves the moderation state of the parent. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group content entity. - * - * @return int - * The moderation status. Can be one of the following values: - * - CommunityContentWorkflowAccessControlHandler::PRE_MODERATION - * - CommunityContentWorkflowAccessControlHandler::POST_MODERATION - */ - public function getParentModeration(EntityInterface $entity): ?int; - /** * Retrieves the content creation option of the parent entity. * From 948f059aa5d3cced7217b3a41f3a6a0179da5bc1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 13:51:25 +0200 Subject: [PATCH 336/957] ISAICP-5692: When orphaned group content is removed we cannot determine the workflow since it depends on the content moderation status of the removed group. --- .../joinup_community_content.module | 18 +++++++++++++----- .../CommunityContentSubscriber.php | 12 +++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 894d7dd434..4bfc11767b 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -111,22 +111,30 @@ function joinup_community_content_attachment_file_process($element, FormStateInt * @param \Drupal\Core\Entity\EntityInterface $entity * The community content entity. * - * @return string - * The id of the workflow to use. + * @return string|null + * The id of the workflow to use, or NULL if the workflow cannot be + * determined. * - * @throws Exception + * @throws \InvalidArgumentException * Thrown when the function is called for bundles that do not refer to * community content. */ -function joinup_community_content_workflow_selector(EntityInterface $entity) { +function joinup_community_content_workflow_selector(EntityInterface $entity): ?string { $bundles = ['document', 'event', 'news']; if ($entity->getEntityTypeId() !== 'node' || !in_array($entity->bundle(), $bundles)) { - throw new Exception('This function can only be called for community content apart from discussion.'); + throw new \InvalidArgumentException('This function can only be called for community content apart from discussion.'); } /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); $parent_entity = $relation_info->getParent($entity); + + // If the entity doesn't have a parent group we cannot determine the workflow. + // This can happen e.g. when deleting orphaned group content. + if (empty($parent_entity)) { + return NULL; + } + $moderation = JoinupGroupHelper::getModeration($parent_entity); return $moderation == CommunityContentWorkflowAccessControlHandler::PRE_MODERATION ? 'node:pre_moderated' : 'node:post_moderated'; } diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 8e53e09df1..3d3b017ac4 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -117,10 +117,16 @@ protected function initialize(NotificationEvent $event) { $state_item = $this->workflowHelper->getEntityStateFieldDefinition($this->entity->getEntityTypeId(), $this->entity->bundle()); if (!empty($state_item)) { $this->stateField = $state_item->getName(); - $this->workflow = $this->entity->get($this->stateField)->first()->getWorkflow(); $from_state = isset($this->entity->field_state_initial_value) ? $this->entity->field_state_initial_value : 'draft'; $to_state = $this->entity->get($this->stateField)->first()->value; - $this->transition = $this->workflow->findTransition($from_state, $to_state); + + $this->workflow = $this->entity->get($this->stateField)->first()->getWorkflow(); + // In some cases the workflow cannot be determined, for example when + // deleting orphaned group content that has a workflow that depends on the + // parent entity's content moderation status. + if ($this->workflow) { + $this->transition = $this->workflow->findTransition($from_state, $to_state); + } } $this->motivation = empty($this->entity->motivation) ? '' : $this->entity->motivation; $this->hasPublished = $this->hasPublishedVersion($this->entity); @@ -223,7 +229,7 @@ public function onDelete(NotificationEvent $event) { // latest revision is forced here. if ($latest_revision = $this->revisionManager->loadLatestRevision($this->entity)) { $state = $latest_revision->get($this->stateField)->first()->value; - if (empty($this->config[$this->workflow->getId()][$state])) { + if (empty($this->workflow) || empty($this->config[$this->workflow->getId()][$state])) { return; } From 368eb61251424d7ec195a0a24307991e05f294d9 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 13:56:49 +0200 Subject: [PATCH 337/957] ISAICP-5692: Replace JoinupGroupRelationInfo::getParentContentCreationOption() with the more generally useful JoinupGroupHelper::getContentCreation(). --- ...ityContentWorkflowAccessControlHandler.php | 21 +--------------- .../src/Guard/CommunityContentGuard.php | 4 +++- .../joinup_group/src/JoinupGroupHelper.php | 24 +++++++++++++++++++ .../src/JoinupGroupRelationInfo.php | 13 ---------- .../src/JoinupGroupRelationInfoInterface.php | 14 ----------- 5 files changed, 28 insertions(+), 48 deletions(-) diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index 7b608315da..efaebfb164 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -376,26 +376,7 @@ protected function getEntityState(NodeInterface $entity): string { */ protected function getParentContentCreationOption(NodeInterface $entity): string { $parent = $this->relationInfo->getParent($entity); - $field_name = $this->getParentContentCreationFieldName($parent); - return $parent->{$field_name}->value; - } - - /** - * Returns the content creation field's machine name. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The parent entity. - * - * @return string - * The machine name of the content creation field. - */ - protected function getParentContentCreationFieldName(EntityInterface $entity): string { - $field_array = [ - 'collection' => 'field_ar_content_creation', - 'solution' => 'field_is_content_creation', - ]; - - return $field_array[$entity->bundle()]; + return JoinupGroupHelper::getContentCreation($parent); } /** diff --git a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php index 284d9f2cd8..73649b6fe0 100644 --- a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php +++ b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php @@ -7,6 +7,7 @@ use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\state_machine\Guard\GuardInterface; @@ -104,7 +105,8 @@ public function allowed(WorkflowTransition $transition, WorkflowInterface $workf public function allowedCreate(WorkflowTransition $transition, WorkflowInterface $workflow, EntityInterface $entity) { $permission_scheme = $this->permissionScheme->get('create'); $workflow_id = $workflow->getId(); - $content_creation = (string) $this->relationInfo->getParentContentCreationOption($entity); + $parent = $this->relationInfo->getParent($entity); + $content_creation = JoinupGroupHelper::getContentCreation($parent); if (!isset($permission_scheme[$workflow_id][$content_creation][$transition->getId()])) { return FALSE; diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index e267cae903..e25064cd5c 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -20,6 +20,14 @@ class JoinupGroupHelper { 'solution' => 'solution', ]; + /** + * Content creation field machine names per group bundle. + */ + const GROUP_CONTENT_CREATION = [ + 'collection' => 'field_ar_content_creation', + 'solution' => 'field_is_content_creation', + ]; + /** * Content moderation field machine names per group bundle. */ @@ -91,6 +99,22 @@ public static function getModeration(EntityInterface $entity): int { return (int) $entity->{self::GROUP_MODERATION_FIELDS[$entity->bundle()]}->first()->value; } + /** + * Returns the content creation option for the given group. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The group for which to return the content creation option value. + * + * @return string + * The content creation option value. Can be one of the following: + * - \Drupal\joinup_group\ContentCreationOptions::FACILITATORS + * - \Drupal\joinup_group\ContentCreationOptions::MEMBERS + * - \Drupal\joinup_group\ContentCreationOptions::REGISTERED_USERS + */ + public static function getContentCreation(EntityInterface $entity): string { + return $entity->{self::GROUP_CONTENT_CREATION[$entity->bundle()]}->first()->value; + } + /** * Returns the workflow state for the given group. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 44c7e2d469..48c35fba17 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -71,19 +71,6 @@ public function getParent(EntityInterface $entity): ?RdfInterface { return reset($groups['rdf_entity']); } - /** - * {@inheritdoc} - */ - public function getParentContentCreationOption(EntityInterface $entity): string { - $parent = $this->getParent($entity); - $field_array = [ - 'collection' => 'field_ar_content_creation', - 'solution' => 'field_is_content_creation', - ]; - - return $parent->{$field_array[$parent->bundle()]}->first()->value; - } - /** * {@inheritdoc} */ diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index f672d1d080..b84bf3501a 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -26,20 +26,6 @@ interface JoinupGroupRelationInfoInterface { */ public function getParent(EntityInterface $entity): ?RdfInterface; - /** - * Retrieves the content creation option of the parent entity. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group content entity. - * - * @return int - * The content creation option. Can be one of the following values: - * - \Drupal\joinup_group\ContentCreationOptions::FACILITATORS - * - \Drupal\joinup_group\ContentCreationOptions::MEMBERS - * - \Drupal\joinup_group\ContentCreationOptions::REGISTERED_USERS - */ - public function getParentContentCreationOption(EntityInterface $entity): string; - /** * Retrieves all the members with any role in a certain group. * From 1d1c18da76825a6c0ba7b9cae1d537c773ff1c21 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:07:41 +0200 Subject: [PATCH 338/957] ISAICP-5692: Remove methods with limited reusability from a shared service. --- .../src/JoinupGroupRelationInfo.php | 33 ------------------- .../src/JoinupGroupRelationInfoInterface.php | 16 --------- .../GroupAdministratorsController.php | 21 +++++++++++- 3 files changed, 20 insertions(+), 50 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 48c35fba17..2b394db8bf 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -105,39 +105,6 @@ public function getUserGroupMembershipsByBundle(AccountInterface $user, string $ return $storage->loadMultiple($query->execute()); } - /** - * {@inheritdoc} - */ - public function getCollectionIds(): array { - return $this->getRdfEntityIdsByBundle('collection'); - } - - /** - * {@inheritdoc} - */ - public function getSolutionIds(): array { - return $this->getRdfEntityIdsByBundle('solution'); - } - - /** - * Returns the entity IDs of the RDF entities with the given bundle ID. - * - * @param string $bundle - * The bundle ID. - * - * @return string[] - * An array of entity IDs. - */ - protected function getRdfEntityIdsByBundle(string $bundle): array { - $storage = $this->entityTypeManager->getStorage('rdf_entity'); - $definition = $this->entityTypeManager->getDefinition('rdf_entity'); - $bundle_key = $definition->getKey('bundle'); - - $query = $storage->getQuery(); - $query->condition($bundle_key, $bundle); - return $query->execute(); - } - /** * Returns the entity storage for OgMembership entities. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index b84bf3501a..8073086df6 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -72,22 +72,6 @@ public function getGroupMemberships(EntityInterface $entity, array $states = [Og */ public function getUserGroupMembershipsByBundle(AccountInterface $user, string $entity_type_id, string $bundle_id, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** - * Returns the entity IDs of all collections. - * - * @return string[] - * An array of entity IDs. - */ - public function getCollectionIds(): array; - - /** - * Returns the entity IDs of all solutions. - * - * @return string[] - * An array of entity IDs. - */ - public function getSolutionIds(): array; - /** * Returns the groups that relate to a contact information entity. * diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index 13bcc632da..05e8b09dd6 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -375,7 +375,7 @@ protected function getAdministrativeCollectionMemberships(): array { // Since this is a moderator-only feature that is rarely used we don't need // to worry about the potential performance impact of loading a large number // of memberships. - $collection_ids = $this->relationInfo->getCollectionIds(); + $collection_ids = $this->getCollectionIds(); if (empty($collection_ids)) { return []; @@ -396,4 +396,23 @@ protected function getAdministrativeCollectionMemberships(): array { return $membership_storage->loadMultiple($membership_ids); } + /** + * Returns the entity IDs of all collections. + * + * @return string[] + * An array of entity IDs. + * + * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException + * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException + */ + protected function getCollectionIds(): array { + $storage = $this->entityTypeManager->getStorage('rdf_entity'); + $definition = $this->entityTypeManager->getDefinition('rdf_entity'); + $bundle_key = $definition->getKey('bundle'); + + $query = $storage->getQuery(); + $query->condition($bundle_key, 'collection'); + return $query->execute(); + } + } From 38ca0c6e498512141daa76d1b50536df4336b5f5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:10:09 +0200 Subject: [PATCH 339/957] ISAICP-5692: Remove dead code. --- .../src/JoinupGroupRelationInfo.php | 14 ------------- .../src/JoinupGroupRelationInfoInterface.php | 20 ------------------- 2 files changed, 34 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 2b394db8bf..7eed606ea4 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -91,20 +91,6 @@ public function getGroupMemberships(EntityInterface $entity, array $states = [Og return $this->membershipManager->getGroupMembershipsByRoleNames($entity, [OgRoleInterface::AUTHENTICATED], $states); } - /** - * {@inheritdoc} - */ - public function getUserGroupMembershipsByBundle(AccountInterface $user, string $entity_type_id, string $bundle_id, array $states = [OgMembershipInterface::STATE_ACTIVE]): array { - $storage = $this->getOgMembershipStorage(); - $query = $storage->getQuery() - ->condition('uid', $user->id()) - ->condition('entity_type', $entity_type_id) - ->condition('entity_bundle', $bundle_id) - ->condition('state', $states, 'IN'); - - return $storage->loadMultiple($query->execute()); - } - /** * Returns the entity storage for OgMembership entities. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 8073086df6..28fbe4140f 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -52,26 +52,6 @@ public function getGroupUsers(EntityInterface $entity, array $states = [OgMember */ public function getGroupMemberships(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** - * Returns the memberships of a user for a given bundle. - * - * Use this to retrieve for example all the user's collection or solution - * memberships. - * - * @param \Drupal\Core\Session\AccountInterface $user - * The user for which to retrieve the memberships. - * @param string $entity_type_id - * The entity type for which to retrieve the memberships. - * @param string $bundle_id - * The bundle for which to retrieve the memberships. - * @param array $states - * The membership states. Defaults to active memberships. - * - * @return \Drupal\og\OgMembershipInterface[] - * The memberships. - */ - public function getUserGroupMembershipsByBundle(AccountInterface $user, string $entity_type_id, string $bundle_id, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** * Returns the groups that relate to a contact information entity. * From 266deab7267e644ba7b0ee3c94781eee65e4abe5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:12:24 +0200 Subject: [PATCH 340/957] ISAICP-5692: Remove method which has in the meantime been integrated in Organic Groups. --- .../joinup_group/src/JoinupGroupRelationInfo.php | 10 +--------- .../src/JoinupGroupRelationInfoInterface.php | 14 -------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 7eed606ea4..a0e639f6ac 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -10,7 +10,6 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\Core\Session\AccountInterface; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgMembershipInterface; use Drupal\og\OgRoleInterface; @@ -75,7 +74,7 @@ public function getParent(EntityInterface $entity): ?RdfInterface { * {@inheritdoc} */ public function getGroupUsers(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array { - return array_reduce($this->getGroupMemberships($entity, $states), function ($users, OgMembershipInterface $membership) { + return array_reduce($this->membershipManager->getGroupMembershipsByRoleNames($entity, [OgRoleInterface::AUTHENTICATED], $states), function ($users, OgMembershipInterface $membership) { $user = $membership->getOwner(); if (!empty($user)) { $users[] = $user; @@ -84,13 +83,6 @@ public function getGroupUsers(EntityInterface $entity, array $states = [OgMember }, []); } - /** - * {@inheritdoc} - */ - public function getGroupMemberships(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array { - return $this->membershipManager->getGroupMembershipsByRoleNames($entity, [OgRoleInterface::AUTHENTICATED], $states); - } - /** * Returns the entity storage for OgMembership entities. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 28fbe4140f..930c77579b 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -5,7 +5,6 @@ namespace Drupal\joinup_group; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Session\AccountInterface; use Drupal\og\OgMembershipInterface; use Drupal\rdf_entity\RdfInterface; @@ -39,19 +38,6 @@ public function getParent(EntityInterface $entity): ?RdfInterface; */ public function getGroupUsers(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** - * Retrieves all the memberships of a certain entity group. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group entity. - * @param array $states - * (optional) An array of membership states to retrieve. Defaults to active. - * - * @return \Drupal\og\OgMembershipInterface[] - * The memberships of the group. - */ - public function getGroupMemberships(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** * Returns the groups that relate to a contact information entity. * From e2419224328c3eb798f9da09d8f115aea2469b93 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:14:38 +0200 Subject: [PATCH 341/957] ISAICP-5692: Remove dead code. --- .../joinup_group/src/JoinupGroupRelationInfo.php | 15 --------------- .../src/JoinupGroupRelationInfoInterface.php | 14 -------------- 2 files changed, 29 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index a0e639f6ac..32d43b6c9a 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -11,8 +11,6 @@ use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\og\MembershipManagerInterface; -use Drupal\og\OgMembershipInterface; -use Drupal\og\OgRoleInterface; use Drupal\rdf_entity\RdfInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -70,19 +68,6 @@ public function getParent(EntityInterface $entity): ?RdfInterface { return reset($groups['rdf_entity']); } - /** - * {@inheritdoc} - */ - public function getGroupUsers(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array { - return array_reduce($this->membershipManager->getGroupMembershipsByRoleNames($entity, [OgRoleInterface::AUTHENTICATED], $states), function ($users, OgMembershipInterface $membership) { - $user = $membership->getOwner(); - if (!empty($user)) { - $users[] = $user; - } - return $users; - }, []); - } - /** * Returns the entity storage for OgMembership entities. * diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 930c77579b..3b7f0d3909 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -5,7 +5,6 @@ namespace Drupal\joinup_group; use Drupal\Core\Entity\EntityInterface; -use Drupal\og\OgMembershipInterface; use Drupal\rdf_entity\RdfInterface; /** @@ -25,19 +24,6 @@ interface JoinupGroupRelationInfoInterface { */ public function getParent(EntityInterface $entity): ?RdfInterface; - /** - * Retrieves all the members with any role in a certain group. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group entity. - * @param array $states - * (optional) An array of membership states to retrieve. Defaults to active. - * - * @return array - * An array of users that are members of the entity group. - */ - public function getGroupUsers(EntityInterface $entity, array $states = [OgMembershipInterface::STATE_ACTIVE]): array; - /** * Returns the groups that relate to a contact information entity. * From 8b4e157c8269c6ae05437d42e2261a3c4699de6c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:48:53 +0200 Subject: [PATCH 342/957] ISAICP-5692: Replace instances of JoinupRelationInfoInterface::getParent() with the leaner and faster JoinupGroupHelper::getGroup(). --- .../custom/custom_page/custom_page.module | 5 ++- .../joinup_group/src/JoinupGroupHelper.php | 17 +++++++++ web/profiles/joinup/joinup.services.yml | 1 - .../src/Controller/PinEntityController.php | 20 +++-------- web/profiles/joinup/src/PinService.php | 35 ++----------------- .../joinup/src/ProxyClass/PinService.php | 12 ++----- 6 files changed, 28 insertions(+), 62 deletions(-) diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 92b110b4a6..1832bc4122 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -14,6 +14,7 @@ use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\node\NodeInterface; use Drupal\og\Entity\OgMembership; use Drupal\og\Og; @@ -174,9 +175,7 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc return AccessResult::neutral(); } - /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); - $parent = $relation_info->getParent($node); + $parent = JoinupGroupHelper::getGroup($node); // Let parentless nodes (e.g. newsletters) be handled by the core access. if (empty($parent)) { return AccessResult::neutral(); diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index e25064cd5c..8e23bf771b 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -5,6 +5,7 @@ namespace Drupal\joinup_group; use Drupal\Core\Entity\EntityInterface; +use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\rdf_entity\RdfInterface; /** @@ -84,6 +85,22 @@ public static function isSolution(EntityInterface $entity): bool { return self::isRdfEntityOfBundle($entity, 'solution'); } + /** + * Returns the group the entity belongs to. + * + * This relies on the fact that in Joinup every group entity only belongs to a + * single group, and always uses the default field name for the group field. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity for which to return the group. + * + * @return \Drupal\Core\Entity\EntityInterface|null + * The group entity, or NULL if the entity doesn't have a group. + */ + public static function getGroup(EntityInterface $entity): ?EntityInterface { + return $entity->get(OgGroupAudienceHelperInterface::DEFAULT_FIELD)->entity; + } + /** * Returns the content moderation status for the given group. * diff --git a/web/profiles/joinup/joinup.services.yml b/web/profiles/joinup/joinup.services.yml index 7559227ed0..ec9063184c 100644 --- a/web/profiles/joinup/joinup.services.yml +++ b/web/profiles/joinup/joinup.services.yml @@ -6,7 +6,6 @@ services: - { name: 'cache.context'} joinup.pin_service: class: Drupal\joinup\PinService - arguments: ['@joinup_group.relation_info'] lazy: true joinup.route_subscriber: class: Drupal\joinup\Routing\RouteSubscriber diff --git a/web/profiles/joinup/src/Controller/PinEntityController.php b/web/profiles/joinup/src/Controller/PinEntityController.php index a2cfe8f94a..aac0e076e0 100644 --- a/web/profiles/joinup/src/Controller/PinEntityController.php +++ b/web/profiles/joinup/src/Controller/PinEntityController.php @@ -1,6 +1,6 @@ relationInfo = $relationInfo; + public function __construct(OgAccessInterface $ogAccess, PinServiceInterface $pinService) { $this->ogAccess = $ogAccess; $this->pinService = $pinService; } @@ -64,7 +53,6 @@ public function __construct(JoinupGroupRelationInfoInterface $relationInfo, OgAc */ public static function create(ContainerInterface $container) { return new static( - $container->get('joinup_group.relation_info'), $container->get('og.access'), $container->get('joinup.pin_service') ); @@ -190,7 +178,7 @@ protected function getGroups(ContentEntityInterface $entity) { $groups = $entity->get('collection')->referencedEntities(); } elseif (CommunityContentHelper::isCommunityContent($entity)) { - $groups = [$this->relationInfo->getParent($entity)]; + $groups = [JoinupGroupHelper::getGroup($entity)]; } $list = []; @@ -220,7 +208,7 @@ protected function validEntityParameters(ContentEntityInterface $entity, RdfInte return JoinupGroupHelper::isCollection($group); } elseif (CommunityContentHelper::isCommunityContent($entity)) { - return JoinupGroupHelper::isCollection($group) || JoinupGroupHelper::isSolution($group); + return JoinupGroupHelper::isGroup($group); } return FALSE; } diff --git a/web/profiles/joinup/src/PinService.php b/web/profiles/joinup/src/PinService.php index 38e8c554e7..317c5bd526 100644 --- a/web/profiles/joinup/src/PinService.php +++ b/web/profiles/joinup/src/PinService.php @@ -1,21 +1,18 @@ relationInfo = $relationInfo; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('joinup_group.relation_info') - ); - } - /** * {@inheritdoc} */ @@ -109,7 +80,7 @@ public function getGroupsWherePinned(ContentEntityInterface $entity) { return $entity->get(self::SOLUTION_PIN_FIELD)->referencedEntities(); } elseif (CommunityContentHelper::isCommunityContent($entity) && $entity->isSticky()) { - return [$this->relationInfo->getParent($entity)]; + return [JoinupGroupHelper::getGroup($entity)]; } return []; diff --git a/web/profiles/joinup/src/ProxyClass/PinService.php b/web/profiles/joinup/src/ProxyClass/PinService.php index 4a2a6e9097..f5444ec274 100644 --- a/web/profiles/joinup/src/ProxyClass/PinService.php +++ b/web/profiles/joinup/src/ProxyClass/PinService.php @@ -12,7 +12,7 @@ * * @see \Drupal\Component\ProxyBuilder */ - class PinService implements \Drupal\joinup\PinServiceInterface, \Drupal\Core\DependencyInjection\ContainerInjectionInterface + class PinService implements \Drupal\joinup\PinServiceInterface { use \Drupal\Core\DependencyInjection\DependencySerializationTrait; @@ -67,14 +67,6 @@ protected function lazyLoadItself() return $this->service; } - /** - * {@inheritdoc} - */ - public static function create(\Symfony\Component\DependencyInjection\ContainerInterface $container) - { - \Drupal\joinup\PinService::create($container); - } - /** * {@inheritdoc} */ @@ -86,7 +78,7 @@ public function isEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entit /** * {@inheritdoc} */ - public function setEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entity, \Drupal\rdf_entity\RdfInterface $group, bool $pinned) + public function setEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entity, \Drupal\rdf_entity\RdfInterface $group, $pinned) { return $this->lazyLoadItself()->setEntityPinned($entity, $group, $pinned); } From 7123ce811dd5a6edacb2b9826ed4e0e3e94330ed Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:54:35 +0200 Subject: [PATCH 343/957] ISAICP-5692: Replace instances of JoinupRelationInfoInterface::getParent() with the leaner and faster JoinupGroupHelper::getGroup(). --- .../processor/JoinupEntityStatus.php | 41 +------------------ .../UrlGenerator/JoinupUrlGeneratorBase.php | 19 ++------- .../UrlGenerator/LatestNewsUrlGenerator.php | 2 +- 3 files changed, 7 insertions(+), 55 deletions(-) diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 0ddd7e0aaf..5c665e8d34 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -6,14 +6,13 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginFormInterface; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\node\NodeInterface; use Drupal\rdf_entity\RdfInterface; use Drupal\search_api\IndexInterface; use Drupal\search_api\Plugin\PluginFormTrait; use Drupal\search_api\Processor\ProcessorPluginBase; use Drupal\user\UserInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Excludes unpublished entities from the index. @@ -31,42 +30,6 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf use PluginFormTrait; - /** - * The relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - - /** - * Constructs a JoinupEntityLatestRevision object. - * - * @param array $configuration - * A configuration array containing information about the plugin instance. - * @param string $plugin_id - * The plugin_id for the plugin instance. - * @param array $plugin_definition - * The plugin implementation definition. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The relation info service. - */ - public function __construct(array $configuration, $plugin_id, array $plugin_definition, JoinupGroupRelationInfoInterface $relation_info) { - parent::__construct($configuration, $plugin_id, $plugin_definition); - $this->relationInfo = $relation_info; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $container->get('joinup_group.relation_info') - ); - } - /** * {@inheritdoc} */ @@ -112,7 +75,7 @@ public function alterIndexedItems(array &$items) { $inverse = $this->getConfiguration()['inverse']; $enabled = TRUE; if ($object instanceof NodeInterface) { - $parent = $this->relationInfo->getParent($object); + $parent = JoinupGroupHelper::getGroup($object); // Check if empty to avoid exceptions. // The entity can be published only if the parent entity is published. if (empty($parent) || !$parent->isPublished()) { diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php index 9667d9d876..aa43e0ac20 100644 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/JoinupUrlGeneratorBase.php @@ -7,7 +7,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Query\QueryInterface; use Drupal\Core\Language\LanguageManagerInterface; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\simple_sitemap\EntityHelper; use Drupal\simple_sitemap\Logger; use Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\EntityUrlGenerator; @@ -27,13 +27,6 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { */ protected $urlGeneratorManager; - /** - * The Joinup group relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - /** * Constructs a JoinupUrlGeneratorBase object. * @@ -55,13 +48,10 @@ abstract class JoinupUrlGeneratorBase extends EntityUrlGenerator { * The sitemap entity helper service. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager $url_generator_manager * The url generator manager service. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The joinup group relation info service. */ - public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager, JoinupGroupRelationInfoInterface $relation_info) { + public function __construct(array $configuration, string $plugin_id, array $plugin_definition, Simplesitemap $generator, Logger $logger, LanguageManagerInterface $language_manager, EntityTypeManagerInterface $entity_type_manager, EntityHelper $entityHelper, UrlGeneratorManager $url_generator_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition, $generator, $logger, $language_manager, $entity_type_manager, $entityHelper, $url_generator_manager); $this->urlGeneratorManager = $url_generator_manager; - $this->relationInfo = $relation_info; } /** @@ -77,8 +67,7 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('language_manager'), $container->get('entity_type.manager'), $container->get('simple_sitemap.entity_helper'), - $container->get('plugin.manager.simple_sitemap.url_generator'), - $container->get('joinup_group.relation_info') + $container->get('plugin.manager.simple_sitemap.url_generator') ); } @@ -150,7 +139,7 @@ protected function processDataSet($data_set) { // In case the entity type is a node, we also need to also take into account // the status of the parent. if ($entity->getEntityTypeId() === 'node') { - $parent = $this->relationInfo->getParent($entity); + $parent = JoinupGroupHelper::getGroup($entity); if (empty($parent) || !$parent->isPublished()) { return FALSE; } diff --git a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php index 1674cc7ecc..0f8975fd79 100755 --- a/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php +++ b/web/modules/custom/joinup_seo/src/Plugin/simple_sitemap/UrlGenerator/LatestNewsUrlGenerator.php @@ -7,7 +7,7 @@ use Drupal\Core\Entity\Query\QueryInterface; /** - * Class LatestNewsUrlGenerator. + * Generates URL for recently created news to include in the sitemap. * * @UrlGenerator( * id = "latest_news", From 591def091d2cce228cbfa19029ff37ab293052aa Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 14:58:51 +0200 Subject: [PATCH 344/957] ISAICP-5692: Fix incompatible method declaration that has arisen in generated code. The proxy class generator doesn't yet support scalar type hints. --- web/profiles/joinup/src/ProxyClass/PinService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/profiles/joinup/src/ProxyClass/PinService.php b/web/profiles/joinup/src/ProxyClass/PinService.php index f5444ec274..bd49f2a542 100644 --- a/web/profiles/joinup/src/ProxyClass/PinService.php +++ b/web/profiles/joinup/src/ProxyClass/PinService.php @@ -78,7 +78,7 @@ public function isEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entit /** * {@inheritdoc} */ - public function setEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entity, \Drupal\rdf_entity\RdfInterface $group, $pinned) + public function setEntityPinned(\Drupal\Core\Entity\ContentEntityInterface $entity, \Drupal\rdf_entity\RdfInterface $group, bool $pinned) { return $this->lazyLoadItself()->setEntityPinned($entity, $group, $pinned); } From 7424ff6bacd0cf16bf28811da62d5ed9467bf10f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 15:06:04 +0200 Subject: [PATCH 345/957] ISAICP-5692: Fix incompatible method declaration that has arisen in generated code. --- .../joinup_notification.services.yml | 2 +- .../src/EventSubscriber/CommentSubscriber.php | 3 ++- .../CommunityContentSubscriber.php | 10 ++++------ .../DistributionRdfSubscriber.php | 3 ++- .../NotificationSubscriberBase.php | 16 +++------------- 5 files changed, 12 insertions(+), 22 deletions(-) diff --git a/web/modules/custom/joinup_notification/joinup_notification.services.yml b/web/modules/custom/joinup_notification/joinup_notification.services.yml index 87d6e48d89..020a931058 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.services.yml +++ b/web/modules/custom/joinup_notification/joinup_notification.services.yml @@ -7,7 +7,7 @@ services: arguments: ['@message_notify.sender'] joinup_notification.notification_subscriber_base: abstract: true - arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_core.workflow.helper', '@joinup_group.relation_info', '@joinup_notification.message_delivery'] + arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_core.workflow.helper', '@joinup_notification.message_delivery'] joinup_notification.community_content.subscriber: class: Drupal\joinup_notification\EventSubscriber\CommunityContentSubscriber parent: joinup_notification.notification_subscriber_base diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php index 641d6a4b5c..06d618021f 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommentSubscriber.php @@ -6,6 +6,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\MessageArgumentGenerator; use Drupal\joinup_notification\NotificationEvents; @@ -65,7 +66,7 @@ protected function initialize(NotificationEvent $event) { $this->group = $this->parent; } elseif ($this->groupTypeManager->isGroupContent($this->parent->getEntityTypeId(), $this->parent->bundle())) { - $this->group = $this->relationInfo->getParent($this->parent); + $this->group = JoinupGroupHelper::getGroup($this->parent); } } } diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 3d3b017ac4..6877dbcb0d 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -9,8 +9,8 @@ use Drupal\Core\Entity\EntityTypeManager; use Drupal\Core\Session\AccountProxy; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelper; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; use Drupal\joinup_notification\MessageArgumentGenerator; @@ -85,15 +85,13 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The Joinup group relation info service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. * @param \Drupal\state_machine_revisions\RevisionManagerInterface $revision_manager * The revision manager service. */ - public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupGroupRelationInfoInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { - parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $relation_info, $message_delivery); + public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { + parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $message_delivery); $this->revisionManager = $revision_manager; } @@ -277,7 +275,7 @@ protected function generateArguments(EntityInterface $entity): array { $arguments['@entity:hasPublished:status'] = $this->hasPublished ? 'an update of the' : 'a new'; // Add arguments related to the parent collection or solution. - $parent = $this->relationInfo->getParent($entity); + $parent = JoinupGroupHelper::getGroup($entity); if (!empty($parent)) { $arguments += MessageArgumentGenerator::getGroupArguments($parent); diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php index a2adcbea0d..14695782e2 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/DistributionRdfSubscriber.php @@ -6,6 +6,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\MessageArgumentGenerator; use Drupal\joinup_notification\NotificationEvents; @@ -192,7 +193,7 @@ protected function generateArguments(EntityInterface $entity): array { // Add arguments related to the parent collection or solution. $parent = $entity->parent->entity; - $solution = (!empty($parent) && $parent->bundle() === 'solution') ? $parent : $this->relationInfo->getParent($entity); + $solution = (!empty($parent) && $parent->bundle() === 'solution') ? $parent : JoinupGroupHelper::getGroup($entity); if (!empty($parent) && $parent->bundle() === 'asset_release') { // Some legacy releases exist without a version. Thus, a check for // existence is needed. diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 8c748031a3..1ec8913c87 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -9,7 +9,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountProxy; use Drupal\Core\Url; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; @@ -88,13 +88,6 @@ abstract class NotificationSubscriberBase { */ protected $workflowHelper; - /** - * The relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - /** * The message delivery service. * @@ -117,19 +110,16 @@ abstract class NotificationSubscriberBase { * The og membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $joinup_core_workflow_helper * The workflow helper service. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The relation info service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message delivery service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupGroupRelationInfoInterface $relation_info, JoinupMessageDeliveryInterface $message_delivery) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupMessageDeliveryInterface $message_delivery) { $this->entityTypeManager = $entity_type_manager; $this->configFactory = $config_factory; $this->currentUser = $current_user; $this->groupTypeManager = $og_group_type_manager; $this->membershipManager = $og_membership_manager; $this->workflowHelper = $joinup_core_workflow_helper; - $this->relationInfo = $relation_info; $this->messageDelivery = $message_delivery; } @@ -280,7 +270,7 @@ protected function getRecipientIdsByRole($role_id) { */ protected function getRecipientIdsByOgRole(EntityInterface $entity, OgRoleInterface $role): array { if (!$this->groupTypeManager->isGroup($entity->getEntityTypeId(), $entity->bundle())) { - $entity = $this->relationInfo->getParent($entity); + $entity = JoinupGroupHelper::getGroup($entity); } if (empty($entity)) { return []; From f0dbf0ade002a797c9fe97fb3c6218f8c6d3c404 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 15:23:04 +0200 Subject: [PATCH 346/957] ISAICP-5692: Update dependencies. --- composer.lock | 217 +++++++++++--------------------------------------- 1 file changed, 47 insertions(+), 170 deletions(-) diff --git a/composer.lock b/composer.lock index 15fc9cebfa..5cc8bab8f2 100644 --- a/composer.lock +++ b/composer.lock @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.39", + "version": "3.133.41", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455" + "reference": "9b4a110de75631339329a4ca45ebbaf7ddd1f7f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0e3b9e497bd39063cb504115c726d369d8f4d455", - "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9b4a110de75631339329a4ca45ebbaf7ddd1f7f9", + "reference": "9b4a110de75631339329a4ca45ebbaf7ddd1f7f9", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-18T18:13:04+00:00" + "time": "2020-03-20T18:10:54+00:00" }, { "name": "caxy/php-htmldiff", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -739,12 +729,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -2317,16 +2301,16 @@ }, { "name": "doctrine/persistence", - "version": "1.3.6", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", "shasum": "" }, "require": { @@ -2334,7 +2318,7 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.1", + "doctrine/reflection": "^1.2", "php": "^7.1" }, "conflict": { @@ -2396,20 +2380,34 @@ "orm", "persistence" ], - "time": "2020-01-16T22:06:23+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2020-03-21T15:13:52+00:00" }, { "name": "doctrine/reflection", - "version": "v1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" + "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/b699ecc7f2784d1e49924fd9858cf1078db6b0e2", + "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2", "shasum": "" }, "require": { @@ -2430,7 +2428,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -2474,7 +2472,7 @@ "reflection", "static" ], - "time": "2020-01-08T19:53:19+00:00" + "time": "2020-03-21T11:34:59+00:00" }, { "name": "drupal/allowed_formats", @@ -10040,16 +10038,16 @@ }, { "name": "psy/psysh", - "version": "v0.10.0", + "version": "v0.10.2", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c" + "reference": "573c2362c3cdebe846b4adae4b630eecb350afd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e361c8b7e5114534078e0ce04ddc442b39018a3c", - "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/573c2362c3cdebe846b4adae4b630eecb350afd8", + "reference": "573c2362c3cdebe846b4adae4b630eecb350afd8", "shasum": "" }, "require": { @@ -10109,7 +10107,7 @@ "interactive", "shell" ], - "time": "2020-03-15T22:52:37+00:00" + "time": "2020-03-21T06:55:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -10372,7 +10370,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -10951,20 +10949,6 @@ ], "description": "Symfony Finder Component", "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": "2020-02-14T07:42:58+00:00" }, { @@ -11109,20 +11093,6 @@ ], "description": "Symfony HttpKernel Component", "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": "2020-02-29T10:16:41+00:00" }, { @@ -11773,20 +11743,6 @@ "uri", "url" ], - "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": "2020-02-04T08:04:52+00:00" }, { @@ -11866,20 +11822,6 @@ ], "description": "Symfony Serializer Component", "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": "2020-02-24T14:33:45+00:00" }, { @@ -11950,20 +11892,6 @@ ], "description": "Symfony Translation Component", "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": "2020-02-04T07:22:30+00:00" }, { @@ -12050,20 +11978,6 @@ ], "description": "Symfony Validator Component", "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": "2020-02-29T09:08:42+00:00" }, { @@ -12140,20 +12054,6 @@ "debug", "dump" ], - "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": "2020-02-24T13:10:00+00:00" }, { @@ -12213,20 +12113,6 @@ ], "description": "Symfony Yaml Component", "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": "2020-01-16T19:04:26+00:00" }, { @@ -13966,6 +13852,11 @@ "phpspec/phpspec": "~2.0 || ~4.0" }, "type": "behat-extension", + "extra": { + "patches_applied": { + "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" + } + }, "autoload": { "psr-0": { "Drupal\\Drupal": "src/", @@ -15407,16 +15298,16 @@ }, { "name": "phpstan/phpstan", - "version": "0.12.17", + "version": "0.12.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6" + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b2c37bda79fdb11d801ce208ce391cffc0f572e6", - "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1ce27fe29c8660a27926127d350d53d80c4d4286", + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286", "shasum": "" }, "require": { @@ -15456,7 +15347,7 @@ "type": "tidelift" } ], - "time": "2020-03-17T15:39:11+00:00" + "time": "2020-03-22T16:51:47+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -16824,20 +16715,6 @@ ], "description": "Symfony PHPUnit Bridge", "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": "2020-02-24T14:58:55+00:00" }, { From ef892175d4ff3780f239eda8c60eb82956487759 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 15:45:43 +0200 Subject: [PATCH 347/957] ISAICP-5692: Replace instances of JoinupRelationInfoInterface::getParent() with the leaner and faster JoinupGroupHelper::getGroup(). --- .../joinup_community_content.module | 4 +- .../joinup_community_content.services.yml | 4 +- .../joinup_community_content.tokens.inc | 7 +-- ...ityContentWorkflowAccessControlHandler.php | 15 +---- .../src/Guard/CommunityContentGuard.php | 15 +---- .../BooleanFieldToggleController.php | 31 +--------- .../joinup_group/joinup_group.tokens.inc | 5 +- .../joinup_group/src/Form/ShareForm.php | 56 +------------------ 8 files changed, 16 insertions(+), 121 deletions(-) diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.module b/web/modules/custom/joinup_community_content/joinup_community_content.module index 4bfc11767b..c07ad10761 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.module +++ b/web/modules/custom/joinup_community_content/joinup_community_content.module @@ -125,9 +125,7 @@ function joinup_community_content_workflow_selector(EntityInterface $entity): ?s throw new \InvalidArgumentException('This function can only be called for community content apart from discussion.'); } - /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); - $parent_entity = $relation_info->getParent($entity); + $parent_entity = JoinupGroupHelper::getGroup($entity); // If the entity doesn't have a parent group we cannot determine the workflow. // This can happen e.g. when deleting orphaned group content. diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index 8a494eb6be..30a43f99c0 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -11,9 +11,9 @@ services: - { name: 'event_subscriber' } joinup_community_content.fulfillment_guard: class: Drupal\joinup_community_content\Guard\CommunityContentGuard - arguments: ['@joinup_group.relation_info', '@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] + arguments: ['@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } joinup_community_content.community_content_workflow_access: class: Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler - arguments: ['@entity_type.manager', '@og.membership_manager', '@joinup_group.relation_info', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] + arguments: ['@entity_type.manager', '@og.membership_manager', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index 421a2d82d9..f49f4adf3d 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -9,6 +9,7 @@ declare(strict_types = 1); use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Url; +use Drupal\joinup_group\JoinupGroupHelper; /** * Implements hook_token_info_alter(). @@ -45,7 +46,7 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], $node_storage = \Drupal::entityTypeManager()->getStorage('node'); $revision_ids = $node_storage->revisionIds($node); if (count($revision_ids) > 1) { - list($left_revision, $right_revision) = array_slice($revision_ids, -2, 2); + [$left_revision, $right_revision] = array_slice($revision_ids, -2, 2); $replacements[$original] = Url::fromRoute('diff.revisions_diff', [ 'node' => $node->id(), @@ -57,11 +58,9 @@ function joinup_community_content_tokens($type, array $tokens, array $data = [], break; case 'path-to-community-content': - /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); $path_parts = []; - if ($parent = $relation_info->getParent($node)) { + if ($parent = JoinupGroupHelper::getGroup($node)) { $bubbleable_metadata->addCacheableDependency($parent); /** @var \Drupal\rdf_entity\RdfInterface $collection */ if ($parent->bundle() === 'solution' && $collection = $parent->collection->first()->entity) { diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index efaebfb164..c221175217 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -12,7 +12,6 @@ use Drupal\Core\Session\AccountInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_group\JoinupGroupHelper; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; use Drupal\og\Entity\OgMembership; @@ -84,13 +83,6 @@ class CommunityContentWorkflowAccessControlHandler { */ protected $membershipManager; - /** - * The group relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - /** * The current logged in user. * @@ -119,8 +111,6 @@ class CommunityContentWorkflowAccessControlHandler { * The entity type manager service. * @param \Drupal\og\MembershipManagerInterface $og_membership_manager * The OG membership manager service. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The group relation info service. * @param \Drupal\Core\Session\AccountInterface $current_user * The current logged in user. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory @@ -128,10 +118,9 @@ class CommunityContentWorkflowAccessControlHandler { * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, JoinupGroupRelationInfoInterface $relation_info, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { $this->entityTypeManager = $entity_type_manager; $this->membershipManager = $og_membership_manager; - $this->relationInfo = $relation_info; $this->currentUser = $current_user; $this->workflowHelper = $workflow_helper; $this->configFactory = $config_factory; @@ -375,7 +364,7 @@ protected function getEntityState(NodeInterface $entity): string { * The content creation option value. */ protected function getParentContentCreationOption(NodeInterface $entity): string { - $parent = $this->relationInfo->getParent($entity); + $parent = JoinupGroupHelper::getGroup($entity); return JoinupGroupHelper::getContentCreation($parent); } diff --git a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php index 73649b6fe0..8cb771af41 100644 --- a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php +++ b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php @@ -8,7 +8,6 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_group\JoinupGroupHelper; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\state_machine\Guard\GuardInterface; use Drupal\state_machine\Plugin\Workflow\WorkflowInterface; @@ -27,13 +26,6 @@ class CommunityContentGuard implements GuardInterface { */ protected $currentUser; - /** - * The relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - /** * The allowed transitions array. * @@ -68,8 +60,6 @@ class CommunityContentGuard implements GuardInterface { * The classes inheriting this class, should also ensure that they set the * protected variable $transitions to be used by the ::allowed() method. * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo - * The relation info service. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The configuration factory service. * @param \Drupal\Core\Session\AccountInterface $currentUser @@ -79,8 +69,7 @@ class CommunityContentGuard implements GuardInterface { * @param \Drupal\workflow_state_permission\WorkflowStatePermissionInterface $workflowStatePermission * The workflow state permission service. */ - public function __construct(JoinupGroupRelationInfoInterface $relationInfo, ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { - $this->relationInfo = $relationInfo; + public function __construct(ConfigFactoryInterface $configFactory, AccountInterface $currentUser, WorkflowHelperInterface $workflow_helper, WorkflowStatePermissionInterface $workflowStatePermission) { $this->currentUser = $currentUser; $this->workflowHelper = $workflow_helper; $this->permissionScheme = $configFactory->get('joinup_community_content.permission_scheme'); @@ -105,7 +94,7 @@ public function allowed(WorkflowTransition $transition, WorkflowInterface $workf public function allowedCreate(WorkflowTransition $transition, WorkflowInterface $workflow, EntityInterface $entity) { $permission_scheme = $this->permissionScheme->get('create'); $workflow_id = $workflow->getId(); - $parent = $this->relationInfo->getParent($entity); + $parent = JoinupGroupHelper::getGroup($entity); $content_creation = JoinupGroupHelper::getContentCreation($parent); if (!isset($permission_scheme[$workflow_id][$content_creation][$transition->getId()])) { diff --git a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php index 7ef0a3fd29..61d8c95f33 100644 --- a/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php +++ b/web/modules/custom/joinup_front_page/src/Controller/BooleanFieldToggleController.php @@ -7,8 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\ContentEntityInterface; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\joinup_group\JoinupGroupHelper; /** * Controller that allows to toggle a boolean field on or off. @@ -21,32 +20,6 @@ */ class BooleanFieldToggleController extends ControllerBase { - /** - * The Joinup group relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - - /** - * Instantiates a new SiteFeatureController object. - * - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo - * The Joinup group relation info service. - */ - public function __construct(JoinupGroupRelationInfoInterface $relationInfo) { - $this->relationInfo = $relationInfo; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('joinup_group.relation_info') - ); - } - /** * Route callback that sets the entity field to the specified value. * @@ -113,7 +86,7 @@ protected function getRedirect(ContentEntityInterface $entity) { $redirect = $entity->toUrl(); } else { - $redirect = $this->relationInfo->getParent($entity)->toUrl(); + $redirect = JoinupGroupHelper::getGroup($entity)->toUrl(); } return $this->redirect($redirect->getRouteName(), $redirect->getRouteParameters()); diff --git a/web/modules/custom/joinup_group/joinup_group.tokens.inc b/web/modules/custom/joinup_group/joinup_group.tokens.inc index a768f099e2..6ec7d26c53 100644 --- a/web/modules/custom/joinup_group/joinup_group.tokens.inc +++ b/web/modules/custom/joinup_group/joinup_group.tokens.inc @@ -8,6 +8,7 @@ declare(strict_types = 1); use Drupal\Core\Render\BubbleableMetadata; +use Drupal\joinup_group\JoinupGroupHelper; /** * Implements hook_token_info(). @@ -44,13 +45,11 @@ function joinup_group_tokens(string $type, array $tokens, array $data, array $op } $token_service = \Drupal::token(); - /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); if (isset($tokens['parent_collection'])) { $original = $tokens['parent_collection']; $parent_solution = $rdf_entity; if ($rdf_entity->bundle() !== 'solution') { - $parent_solution = $relation_info->getParent($rdf_entity); + $parent_solution = JoinupGroupHelper::getGroup($rdf_entity); } if (empty($parent_solution) || $parent_solution->collection->isEmpty()) { diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 6847e36b5f..3330c2a0bc 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -7,70 +7,18 @@ use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\RedirectCommand; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\EntityViewBuilderInterface; use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\Core\Form\FormBuilderInterface; use Drupal\Core\Form\FormStateInterface; -use Drupal\Core\Messenger\MessengerInterface; -use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; -use Drupal\og\MembershipManagerInterface; -use Drupal\og\OgRoleManagerInterface; -use Drupal\sparql_entity_storage\SparqlEntityStorage; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\rdf_entity\RdfInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Form to share a community content inside collections. */ abstract class ShareForm extends ShareFormBase { - /** - * The group relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - - /** - * Constructs a new ShareForm. - * - * @param \Drupal\sparql_entity_storage\SparqlEntityStorage $sparql_storage - * The RDF entity storage. - * @param \Drupal\Core\Entity\EntityViewBuilderInterface $rdf_builder - * The RDF view builder. - * @param \Drupal\og\MembershipManagerInterface $membership_manager - * The OG membership manager. - * @param \Drupal\og\OgRoleManagerInterface $role_manager - * The OG role manager service. - * @param \Drupal\Core\Session\AccountInterface $current_user - * The current user account. - * @param \Drupal\Core\Messenger\MessengerInterface $messenger - * The messenger service. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info - * The group relation info service. - */ - public function __construct(SparqlEntityStorage $sparql_storage, EntityViewBuilderInterface $rdf_builder, MembershipManagerInterface $membership_manager, OgRoleManagerInterface $role_manager, AccountInterface $current_user, MessengerInterface $messenger, JoinupGroupRelationInfoInterface $relation_info) { - parent::__construct($sparql_storage, $rdf_builder, $membership_manager, $role_manager, $current_user, $messenger); - $this->relationInfo = $relation_info; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('entity_type.manager')->getStorage('rdf_entity'), - $container->get('entity_type.manager')->getViewBuilder('rdf_entity'), - $container->get('og.membership_manager'), - $container->get('og.role_manager'), - $container->get('current_user'), - $container->get('messenger'), - $container->get('joinup_group.relation_info') - ); - } - /** * {@inheritdoc} */ @@ -252,7 +200,7 @@ protected function getShareableCollections(): array { */ protected function getExcludedParent(): ?RdfInterface { if ($this->entity->getEntityTypeId() === 'node') { - return $this->relationInfo->getParent($this->entity); + return JoinupGroupHelper::getGroup($this->entity); } else { return $this->entity->get('collection')->isEmpty() ? NULL : $this->entity->get('collection')->first()->entity; From 7d2da5048a09dc0af1c9e2a92ab8f5e8a39a26ba Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 16:17:58 +0200 Subject: [PATCH 348/957] ISAICP-5692: Replace instances of JoinupRelationInfoInterface::getParent() with the leaner and faster JoinupGroupHelper::getGroup(). --- .../src/EventSubscriber/ReleaseRdfSubscriber.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php index e2d28f9ef2..92fb2a215a 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/ReleaseRdfSubscriber.php @@ -6,6 +6,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\MessageArgumentGenerator; use Drupal\joinup_notification\NotificationEvents; @@ -308,7 +309,7 @@ protected function generateArguments(EntityInterface $entity): array { $arguments['@entity:field_isr_release_number'] = !empty($entity->get('field_isr_release_number')->first()->value) ? $entity->get('field_isr_release_number')->first()->value : ''; // Add arguments related to the parent collection or solution. - $parent = $this->relationInfo->getParent($entity); + $parent = JoinupGroupHelper::getGroup($entity); if (!empty($parent)) { $arguments += MessageArgumentGenerator::getGroupArguments($parent); if (empty($arguments['@actor:role'])) { From 9dfdd2d8a0465fb36656a46e2263b2f30db3f737 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 16:18:17 +0200 Subject: [PATCH 349/957] ISAICP-5692: Asset releases have a non standard group field name. --- .../joinup_group/src/JoinupGroupHelper.php | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index 8e23bf771b..5455fe785a 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -89,7 +89,7 @@ public static function isSolution(EntityInterface $entity): bool { * Returns the group the entity belongs to. * * This relies on the fact that in Joinup every group entity only belongs to a - * single group, and always uses the default field name for the group field. + * single group. * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity for which to return the group. @@ -98,7 +98,23 @@ public static function isSolution(EntityInterface $entity): bool { * The group entity, or NULL if the entity doesn't have a group. */ public static function getGroup(EntityInterface $entity): ?EntityInterface { - return $entity->get(OgGroupAudienceHelperInterface::DEFAULT_FIELD)->entity; + $group_field = self::getGroupField($entity); + return $entity->get($group_field)->entity; + } + + /** + * Returns the name of the group field for the given entity. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity for which to return the group field name. + * + * @return string + * The field name. + */ + public static function getGroupField(EntityInterface $entity): string { + // Asset releases use the ADMS-AP dictated name for the group field, while + // all others use the default name. + return $entity->bundle() === 'asset_release' ? 'field_isr_is_version_of' : OgGroupAudienceHelperInterface::DEFAULT_FIELD; } /** From 17834703955ae0467daca92f79aaa6f502da5fba Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 16:24:35 +0200 Subject: [PATCH 350/957] ISAICP-5692: Remove method which has been replaced by a leaner and faster implementation. --- .../joinup_group/joinup_group.services.yml | 2 +- .../src/JoinupGroupRelationInfo.php | 55 +------------------ .../src/JoinupGroupRelationInfoInterface.php | 13 ----- 3 files changed, 2 insertions(+), 68 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index aac00615f0..62db04cd50 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -10,7 +10,7 @@ services: lazy: true joinup_group.relation_info: class: Drupal\joinup_group\JoinupGroupRelationInfo - arguments: ['@og.membership_manager', '@entity_type.manager'] + arguments: ['@entity_type.manager'] lazy: true joinup_group.route_subscriber: class: Drupal\joinup_group\Routing\RouteSubscriber diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php index 32d43b6c9a..7fe9da6389 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php @@ -4,13 +4,8 @@ namespace Drupal\joinup_group; -use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException; -use Drupal\Component\Plugin\Exception\PluginNotFoundException; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; -use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\og\MembershipManagerInterface; use Drupal\rdf_entity\RdfInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -26,23 +21,13 @@ class JoinupGroupRelationInfo implements JoinupGroupRelationInfoInterface, Conta */ protected $entityTypeManager; - /** - * The OG membership manager service. - * - * @var \Drupal\og\MembershipManagerInterface - */ - protected $membershipManager; - /** * Constructs a JoinupRelationshipManager object. * - * @param \Drupal\og\MembershipManagerInterface $membershipManager - * The OG membership manager service. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager * The entity type manager. */ - public function __construct(MembershipManagerInterface $membershipManager, EntityTypeManagerInterface $entityTypeManager) { - $this->membershipManager = $membershipManager; + public function __construct(EntityTypeManagerInterface $entityTypeManager) { $this->entityTypeManager = $entityTypeManager; } @@ -51,48 +36,10 @@ public function __construct(MembershipManagerInterface $membershipManager, Entit */ public static function create(ContainerInterface $container) { return new static( - $container->get('og.membership_manager'), $container->get('entity_type.manager') ); } - /** - * {@inheritdoc} - */ - public function getParent(EntityInterface $entity): ?RdfInterface { - $groups = $this->membershipManager->getGroups($entity); - if (empty($groups['rdf_entity'])) { - return NULL; - } - - return reset($groups['rdf_entity']); - } - - /** - * Returns the entity storage for OgMembership entities. - * - * @return \Drupal\Core\Entity\EntityStorageInterface - * The entity storage. - */ - protected function getOgMembershipStorage(): EntityStorageInterface { - // Since entities can be dynamically defined in Drupal the generic entity - // type manager service can throw exceptions in case entities are not - // available. However these circumstances do not apply to us since we are - // requesting the OgMembership entities which are defined in code in the OG - // module on which we correctly depend. Transform these exceptions to - // unchecked runtime exceptions so we don't need to document these all the - // way up the call stack. - try { - return $this->entityTypeManager->getStorage('og_membership'); - } - catch (InvalidPluginDefinitionException $e) { - throw new \RuntimeException('The OgMembership entity has an invalid plugin definition.', NULL, $e); - } - catch (PluginNotFoundException $e) { - throw new \RuntimeException('The OgMembership entity storage does not exist.', NULL, $e); - } - } - /** * {@inheritdoc} */ diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php index 3b7f0d3909..4e44beaf92 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php @@ -4,7 +4,6 @@ namespace Drupal\joinup_group; -use Drupal\Core\Entity\EntityInterface; use Drupal\rdf_entity\RdfInterface; /** @@ -12,18 +11,6 @@ */ interface JoinupGroupRelationInfoInterface { - /** - * Retrieves the parent of the entity. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The group content entity. - * - * @return \Drupal\rdf_entity\RdfInterface|null - * The rdf entity the passed entity belongs to, or NULL when no group is - * found. - */ - public function getParent(EntityInterface $entity): ?RdfInterface; - /** * Returns the groups that relate to a contact information entity. * From cfa09f7a727f4be4990ff37cac199cfcc696b94a Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 23 Mar 2020 16:55:57 +0200 Subject: [PATCH 351/957] ISAICP-5712: Provide a test that requires the correct search result count in the analytics json. --- .../isa2_analytics/site_search.feature | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/features/isa2_analytics/site_search.feature b/tests/features/isa2_analytics/site_search.feature index 9f19ea1f32..1b6cdde69e 100644 --- a/tests/features/isa2_analytics/site_search.feature +++ b/tests/features/isa2_analytics/site_search.feature @@ -7,4 +7,38 @@ Feature: Site search Scenario: Search keywords are tracked in analytics. When I am on the homepage When I enter "sample text 1" in the search bar and press enter + # The result count is 0, thus, is not added. Then the response should contain "\"search\":{\"keyword\":\"sample text 1\"}" + + Scenario: Search results should contain a total count when results are available. + And the following collections: + | title | description | abstract | state | + | Collection total count | No description available. | No abstract available. | validated | + And news content: + | title | headline | body | collection | state | + | News total count | News total count | No body available. | Collection total count | validated | + | News total count new | News total count new | No body available. | Collection total count | draft | + When I am on the homepage + And I enter "total count" in the search bar and press enter + Then I should see the following tiles in the correct order: + | Collection total count | + | News total count | + And the response should contain "\"search\":{\"keyword\":\"total count\",\"count\":2}" + + # Test as different user and change the data to ensure that cache is invalidated properly. + When I am logged in as a moderator + And I enter "total count" in the search bar and press enter + Then I should see the following tiles in the correct order: + | Collection total count | + | News total count | + And the response should contain "\"search\":{\"keyword\":\"total count\",\"count\":2}" + + When I go to the "News total count new" news + And I click "Edit" in the "Entity actions" region + And I press "Publish" + And I enter "total count" in the search bar and press enter + Then I should see the following tiles in the correct order: + | Collection total count | + | News total count | + | News total count new | + And the response should contain "\"search\":{\"keyword\":\"total count\",\"count\":3}" From 1a934f7c6a98f7b0b73eba19dfac345003446149 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 23 Mar 2020 16:58:22 +0200 Subject: [PATCH 352/957] ISAICP-5712: Attach the result count in the page attributes. --- .../isa2_analytics/isa2_analytics.module | 25 +++++++++++++++++++ .../WebtoolsAnalyticsSubscriber.php | 3 +++ 2 files changed, 28 insertions(+) create mode 100644 web/modules/custom/isa2_analytics/isa2_analytics.module diff --git a/web/modules/custom/isa2_analytics/isa2_analytics.module b/web/modules/custom/isa2_analytics/isa2_analytics.module new file mode 100644 index 0000000000..eaa959e8de --- /dev/null +++ b/web/modules/custom/isa2_analytics/isa2_analytics.module @@ -0,0 +1,25 @@ +id() === 'search' && !empty($view->total_rows)) { + \Drupal::requestStack()->getCurrentRequest()->attributes->set('total_rows', $view->total_rows); + } +} diff --git a/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php b/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php index 51f887b323..7ab61a5393 100644 --- a/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php +++ b/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php @@ -122,6 +122,9 @@ public function setSearchData(AnalyticsEventInterface $event) { if ($keys = $this->currentRequest->get('keys')) { $search_data = $event->getSearch(); $search_data->setKeyword($keys); + if ($total_rows = $this->currentRequest->attributes->get('total_rows')) { + $search_data->setCount($total_rows); + } } } From a318dfc8644ee6c244f7a489f11e416f4f9cc830 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 17:31:03 +0200 Subject: [PATCH 353/957] ISAICP-5692: Replace instances of JoinupRelationInfoInterface::getParent() with the leaner and faster JoinupGroupHelper::getGroup(). --- web/modules/custom/joinup_core/README.md | 5 ++--- .../src/Form/InviteToDiscussionForm.php | 3 ++- .../Controller/GroupAdministratorsController.php | 14 +------------- web/themes/joinup/joinup_theme.theme | 3 ++- 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/web/modules/custom/joinup_core/README.md b/web/modules/custom/joinup_core/README.md index e313d03839..f516e61600 100644 --- a/web/modules/custom/joinup_core/README.md +++ b/web/modules/custom/joinup_core/README.md @@ -53,9 +53,8 @@ function joinup_news_workflow_selector(EntityInterface $entity) { if ($entity->bundle() != 'news') { throw new Exception('This method can only be called for document entities'); } - /** @var \Drupal\joinup_group\JoinupGroupRelationInfo $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); - $moderation = $relation_info->getParentModeration($entity); + $parent = Drupal\joinup_group\JoinupGroupHelper::getGroup($entity); + $moderation = Drupal\joinup_group\JoinupGroupHelper::getModeration($parent); $moderation_type = $moderation == 1 ? 'pre_moderated' : 'post_moderated'; return "node:news:$moderation_type"; } diff --git a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php index 2528e71cd3..eee40f09e6 100644 --- a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php +++ b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php @@ -11,6 +11,7 @@ use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Url; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_invite\Entity\Invitation; use Drupal\joinup_invite\Entity\InvitationInterface; use Drupal\joinup_invite\Form\InviteFormBase; @@ -296,7 +297,7 @@ public function access(AccountProxyInterface $account, NodeInterface $node = NUL // user is a facilitator), or the author of the discussion itself. $user = $account->getAccount(); /** @var \Drupal\rdf_entity\Entity\Rdf $group */ - $group = \Drupal::service('joinup_group.relation_info')->getParent($node); + $group = JoinupGroupHelper::getGroup($node); $is_group_administrator = $user->hasPermission('administer groups'); $is_owner = $user->id() == $node->getOwnerId(); diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index 05e8b09dd6..106133d5e3 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -16,7 +16,6 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\csv_serialization\Encoder\CsvEncoder; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; use Drupal\og\GroupTypeManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; @@ -39,13 +38,6 @@ class GroupAdministratorsController extends ControllerBase { */ protected $groupTypeManager; - /** - * The Joinup group relation info service. - * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface - */ - protected $relationInfo; - /** * The entity type bundle info service. * @@ -65,16 +57,13 @@ class GroupAdministratorsController extends ControllerBase { * * @param \Drupal\og\GroupTypeManager $groupTypeManager * The OG group type manager. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relationInfo - * The Joinup group relation info service. * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityTypeBundleInfo * The entity type bundle info service. * @param \Drupal\Core\Routing\RouteMatchInterface $routeMatch * The current route match service. */ - public function __construct(GroupTypeManager $groupTypeManager, JoinupGroupRelationInfoInterface $relationInfo, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { + public function __construct(GroupTypeManager $groupTypeManager, EntityTypeBundleInfoInterface $entityTypeBundleInfo, RouteMatchInterface $routeMatch) { $this->groupTypeManager = $groupTypeManager; - $this->relationInfo = $relationInfo; $this->entityTypeBundleInfo = $entityTypeBundleInfo; $this->routeMatch = $routeMatch; } @@ -85,7 +74,6 @@ public function __construct(GroupTypeManager $groupTypeManager, JoinupGroupRelat public static function create(ContainerInterface $container) { return new static( $container->get('og.group_type_manager'), - $container->get('joinup_group.relation_info'), $container->get('entity_type.bundle.info'), $container->get('current_route_match') ); diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 7fb9731245..cef0f1af46 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -20,6 +20,7 @@ use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; use Drupal\file\Entity\File; use Drupal\image\Entity\ImageStyle; use Drupal\joinup_core\Controller\IdRedirect; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\message\MessageInterface; use Drupal\node\NodeInterface; use Drupal\oe_newsroom_newsletter\Form\NewsletterSubscribeForm; @@ -1986,7 +1987,7 @@ function joinup_theme_preprocess_node(&$variables) { // Add the group ID and label as data attributes in tiles. if ($variables['view_mode'] === 'view_mode_tile') { /** @var \Drupal\rdf_entity\RdfInterface|null $parent */ - $parent = \Drupal::service('joinup_group.relation_info')->getParent($node); + $parent = JoinupGroupHelper::getGroup($node); if ($parent) { $variables['attributes']['data-drupal-parent-id'] = $parent->id(); $variables['attributes']['data-drupal-parent-label'] = $parent->label(); From 0543f3f6f7173e6ceb433c04c18eb9fa4ef63c03 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 23 Mar 2020 17:59:39 +0200 Subject: [PATCH 354/957] ISAICP-5904: Do not send emails for deleting the solutions. --- web/modules/custom/joinup_core/joinup_core.post_update.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 7305f4995e..2f7a8355af 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1129,6 +1129,8 @@ function joinup_core_post_update_delete_orphaned_solutions() { ]; $storage = \Drupal::entityTypeManager()->getStorage('rdf_entity'); foreach ($solution_ids as $solution_id) { - $storage->load($solution_id)->delete(); + $solution = $storage->load($solution_id); + $solution->skip_notification = 1; + $solution->delete(); } } From 92f71f49b27d94e768eca6dab83800d69760a61f Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 23 Mar 2020 18:07:37 +0200 Subject: [PATCH 355/957] ISAICP-5904: Let's use TRUE as always :D --- web/modules/custom/joinup_core/joinup_core.post_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 2f7a8355af..b02c67b45d 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1130,7 +1130,7 @@ function joinup_core_post_update_delete_orphaned_solutions() { $storage = \Drupal::entityTypeManager()->getStorage('rdf_entity'); foreach ($solution_ids as $solution_id) { $solution = $storage->load($solution_id); - $solution->skip_notification = 1; + $solution->skip_notification = TRUE; $solution->delete(); } } From 255b5d9183baa66d4e98c0e4c5d8f49fc3ebf1a2 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 23 Mar 2020 18:12:38 +0200 Subject: [PATCH 356/957] ISAICP-5692: Fix Call to a member function getStorage() on null. --- .../joinup/src/Controller/GroupAdministratorsController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php index 106133d5e3..f0452ae26a 100644 --- a/web/profiles/joinup/src/Controller/GroupAdministratorsController.php +++ b/web/profiles/joinup/src/Controller/GroupAdministratorsController.php @@ -394,8 +394,8 @@ protected function getAdministrativeCollectionMemberships(): array { * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ protected function getCollectionIds(): array { - $storage = $this->entityTypeManager->getStorage('rdf_entity'); - $definition = $this->entityTypeManager->getDefinition('rdf_entity'); + $storage = $this->entityTypeManager()->getStorage('rdf_entity'); + $definition = $this->entityTypeManager()->getDefinition('rdf_entity'); $bundle_key = $definition->getKey('bundle'); $query = $storage->getQuery(); From 1896299d18f15b88e16564ef0884f61ccbade215 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Mon, 23 Mar 2020 19:21:59 +0200 Subject: [PATCH 357/957] ISAICP-5712: Docs improvements. --- web/modules/custom/isa2_analytics/isa2_analytics.module | 4 ++-- .../src/EventSubscriber/WebtoolsAnalyticsSubscriber.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/isa2_analytics/isa2_analytics.module b/web/modules/custom/isa2_analytics/isa2_analytics.module index eaa959e8de..4a77973445 100644 --- a/web/modules/custom/isa2_analytics/isa2_analytics.module +++ b/web/modules/custom/isa2_analytics/isa2_analytics.module @@ -12,8 +12,8 @@ use Drupal\views\ViewExecutable; /** * Implements hook_views_post_execute(). * - * Set the total rows in the parameter bag so that it is retrievable in the - * analytics subscriber. + * Set the total rows in the current request attribute parameter bag so that it + * is retrievable in the analytics subscriber. * * @see \oe_webtools_analytics_page_attachments() * @see \Drupal\isa2_analytics\EventSubscriber\WebtoolsAnalyticsSubscriber::setSearchData diff --git a/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php b/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php index 7ab61a5393..1dbc7bbd42 100644 --- a/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php +++ b/web/modules/custom/isa2_analytics/src/EventSubscriber/WebtoolsAnalyticsSubscriber.php @@ -18,7 +18,7 @@ class WebtoolsAnalyticsSubscriber implements EventSubscriberInterface { /** - * The entity type manager interface. + * The entity type manager service. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ From 0aff5a9e35a59641175059b90020e8aca317aebe Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 24 Mar 2020 17:33:41 +0200 Subject: [PATCH 358/957] ISAICP-5692: Move the remnant of the JoinupGroupRelationInfo service into the contact information module now that it only provides a single method related to contact information. --- .../contact_information.module | 2 +- .../contact_information.services.yml | 3 + .../src/ContactInformationRelationInfo.php} | 8 +- ...ntactInformationRelationInfoInterface.php} | 6 +- ...tactInformationWorkflowStatePermission.php | 10 +- .../joinup_group/joinup_group.services.yml | 4 - .../joinup_group/src/Form/ShareFormBase.php | 3 +- .../ProxyClass/JoinupGroupRelationInfo.php | 166 ------------------ 8 files changed, 18 insertions(+), 184 deletions(-) rename web/modules/custom/{joinup_group/src/JoinupGroupRelationInfo.php => contact_information/src/ContactInformationRelationInfo.php} (85%) rename web/modules/custom/{joinup_group/src/JoinupGroupRelationInfoInterface.php => contact_information/src/ContactInformationRelationInfoInterface.php} (74%) delete mode 100644 web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 7080048091..7dc19a13ee 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -145,7 +145,7 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // entities by a simple reference field. // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. - /** @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info */ + /** @var \Drupal\contact_information\ContactInformationRelationInfoInterface $relation_info */ $relation_info = \Drupal::service('joinup_group.relation_info'); if ($groups = $relation_info->getContactInformationRelatedGroups($entity)) { $group = reset($groups); diff --git a/web/modules/custom/contact_information/contact_information.services.yml b/web/modules/custom/contact_information/contact_information.services.yml index 74c45f1c5f..13b21632f9 100644 --- a/web/modules/custom/contact_information/contact_information.services.yml +++ b/web/modules/custom/contact_information/contact_information.services.yml @@ -4,3 +4,6 @@ services: arguments: ['@current_user', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: contact_information } + contact_information.relation_info: + class: Drupal\contact_information\ContactInformationRelationInfo + arguments: ['@entity_type.manager'] diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php b/web/modules/custom/contact_information/src/ContactInformationRelationInfo.php similarity index 85% rename from web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php rename to web/modules/custom/contact_information/src/ContactInformationRelationInfo.php index 7fe9da6389..0df8990ba8 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfo.php +++ b/web/modules/custom/contact_information/src/ContactInformationRelationInfo.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_group; +namespace Drupal\contact_information; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; @@ -10,9 +10,9 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Service to manage relations for the group content entities. + * Service to provide information about contact information entity relations. */ -class JoinupGroupRelationInfo implements JoinupGroupRelationInfoInterface, ContainerInjectionInterface { +class ContactInformationRelationInfo implements ContactInformationRelationInfoInterface, ContainerInjectionInterface { /** * The entity type manager. @@ -22,7 +22,7 @@ class JoinupGroupRelationInfo implements JoinupGroupRelationInfoInterface, Conta protected $entityTypeManager; /** - * Constructs a JoinupRelationshipManager object. + * Constructs a new ContactInformationRelationInfo service. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager * The entity type manager. diff --git a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php b/web/modules/custom/contact_information/src/ContactInformationRelationInfoInterface.php similarity index 74% rename from web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php rename to web/modules/custom/contact_information/src/ContactInformationRelationInfoInterface.php index 4e44beaf92..192c4fd9a2 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupRelationInfoInterface.php +++ b/web/modules/custom/contact_information/src/ContactInformationRelationInfoInterface.php @@ -2,14 +2,14 @@ declare(strict_types = 1); -namespace Drupal\joinup_group; +namespace Drupal\contact_information; use Drupal\rdf_entity\RdfInterface; /** - * An interface for services that provide information about group relations. + * Interface for services that inform about contact information relations. */ -interface JoinupGroupRelationInfoInterface { +interface ContactInformationRelationInfoInterface { /** * Returns the groups that relate to a contact information entity. diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index 73dbd482ac..f74cca28bf 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -9,7 +9,7 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_group\JoinupGroupRelationInfoInterface; +use Drupal\contact_information\ContactInformationRelationInfoInterface; use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\rdf_entity\RdfInterface; @@ -37,7 +37,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo /** * The relation info service. * - * @var \Drupal\joinup_group\JoinupGroupRelationInfoInterface + * @var \Drupal\contact_information\ContactInformationRelationInfo */ protected $relationInfo; @@ -66,14 +66,14 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo * The plugin implementation definition. * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory * The config factory. - * @param \Drupal\joinup_group\JoinupGroupRelationInfoInterface $relation_info + * @param \Drupal\contact_information\ContactInformationRelationInfoInterface $relation_info * The relation info service. * @param \Drupal\og\MembershipManagerInterface $membership_manager * The membership manager service. * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper * The workflow helper class. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, JoinupGroupRelationInfoInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, ContactInformationRelationInfoInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->configFactory = $configFactory; $this->relationInfo = $relation_info; @@ -90,7 +90,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $container->get('config.factory'), - $container->get('joinup_group.relation_info'), + $container->get('contact_information.relation_info'), $container->get('og.membership_manager'), $container->get('joinup_core.workflow.helper') ); diff --git a/web/modules/custom/joinup_group/joinup_group.services.yml b/web/modules/custom/joinup_group/joinup_group.services.yml index 62db04cd50..4fe42c884e 100644 --- a/web/modules/custom/joinup_group/joinup_group.services.yml +++ b/web/modules/custom/joinup_group/joinup_group.services.yml @@ -8,10 +8,6 @@ services: class: Drupal\joinup_group\JoinupGroupManager arguments: ['@og.membership_manager', '@entity_type.manager'] lazy: true - joinup_group.relation_info: - class: Drupal\joinup_group\JoinupGroupRelationInfo - arguments: ['@entity_type.manager'] - lazy: true joinup_group.route_subscriber: class: Drupal\joinup_group\Routing\RouteSubscriber tags: diff --git a/web/modules/custom/joinup_group/src/Form/ShareFormBase.php b/web/modules/custom/joinup_group/src/Form/ShareFormBase.php index a2a5900b5e..ce011cdd7e 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareFormBase.php +++ b/web/modules/custom/joinup_group/src/Form/ShareFormBase.php @@ -8,6 +8,7 @@ use Drupal\Core\Form\FormBase; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgRoleManagerInterface; use Drupal\rdf_entity\RdfInterface; @@ -193,7 +194,7 @@ protected function getPermissionForAction(string $action): string { */ protected function getExcludedParent(): ?RdfInterface { if ($this->entity->getEntityTypeId() === 'node') { - return $this->relationInfo->getParent($this->entity); + return JoinupGroupHelper::getGroup($this->entity); } else { return $this->entity->get('collection')->isEmpty() ? NULL : $this->entity->get('collection')->first()->entity; diff --git a/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php b/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php deleted file mode 100644 index a8830c3139..0000000000 --- a/web/modules/custom/joinup_group/src/ProxyClass/JoinupGroupRelationInfo.php +++ /dev/null @@ -1,166 +0,0 @@ -container = $container; - $this->drupalProxyOriginalServiceId = $drupal_proxy_original_service_id; - } - - /** - * Lazy loads the real service from the container. - * - * @return object - * Returns the constructed real service. - */ - protected function lazyLoadItself() - { - if (!isset($this->service)) { - $this->service = $this->container->get($this->drupalProxyOriginalServiceId); - } - - return $this->service; - } - - /** - * {@inheritdoc} - */ - public static function create(\Symfony\Component\DependencyInjection\ContainerInterface $container) - { - \Drupal\joinup_group\JoinupGroupRelationInfo::create($container); - } - - /** - * {@inheritdoc} - */ - public function getParent(\Drupal\Core\Entity\EntityInterface $entity) : ?\Drupal\rdf_entity\RdfInterface - { - return $this->lazyLoadItself()->getParent($entity); - } - - /** - * {@inheritdoc} - */ - public function getParentModeration(\Drupal\Core\Entity\EntityInterface $entity) : ?int - { - return $this->lazyLoadItself()->getParentModeration($entity); - } - - /** - * {@inheritdoc} - */ - public function getParentState(\Drupal\Core\Entity\EntityInterface $entity) : string - { - return $this->lazyLoadItself()->getParentState($entity); - } - - /** - * {@inheritdoc} - */ - public function getParentContentCreationOption(\Drupal\Core\Entity\EntityInterface $entity) : string - { - return $this->lazyLoadItself()->getParentContentCreationOption($entity); - } - - /** - * {@inheritdoc} - */ - public function getGroupUsers(\Drupal\Core\Entity\EntityInterface $entity, array $states = array ( - 0 => 'active', - )) : array - { - return $this->lazyLoadItself()->getGroupUsers($entity, $states); - } - - /** - * {@inheritdoc} - */ - public function getGroupMemberships(\Drupal\Core\Entity\EntityInterface $entity, array $states = array ( - 0 => 'active', - )) : array - { - return $this->lazyLoadItself()->getGroupMemberships($entity, $states); - } - - /** - * {@inheritdoc} - */ - public function getUserGroupMembershipsByBundle(\Drupal\Core\Session\AccountInterface $user, string $entity_type_id, string $bundle_id, array $states = array ( - 0 => 'active', - )) : array - { - return $this->lazyLoadItself()->getUserGroupMembershipsByBundle($user, $entity_type_id, $bundle_id, $states); - } - - /** - * {@inheritdoc} - */ - public function getCollectionIds() : array - { - return $this->lazyLoadItself()->getCollectionIds(); - } - - /** - * {@inheritdoc} - */ - public function getSolutionIds() : array - { - return $this->lazyLoadItself()->getSolutionIds(); - } - - /** - * {@inheritdoc} - */ - public function getContactInformationRelatedGroups(\Drupal\rdf_entity\RdfInterface $entity) : array - { - return $this->lazyLoadItself()->getContactInformationRelatedGroups($entity); - } - - } - -} From f482e77218f33fc629d736a39a906413ebf16fe5 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 24 Mar 2020 17:41:19 +0200 Subject: [PATCH 359/957] ISAICP-5692: Remove obsolete dependency. --- web/modules/custom/joinup_rss/joinup_rss.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_rss/joinup_rss.info.yml b/web/modules/custom/joinup_rss/joinup_rss.info.yml index cdda6371da..f8dd188f31 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.info.yml +++ b/web/modules/custom/joinup_rss/joinup_rss.info.yml @@ -6,7 +6,6 @@ package: Joinup dependencies: - drupal:views - - joinup_group:joinup_group - joinup_search:joinup_search - smart_trim:smart_trim From 0f138853278439bb7d98da03a902bb9beb4a1927 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 24 Mar 2020 17:54:51 +0200 Subject: [PATCH 360/957] ISAICP-5891: Update dependencies. --- composer.lock | 244 +++++++++++++------------------------------------- 1 file changed, 61 insertions(+), 183 deletions(-) diff --git a/composer.lock b/composer.lock index 201d5dc00a..26d00e3447 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": "3208e99b9406944ef112da2fabc0d19f", + "content-hash": "bafb725c6737304b5fb2bff3a0b19bbc", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.39", + "version": "3.133.42", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455" + "reference": "4f0259689e66237e429f9fc1d879b2bcdce6dadb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0e3b9e497bd39063cb504115c726d369d8f4d455", - "reference": "0e3b9e497bd39063cb504115c726d369d8f4d455", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4f0259689e66237e429f9fc1d879b2bcdce6dadb", + "reference": "4f0259689e66237e429f9fc1d879b2bcdce6dadb", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-18T18:13:04+00:00" + "time": "2020-03-23T18:17:07+00:00" }, { "name": "caxy/php-htmldiff", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -739,12 +729,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -2317,16 +2301,16 @@ }, { "name": "doctrine/persistence", - "version": "1.3.6", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", "shasum": "" }, "require": { @@ -2334,7 +2318,7 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.1", + "doctrine/reflection": "^1.2", "php": "^7.1" }, "conflict": { @@ -2396,20 +2380,34 @@ "orm", "persistence" ], - "time": "2020-01-16T22:06:23+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2020-03-21T15:13:52+00:00" }, { "name": "doctrine/reflection", - "version": "v1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" + "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/b699ecc7f2784d1e49924fd9858cf1078db6b0e2", + "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2", "shasum": "" }, "require": { @@ -2430,7 +2428,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -2474,7 +2472,7 @@ "reflection", "static" ], - "time": "2020-01-08T19:53:19+00:00" + "time": "2020-03-21T11:34:59+00:00" }, { "name": "drupal/allowed_formats", @@ -9994,16 +9992,16 @@ }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -10037,20 +10035,20 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { "name": "psy/psysh", - "version": "v0.10.0", + "version": "v0.10.2", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c" + "reference": "573c2362c3cdebe846b4adae4b630eecb350afd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e361c8b7e5114534078e0ce04ddc442b39018a3c", - "reference": "e361c8b7e5114534078e0ce04ddc442b39018a3c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/573c2362c3cdebe846b4adae4b630eecb350afd8", + "reference": "573c2362c3cdebe846b4adae4b630eecb350afd8", "shasum": "" }, "require": { @@ -10110,7 +10108,7 @@ "interactive", "shell" ], - "time": "2020-03-15T22:52:37+00:00" + "time": "2020-03-21T06:55:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -10373,7 +10371,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -10952,20 +10950,6 @@ ], "description": "Symfony Finder Component", "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": "2020-02-14T07:42:58+00:00" }, { @@ -11110,20 +11094,6 @@ ], "description": "Symfony HttpKernel Component", "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": "2020-02-29T10:16:41+00:00" }, { @@ -11774,20 +11744,6 @@ "uri", "url" ], - "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": "2020-02-04T08:04:52+00:00" }, { @@ -11867,20 +11823,6 @@ ], "description": "Symfony Serializer Component", "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": "2020-02-24T14:33:45+00:00" }, { @@ -11951,20 +11893,6 @@ ], "description": "Symfony Translation Component", "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": "2020-02-04T07:22:30+00:00" }, { @@ -12051,20 +11979,6 @@ ], "description": "Symfony Validator Component", "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": "2020-02-29T09:08:42+00:00" }, { @@ -12141,20 +12055,6 @@ "debug", "dump" ], - "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": "2020-02-24T13:10:00+00:00" }, { @@ -12214,20 +12114,6 @@ ], "description": "Symfony Yaml Component", "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": "2020-01-16T19:04:26+00:00" }, { @@ -13533,24 +13419,25 @@ }, { "name": "drupal/coder", - "version": "8.3.7", + "version": "8.3.8", "source": { "type": "git", "url": "https://git.drupalcode.org/project/coder.git", - "reference": "c11c2957653bdbfd68adc851692d094b43d39221" + "reference": "e53e75b45842a5d2b454b08c318a17f57339e60e" }, "require": { "ext-mbstring": "*", - "php": ">=5.5.9", - "squizlabs/php_codesniffer": "^3.4.1", + "php": ">=7.0.8", + "squizlabs/php_codesniffer": "^3.5.4", "symfony/yaml": ">=2.0.5" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpstan/phpstan": "^0.12.5", + "phpunit/phpunit": "^6.0 || ^7.0" }, "type": "phpcodesniffer-standard", "autoload": { - "psr-0": { + "psr-4": { "Drupal\\": "coder_sniffer/Drupal/", "DrupalPractice\\": "coder_sniffer/DrupalPractice/" } @@ -13566,7 +13453,7 @@ "phpcs", "standards" ], - "time": "2019-12-07T16:00:28+00:00" + "time": "2020-03-08T19:03:35+00:00" }, { "name": "drupal/config_devel", @@ -13967,6 +13854,11 @@ "phpspec/phpspec": "~2.0 || ~4.0" }, "type": "behat-extension", + "extra": { + "patches_applied": { + "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" + } + }, "autoload": { "psr-0": { "Drupal\\Drupal": "src/", @@ -15408,16 +15300,16 @@ }, { "name": "phpstan/phpstan", - "version": "0.12.17", + "version": "0.12.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6" + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b2c37bda79fdb11d801ce208ce391cffc0f572e6", - "reference": "b2c37bda79fdb11d801ce208ce391cffc0f572e6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1ce27fe29c8660a27926127d350d53d80c4d4286", + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286", "shasum": "" }, "require": { @@ -15457,7 +15349,7 @@ "type": "tidelift" } ], - "time": "2020-03-17T15:39:11+00:00" + "time": "2020-03-22T16:51:47+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -16825,20 +16717,6 @@ ], "description": "Symfony PHPUnit Bridge", "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": "2020-02-24T14:58:55+00:00" }, { From 6cef7f8012932c38a53766013306cbe0460ed463 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 24 Mar 2020 18:00:11 +0200 Subject: [PATCH 361/957] ISAICP-5891: Tighten up coding standards detection. --- phpcs-ruleset.xml.dist | 2 - .../NotificationSubscriber.php | 5 +- .../src/CustomPageOgMenuLinksManager.php | 46 +++++++++---------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/phpcs-ruleset.xml.dist b/phpcs-ruleset.xml.dist index 3dad8fbef9..d74e977aab 100644 --- a/phpcs-ruleset.xml.dist +++ b/phpcs-ruleset.xml.dist @@ -23,8 +23,6 @@ - - diff --git a/web/modules/custom/contact_form/src/EventSubscriber/NotificationSubscriber.php b/web/modules/custom/contact_form/src/EventSubscriber/NotificationSubscriber.php index 19542a59d6..4728ddc700 100644 --- a/web/modules/custom/contact_form/src/EventSubscriber/NotificationSubscriber.php +++ b/web/modules/custom/contact_form/src/EventSubscriber/NotificationSubscriber.php @@ -9,7 +9,6 @@ use Drupal\Core\Url; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\EventSubscriber\NotificationSubscriberBase; -use Drupal\user\Entity\User; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** @@ -128,9 +127,11 @@ protected function sendReportMessage(NotificationEvent $event) { * Skip generating the arguments during the sending process. */ protected function sendUserDataMessages(array $user_data, array $arguments = [], array $notifier_options = [], array $message_values = []): bool { + $user_storage = $this->entityTypeManager->getStorage('user'); + $success = TRUE; foreach ($user_data as $template_id => $user_ids) { - $success = $this->messageDelivery->sendMessageTemplateToMultipleUsers($template_id, $arguments, User::loadMultiple($user_ids), $notifier_options, $message_values) && $success; + $success = $this->messageDelivery->sendMessageTemplateToMultipleUsers($template_id, $arguments, $user_storage->loadMultiple($user_ids), $notifier_options, $message_values) && $success; } return $success; } diff --git a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php index f338b906a4..5c351790e5 100644 --- a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php +++ b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php @@ -7,7 +7,6 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Menu\MenuLinkManagerInterface; use Drupal\Core\Url; -use Drupal\node\Entity\Node; use Drupal\node\NodeInterface; use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\og_menu\OgMenuInstanceInterface; @@ -19,11 +18,11 @@ class CustomPageOgMenuLinksManager implements CustomPageOgMenuLinksManagerInterface { /** - * The OG menu instance storage. + * The entity type manager. * - * @var \Drupal\Core\Entity\EntityStorageInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $ogMenuInstanceStorage; + protected $entityTypeManager; /** * The menu link manager service. @@ -32,13 +31,6 @@ class CustomPageOgMenuLinksManager implements CustomPageOgMenuLinksManagerInterf */ protected $menuLinkManager; - /** - * The menu link content storage. - * - * @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage - */ - protected $menuLinkContentStorage; - /** * Builds a new custom page OG menu links updater service. * @@ -48,8 +40,7 @@ class CustomPageOgMenuLinksManager implements CustomPageOgMenuLinksManagerInterf * The menu link manager service. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MenuLinkManagerInterface $menu_link_manager) { - $this->ogMenuInstanceStorage = $entity_type_manager->getStorage('ogmenu_instance'); - $this->menuLinkContentStorage = $entity_type_manager->getStorage('menu_link_content'); + $this->entityTypeManager = $entity_type_manager; $this->menuLinkManager = $menu_link_manager; } @@ -57,12 +48,15 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Men * {@inheritdoc} */ public function getChildren(NodeInterface $custom_page) : array { + $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); + $node_storage = $this->entityTypeManager->getStorage('node'); + $this->verifyCustomPage($custom_page); $children = []; if ($og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { $menu_name = "ogmenu-{$og_menu_instance->id()}"; // Collect the IDs of links to the custom page. - $mids = $this->menuLinkContentStorage->getQuery() + $mids = $menu_link_content_storage->getQuery() ->condition('bundle', 'menu_link_content') ->condition('menu_name', $menu_name) ->condition('link.uri', "entity:node/{$custom_page->id()}") @@ -70,22 +64,22 @@ public function getChildren(NodeInterface $custom_page) : array { if ($mids) { $parents = []; /** @var \Drupal\menu_link_content\MenuLinkContentInterface $menu_link */ - foreach ($this->menuLinkContentStorage->loadMultiple($mids) as $menu_link) { + foreach ($menu_link_content_storage->loadMultiple($mids) as $menu_link) { $parents[] = $menu_link->getPluginId(); } if ($parents) { - $children_ids = $this->menuLinkContentStorage->getQuery() + $children_ids = $menu_link_content_storage->getQuery() ->condition('bundle', 'menu_link_content') ->condition('menu_name', $menu_name) ->condition('parent', $parents, 'IN') ->execute(); if ($children_ids) { - foreach ($this->menuLinkContentStorage->loadMultiple($children_ids) as $menu_link) { + foreach ($menu_link_content_storage->loadMultiple($children_ids) as $menu_link) { if ($uri = $menu_link->link->uri) { try { $url = Url::fromUri($uri); if ($url->isRouted() && $url->getRouteName() === 'entity.node.canonical' && ($parameters = $url->getRouteParameters()) && !empty($parameters['node'])) { - if ($node = Node::load($parameters['node'])) { + if ($node = $node_storage->load($parameters['node'])) { $children[$parameters['node']] = $node; } } @@ -106,9 +100,10 @@ public function getChildren(NodeInterface $custom_page) : array { * {@inheritdoc} */ public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface { + $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); if ($og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { - $this->menuLinkContentStorage->create([ + $menu_link_content_storage->create([ 'title' => $custom_page->label(), 'menu_name' => 'ogmenu-' . $og_menu_instance->id(), 'link' => ['uri' => 'entity:node/' . $custom_page->id()], @@ -122,12 +117,13 @@ public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManag * {@inheritdoc} */ public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgMenuLinksManagerInterface { + $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); if ($source_og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { if ($target_og_menu_instance = $this->getOgMenuInstanceByGroupId($group_id)) { $source_menu_name = "ogmenu-{$source_og_menu_instance->id()}"; // Collect the IDs of links to the custom page. - $mids = $this->menuLinkContentStorage->getQuery() + $mids = $menu_link_content_storage->getQuery() ->condition('bundle', 'menu_link_content') ->condition('menu_name', $source_menu_name) ->condition('link.uri', "entity:node/{$custom_page->id()}") @@ -135,7 +131,7 @@ public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgM if ($mids) { $target_menu_name = "ogmenu-{$target_og_menu_instance->id()}"; /** @var \Drupal\menu_link_content\MenuLinkContentInterface $menu_link */ - foreach ($this->menuLinkContentStorage->loadMultiple($mids) as $menu_link) { + foreach ($menu_link_content_storage->loadMultiple($mids) as $menu_link) { // Change the OG menu instance of each link. $menu_link->set('menu_name', $target_menu_name)->save(); }; @@ -150,6 +146,7 @@ public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgM * {@inheritdoc} */ public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface { + $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); /** @var \Drupal\Core\Menu\MenuLinkTreeInterface $t */ if ($og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { @@ -163,13 +160,13 @@ public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksM if ($instance->getMenuName() === $menu_name && $instance->isDeletable() && strpos($id, 'menu_link_content:') === 0) { $instance->deleteLink(); // Search for children of deleted menu link. - $mids = $this->menuLinkContentStorage->getQuery() + $mids = $menu_link_content_storage->getQuery() ->condition('parent', "menu_link_content:{$instance->getDerivativeId()}") ->execute(); if ($mids) { // Remove the relationship to the deleted parent menu link. /** @var \Drupal\menu_link_content\MenuLinkContentInterface $menu_link_content */ - foreach ($this->menuLinkContentStorage->loadMultiple($mids) as $menu_link_content) { + foreach ($menu_link_content_storage->loadMultiple($mids) as $menu_link_content) { $menu_link_content->set('parent', NULL)->save(); } } @@ -220,7 +217,8 @@ protected function getOgMenuInstanceByGroupId(string $group_id) : ?OgMenuInstanc 'type' => 'navigation', OgGroupAudienceHelperInterface::DEFAULT_FIELD => $group_id, ]; - if ($instances = $this->ogMenuInstanceStorage->loadByProperties($properties)) { + $storage = $this->entityTypeManager->getStorage('ogmenu_instance'); + if ($instances = $storage->loadByProperties($properties)) { return reset($instances); } } From b74f836265b2420782533452b909c84cfa23d5ff Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 24 Mar 2020 20:17:32 +0200 Subject: [PATCH 362/957] ISAICP-5692: Fix leftover update to the new location of the service. --- .../custom/contact_information/contact_information.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 7dc19a13ee..0ac5ffb522 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -146,7 +146,7 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati // To grant access to group owner/facilitators, we need to identify first // which groups reference the contact information. /** @var \Drupal\contact_information\ContactInformationRelationInfoInterface $relation_info */ - $relation_info = \Drupal::service('joinup_group.relation_info'); + $relation_info = \Drupal::service('contact_information.relation_info'); if ($groups = $relation_info->getContactInformationRelatedGroups($entity)) { $group = reset($groups); $membership = \Drupal::service('og.membership_manager')->getMembership($group, $account->id()); From 19ad871fa663d67a216e1de2ac3fcc5d3633b966 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 09:19:51 +0200 Subject: [PATCH 363/957] ISAICP-5902: Update hook name after moving it to a different module. --- web/modules/custom/joinup_workflow/joinup_workflow.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module index 67a185d9e1..33c778d9d3 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.module +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -20,7 +20,7 @@ use Drupal\Core\StringTranslation\TranslatableMarkup; * buttons are used the current workflow state is not indicated, so this field * can be used to expose this information. */ -function joinup_core_entity_base_field_info(EntityTypeInterface $entity_type) { +function joinup_workflow_entity_base_field_info(EntityTypeInterface $entity_type) { $fields = []; if ($entity_type->id() === 'rdf_entity' || $entity_type->id() === 'node') { From e395d0fdc3c9423dea0ce73ee16c8c2872b5da7c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 09:57:21 +0200 Subject: [PATCH 364/957] ISAICP-5902: Move the WorkflowHelper into its own little module. --- tests/src/Traits/WorkflowTrait.php | 6 +++--- .../custom/asset_release/asset_release.module | 6 ++++-- web/modules/custom/collection/collection.module | 4 ++-- .../contact_information.module | 4 ++-- ...ContactInformationWorkflowStatePermission.php | 8 ++++---- .../joinup_community_content.services.yml | 4 ++-- ...munityContentWorkflowAccessControlHandler.php | 6 +++--- .../src/Guard/CommunityContentGuard.php | 6 +++--- .../CommunityContentWorkflowStatePermission.php | 8 ++++---- .../tests/src/Kernel/CustomTokensTest.php | 2 +- .../custom/joinup_core/joinup_core.module | 8 ++++---- .../custom/joinup_core/joinup_core.services.yml | 3 --- .../src/Plugin/Block/StatisticsBlock.php | 10 ++++++---- .../JoinupWorkflowExistingSiteTestBase.php | 4 ++-- .../joinup_notification.services.yml | 2 +- .../CommunityContentSubscriber.php | 8 ++++---- .../NotificationSubscriberBase.php | 10 +++++----- .../joinup_workflow/joinup_workflow.services.yml | 4 ++++ .../FieldWidget/CurrentWorkflowStateWidget.php | 8 ++++---- .../src/WorkflowHelper.php | 16 +++++++++------- .../src/WorkflowHelperInterface.php | 14 +++++++------- web/modules/custom/owner/owner.module | 4 ++-- web/modules/custom/solution/solution.module | 4 ++-- .../src/WorkflowStatePermissionInterface.php | 2 +- 24 files changed, 79 insertions(+), 72 deletions(-) create mode 100644 web/modules/custom/joinup_workflow/joinup_workflow.services.yml rename web/modules/custom/{joinup_core => joinup_workflow}/src/WorkflowHelper.php (93%) rename web/modules/custom/{joinup_core => joinup_workflow}/src/WorkflowHelperInterface.php (92%) diff --git a/tests/src/Traits/WorkflowTrait.php b/tests/src/Traits/WorkflowTrait.php index f068e5e3a7..0307774e37 100644 --- a/tests/src/Traits/WorkflowTrait.php +++ b/tests/src/Traits/WorkflowTrait.php @@ -4,7 +4,7 @@ use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; /** * Helper methods to deal with workflow checks. @@ -124,11 +124,11 @@ protected function getEntityStateField(FieldableEntityInterface $entity) { /** * Returns the workflow helper service. * - * @return \Drupal\joinup_core\WorkflowHelperInterface + * @return \Drupal\joinup_workflow\WorkflowHelperInterface * The workflow helper service. */ protected function getWorkflowHelper(): WorkflowHelperInterface { - return \Drupal::service('joinup_core.workflow.helper'); + return \Drupal::service('joinup_workflow.workflow_helper'); } /** diff --git a/web/modules/custom/asset_release/asset_release.module b/web/modules/custom/asset_release/asset_release.module index 1893862a93..dfa2d702d1 100644 --- a/web/modules/custom/asset_release/asset_release.module +++ b/web/modules/custom/asset_release/asset_release.module @@ -5,6 +5,8 @@ * Contains hooks regarding the asset_release rdf entity bundle. */ +declare(strict_types = 1); + use Drupal\Core\Access\AccessResult; use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\EntityInterface; @@ -200,8 +202,8 @@ function asset_release_rdf_entity_access(EntityInterface $entity, $operation, Ac break; case 'edit': - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $allowed_states = $workflow_helper->getAvailableTargetStates($entity, $account); return AccessResult::forbiddenIf(empty($allowed_states)); } diff --git a/web/modules/custom/collection/collection.module b/web/modules/custom/collection/collection.module index 0d72c7c77f..d7dd102aad 100644 --- a/web/modules/custom/collection/collection.module +++ b/web/modules/custom/collection/collection.module @@ -138,8 +138,8 @@ function collection_rdf_entity_access(EntityInterface $entity, $operation, Accou break; case 'edit': - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $allowed_transitions = $workflow_helper->getAvailableTransitions($entity, $account); return empty($allowed_transitions) ? AccessResult::forbidden() : AccessResult::allowed(); diff --git a/web/modules/custom/contact_information/contact_information.module b/web/modules/custom/contact_information/contact_information.module index 0ac5ffb522..c25fe4c82b 100644 --- a/web/modules/custom/contact_information/contact_information.module +++ b/web/modules/custom/contact_information/contact_information.module @@ -134,8 +134,8 @@ function contact_information_rdf_entity_access(EntityInterface $entity, $operati } } elseif ($operation == 'edit') { - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $available_target_states = $workflow_helper->getAvailableTargetStates($entity, $account); return empty($available_target_states) ? AccessResult::forbidden() : AccessResult::allowed(); } diff --git a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php index f74cca28bf..baeb9d32b8 100644 --- a/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php +++ b/web/modules/custom/contact_information/src/Plugin/WorkflowStatePermission/ContactInformationWorkflowStatePermission.php @@ -10,7 +10,7 @@ use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; use Drupal\contact_information\ContactInformationRelationInfoInterface; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\rdf_entity\RdfInterface; use Drupal\workflow_state_permission\WorkflowStatePermissionPluginInterface; @@ -51,7 +51,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo /** * The workflow helper class. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -70,7 +70,7 @@ class ContactInformationWorkflowStatePermission extends PluginBase implements Wo * The relation info service. * @param \Drupal\og\MembershipManagerInterface $membership_manager * The membership manager service. - * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper class. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, ContactInformationRelationInfoInterface $relation_info, MembershipManagerInterface $membership_manager, WorkflowHelperInterface $workflow_helper) { @@ -92,7 +92,7 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('config.factory'), $container->get('contact_information.relation_info'), $container->get('og.membership_manager'), - $container->get('joinup_core.workflow.helper') + $container->get('joinup_workflow.workflow_helper') ); } diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml index 30a43f99c0..a70ab74b2d 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.services.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.services.yml @@ -11,9 +11,9 @@ services: - { name: 'event_subscriber' } joinup_community_content.fulfillment_guard: class: Drupal\joinup_community_content\Guard\CommunityContentGuard - arguments: ['@config.factory', '@current_user', '@joinup_core.workflow.helper', '@workflow_state_permission.workflow_state_permission'] + arguments: ['@config.factory', '@current_user', '@joinup_workflow.workflow_helper', '@workflow_state_permission.workflow_state_permission'] tags: - { name: state_machine.guard, group: community_content } joinup_community_content.community_content_workflow_access: class: Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler - arguments: ['@entity_type.manager', '@og.membership_manager', '@current_user', '@config.factory', '@joinup_core.workflow.helper'] + arguments: ['@entity_type.manager', '@og.membership_manager', '@current_user', '@config.factory', '@joinup_workflow.workflow_helper'] diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index c221175217..9c3e9cd553 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -10,7 +10,7 @@ use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; @@ -100,7 +100,7 @@ class CommunityContentWorkflowAccessControlHandler { /** * The workflow helper class. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -115,7 +115,7 @@ class CommunityContentWorkflowAccessControlHandler { * The current logged in user. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory service. - * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper service. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MembershipManagerInterface $og_membership_manager, AccountInterface $current_user, ConfigFactoryInterface $config_factory, WorkflowHelperInterface $workflow_helper) { diff --git a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php index 8cb771af41..a6a6715237 100644 --- a/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php +++ b/web/modules/custom/joinup_community_content/src/Guard/CommunityContentGuard.php @@ -8,7 +8,7 @@ use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_group\JoinupGroupHelper; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\state_machine\Guard\GuardInterface; use Drupal\state_machine\Plugin\Workflow\WorkflowInterface; use Drupal\state_machine\Plugin\Workflow\WorkflowTransition; @@ -43,7 +43,7 @@ class CommunityContentGuard implements GuardInterface { /** * The workflow helper class. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -64,7 +64,7 @@ class CommunityContentGuard implements GuardInterface { * The configuration factory service. * @param \Drupal\Core\Session\AccountInterface $currentUser * The current logged in user. - * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper service. * @param \Drupal\workflow_state_permission\WorkflowStatePermissionInterface $workflowStatePermission * The workflow state permission service. diff --git a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php index 732e395c14..02b1053364 100644 --- a/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php +++ b/web/modules/custom/joinup_community_content/src/Plugin/WorkflowStatePermission/CommunityContentWorkflowStatePermission.php @@ -11,7 +11,7 @@ use Drupal\Core\Session\AccountInterface; use Drupal\joinup_community_content\CommunityContentHelper; use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\og\MembershipManagerInterface; use Drupal\workflow_state_permission\WorkflowStatePermissionPluginInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -48,7 +48,7 @@ class CommunityContentWorkflowStatePermission extends PluginBase implements Work /** * The workflow helper service. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -65,7 +65,7 @@ class CommunityContentWorkflowStatePermission extends PluginBase implements Work * The config factory. * @param \Drupal\og\MembershipManagerInterface $membershipManager * The OG membership manager. - * @param \Drupal\joinup_core\WorkflowHelperInterface $workflowHelper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflowHelper * The workflow helper service. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $configFactory, MembershipManagerInterface $membershipManager, WorkflowHelperInterface $workflowHelper) { @@ -85,7 +85,7 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_definition, $container->get('config.factory'), $container->get('og.membership_manager'), - $container->get('joinup_core.workflow.helper') + $container->get('joinup_workflow.workflow_helper') ); } diff --git a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php index 6f0c05ea98..815dc7340e 100644 --- a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php +++ b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php @@ -40,7 +40,7 @@ public function register(ContainerBuilder $container) { // Register a few services directly to avoid having to enable a long chain // of module dependencies. - $this->container->register('joinup_core.workflow.helper', '\Drupal\joinup_core\WorkflowHelper'); + $this->container->register('joinup_workflow.workflow_helper', '\Drupal\joinup_workflow\WorkflowHelper'); $this->container->register('joinup_notification.message_delivery', '\Drupal\joinup_notification\JoinupMessageDelivery'); } diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 66419881de..a962c1bbd7 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -362,8 +362,8 @@ function joinup_core_entity_create(EntityInterface $entity) { // depending on the initial state that is passed into the entity. // @see: \Drupal\state_machine\Plugin\Field\FieldType\StateItem::preSave if ($entity instanceof EntityPublishedInterface) { - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); if ($workflow_helper->hasEntityStateField($entity->getEntityTypeId(), $entity->bundle())) { $state_field = $workflow_helper->getEntityStateField($entity); $workflow = $state_field->getWorkflow(); @@ -497,8 +497,8 @@ function joinup_core_motivation_form_validate(array &$form, FormStateInterface $ } $to_state = $triggering_element['#state_id']; - /** @var \Drupal\joinup_core\WorkflowHelper $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $state_field = $workflow_helper->getEntityStateFieldDefinition($entity->getEntityTypeId(), $entity->bundle())->getName(); /** @var \Drupal\state_machine\Plugin\Workflow\Workflow $workflow */ $workflow = $workflow_helper->getWorkflow($entity, $state_field); diff --git a/web/modules/custom/joinup_core/joinup_core.services.yml b/web/modules/custom/joinup_core/joinup_core.services.yml index fd3923720d..42daf0e2ab 100644 --- a/web/modules/custom/joinup_core/joinup_core.services.yml +++ b/web/modules/custom/joinup_core/joinup_core.services.yml @@ -5,9 +5,6 @@ services: class: Drupal\joinup_core\EventSubscriber\JoinupCoreOgSubscriber tags: - name: event_subscriber - joinup_core.workflow.helper: - class: Drupal\joinup_core\WorkflowHelper - arguments: ['@current_user', '@account_switcher', '@entity_field.manager', '@og.membership_manager', '@workflow_state_permission.workflow_state_permission'] joinup_core.vocabulary_fixtures.helper: class: Drupal\joinup_core\VocabularyFixturesHelper arguments: ['@sparql_endpoint'] diff --git a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php b/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php index d82eed4abc..78275cc857 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php +++ b/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php @@ -1,12 +1,14 @@ get('entity_type.manager'), - $container->get('joinup_core.workflow.helper') + $container->get('joinup_workflow.workflow_helper') ); } diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php index 84ec683744..83c4876aae 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php @@ -43,7 +43,7 @@ abstract class JoinupWorkflowExistingSiteTestBase extends JoinupExistingSiteTest /** * The workflow helper service. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -56,7 +56,7 @@ protected function setUp(): void { $this->ogAccess = \Drupal::service('og.access'); $this->entityAccess = \Drupal::service('entity_type.manager') ->getAccessControlHandler($this->getEntityType()); - $this->workflowHelper = \Drupal::service('joinup_core.workflow.helper'); + $this->workflowHelper = \Drupal::service('joinup_workflow.workflow_helper'); } /** diff --git a/web/modules/custom/joinup_notification/joinup_notification.services.yml b/web/modules/custom/joinup_notification/joinup_notification.services.yml index 020a931058..57c9ac85e8 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.services.yml +++ b/web/modules/custom/joinup_notification/joinup_notification.services.yml @@ -7,7 +7,7 @@ services: arguments: ['@message_notify.sender'] joinup_notification.notification_subscriber_base: abstract: true - arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_core.workflow.helper', '@joinup_notification.message_delivery'] + arguments: ['@entity_type.manager', '@config.factory', '@current_user', '@og.group_type_manager', '@og.membership_manager', '@joinup_workflow.workflow_helper', '@joinup_notification.message_delivery'] joinup_notification.community_content.subscriber: class: Drupal\joinup_notification\EventSubscriber\CommunityContentSubscriber parent: joinup_notification.notification_subscriber_base diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 6877dbcb0d..027bfe2bac 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -9,12 +9,12 @@ use Drupal\Core\Entity\EntityTypeManager; use Drupal\Core\Session\AccountProxy; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_core\WorkflowHelper; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; use Drupal\joinup_notification\MessageArgumentGenerator; use Drupal\joinup_notification\NotificationEvents; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\og\GroupTypeManager; use Drupal\og\MembershipManager; use Drupal\og\OgRoleInterface; @@ -83,15 +83,15 @@ class CommunityContentSubscriber extends NotificationSubscriberBase implements E * The og group type manager service. * @param \Drupal\og\MembershipManager $og_membership_manager * The og membership manager service. - * @param \Drupal\joinup_core\WorkflowHelper $joinup_core_workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message deliver service. * @param \Drupal\state_machine_revisions\RevisionManagerInterface $revision_manager * The revision manager service. */ - public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelper $joinup_core_workflow_helper, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { - parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $joinup_core_workflow_helper, $message_delivery); + public function __construct(EntityTypeManager $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManager $og_membership_manager, WorkflowHelperInterface $workflow_helper, JoinupMessageDeliveryInterface $message_delivery, RevisionManagerInterface $revision_manager) { + parent::__construct($entity_type_manager, $config_factory, $current_user, $og_group_type_manager, $og_membership_manager, $workflow_helper, $message_delivery); $this->revisionManager = $revision_manager; } diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 1ec8913c87..3964cfa63a 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -10,10 +10,10 @@ use Drupal\Core\Session\AccountProxy; use Drupal\Core\Url; use Drupal\joinup_group\JoinupGroupHelper; -use Drupal\joinup_core\WorkflowHelperInterface; use Drupal\joinup_notification\Event\NotificationEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; use Drupal\joinup_notification\MessageArgumentGenerator; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\og\GroupTypeManager; use Drupal\og\MembershipManagerInterface; use Drupal\og\OgRoleInterface; @@ -84,7 +84,7 @@ abstract class NotificationSubscriberBase { /** * The workflow helper service. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -108,18 +108,18 @@ abstract class NotificationSubscriberBase { * The og group type manager service. * @param \Drupal\og\MembershipManagerInterface $og_membership_manager * The og membership manager service. - * @param \Drupal\joinup_core\WorkflowHelperInterface $joinup_core_workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper service. * @param \Drupal\joinup_notification\JoinupMessageDeliveryInterface $message_delivery * The message delivery service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $joinup_core_workflow_helper, JoinupMessageDeliveryInterface $message_delivery) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactory $config_factory, AccountProxy $current_user, GroupTypeManager $og_group_type_manager, MembershipManagerInterface $og_membership_manager, WorkflowHelperInterface $workflow_helper, JoinupMessageDeliveryInterface $message_delivery) { $this->entityTypeManager = $entity_type_manager; $this->configFactory = $config_factory; $this->currentUser = $current_user; $this->groupTypeManager = $og_group_type_manager; $this->membershipManager = $og_membership_manager; - $this->workflowHelper = $joinup_core_workflow_helper; + $this->workflowHelper = $workflow_helper; $this->messageDelivery = $message_delivery; } diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.services.yml b/web/modules/custom/joinup_workflow/joinup_workflow.services.yml new file mode 100644 index 0000000000..b83ec49d1e --- /dev/null +++ b/web/modules/custom/joinup_workflow/joinup_workflow.services.yml @@ -0,0 +1,4 @@ +services: + joinup_workflow.workflow_helper: + class: Drupal\joinup_workflow\WorkflowHelper + arguments: ['@current_user', '@account_switcher', '@entity_field.manager', '@og.membership_manager', '@workflow_state_permission.workflow_state_permission'] diff --git a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php index 3e635e07c3..e959e80d35 100644 --- a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/CurrentWorkflowStateWidget.php @@ -9,7 +9,7 @@ use Drupal\Core\Field\WidgetBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; -use Drupal\joinup_core\WorkflowHelperInterface; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -28,7 +28,7 @@ class CurrentWorkflowStateWidget extends WidgetBase implements ContainerFactoryP /** * The workflow helper service. * - * @var \Drupal\joinup_core\WorkflowHelperInterface + * @var \Drupal\joinup_workflow\WorkflowHelperInterface */ protected $workflowHelper; @@ -45,7 +45,7 @@ class CurrentWorkflowStateWidget extends WidgetBase implements ContainerFactoryP * The widget settings. * @param array $third_party_settings * Any third party settings. - * @param \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper + * @param \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper * The workflow helper service. */ public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, WorkflowHelperInterface $workflow_helper) { @@ -64,7 +64,7 @@ public static function create(ContainerInterface $container, array $configuratio $configuration['field_definition'], $configuration['settings'], $configuration['third_party_settings'], - $container->get('joinup_core.workflow.helper') + $container->get('joinup_workflow.workflow_helper') ); } diff --git a/web/modules/custom/joinup_core/src/WorkflowHelper.php b/web/modules/custom/joinup_workflow/src/WorkflowHelper.php similarity index 93% rename from web/modules/custom/joinup_core/src/WorkflowHelper.php rename to web/modules/custom/joinup_workflow/src/WorkflowHelper.php index a8fbe5d65a..3bb8d1c5b5 100644 --- a/web/modules/custom/joinup_core/src/WorkflowHelper.php +++ b/web/modules/custom/joinup_workflow/src/WorkflowHelper.php @@ -1,6 +1,8 @@ getEntityStateFieldDefinitions($entity_type_id, $bundle_id)) { return reset($field_definitions); } @@ -159,7 +161,7 @@ public function getEntityStateFieldDefinition($entity_type_id, $bundle_id): ?Fie /** * {@inheritdoc} */ - public function getEntityStateFieldDefinitions($entity_type_id, $bundle_id): array { + public function getEntityStateFieldDefinitions(string $entity_type_id, string $bundle_id): array { return array_filter($this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle_id), function (FieldDefinitionInterface $field_definition) { return $field_definition->getType() == 'state'; }); @@ -177,14 +179,14 @@ public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, /** * {@inheritdoc} */ - public function hasEntityStateField($entity_type_id, $bundle_id): bool { + public function hasEntityStateField(string $entity_type_id, string $bundle_id): bool { return (bool) $this->getEntityStateFieldDefinitions($entity_type_id, $bundle_id); } /** * {@inheritdoc} */ - public function isWorkflowStatePublished($state_id, WorkflowInterface $workflow): bool { + public function isWorkflowStatePublished(string $state_id, WorkflowInterface $workflow): bool { // We rely on being able to inspect the plugin definition. Throw an error if // this is not the case. if (!$workflow instanceof PluginInspectionInterface) { @@ -201,7 +203,7 @@ public function isWorkflowStatePublished($state_id, WorkflowInterface $workflow) /** * {@inheritdoc} */ - public function getWorkflow(EntityInterface $entity, $state_field_name = NULL): ?WorkflowInterface { + public function getWorkflow(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowInterface { if (empty($state_field_name)) { $state_field_item = $this->getEntityStateField($entity); if (empty($state_field_item)) { @@ -216,7 +218,7 @@ public function getWorkflow(EntityInterface $entity, $state_field_name = NULL): /** * {@inheritdoc} */ - public function findTransitionOnUpdate(EntityInterface $entity, $state_field_name = NULL): ?WorkflowTransition { + public function findTransitionOnUpdate(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowTransition { if (empty($state_field_name)) { $state_field_item = $this->getEntityStateField($entity); if (empty($state_field_item)) { diff --git a/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php b/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php similarity index 92% rename from web/modules/custom/joinup_core/src/WorkflowHelperInterface.php rename to web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php index 935eacc626..cd407007e0 100644 --- a/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php +++ b/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core; +namespace Drupal\joinup_workflow; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\FieldableEntityInterface; @@ -78,7 +78,7 @@ public function getAvailableTransitions(FieldableEntityInterface $entity, Accoun * @return \Drupal\Core\Field\FieldDefinitionInterface[] * Returns an array of state field definitions. */ - public function getEntityStateFieldDefinitions($entity_type_id, $bundle_id): array; + public function getEntityStateFieldDefinitions(string $entity_type_id, string $bundle_id): array; /** * Returns the state field definition of an entity. @@ -96,7 +96,7 @@ public function getEntityStateFieldDefinitions($entity_type_id, $bundle_id): arr * Returns the state field definition of the entity or NULL if none is * found. */ - public function getEntityStateFieldDefinition($entity_type_id, $bundle_id): ?FieldDefinitionInterface; + public function getEntityStateFieldDefinition(string $entity_type_id, string $bundle_id): ?FieldDefinitionInterface; /** * Returns the StateItem field for a given entity. @@ -127,7 +127,7 @@ public function getEntityStateField(FieldableEntityInterface $entity): StateItem * @return bool * TRUE if the entity has a state field. FALSE otherwise. */ - public function hasEntityStateField($entity_type_id, $bundle_id): bool; + public function hasEntityStateField(string $entity_type_id, string $bundle_id): bool; /** * Checks if a state is set as published in a certain workflow. @@ -144,7 +144,7 @@ public function hasEntityStateField($entity_type_id, $bundle_id): bool; * Thrown when the workflow is not plugin based, because this is required to * retrieve the publication state from the workflow states. */ - public function isWorkflowStatePublished($state_id, WorkflowInterface $workflow): bool; + public function isWorkflowStatePublished(string $state_id, WorkflowInterface $workflow): bool; /** * Returns the workflow related to an entity. @@ -157,7 +157,7 @@ public function isWorkflowStatePublished($state_id, WorkflowInterface $workflow) * @return \Drupal\workflows\WorkflowInterface|null * The workflow object or null if it was not found. */ - public function getWorkflow(EntityInterface $entity, $state_field_name = NULL): ?WorkflowInterface; + public function getWorkflow(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowInterface; /** * Finds the transition given an entity that is being updated. @@ -170,7 +170,7 @@ public function getWorkflow(EntityInterface $entity, $state_field_name = NULL): * @return \Drupal\state_machine\Plugin\Workflow\WorkflowTransition|null * The transition object or null if it was not found. */ - public function findTransitionOnUpdate(EntityInterface $entity, $state_field_name = NULL): ?WorkflowTransition; + public function findTransitionOnUpdate(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowTransition; /** * Checks whether the user has at least one of the provided roles. diff --git a/web/modules/custom/owner/owner.module b/web/modules/custom/owner/owner.module index 5340438123..a37cce6f97 100644 --- a/web/modules/custom/owner/owner.module +++ b/web/modules/custom/owner/owner.module @@ -167,8 +167,8 @@ function owner_rdf_entity_access(EntityInterface $entity, $operation, AccountInt switch ($operation) { case 'edit': - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $allowed_states = $workflow_helper->getAvailableTargetStates($entity, $account); return AccessResult::forbiddenIf(empty($allowed_states)); } diff --git a/web/modules/custom/solution/solution.module b/web/modules/custom/solution/solution.module index cd53182b12..198a8c2bf1 100644 --- a/web/modules/custom/solution/solution.module +++ b/web/modules/custom/solution/solution.module @@ -168,8 +168,8 @@ function solution_rdf_entity_access(EntityInterface $entity, $operation, Account } if ($operation == 'edit') { - /** @var \Drupal\joinup_core\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_core.workflow.helper'); + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); $allowed_transitions = $workflow_helper->getAvailableTransitions($entity, $account); if (empty($allowed_transitions)) { return AccessResult::forbidden(); diff --git a/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionInterface.php b/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionInterface.php index efdd0ef18a..1fae0f2880 100644 --- a/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionInterface.php +++ b/web/modules/custom/workflow_state_permission/src/WorkflowStatePermissionInterface.php @@ -40,7 +40,7 @@ interface WorkflowStatePermissionInterface { * @return bool * TRUE if the transition is allowed, FALSE if it is not. * - * @see \Drupal\joinup_core\WorkflowHelperInterface::getAvailableTargetStates() + * @see \Drupal\joinup_workflow\WorkflowHelperInterface::getAvailableTargetStates() */ public function isStateUpdatePermitted(AccountInterface $account, EntityInterface $entity, string $from_state, string $to_state): bool; From 8ba5550e7632f2255e9090361e6b18e9b6d8c5b4 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 09:57:37 +0200 Subject: [PATCH 365/957] ISAICP-5902: Update documentation. --- .../src/EventSubscriber/CommunityContentSubscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php index 027bfe2bac..bc6e45bee9 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/CommunityContentSubscriber.php @@ -22,7 +22,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** - * Class CommunityContentSubscriber. + * Notification subscriber for community content. */ class CommunityContentSubscriber extends NotificationSubscriberBase implements EventSubscriberInterface { From acf868014d66e1d8b238b73f7b734edb12727201 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 10:20:07 +0200 Subject: [PATCH 366/957] ISAICP-5902: Update dependencies. --- web/modules/custom/asset_release/asset_release.info.yml | 1 + web/modules/custom/collection/collection.info.yml | 1 + .../custom/contact_information/contact_information.info.yml | 1 + .../joinup_community_content/joinup_community_content.info.yml | 1 + .../custom/joinup_notification/joinup_notification.info.yml | 1 + web/modules/custom/owner/owner.info.yml | 1 + web/modules/custom/solution/solution.info.yml | 1 + 7 files changed, 7 insertions(+) diff --git a/web/modules/custom/asset_release/asset_release.info.yml b/web/modules/custom/asset_release/asset_release.info.yml index aed3114fd5..c076ed58c9 100644 --- a/web/modules/custom/asset_release/asset_release.info.yml +++ b/web/modules/custom/asset_release/asset_release.info.yml @@ -16,6 +16,7 @@ dependencies: - 'joinup:contact_information' - 'joinup:joinup_core' - 'joinup:joinup_user' + - 'joinup:joinup_workflow' - 'joinup:owner' - 'joinup:workflow_state_permission' - 'og:og' diff --git a/web/modules/custom/collection/collection.info.yml b/web/modules/custom/collection/collection.info.yml index 983e67cda8..02ba67b2a5 100644 --- a/web/modules/custom/collection/collection.info.yml +++ b/web/modules/custom/collection/collection.info.yml @@ -16,6 +16,7 @@ dependencies: - joinup:contact_information - joinup:joinup_core - joinup:joinup_group + - joinup:joinup_workflow - joinup:oe_newsroom_newsletter - joinup:owner - joinup:rdf_schema_field_validation diff --git a/web/modules/custom/contact_information/contact_information.info.yml b/web/modules/custom/contact_information/contact_information.info.yml index d5d10dd3ab..0da40f5ce2 100644 --- a/web/modules/custom/contact_information/contact_information.info.yml +++ b/web/modules/custom/contact_information/contact_information.info.yml @@ -9,6 +9,7 @@ dependencies: - 'drupal:link' - 'drupal:text' - 'joinup:joinup_core' + - 'joinup:joinup_workflow' - 'rdf_entity:rdf_entity' - 'state_machine:state_machine' diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.info.yml b/web/modules/custom/joinup_community_content/joinup_community_content.info.yml index c8a8a36f4f..5e32cef119 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.info.yml +++ b/web/modules/custom/joinup_community_content/joinup_community_content.info.yml @@ -13,6 +13,7 @@ dependencies: - drupal:text - joinup:joinup_core - joinup:joinup_group + - joinup:joinup_workflow - joinup:workflow_state_permission - state_machine:state_machine diff --git a/web/modules/custom/joinup_notification/joinup_notification.info.yml b/web/modules/custom/joinup_notification/joinup_notification.info.yml index ac43a5b6fe..17a53dfacf 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.info.yml +++ b/web/modules/custom/joinup_notification/joinup_notification.info.yml @@ -5,6 +5,7 @@ core: 8.x package: Joinup dependencies: - 'joinup:joinup_core' + - 'joinup:joinup_workflow' - 'joinup:solution' - 'joinup:state_machine_revisions' - 'message:message' diff --git a/web/modules/custom/owner/owner.info.yml b/web/modules/custom/owner/owner.info.yml index cd463ee1e0..a9d5521215 100644 --- a/web/modules/custom/owner/owner.info.yml +++ b/web/modules/custom/owner/owner.info.yml @@ -6,6 +6,7 @@ package: Joinup dependencies: - 'joinup:joinup_core' + - 'joinup:joinup_workflow' - 'joinup:workflow_state_permission' - 'state_machine:state_machine' diff --git a/web/modules/custom/solution/solution.info.yml b/web/modules/custom/solution/solution.info.yml index cf8ffa3d1f..b707df7e29 100644 --- a/web/modules/custom/solution/solution.info.yml +++ b/web/modules/custom/solution/solution.info.yml @@ -16,6 +16,7 @@ dependencies: - 'joinup:contact_information' - 'joinup:joinup_core' - 'joinup:joinup_group' + - 'joinup:joinup_workflow' - 'joinup:owner' - 'joinup:workflow_state_permission' - 'rdf_entity:rdf_entity' From 046d784e327f44563df53c9c26f45ad4eb792be8 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 10:38:13 +0200 Subject: [PATCH 367/957] ISAICP-5902: Move workflow related procedural code into the joinup_workflow module. --- .../custom/joinup_core/joinup_core.module | 141 ----------------- .../joinup_workflow/joinup_workflow.module | 143 ++++++++++++++++++ 2 files changed, 143 insertions(+), 141 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index a962c1bbd7..5f1492a765 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -442,147 +442,6 @@ function joinup_core_entity_extra_field_info() { return $fields; } -/** - * Returns an array of form IDs that should have a motivation field. - * - * @return array - * An array of form IDs. - */ -function joinup_core_get_motivation_form_ids() { - return [ - 'rdf_entity_collection_edit_form', - 'rdf_entity_solution_edit_form', - 'rdf_entity_asset_release_edit_form', - 'node_discussion_edit_form', - 'node_document_edit_form', - 'node_event_edit_form', - 'node_news_edit_form', - ]; -} - -/** - * Implements hook_form_alter(). - */ -function joinup_core_form_alter(&$form, FormStateInterface $form_state, $form_id) { - if (!in_array($form_id, joinup_core_get_motivation_form_ids())) { - return; - } - - $form['transition_motivation'] = [ - '#type' => 'textarea', - '#title' => t('Motivation'), - '#description' => t('Description of the reason of this operation.'), - ]; - $form['#validate'][] = 'joinup_core_motivation_form_validate'; -} - -/** - * Validation function for the forms with a motivation field. - * - * @param array $form - * The form array. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The form state object. - */ -function joinup_core_motivation_form_validate(array &$form, FormStateInterface $form_state) { - /** @var \Drupal\node\NodeInterface $entity */ - $entity = $form_state->getFormObject()->getEntity(); - - $triggering_element = $form_state->getTriggeringElement(); - // If '#state_id' is empty, it means that no transition has been triggered. - // @see \Drupal\joinup_core\Plugin\Field\FieldWidget\StateMachineButtons::processActions() - // "Add new" in the contact information field. - if (empty($triggering_element['#state_id'])) { - return; - } - $to_state = $triggering_element['#state_id']; - - /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); - $state_field = $workflow_helper->getEntityStateFieldDefinition($entity->getEntityTypeId(), $entity->bundle())->getName(); - /** @var \Drupal\state_machine\Plugin\Workflow\Workflow $workflow */ - $workflow = $workflow_helper->getWorkflow($entity, $state_field); - $from_state = $entity->get($state_field)->first()->value; - - $transition = $workflow->findTransition($from_state, $to_state); - if (empty($transition)) { - return; - } - - $required = joinup_core_is_motivation_required($entity->getEntityTypeId(), $workflow->getId(), $transition->getId()); - // @todo Remove this when the 'reject_deletion' and 'reject_archival' for - // rdf_entities are separate transitions. - // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3644 - if ($entity->getEntityTypeId() === 'rdf_entity' && $entity->bundle() === 'collection' && $transition->getId() === 'validate' && !in_array($from_state, ['archival_request', 'deletion_request'])) { - $required = FALSE; - } - // @todo Remove this when the 'reject_deletion' and 'proposed_from_validated' - // for rdf_entities are separate transitions. - // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3840 - if ($entity->getEntityTypeId() === 'rdf_entity' && $entity->bundle() === 'solution') { - $user_roles = \Drupal::currentUser()->getRoles(); - $reject_deletion = $transition->getId() === 'validate' && $from_state === 'deletion_request'; - $propose_changes = $transition->getId() === 'propose' && $from_state === 'validated' && in_array('moderator', $user_roles); - if ($reject_deletion || $propose_changes) { - $required = TRUE; - } - } - - if ($required && empty($form_state->getValue('transition_motivation'))) { - $form_state->setErrorByName('transition_motivation', t('This action requires you to fill in the motivation field.')); - } - $entity->motivation = $form_state->getValue('transition_motivation'); -} - -/** - * Returns whether the transition requires a motivation. - * - * @param string $entity_type_id - * The entity type ID. - * @param string $workflow_id - * The workflow ID. - * @param string $transition_id - * The transition ID. - * - * @return bool - * Whether the transition requires a motivation. - */ -function joinup_core_is_motivation_required($entity_type_id, $workflow_id, $transition_id) { - $required_transitions = [ - 'node' => [ - 'node:pre_moderated' => [ - 'report', - 'request_changes', - 'report', - 'reject_deletion', - 'request_deletion', - ], - 'node:post_moderated' => [ - 'report', - 'request_changes', - ], - 'node:discussion:post_moderated' => [ - 'report', - 'request_changes', - ], - ], - 'rdf_entity' => [ - 'collection_workflow' => [ - 'validate', - 'archive', - ], - 'solution_workflow' => [ - 'needs_update', - ], - 'asset_release_workflow' => [ - 'request_changes', - ], - ], - ]; - - return !empty($required_transitions[$entity_type_id][$workflow_id]) && in_array($transition_id, $required_transitions[$entity_type_id][$workflow_id]); -} - /** * Only index English content. * diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module index 33c778d9d3..d0618a4af5 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.module +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -9,6 +9,7 @@ declare(strict_types = 1); use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\BaseFieldDefinition; +use Drupal\Core\Form\FormStateInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; /** @@ -33,3 +34,145 @@ function joinup_workflow_entity_base_field_info(EntityTypeInterface $entity_type return $fields; } + +/** + * Implements hook_form_alter(). + */ +function joinup_workflow_form_alter(&$form, FormStateInterface $form_state, $form_id) { + if (!in_array($form_id, joinup_workflow_get_motivation_form_ids())) { + return; + } + + $form['transition_motivation'] = [ + '#type' => 'textarea', + '#title' => t('Motivation'), + '#description' => t('Description of the reason of this operation.'), + ]; + $form['#validate'][] = 'joinup_workflow_motivation_form_validate'; +} + +/** + * Returns an array of form IDs that should have a motivation field. + * + * @return array + * An array of form IDs. + */ +function joinup_workflow_get_motivation_form_ids() { + return [ + 'rdf_entity_collection_edit_form', + 'rdf_entity_solution_edit_form', + 'rdf_entity_asset_release_edit_form', + 'node_discussion_edit_form', + 'node_document_edit_form', + 'node_event_edit_form', + 'node_news_edit_form', + ]; +} + +/** + * Validation function for the forms with a motivation field. + * + * @param array $form + * The form array. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state object. + */ +function joinup_workflow_motivation_form_validate(array &$form, FormStateInterface $form_state) { + /** @var \Drupal\node\NodeInterface $entity */ + $entity = $form_state->getFormObject()->getEntity(); + + $triggering_element = $form_state->getTriggeringElement(); + // If '#state_id' is empty, it means that no transition has been triggered. + // @see \Drupal\joinup_core\Plugin\Field\FieldWidget\StateMachineButtons::processActions() + // "Add new" in the contact information field. + if (empty($triggering_element['#state_id'])) { + return; + } + $to_state = $triggering_element['#state_id']; + + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); + $state_field = $workflow_helper->getEntityStateFieldDefinition($entity->getEntityTypeId(), $entity->bundle())->getName(); + /** @var \Drupal\state_machine\Plugin\Workflow\Workflow $workflow */ + $workflow = $workflow_helper->getWorkflow($entity, $state_field); + $from_state = $entity->get($state_field)->first()->value; + + $transition = $workflow->findTransition($from_state, $to_state); + if (empty($transition)) { + return; + } + + $required = joinup_workflow_is_motivation_required($entity->getEntityTypeId(), $workflow->getId(), $transition->getId()); + // @todo Remove this when the 'reject_deletion' and 'reject_archival' for + // rdf_entities are separate transitions. + // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3644 + if ($entity->getEntityTypeId() === 'rdf_entity' && $entity->bundle() === 'collection' && $transition->getId() === 'validate' && !in_array($from_state, ['archival_request', 'deletion_request'])) { + $required = FALSE; + } + // @todo Remove this when the 'reject_deletion' and 'proposed_from_validated' + // for rdf_entities are separate transitions. + // @see https://webgate.ec.europa.eu/CITnet/jira/browse/ISAICP-3840 + if ($entity->getEntityTypeId() === 'rdf_entity' && $entity->bundle() === 'solution') { + $user_roles = \Drupal::currentUser()->getRoles(); + $reject_deletion = $transition->getId() === 'validate' && $from_state === 'deletion_request'; + $propose_changes = $transition->getId() === 'propose' && $from_state === 'validated' && in_array('moderator', $user_roles); + if ($reject_deletion || $propose_changes) { + $required = TRUE; + } + } + + if ($required && empty($form_state->getValue('transition_motivation'))) { + $form_state->setErrorByName('transition_motivation', t('This action requires you to fill in the motivation field.')); + } + $entity->motivation = $form_state->getValue('transition_motivation'); +} + +/** + * Returns whether the transition requires a motivation. + * + * @param string $entity_type_id + * The entity type ID. + * @param string $workflow_id + * The workflow ID. + * @param string $transition_id + * The transition ID. + * + * @return bool + * Whether the transition requires a motivation. + */ +function joinup_workflow_is_motivation_required($entity_type_id, $workflow_id, $transition_id) { + $required_transitions = [ + 'node' => [ + 'node:pre_moderated' => [ + 'report', + 'request_changes', + 'report', + 'reject_deletion', + 'request_deletion', + ], + 'node:post_moderated' => [ + 'report', + 'request_changes', + ], + 'node:discussion:post_moderated' => [ + 'report', + 'request_changes', + ], + ], + 'rdf_entity' => [ + 'collection_workflow' => [ + 'validate', + 'archive', + ], + 'solution_workflow' => [ + 'needs_update', + ], + 'asset_release_workflow' => [ + 'request_changes', + ], + ], + ]; + + return !empty($required_transitions[$entity_type_id][$workflow_id]) && in_array($transition_id, $required_transitions[$entity_type_id][$workflow_id]); +} + From 337c42505b7583fe0f542e9976cf4f678494f886 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 10:41:48 +0200 Subject: [PATCH 368/957] ISAICP-5902: Adhere to coding standards. --- web/modules/custom/joinup_workflow/joinup_workflow.module | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module index d0618a4af5..a71b625689 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.module +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -175,4 +175,3 @@ function joinup_workflow_is_motivation_required($entity_type_id, $workflow_id, $ return !empty($required_transitions[$entity_type_id][$workflow_id]) && in_array($transition_id, $required_transitions[$entity_type_id][$workflow_id]); } - From 5a0eb30c0c9a831b98905a20e4cdd804b7db95de Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 25 Mar 2020 10:43:10 +0200 Subject: [PATCH 369/957] ISAICP-5692: Fix a wrong module dependency prefix. --- web/modules/custom/joinup_rss/joinup_rss.info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_rss/joinup_rss.info.yml b/web/modules/custom/joinup_rss/joinup_rss.info.yml index f8dd188f31..be22217679 100644 --- a/web/modules/custom/joinup_rss/joinup_rss.info.yml +++ b/web/modules/custom/joinup_rss/joinup_rss.info.yml @@ -6,7 +6,7 @@ package: Joinup dependencies: - drupal:views - - joinup_search:joinup_search + - joinup:joinup_search - smart_trim:smart_trim config_devel: From 45f95ad290dbaab06cbf92e56cd3a31b160aedd1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 10:44:51 +0200 Subject: [PATCH 370/957] ISAICP-5902: Make sure the Joinup Workflow module is installed. --- config/sync/core.extension.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index b7df322263..1797819d6f 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -81,6 +81,7 @@ module: joinup_subscription: 0 joinup_user: 0 joinup_video: 0 + joinup_workflow: 0 language: 0 layout_discovery: 0 link: 0 From de217bbca6fbf8eefe723fe08073c491c30193a7 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 11:08:59 +0200 Subject: [PATCH 371/957] ISAICP-5902: Move the StatisticsBlock out of joinup_core. This solves an inverse dependency from joinup_core on joinup_workflow. Since this block is only shown on the front page this is the right module for it. --- config/sync/block.block.statistics.yml | 4 ++-- web/modules/custom/joinup_core/joinup_core.module | 7 ------- .../config/install/block.block.statistics.yml | 4 ++-- .../joinup_front_page/joinup_front_page.info.yml | 3 +++ .../joinup_front_page/joinup_front_page.module | 15 +++++++++++++++ .../src/Plugin/Block/StatisticsBlock.php | 2 +- .../templates/statistics-block.html.twig | 0 web/profiles/joinup/joinup.info.yml | 1 - 8 files changed, 23 insertions(+), 13 deletions(-) rename web/{profiles/joinup => modules/custom/joinup_front_page}/config/install/block.block.statistics.yml (91%) rename web/modules/custom/{joinup_core => joinup_front_page}/src/Plugin/Block/StatisticsBlock.php (98%) rename web/modules/custom/{joinup_core => joinup_front_page}/templates/statistics-block.html.twig (100%) diff --git a/config/sync/block.block.statistics.yml b/config/sync/block.block.statistics.yml index 1d43910070..cf818c87c3 100644 --- a/config/sync/block.block.statistics.yml +++ b/config/sync/block.block.statistics.yml @@ -3,7 +3,7 @@ langcode: en status: true dependencies: module: - - joinup_core + - joinup_front_page - system - user theme: @@ -17,7 +17,7 @@ plugin: statistics settings: id: broken label: 'Statistics block' - provider: joinup_core + provider: joinup_front_page label_display: '0' visibility: request_path: diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 5f1492a765..df9fadad75 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -44,13 +44,6 @@ function joinup_core_theme($existing, $type, $theme, $path) { 'suffix_text' => '', ], ], - 'statistics_block' => [ - 'variables' => [ - 'collection_count' => 0, - 'solution_count' => 0, - 'content_count' => 0, - ], - ], '404_not_found' => [ 'variables' => [ 'search' => [], diff --git a/web/profiles/joinup/config/install/block.block.statistics.yml b/web/modules/custom/joinup_front_page/config/install/block.block.statistics.yml similarity index 91% rename from web/profiles/joinup/config/install/block.block.statistics.yml rename to web/modules/custom/joinup_front_page/config/install/block.block.statistics.yml index dde09fd62b..d90662caf2 100644 --- a/web/profiles/joinup/config/install/block.block.statistics.yml +++ b/web/modules/custom/joinup_front_page/config/install/block.block.statistics.yml @@ -2,7 +2,7 @@ langcode: en status: true dependencies: module: - - joinup_core + - joinup_front_page - system - user theme: @@ -16,7 +16,7 @@ plugin: statistics settings: id: broken label: 'Statistics block' - provider: joinup_core + provider: joinup_front_page label_display: '0' visibility: request_path: diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml index ff41e7902f..1dc1002d1a 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml +++ b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml @@ -5,11 +5,14 @@ core: 8.x package: Joinup dependencies: + - 'drupal:user' - 'joinup:joinup_group' + - 'joinup:joinup_workflow' - 'menu_admin_per_menu:menu_admin_per_menu' config_devel: install: - block.block.recommended_content + - block.block.statistics - system.menu.front-page - tour.tour.joinup_homepage diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.module b/web/modules/custom/joinup_front_page/joinup_front_page.module index 5ab2274bb9..4400b578cb 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.module +++ b/web/modules/custom/joinup_front_page/joinup_front_page.module @@ -89,3 +89,18 @@ function joinup_front_page_menu_link_content_update(MenuLinkContentInterface $en $entity = reset($entities); $front_page_helper->updateSearchApiEntry($entity); } + +/** + * Implements hook_theme(). + */ +function joinup_front_page_theme($existing, $type, $theme, $path) { + return [ + 'statistics_block' => [ + 'variables' => [ + 'collection_count' => 0, + 'solution_count' => 0, + 'content_count' => 0, + ], + ], + ]; +} diff --git a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php b/web/modules/custom/joinup_front_page/src/Plugin/Block/StatisticsBlock.php similarity index 98% rename from web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php rename to web/modules/custom/joinup_front_page/src/Plugin/Block/StatisticsBlock.php index 78275cc857..4236ebb00f 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php +++ b/web/modules/custom/joinup_front_page/src/Plugin/Block/StatisticsBlock.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Plugin\Block; +namespace Drupal\joinup_front_page\Plugin\Block; use Drupal\Core\Block\BlockBase; use Drupal\Core\Cache\Cache; diff --git a/web/modules/custom/joinup_core/templates/statistics-block.html.twig b/web/modules/custom/joinup_front_page/templates/statistics-block.html.twig similarity index 100% rename from web/modules/custom/joinup_core/templates/statistics-block.html.twig rename to web/modules/custom/joinup_front_page/templates/statistics-block.html.twig diff --git a/web/profiles/joinup/joinup.info.yml b/web/profiles/joinup/joinup.info.yml index 299de3bd70..1acda2a384 100644 --- a/web/profiles/joinup/joinup.info.yml +++ b/web/profiles/joinup/joinup.info.yml @@ -43,7 +43,6 @@ config_devel: - block.block.seven_login - block.block.solutiontype - block.block.spatial_coverage_facet - - block.block.statistics - block.block.support - block.block.support_homepage - block.block.table_of_contents From 9cb459d89df2fc8e65eea4a4cb7aae9c351d62b1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 11:16:26 +0200 Subject: [PATCH 372/957] ISAICP-5902: Move workflow related code into the joinup_workflow module, solving an inverse dependency. --- .../custom/joinup_core/joinup_core.module | 30 ------------------ .../joinup_workflow/joinup_workflow.module | 31 +++++++++++++++++++ 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index df9fadad75..4ee24d9721 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -12,7 +12,6 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Database\Query\AlterableInterface; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; @@ -342,35 +341,6 @@ function joinup_core_field_formatter_info_alter(array &$info) { $info['link']['field_types'][] = 'report_link'; } -/** - * Implements hook_entity_create(). - */ -function joinup_core_entity_create(EntityInterface $entity) { - // Since the state_machine module does not support same from-to state - // transitions, the transition events also don't fire. Normally, the - // transition event would be the one to decide whether the entity would be - // published or not, this is not happening for new entities. - // In Joinup, we do not create any entity with an initial state but for - // testing, it is necessary to setup the initial status automatically - // depending on the initial state that is passed into the entity. - // @see: \Drupal\state_machine\Plugin\Field\FieldType\StateItem::preSave - if ($entity instanceof EntityPublishedInterface) { - /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ - $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); - if ($workflow_helper->hasEntityStateField($entity->getEntityTypeId(), $entity->bundle())) { - $state_field = $workflow_helper->getEntityStateField($entity); - $workflow = $state_field->getWorkflow(); - $state_id = $state_field->getValue()['value']; - if ($workflow_helper->isWorkflowStatePublished($state_id, $workflow)) { - $entity->setPublished(); - } - else { - $entity->setUnpublished(); - } - } - } -} - /** * Implements hook_element_info_alter(). * diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module index a71b625689..720550c31c 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.module +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -7,6 +7,8 @@ declare(strict_types = 1); +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; @@ -35,6 +37,35 @@ function joinup_workflow_entity_base_field_info(EntityTypeInterface $entity_type return $fields; } +/** + * Implements hook_entity_create(). + */ +function joinup_workflow_entity_create(EntityInterface $entity) { + // Since the state_machine module does not support same from-to state + // transitions, the transition events also don't fire. Normally, the + // transition event would be the one to decide whether the entity would be + // published or not, this is not happening for new entities. + // In Joinup, we do not create any entity with an initial state but for + // testing, it is necessary to setup the initial status automatically + // depending on the initial state that is passed into the entity. + // @see: \Drupal\state_machine\Plugin\Field\FieldType\StateItem::preSave + if ($entity instanceof EntityPublishedInterface) { + /** @var \Drupal\joinup_workflow\WorkflowHelperInterface $workflow_helper */ + $workflow_helper = \Drupal::service('joinup_workflow.workflow_helper'); + if ($workflow_helper->hasEntityStateField($entity->getEntityTypeId(), $entity->bundle())) { + $state_field = $workflow_helper->getEntityStateField($entity); + $workflow = $state_field->getWorkflow(); + $state_id = $state_field->getValue()['value']; + if ($workflow_helper->isWorkflowStatePublished($state_id, $workflow)) { + $entity->setPublished(); + } + else { + $entity->setUnpublished(); + } + } + } +} + /** * Implements hook_form_alter(). */ From d1876d4f2042196c5bbd010042b638c4d6e06ded Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 11:28:16 +0200 Subject: [PATCH 373/957] ISAICP-5902: Move the base class for workflow tests into the joinup_workflow module. --- .../tests/src/ExistingSite/AssetReleaseWorkflowTest.php | 4 ++-- .../tests/src/ExistingSite/ContactInformationWorkflowTest.php | 4 ++-- .../src/ExistingSite/CommunityContentWorkflowTestBase.php | 2 +- .../src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php | 3 ++- .../custom/owner/tests/src/ExistingSite/OwnerWorkflowTest.php | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) rename web/modules/custom/{joinup_core => joinup_workflow}/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php (95%) diff --git a/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php b/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php index 331058f850..9ba25a69d3 100644 --- a/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php +++ b/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php @@ -8,14 +8,14 @@ use Drupal\og\Entity\OgRole; use Drupal\rdf_entity\Entity\Rdf; use Drupal\rdf_entity\RdfInterface; -use Drupal\Tests\joinup_core\ExistingSite\JoinupWorkflowExistingSiteTestBase; +use Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase; /** * Tests crud operations and the workflow for the asset release rdf entity. * * @group asset_release */ -class AssetReleaseWorkflowTest extends JoinupWorkflowExistingSiteTestBase { +class AssetReleaseWorkflowTest extends \Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase { /** * A non authenticated user. diff --git a/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php b/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php index cb1b8556d3..dd02cf8401 100644 --- a/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php +++ b/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php @@ -6,14 +6,14 @@ use Drupal\Core\Session\AnonymousUserSession; use Drupal\rdf_entity\Entity\Rdf; -use Drupal\Tests\joinup_core\ExistingSite\JoinupWorkflowExistingSiteTestBase; +use Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase; /** * Tests the workflow for the contact information entity. * * @group contact_information */ -class ContactInformationWorkflowTest extends JoinupWorkflowExistingSiteTestBase { +class ContactInformationWorkflowTest extends \Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase { /** * A non authenticated user. diff --git a/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php index 02bb18429d..e7ca1664a0 100644 --- a/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php +++ b/web/modules/custom/joinup_community_content/tests/src/ExistingSite/CommunityContentWorkflowTestBase.php @@ -11,7 +11,7 @@ use Drupal\og\Entity\OgRole; use Drupal\og\OgGroupAudienceHelper; use Drupal\rdf_entity\RdfInterface; -use Drupal\Tests\joinup_core\ExistingSite\JoinupWorkflowExistingSiteTestBase; +use Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase; use weitzman\DrupalTestTraits\Entity\NodeCreationTrait; /** diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php b/web/modules/custom/joinup_workflow/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php similarity index 95% rename from web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php rename to web/modules/custom/joinup_workflow/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php index 83c4876aae..8eca823543 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php +++ b/web/modules/custom/joinup_workflow/tests/src/ExistingSite/JoinupWorkflowExistingSiteTestBase.php @@ -2,11 +2,12 @@ declare(strict_types = 1); -namespace Drupal\Tests\joinup_core\ExistingSite; +namespace Drupal\Tests\joinup_workflow\ExistingSite; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Tests\joinup_core\ExistingSite\JoinupExistingSiteTestBase; use Drupal\Tests\rdf_entity\Traits\DrupalTestTraits\RdfEntityCreationTrait; use weitzman\DrupalTestTraits\Entity\UserCreationTrait; diff --git a/web/modules/custom/owner/tests/src/ExistingSite/OwnerWorkflowTest.php b/web/modules/custom/owner/tests/src/ExistingSite/OwnerWorkflowTest.php index 083c03fc54..808b97b4b2 100644 --- a/web/modules/custom/owner/tests/src/ExistingSite/OwnerWorkflowTest.php +++ b/web/modules/custom/owner/tests/src/ExistingSite/OwnerWorkflowTest.php @@ -5,7 +5,7 @@ namespace Drupal\Tests\owner\ExistingSite; use Drupal\Core\Session\AnonymousUserSession; -use Drupal\Tests\joinup_core\ExistingSite\JoinupWorkflowExistingSiteTestBase; +use Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase; /** * Tests crud operations and the workflow for the owner rdf entity. From 065b5e8263eb097c1e022b9c9debd5695f99d0a1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 11:45:09 +0200 Subject: [PATCH 374/957] ISAICP-5902: Move the state machine buttons field widget into the joinup_workflow module where it belongs. --- .../joinup_core/config/schema/joinup_core.schema.yml | 7 ------- .../src/Event/UnchangedWorkflowStateUpdateEvent.php | 2 +- .../config/schema/joinup_workflow.schema.yml | 6 ++++++ web/modules/custom/joinup_workflow/joinup_workflow.module | 2 +- .../src/Plugin/Field/FieldWidget/StateMachineButtons.php | 4 ++-- 5 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml rename web/modules/custom/{joinup_core => joinup_workflow}/src/Plugin/Field/FieldWidget/StateMachineButtons.php (98%) diff --git a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml index 5c42004880..88d3678c90 100644 --- a/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml +++ b/web/modules/custom/joinup_core/config/schema/joinup_core.schema.yml @@ -42,13 +42,6 @@ field.widget.settings.email_legacy_multicardinality: field.widget.settings.link_legacy_multicardinality: type: field.widget.settings.link_default -field.widget.settings.state_machine_buttons: - type: mapping - label: 'Theme settings for Joinup project.' - mapping: - use_transition_label: - type: integer - field.widget.settings.string_textfield_legacy_multicardinality: type: field.widget.settings.string_textfield diff --git a/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php b/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php index 429fd4ab83..dfd151dfef 100644 --- a/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php +++ b/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php @@ -13,7 +13,7 @@ /** * Event fired when an entity is updated without changing its workflow state. * - * @see \Drupal\joinup_core\Plugin\Field\FieldWidget\StateMachineButtons + * @see \Drupal\joinup_workflow\Plugin\Field\FieldWidget\StateMachineButtons */ class UnchangedWorkflowStateUpdateEvent extends Event { diff --git a/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml b/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml new file mode 100644 index 0000000000..e800b63647 --- /dev/null +++ b/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml @@ -0,0 +1,6 @@ +field.widget.settings.state_machine_buttons: + type: mapping + label: 'Settings for the state machine buttons field widget.' + mapping: + use_transition_label: + type: integer diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.module b/web/modules/custom/joinup_workflow/joinup_workflow.module index 720550c31c..262a7ca907 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.module +++ b/web/modules/custom/joinup_workflow/joinup_workflow.module @@ -114,7 +114,7 @@ function joinup_workflow_motivation_form_validate(array &$form, FormStateInterfa $triggering_element = $form_state->getTriggeringElement(); // If '#state_id' is empty, it means that no transition has been triggered. - // @see \Drupal\joinup_core\Plugin\Field\FieldWidget\StateMachineButtons::processActions() + // @see \Drupal\joinup_workflow\Plugin\Field\FieldWidget\StateMachineButtons::processActions() // "Add new" in the contact information field. if (empty($triggering_element['#state_id'])) { return; diff --git a/web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/StateMachineButtons.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php similarity index 98% rename from web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/StateMachineButtons.php rename to web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php index 510a8a09db..b0e953f687 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Field/FieldWidget/StateMachineButtons.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Plugin\Field\FieldWidget; +namespace Drupal\joinup_workflow\Plugin\Field\FieldWidget; use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Field\FieldDefinitionInterface; @@ -16,7 +16,7 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** - * Plugin implementation of the 'state_machine_buttons' widget. + * Field widget showing the available workflow transition states as buttons. * * @FieldWidget( * id = "state_machine_buttons", From 48e7eb84b8f345c6def48af4f0cf593d987907e6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 11:46:21 +0200 Subject: [PATCH 375/957] ISAICP-5902: Adhere to coding standards. --- .../tests/src/ExistingSite/AssetReleaseWorkflowTest.php | 2 +- .../tests/src/ExistingSite/ContactInformationWorkflowTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php b/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php index 9ba25a69d3..740dc08432 100644 --- a/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php +++ b/web/modules/custom/asset_release/tests/src/ExistingSite/AssetReleaseWorkflowTest.php @@ -15,7 +15,7 @@ * * @group asset_release */ -class AssetReleaseWorkflowTest extends \Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase { +class AssetReleaseWorkflowTest extends JoinupWorkflowExistingSiteTestBase { /** * A non authenticated user. diff --git a/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php b/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php index dd02cf8401..23cc409402 100644 --- a/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php +++ b/web/modules/custom/contact_information/tests/src/ExistingSite/ContactInformationWorkflowTest.php @@ -13,7 +13,7 @@ * * @group contact_information */ -class ContactInformationWorkflowTest extends \Drupal\Tests\joinup_workflow\ExistingSite\JoinupWorkflowExistingSiteTestBase { +class ContactInformationWorkflowTest extends JoinupWorkflowExistingSiteTestBase { /** * A non authenticated user. From 20519a96268e8b718a84ca846d790fa92f56d8d6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 12:12:40 +0200 Subject: [PATCH 376/957] ISAICP-5902: Move UnchangedWorkflowStateUpdateEvent into joinup_workflow where it belongs. --- .../src/EventSubscriber/CollectionEventSubscriber.php | 9 +++++---- .../src/EventSubscriber/EventSubscriber.php | 4 ++-- .../src/Event/UnchangedWorkflowStateUpdateEvent.php | 10 +++++----- .../Plugin/Field/FieldWidget/StateMachineButtons.php | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) rename web/modules/custom/{joinup_core => joinup_workflow}/src/Event/UnchangedWorkflowStateUpdateEvent.php (91%) diff --git a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php index cae7b35ef7..67d6e68f34 100644 --- a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php +++ b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php @@ -7,7 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; -use Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent; +use Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent; use Drupal\og\Event\PermissionEventInterface; use Drupal\og\GroupPermission; use Drupal\workflow_state_permission\WorkflowStatePermissionInterface; @@ -108,11 +108,12 @@ public function provideDefaultOgPermissions(PermissionEventInterface $event) { * * This applies both to collections and solutions. * - * @todo Move this in a shared 'group' module that can contain code that is + * @param \Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent $event + * The event. + * + *@todo Move this in a shared 'group' module that can contain code that is * shared between collections and solutions. * - * @param \Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent $event - * The event. */ public function onUnchangedWorkflowStateUpdate(UnchangedWorkflowStateUpdateEvent $event): void { $entity = $event->getEntity(); diff --git a/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php b/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php index 5fcb18743e..c5914cb960 100644 --- a/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php +++ b/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php @@ -7,7 +7,7 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent; +use Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent; use Drupal\og\Event\PermissionEventInterface as OgPermissionEventInterface; use Drupal\og\GroupContentOperationPermission; use Drupal\og\GroupPermission; @@ -151,7 +151,7 @@ public function provideOgRevisionPermissions(OgPermissionEventInterface $event) /** * Determines if the content be updated without changing workflow state. * - * @param \Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent $event + * @param \Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent $event * The event. */ public function onUnchangedWorkflowStateUpdate(UnchangedWorkflowStateUpdateEvent $event): void { diff --git a/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php similarity index 91% rename from web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php rename to web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php index dfd151dfef..7a01f3d368 100644 --- a/web/modules/custom/joinup_core/src/Event/UnchangedWorkflowStateUpdateEvent.php +++ b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php @@ -2,7 +2,7 @@ declare(strict_types = 1); -namespace Drupal\joinup_core\Event; +namespace Drupal\joinup_workflow\Event; use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessResultInterface; @@ -17,7 +17,7 @@ */ class UnchangedWorkflowStateUpdateEvent extends Event { - const EVENT_NAME = 'joinup_core.unchanged_workflow_state_update'; + const EVENT_NAME = 'joinup_workflow.unchanged_workflow_state_update'; /** * The entity being updated. @@ -110,7 +110,7 @@ public function getLabel(): TranslatableMarkup { * @param \Drupal\Core\StringTranslation\TranslatableMarkup $label * The label text. * - * @return \Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent + * @return self * The event, for chaining. */ public function setLabel(TranslatableMarkup $label): self { @@ -134,7 +134,7 @@ public function getWeight(): int { * @param int $weight * The weight. * - * @return \Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent + * @return self * The event, for chaining. */ public function setWeight(int $weight): self { @@ -161,7 +161,7 @@ public function getAccess(): AccessResultInterface { * @param \Drupal\Core\Access\AccessResultInterface $access * The access result object. * - * @return \Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent + * @return self * The event, for chaining. */ public function setAccess(AccessResultInterface $access): self { diff --git a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php index b0e953f687..ded2c8ab64 100644 --- a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php @@ -11,7 +11,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; -use Drupal\joinup_core\Event\UnchangedWorkflowStateUpdateEvent; +use Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; From 58cd02b85423717fa4497bfb527029abd147203f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 12:13:11 +0200 Subject: [PATCH 377/957] ISAICP-5902: Leverage existing code to check if an entity is a group. --- .../src/EventSubscriber/CollectionEventSubscriber.php | 9 ++++----- .../custom/joinup_group/src/JoinupGroupHelper.php | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php index 67d6e68f34..bd1b7d6454 100644 --- a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php +++ b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php @@ -7,6 +7,7 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\joinup_group\JoinupGroupHelper; use Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent; use Drupal\og\Event\PermissionEventInterface; use Drupal\og\GroupPermission; @@ -108,16 +109,14 @@ public function provideDefaultOgPermissions(PermissionEventInterface $event) { * * This applies both to collections and solutions. * + * @todo Move this in the 'joinup_group' module. + * * @param \Drupal\joinup_workflow\Event\UnchangedWorkflowStateUpdateEvent $event * The event. - * - *@todo Move this in a shared 'group' module that can contain code that is - * shared between collections and solutions. - * */ public function onUnchangedWorkflowStateUpdate(UnchangedWorkflowStateUpdateEvent $event): void { $entity = $event->getEntity(); - if ($entity->getEntityTypeId() !== 'rdf_entity' || !in_array($entity->bundle(), ['collection', 'solution'])) { + if (!JoinupGroupHelper::isGroup($entity)) { return; } diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index 5455fe785a..68dfcebc0d 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -56,7 +56,7 @@ class JoinupGroupHelper { * otherwise. */ public static function isGroup(EntityInterface $entity): bool { - return isset(self::GROUP_BUNDLES[$entity->bundle()]); + return $entity instanceof RdfInterface && isset(self::GROUP_BUNDLES[$entity->bundle()]); } /** From c8d9817f42f4f16a878229f94717ceee8fb5ff7b Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 12:21:30 +0200 Subject: [PATCH 378/957] ISAICP-5902: Remove unneeded dependency. --- .../custom/joinup_notification/joinup_notification.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_notification/joinup_notification.info.yml b/web/modules/custom/joinup_notification/joinup_notification.info.yml index 17a53dfacf..39a11b1c47 100644 --- a/web/modules/custom/joinup_notification/joinup_notification.info.yml +++ b/web/modules/custom/joinup_notification/joinup_notification.info.yml @@ -4,7 +4,6 @@ description: 'Handles notifications for joinup project.' core: 8.x package: Joinup dependencies: - - 'joinup:joinup_core' - 'joinup:joinup_workflow' - 'joinup:solution' - 'joinup:state_machine_revisions' From 2a8e0bd212f1be86387d9301fd7bae48ba22c7cc Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 13:36:17 +0200 Subject: [PATCH 379/957] ISAICP-5902: Unbreak unit tests. --- .../src/Kernel/AssetReleaseValidationTest.php | 1 + .../Kernel/SyncFieldsFromParentSolutionTest.php | 1 + .../config/schema/joinup_core.schema.yml | 13 ------------- .../config/schema/joinup_workflow.schema.yml | 14 ++++++++++++++ 4 files changed, 16 insertions(+), 13 deletions(-) delete mode 100644 web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml diff --git a/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php b/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php index 180d2a5a68..f18b10cc39 100644 --- a/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php +++ b/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php @@ -21,6 +21,7 @@ class AssetReleaseValidationTest extends RdfEntityValidationTestBase { 'asset_release', 'file', 'file_url', + 'joinup_workflow', ]; /** diff --git a/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php b/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php index 4dd63eb940..080b5ba2f1 100644 --- a/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php +++ b/web/modules/custom/asset_release/tests/src/Kernel/SyncFieldsFromParentSolutionTest.php @@ -40,6 +40,7 @@ class SyncFieldsFromParentSolutionTest extends KernelTestBase { 'image', 'inline_entity_form', 'joinup_core', + 'joinup_workflow', 'link', 'matomo_reporting_api', 'node', diff --git a/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml b/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml deleted file mode 100644 index 36ec8593d2..0000000000 --- a/web/modules/custom/joinup_workflow/config/schema/joinup_core.schema.yml +++ /dev/null @@ -1,13 +0,0 @@ -field.widget.settings.current_workflow_state_widget: - type: mapping - label: 'Field widget format settings for the current workflow state field.' - mapping: - title: - type: string - label: 'The title to use for the field widget.' - title_display: - type: string - label: 'The setting that determines how the field widget title is displayed.' - show_for_new_entities: - type: boolean - label: 'The setting that allows to show the widget on entity creation forms.' diff --git a/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml b/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml index e800b63647..53b0d44d06 100644 --- a/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml +++ b/web/modules/custom/joinup_workflow/config/schema/joinup_workflow.schema.yml @@ -1,3 +1,17 @@ +field.widget.settings.current_workflow_state_widget: + type: mapping + label: 'Field widget format settings for the current workflow state field.' + mapping: + title: + type: string + label: 'The title to use for the field widget.' + title_display: + type: string + label: 'The setting that determines how the field widget title is displayed.' + show_for_new_entities: + type: boolean + label: 'The setting that allows to show the widget on entity creation forms.' + field.widget.settings.state_machine_buttons: type: mapping label: 'Settings for the state machine buttons field widget.' From 6cd7cf702071e84f05c42294f6c17916c264b0dd Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 25 Mar 2020 14:11:27 +0200 Subject: [PATCH 380/957] ISAICP-5902: Update unit tests now that code they depend on has moved to the joinup_workflow module. --- .../joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php | 1 + .../custom/solution/tests/src/Kernel/SolutionAffiliationTest.php | 1 + 2 files changed, 2 insertions(+) diff --git a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php index 0f1ce7fce8..0909612f1b 100644 --- a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php @@ -18,6 +18,7 @@ abstract class RdfEntityValidationTestBase extends JoinupKernelTestBase { 'comment', 'image', 'joinup_core', + 'joinup_workflow', 'link', 'node', 'oe_newsroom_newsletter', diff --git a/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php b/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php index 624e797bbd..de2dd953f4 100644 --- a/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php +++ b/web/modules/custom/solution/tests/src/Kernel/SolutionAffiliationTest.php @@ -39,6 +39,7 @@ class SolutionAffiliationTest extends KernelTestBase { 'inline_entity_form', 'joinup_core', 'joinup_sparql', + 'joinup_workflow', 'link', 'matomo_reporting_api', 'node', From cb80b75a3632f55018fe98c2a8eef2b2b65fdc05 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 25 Mar 2020 14:47:32 +0200 Subject: [PATCH 381/957] ISAICP-5692: Some kernel testing dependecies just got relaxed. --- .../tests/src/Kernel/AssetDistributionValidationTest.php | 1 - .../tests/src/Kernel/CustomTokensTest.php | 4 ---- .../src/Kernel/Plugin/Condition/RequestRouteConditionTest.php | 3 +-- .../tests/src/Kernel/RdfEntityValidationTestBase.php | 3 --- .../src/Kernel/UserSelectionFilterWhitelistBuilderTest.php | 0 5 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 web/modules/custom/joinup_federation/tests/src/Kernel/UserSelectionFilterWhitelistBuilderTest.php diff --git a/web/modules/custom/asset_distribution/tests/src/Kernel/AssetDistributionValidationTest.php b/web/modules/custom/asset_distribution/tests/src/Kernel/AssetDistributionValidationTest.php index 73465236d3..5c37a0a3c3 100644 --- a/web/modules/custom/asset_distribution/tests/src/Kernel/AssetDistributionValidationTest.php +++ b/web/modules/custom/asset_distribution/tests/src/Kernel/AssetDistributionValidationTest.php @@ -28,7 +28,6 @@ class AssetDistributionValidationTest extends RdfEntityValidationTestBase { 'file', 'file_url', 'options', - 'views', ]; /** diff --git a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php index 6f0c05ea98..e0e84a5a8f 100644 --- a/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php +++ b/web/modules/custom/joinup_community_content/tests/src/Kernel/CustomTokensTest.php @@ -21,14 +21,10 @@ class CustomTokensTest extends TokenReplaceKernelTestBase { * {@inheritdoc} */ public static $modules = [ - 'comment', 'diff', 'joinup_community_content', - 'joinup_group', - 'message_notify', 'node', 'og', - 'state_machine', 'workflow_state_permission', ]; diff --git a/web/modules/custom/joinup_core/tests/src/Kernel/Plugin/Condition/RequestRouteConditionTest.php b/web/modules/custom/joinup_core/tests/src/Kernel/Plugin/Condition/RequestRouteConditionTest.php index ba01972f9d..1e830dfa04 100644 --- a/web/modules/custom/joinup_core/tests/src/Kernel/Plugin/Condition/RequestRouteConditionTest.php +++ b/web/modules/custom/joinup_core/tests/src/Kernel/Plugin/Condition/RequestRouteConditionTest.php @@ -19,9 +19,8 @@ class RequestRouteConditionTest extends KernelTestBase { /** * {@inheritdoc} */ - public static $modules = [ + protected static $modules = [ 'joinup_core', - 'matomo_reporting_api', 'og', 'rdf_entity', 'sparql_entity_storage', diff --git a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php index 0f1ce7fce8..8a263859ac 100644 --- a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php @@ -14,15 +14,12 @@ abstract class RdfEntityValidationTestBase extends JoinupKernelTestBase { */ public static $modules = [ 'allowed_formats', - 'cached_computed_field', 'comment', 'image', 'joinup_core', - 'link', 'node', 'oe_newsroom_newsletter', 'og', - 'matomo_reporting_api', 'rdf_taxonomy', 'rdf_entity', 'rdf_schema_field_validation', diff --git a/web/modules/custom/joinup_federation/tests/src/Kernel/UserSelectionFilterWhitelistBuilderTest.php b/web/modules/custom/joinup_federation/tests/src/Kernel/UserSelectionFilterWhitelistBuilderTest.php deleted file mode 100644 index e69de29bb2..0000000000 From d5185cc56c97a8688126899fdfad42c0b7e37a4f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 13:42:34 +0200 Subject: [PATCH 382/957] ISAICP-5908: Remove migration leftover. --- build.dist.xml | 1 - build.project.xml | 1 - phpunit.xml.dist | 2 -- src/Phing/PhpUnitConfigurationTask.php | 20 -------------------- 4 files changed, 24 deletions(-) diff --git a/build.dist.xml b/build.dist.xml index a879fada89..476b03e60c 100644 --- a/build.dist.xml +++ b/build.dist.xml @@ -137,7 +137,6 @@ testsuiteName="${phpunit.testsuite.name}" baseUrl="${phpunit.base_url}" dbUrl="${phpunit.db_url}" - legacyDbUrl="${drupal.db.type}://${drupal.db.user}:${drupal.db.password}@${drupal.db.host}:${drupal.db.port}/${phpunit.migrate.legacy_db.name}" browsertestOutputDirectory="${phpunit.browsertest_output_dir}" browsertestOutputFile="${phpunit.browsertest_output_file}" /> diff --git a/build.project.xml b/build.project.xml index 2a9d801cc5..e91aaf88fe 100644 --- a/build.project.xml +++ b/build.project.xml @@ -230,7 +230,6 @@ baseUrl="${phpunit.base_url}" dbUrl="${phpunit.db_url}" sparqlUrl="${phpunit.sparql_url}" - legacyDbUrl="${drupal.db.type}://${drupal.db.user}:${drupal.db.password}@${drupal.db.host}:${drupal.db.port}/${phpunit.migrate.legacy_db.name}" browsertestOutputDirectory="${phpunit.browsertest_output_dir}" browsertestOutputFile="${phpunit.browsertest_output_file}" dttBaseUrl="${dtt.base_url}" diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 35ac48f57c..de01941150 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -24,8 +24,6 @@ - - - Date: Thu, 26 Mar 2020 13:44:42 +0200 Subject: [PATCH 384/957] ISAICP-5908: file_put_contents() always override an existing file. --- build.dist.xml | 7 ------- build.project.xml | 7 ------- 2 files changed, 14 deletions(-) diff --git a/build.dist.xml b/build.dist.xml index 476b03e60c..861be4aa86 100644 --- a/build.dist.xml +++ b/build.dist.xml @@ -122,13 +122,6 @@ - - - - - - - - - - - - - - Date: Thu, 26 Mar 2020 13:49:46 +0200 Subject: [PATCH 385/957] ISAICP-5908: Reorganize suites based on their type. --- phpunit.xml.dist | 18 ++++++++ .../JoinupExistingSiteJavascriptTestSuite.php | 24 +++++++++++ src/PhpUnit/JoinupExistingSiteTestSuite.php | 24 +++++++++++ .../JoinupFunctionalJavascriptTestSuite.php | 24 +++++++++++ src/PhpUnit/JoinupFunctionalTestSuite.php | 24 +++++++++++ src/PhpUnit/JoinupKernelTestSuite.php | 24 +++++++++++ src/PhpUnit/JoinupTestSuiteBase.php | 43 +++++++++++++++++++ src/PhpUnit/JoinupUnitTestSuite.php | 24 +++++++++++ 8 files changed, 205 insertions(+) create mode 100644 src/PhpUnit/JoinupExistingSiteJavascriptTestSuite.php create mode 100644 src/PhpUnit/JoinupExistingSiteTestSuite.php create mode 100644 src/PhpUnit/JoinupFunctionalJavascriptTestSuite.php create mode 100644 src/PhpUnit/JoinupFunctionalTestSuite.php create mode 100644 src/PhpUnit/JoinupKernelTestSuite.php create mode 100644 src/PhpUnit/JoinupTestSuiteBase.php create mode 100644 src/PhpUnit/JoinupUnitTestSuite.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index bb2e96ed4c..0628484fb3 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -48,6 +48,24 @@ + + src/PhpUnit/JoinupUnitTestSuite.php + + + src/PhpUnit/JoinupKernelTestSuite.php + + + src/PhpUnit/JoinupFunctionalTestSuite.php + + + src/PhpUnit/JoinupFunctionalJavascriptTestSuite.php + + + src/PhpUnit/JoinupExistingSiteTestSuite.php + + + src/PhpUnit/JoinupExistingSiteJavascriptTestSuite.php + diff --git a/src/PhpUnit/JoinupExistingSiteJavascriptTestSuite.php b/src/PhpUnit/JoinupExistingSiteJavascriptTestSuite.php new file mode 100644 index 0000000000..3368599f0c --- /dev/null +++ b/src/PhpUnit/JoinupExistingSiteJavascriptTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'ExistingSiteJavascript'); + return $suite; + } + +} diff --git a/src/PhpUnit/JoinupExistingSiteTestSuite.php b/src/PhpUnit/JoinupExistingSiteTestSuite.php new file mode 100644 index 0000000000..ff47bcbe83 --- /dev/null +++ b/src/PhpUnit/JoinupExistingSiteTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'ExistingSite'); + return $suite; + } + +} diff --git a/src/PhpUnit/JoinupFunctionalJavascriptTestSuite.php b/src/PhpUnit/JoinupFunctionalJavascriptTestSuite.php new file mode 100644 index 0000000000..b267d5f00a --- /dev/null +++ b/src/PhpUnit/JoinupFunctionalJavascriptTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'FunctionalJavascript'); + return $suite; + } + +} diff --git a/src/PhpUnit/JoinupFunctionalTestSuite.php b/src/PhpUnit/JoinupFunctionalTestSuite.php new file mode 100644 index 0000000000..21a5b9f512 --- /dev/null +++ b/src/PhpUnit/JoinupFunctionalTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'Functional'); + return $suite; + } + +} diff --git a/src/PhpUnit/JoinupKernelTestSuite.php b/src/PhpUnit/JoinupKernelTestSuite.php new file mode 100644 index 0000000000..0379bc540d --- /dev/null +++ b/src/PhpUnit/JoinupKernelTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'Kernel'); + return $suite; + } + +} diff --git a/src/PhpUnit/JoinupTestSuiteBase.php b/src/PhpUnit/JoinupTestSuiteBase.php new file mode 100644 index 0000000000..711677bc20 --- /dev/null +++ b/src/PhpUnit/JoinupTestSuiteBase.php @@ -0,0 +1,43 @@ +findExtensionDirectories($root) as $extension_name => $dir) { + $test_path = "$dir/tests/src/$suite_namespace"; + if (is_dir($test_path)) { + $this->addTestFiles(TestDiscovery::scanDirectory("Drupal\\Tests\\$extension_name\\$suite_namespace\\", $test_path)); + } + } + } + +} diff --git a/src/PhpUnit/JoinupUnitTestSuite.php b/src/PhpUnit/JoinupUnitTestSuite.php new file mode 100644 index 0000000000..1656e7a558 --- /dev/null +++ b/src/PhpUnit/JoinupUnitTestSuite.php @@ -0,0 +1,24 @@ +addTestsBySuiteNamespace(NULL, 'Unit'); + return $suite; + } + +} From 37e0a5446bb97200232758e11ca6525876892514 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 14:10:20 +0200 Subject: [PATCH 386/957] ISAICP-5908: Remove stale properties and methods. --- build.dist.xml | 3 - build.project.xml | 3 - build.properties | 8 --- build.properties.dist | 11 ---- src/Phing/PhpUnitConfigurationTask.php | 83 -------------------------- 5 files changed, 108 deletions(-) diff --git a/build.dist.xml b/build.dist.xml index 861be4aa86..a5b18886af 100644 --- a/build.dist.xml +++ b/build.dist.xml @@ -125,9 +125,6 @@ setEnvironmentVariable('DTT_API_URL', $this->dttApiUrl, $document); $this->setEnvironmentVariable('DTT_MINK_DRIVER_ARGS', $this->dttMinkDriverArgs, $document); - // Add a test suite for the Drupal project. - $test_suite = $document->createElement('testsuite'); - $test_suite->setAttribute('name', $this->testsuiteName); - - // Append the list of test files. - foreach ($this->files as $file) { - $element = $document->createElement('file', $file); - $test_suite->appendChild($element); - } - - // Append the list of test directories. - foreach ($this->directories as $directory) { - $element = $document->createElement('directory', $directory); - $test_suite->appendChild($element); - } - - // Insert the test suite in the list of test suites. - $test_suites = $document->getElementsByTagName('testsuites')->item(0); - $test_suites->appendChild($test_suite); - // Save the file. file_put_contents($this->configFile, $document->saveXML()); } @@ -217,48 +176,6 @@ public function setConfigFile($configFile) { $this->configFile = $configFile; } - /** - * Sets the list of directories containing test files to execute. - * - * @param string $directories - * A list of directory paths, delimited by spaces, commas or semicolons. - */ - public function setDirectories($directories) { - $this->directories = []; - $token = ' ,;'; - $directory = strtok($directories, $token); - while ($directory !== FALSE) { - $this->directories[] = $directory; - $directory = strtok($token); - } - } - - /** - * Sets the list of test files to execute. - * - * @param string $files - * A list of file paths, delimited by spaces, commas or semicolons. - */ - public function setFiles($files) { - $this->files = []; - $token = ' ,;'; - $file = strtok($files, $token); - while ($file !== FALSE) { - $this->files[] = $file; - $file = strtok($token); - } - } - - /** - * Sets the name of the test suite. - * - * @param string $testsuiteName - * The name of the test suite. - */ - public function setTestsuiteName($testsuiteName) { - $this->testsuiteName = $testsuiteName; - } - /** * Sets the base URL. * From 4fb551996c8136681eb96f65abe0ffd5b3bed044 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 14:14:06 +0200 Subject: [PATCH 387/957] ISAICP-5908: Re-enable the Symfony PHPUnit Bridge deprecation listener. --- phpunit.xml.dist | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 0628484fb3..06073bf99e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -71,12 +71,8 @@ - + + From 4fcedd04e3c7f09817b6f8da1c73ec7a92f16e6b Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 14:15:20 +0200 Subject: [PATCH 388/957] ISAICP-5908: Limit coverage reports. --- phpunit.xml.dist | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 06073bf99e..bfea66023f 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -77,11 +77,9 @@ - ./core/includes - ./core/lib - ./core/modules - ./modules - ./sites + web/modules/custom + web/profiles + web/themes */tests/* From 7fd55a54bf5f757b3bd40c654f49ba036d7535e9 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 16:29:18 +0200 Subject: [PATCH 389/957] ISAICP-5908: Enable deprecated code message output. --- phpunit.xml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index bfea66023f..5bf36ff9d2 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -32,7 +32,7 @@ --> - + From d87c770cf52ccd28ce029f0d98ee391db32ed0c0 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 16:29:35 +0200 Subject: [PATCH 390/957] ISAICP-5908: Fix docs. --- build.properties.dist | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.properties.dist b/build.properties.dist index bfc81568d6..83d40f81b2 100644 --- a/build.properties.dist +++ b/build.properties.dist @@ -150,8 +150,7 @@ phpcs.prepush.destination = ${project.basedir}/.git/hooks/pre-push # The path to the configuration file template. phpunit.dist = ${project.basedir}/phpunit.xml.dist -# The path to the generated configuration file. This is typically inside the web -# root. +# The path to the generated configuration file. phpunit.config = ${project.basedir}/phpunit.xml # The base URL to use in functional tests. From 3daa38ee9f3ed66eb35550c7f2096d27f285734b Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 26 Mar 2020 16:36:17 +0200 Subject: [PATCH 391/957] ISAICP-5708: Giving a little attention to the IndexDistributionData class before I steal its code. --- .../src/Plugin/search_api/processor/IndexDistributionData.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/asset_distribution/src/Plugin/search_api/processor/IndexDistributionData.php b/web/modules/custom/asset_distribution/src/Plugin/search_api/processor/IndexDistributionData.php index eda72fce0c..6e11359bfc 100644 --- a/web/modules/custom/asset_distribution/src/Plugin/search_api/processor/IndexDistributionData.php +++ b/web/modules/custom/asset_distribution/src/Plugin/search_api/processor/IndexDistributionData.php @@ -1,5 +1,7 @@ Date: Thu, 26 Mar 2020 17:55:07 +0200 Subject: [PATCH 392/957] ISAICP-5902: Joinup only supports Drupal >= 8.8. --- web/modules/custom/joinup_workflow/joinup_workflow.info.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/web/modules/custom/joinup_workflow/joinup_workflow.info.yml b/web/modules/custom/joinup_workflow/joinup_workflow.info.yml index 717e714530..3292ab9345 100644 --- a/web/modules/custom/joinup_workflow/joinup_workflow.info.yml +++ b/web/modules/custom/joinup_workflow/joinup_workflow.info.yml @@ -2,5 +2,4 @@ name: Joinup Workflow type: module description: Shared code for handling workflows in Joinup. package: Joinup -core: 8.x core_version_requirement: ^8 || ^9 From 2f313e2adf5d470f0b7f609aa69e7246832d41b1 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 17:56:28 +0200 Subject: [PATCH 393/957] ISAICP-5902: Follow coding standards when chainig methods. --- .../src/Event/UnchangedWorkflowStateUpdateEvent.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php index 7a01f3d368..023a39bd26 100644 --- a/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php +++ b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php @@ -110,8 +110,7 @@ public function getLabel(): TranslatableMarkup { * @param \Drupal\Core\StringTranslation\TranslatableMarkup $label * The label text. * - * @return self - * The event, for chaining. + * @return $this */ public function setLabel(TranslatableMarkup $label): self { $this->label = $label; @@ -134,8 +133,7 @@ public function getWeight(): int { * @param int $weight * The weight. * - * @return self - * The event, for chaining. + * @return $this */ public function setWeight(int $weight): self { $this->weight = $weight; @@ -161,8 +159,7 @@ public function getAccess(): AccessResultInterface { * @param \Drupal\Core\Access\AccessResultInterface $access * The access result object. * - * @return self - * The event, for chaining. + * @return $this */ public function setAccess(AccessResultInterface $access): self { $this->access = $this->access->orIf($access); From 77019924288876305f2cb6880ae630fcee31574e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 17:57:26 +0200 Subject: [PATCH 394/957] ISAICP-5902: Use nullable typing when case. --- .../custom/joinup_workflow/src/WorkflowHelper.php | 4 ++-- .../joinup_workflow/src/WorkflowHelperInterface.php | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/joinup_workflow/src/WorkflowHelper.php b/web/modules/custom/joinup_workflow/src/WorkflowHelper.php index 3bb8d1c5b5..124a96d3ea 100644 --- a/web/modules/custom/joinup_workflow/src/WorkflowHelper.php +++ b/web/modules/custom/joinup_workflow/src/WorkflowHelper.php @@ -203,7 +203,7 @@ public function isWorkflowStatePublished(string $state_id, WorkflowInterface $wo /** * {@inheritdoc} */ - public function getWorkflow(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowInterface { + public function getWorkflow(EntityInterface $entity, ?string $state_field_name = NULL): ?WorkflowInterface { if (empty($state_field_name)) { $state_field_item = $this->getEntityStateField($entity); if (empty($state_field_item)) { @@ -218,7 +218,7 @@ public function getWorkflow(EntityInterface $entity, string $state_field_name = /** * {@inheritdoc} */ - public function findTransitionOnUpdate(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowTransition { + public function findTransitionOnUpdate(EntityInterface $entity, ?string $state_field_name = NULL): ?WorkflowTransition { if (empty($state_field_name)) { $state_field_item = $this->getEntityStateField($entity); if (empty($state_field_item)) { diff --git a/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php b/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php index cd407007e0..12b0d892a4 100644 --- a/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php +++ b/web/modules/custom/joinup_workflow/src/WorkflowHelperInterface.php @@ -151,26 +151,26 @@ public function isWorkflowStatePublished(string $state_id, WorkflowInterface $wo * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity object. - * @param string $state_field_name - * The state field name. If not passed, it will be searched. + * @param string|null $state_field_name + * (optional) The state field name. If not passed, it will be searched. * * @return \Drupal\workflows\WorkflowInterface|null * The workflow object or null if it was not found. */ - public function getWorkflow(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowInterface; + public function getWorkflow(EntityInterface $entity, ?string $state_field_name = NULL): ?WorkflowInterface; /** * Finds the transition given an entity that is being updated. * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity object. - * @param string $state_field_name - * The state field name. If not passed, it will be searched. + * @param string|null $state_field_name + * (optional) The state field name. If not passed, it will be searched. * * @return \Drupal\state_machine\Plugin\Workflow\WorkflowTransition|null * The transition object or null if it was not found. */ - public function findTransitionOnUpdate(EntityInterface $entity, string $state_field_name = NULL): ?WorkflowTransition; + public function findTransitionOnUpdate(EntityInterface $entity, ?string $state_field_name = NULL): ?WorkflowTransition; /** * Checks whether the user has at least one of the provided roles. From 18dd4be6f9ccddbbf5ff8dca66cc00dadbdb3c5a Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 26 Mar 2020 18:13:19 +0200 Subject: [PATCH 395/957] ISAICP-5902: Relax more the some kernel test dependencies. --- .../tests/src/Kernel/AssetReleaseValidationTest.php | 2 ++ .../collection/tests/src/Kernel/CollectionValidationTest.php | 3 +++ .../tests/src/Kernel/ContactInformationValidationTest.php | 3 +++ .../tests/src/Kernel/RdfEntityValidationTestBase.php | 3 --- .../custom/owner/tests/src/Kernel/OwnerValidationTest.php | 3 +++ .../solution/tests/src/Kernel/SolutionValidationTest.php | 3 +++ 6 files changed, 14 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php b/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php index f18b10cc39..7eb4ce32b2 100644 --- a/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php +++ b/web/modules/custom/asset_release/tests/src/Kernel/AssetReleaseValidationTest.php @@ -22,6 +22,8 @@ class AssetReleaseValidationTest extends RdfEntityValidationTestBase { 'file', 'file_url', 'joinup_workflow', + 'state_machine', + 'workflow_state_permission', ]; /** diff --git a/web/modules/custom/collection/tests/src/Kernel/CollectionValidationTest.php b/web/modules/custom/collection/tests/src/Kernel/CollectionValidationTest.php index 12366ed9b9..4742cb831c 100644 --- a/web/modules/custom/collection/tests/src/Kernel/CollectionValidationTest.php +++ b/web/modules/custom/collection/tests/src/Kernel/CollectionValidationTest.php @@ -21,10 +21,13 @@ class CollectionValidationTest extends RdfEntityValidationTestBase { 'field_group', 'file', 'inline_entity_form', + 'joinup_workflow', 'options', 'search_api', 'search_api_field', 'smart_trim', + 'state_machine', + 'workflow_state_permission', ]; /** diff --git a/web/modules/custom/contact_information/tests/src/Kernel/ContactInformationValidationTest.php b/web/modules/custom/contact_information/tests/src/Kernel/ContactInformationValidationTest.php index fd0e7c26c7..db3f447184 100644 --- a/web/modules/custom/contact_information/tests/src/Kernel/ContactInformationValidationTest.php +++ b/web/modules/custom/contact_information/tests/src/Kernel/ContactInformationValidationTest.php @@ -18,6 +18,9 @@ class ContactInformationValidationTest extends RdfEntityValidationTestBase { */ public static $modules = [ 'contact_information', + 'joinup_workflow', + 'state_machine', + 'workflow_state_permission', ]; /** diff --git a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php index 90f9e9c84f..1a5c79962a 100644 --- a/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php +++ b/web/modules/custom/joinup_core/tests/src/Kernel/RdfEntityValidationTestBase.php @@ -17,17 +17,14 @@ abstract class RdfEntityValidationTestBase extends JoinupKernelTestBase { 'comment', 'image', 'joinup_core', - 'joinup_workflow', 'node', 'oe_newsroom_newsletter', 'og', 'rdf_taxonomy', 'rdf_entity', 'rdf_schema_field_validation', - 'state_machine', 'taxonomy', 'tour', - 'workflow_state_permission', ]; /** diff --git a/web/modules/custom/owner/tests/src/Kernel/OwnerValidationTest.php b/web/modules/custom/owner/tests/src/Kernel/OwnerValidationTest.php index 086a08de61..d58beba737 100644 --- a/web/modules/custom/owner/tests/src/Kernel/OwnerValidationTest.php +++ b/web/modules/custom/owner/tests/src/Kernel/OwnerValidationTest.php @@ -17,7 +17,10 @@ class OwnerValidationTest extends RdfEntityValidationTestBase { * {@inheritdoc} */ public static $modules = [ + 'joinup_workflow', 'owner', + 'state_machine', + 'workflow_state_permission', ]; /** diff --git a/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php b/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php index 75c7cf7c43..37e31e177a 100644 --- a/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php +++ b/web/modules/custom/solution/tests/src/Kernel/SolutionValidationTest.php @@ -28,13 +28,16 @@ class SolutionValidationTest extends RdfEntityValidationTestBase { 'file', 'file_url', 'inline_entity_form', + 'joinup_workflow', 'og', 'options', 'search_api', 'search_api_field', 'smart_trim', 'solution', + 'state_machine', 'views', + 'workflow_state_permission', ]; /** From 0c06af8719e70c6486162e95e6ea10d24a45c3db Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 26 Mar 2020 18:33:50 +0200 Subject: [PATCH 396/957] ISAICP-5708: Create the skeleton for the CustomPageProvider service. --- .../custom_page/custom_page.services.yml | 11 +++-- .../src/CustomPageOgMenuLinksManager.php | 10 +--- .../CustomPageOgMenuLinksManagerInterface.php | 11 +++++ .../custom_page/src/CustomPageProvider.php | 47 +++++++++++++++++++ .../src/CustomPageProviderInterface.php | 26 ++++++++++ 5 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 web/modules/custom/custom_page/src/CustomPageProvider.php create mode 100644 web/modules/custom/custom_page/src/CustomPageProviderInterface.php diff --git a/web/modules/custom/custom_page/custom_page.services.yml b/web/modules/custom/custom_page/custom_page.services.yml index cf97710c3f..f32e949954 100644 --- a/web/modules/custom/custom_page/custom_page.services.yml +++ b/web/modules/custom/custom_page/custom_page.services.yml @@ -1,9 +1,12 @@ services: - custom_page.route_subscriber: - class: Drupal\custom_page\Routing\RouteSubscriber - tags: - - { name: event_subscriber } custom_page.og_menu_links_manager: class: Drupal\custom_page\CustomPageOgMenuLinksManager arguments: ['@entity_type.manager', '@plugin.manager.menu.link'] lazy: true + custom_page.provider: + class: Drupal\custom_page\CustomPageProvider + arguments: ['@custom_page.og_menu_links_manager'] + custom_page.route_subscriber: + class: Drupal\custom_page\Routing\RouteSubscriber + tags: + - { name: event_subscriber } diff --git a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php index 5c351790e5..0d4458fbf5 100644 --- a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php +++ b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManager.php @@ -203,15 +203,9 @@ protected function verifyCustomPage(NodeInterface $custom_page) : void { } /** - * Gets the OG menu instance, given a group ID. - * - * @param string $group_id - * The ID of the group where is attached the OG menu instance. - * - * @return \Drupal\og_menu\OgMenuInstanceInterface|null - * The OG menu instance or NULL if none can be determined. + * {@inheritdoc} */ - protected function getOgMenuInstanceByGroupId(string $group_id) : ?OgMenuInstanceInterface { + public function getOgMenuInstanceByGroupId(string $group_id) : ?OgMenuInstanceInterface { if (Rdf::load($group_id)) { $properties = [ 'type' => 'navigation', diff --git a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php index 3ad80b0a55..dd4773c7e9 100644 --- a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php +++ b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php @@ -66,4 +66,15 @@ public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksM */ public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page) : ?OgMenuInstanceInterface; + /** + * Returns the OG menu instance, given a group ID. + * + * @param string $group_id + * The ID of the group to which OG menu instance is attached. + * + * @return \Drupal\og_menu\OgMenuInstanceInterface|null + * The OG menu instance or NULL if none can be determined. + */ + public function getOgMenuInstanceByGroupId(string $group_id) : ?OgMenuInstanceInterface; + } diff --git a/web/modules/custom/custom_page/src/CustomPageProvider.php b/web/modules/custom/custom_page/src/CustomPageProvider.php new file mode 100644 index 0000000000..2fa79e53a2 --- /dev/null +++ b/web/modules/custom/custom_page/src/CustomPageProvider.php @@ -0,0 +1,47 @@ +menuLinkManager = $menuLinkManager; + } + + /** + * Returns the custom pages that belong to the given group. + * + * @param string $group_id + * The entity ID of the group for which to return the custom pages. + * @param bool $include_disabled + * Whether or not to include custom pages that are disabled by the group + * facilitators and are not visible in the group menu. Defaults to FALSE. + * + * @return \Drupal\node\NodeInterface[] + * The custom page entities. + */ + public function getCustomPagesByGroupId(string $group_id, bool $include_disabled = FALSE): array { + $menu_instance = $this->menuLinkManager->getOgMenuInstanceByGroupId($group_id); + // @todo Implement. + return []; + } + +} diff --git a/web/modules/custom/custom_page/src/CustomPageProviderInterface.php b/web/modules/custom/custom_page/src/CustomPageProviderInterface.php new file mode 100644 index 0000000000..4232748ece --- /dev/null +++ b/web/modules/custom/custom_page/src/CustomPageProviderInterface.php @@ -0,0 +1,26 @@ + Date: Thu, 26 Mar 2020 18:34:42 +0200 Subject: [PATCH 397/957] ISAICP-5708: Create the skeleton of the IncludeBasicPageContent Search API processor. --- .../processor/IncludeBasicPageContent.php | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php diff --git a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php new file mode 100644 index 0000000000..0936e02c78 --- /dev/null +++ b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php @@ -0,0 +1,105 @@ +setCustomPageProvider($container->get('custom_page.provider')); + return $processor; + } + + /** + * Sets the custom page provider. + * + * @param \Drupal\custom_page\CustomPageProviderInterface $custom_page_provider + * The custom page provider. + * + * @return self + */ + public function setCustomPageProvider(CustomPageProviderInterface $custom_page_provider): self { + $this->customPageProvider = $custom_page_provider; + return $this; + } + + /** + * {@inheritdoc} + */ + public static function supportsIndex(IndexInterface $index): bool { + foreach ($index->getDatasources() as $datasource) { + if ($datasource->getEntityTypeId() == 'rdf_entity') { + return TRUE; + } + } + return FALSE; + } + + /** + * {@inheritdoc} + */ + public function preprocessIndexItems(array $items): void { + /** @var \Drupal\search_api\Item\ItemInterface $item */ + foreach ($items as $item) { + /** @var \Drupal\rdf_entity\RdfInterface $entity */ + $entity = $item->getOriginalObject()->getValue(); + + // Only process groups. + if (!JoinupGroupHelper::isGroup($entity)) { + return; + } + + foreach ($this->customPageProvider->getCustomPagesByGroupId($entity->id()) as $custom_page) { + // @todo Implement. + $field = $item->getField('??'); + // Index the title and body text of the custom page. + $field->addValue($custom_page->label()); + $body_field_item_list = $custom_page->get('body'); + if (!$body_field_item_list->isEmpty()) { + $field->addValue(check_markup($body_field_item_list->value, $body_field_item_list->format)); + } + } + } + } + +} From d2336a042bafc28d5cb5412f27240f58281f6c12 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 26 Mar 2020 18:53:04 +0200 Subject: [PATCH 398/957] ISAICP-5907: Tighten up the coding standards. --- composer.json | 1 + composer.lock | 260 +++++++++++++++++------------------------ phpcs-ruleset.xml.dist | 52 ++++++++- 3 files changed, 153 insertions(+), 160 deletions(-) diff --git a/composer.json b/composer.json index 442f556a5b..17ad4ecbf2 100644 --- a/composer.json +++ b/composer.json @@ -128,6 +128,7 @@ "pfrenssen/phpcs-pre-push": "1.1", "phpstan/phpstan-deprecation-rules": "~0.12", "phpunit/phpunit": "~6.5", + "slevomat/coding-standard": "~6.1", "symfony/css-selector": "~2.8|~3.0|~4.0", "symfony/dom-crawler": "4.4.4", "symfony/phpunit-bridge": "^4.2", diff --git a/composer.lock b/composer.lock index b8f7460316..d3d912ea74 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": "bafb725c6737304b5fb2bff3a0b19bbc", + "content-hash": "ce8e9c3a6683b1c7a4e42e7dd924a26f", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.42", + "version": "3.133.44", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4f0259689e66237e429f9fc1d879b2bcdce6dadb" + "reference": "00df425deebdde3f3bebfde446a4250695dc47e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4f0259689e66237e429f9fc1d879b2bcdce6dadb", - "reference": "4f0259689e66237e429f9fc1d879b2bcdce6dadb", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/00df425deebdde3f3bebfde446a4250695dc47e4", + "reference": "00df425deebdde3f3bebfde446a4250695dc47e4", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-23T18:17:07+00:00" + "time": "2020-03-25T18:15:47+00:00" }, { "name": "caxy/php-htmldiff", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -739,12 +729,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -4595,17 +4579,17 @@ }, { "name": "drupal/geofield", - "version": "1.8.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/geofield.git", - "reference": "8.x-1.8" + "reference": "8.x-1.9" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.8.zip", - "reference": "8.x-1.8", - "shasum": "e38c015a50d9eb7b156aab0a0a633068bd317dea" + "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.9.zip", + "reference": "8.x-1.9", + "shasum": "785bfb06a6684e3e310170aaacbfdaff46214052" }, "require": { "drupal/core": "~8.0", @@ -4617,8 +4601,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.8", - "datestamp": "1576963383", + "version": "8.x-1.9", + "datestamp": "1585173153", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -10387,7 +10371,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", @@ -10966,20 +10950,6 @@ ], "description": "Symfony Finder Component", "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": "2020-02-14T07:42:58+00:00" }, { @@ -11124,20 +11094,6 @@ ], "description": "Symfony HttpKernel Component", "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": "2020-02-29T10:16:41+00:00" }, { @@ -11788,20 +11744,6 @@ "uri", "url" ], - "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": "2020-02-04T08:04:52+00:00" }, { @@ -11881,20 +11823,6 @@ ], "description": "Symfony Serializer Component", "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": "2020-02-24T14:33:45+00:00" }, { @@ -11965,20 +11893,6 @@ ], "description": "Symfony Translation Component", "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": "2020-02-04T07:22:30+00:00" }, { @@ -12065,20 +11979,6 @@ ], "description": "Symfony Validator Component", "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": "2020-02-29T09:08:42+00:00" }, { @@ -12155,20 +12055,6 @@ "debug", "dump" ], - "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": "2020-02-24T13:10:00+00:00" }, { @@ -12228,20 +12114,6 @@ ], "description": "Symfony Yaml Component", "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": "2020-01-16T19:04:26+00:00" }, { @@ -15426,6 +15298,55 @@ ], "time": "2020-03-05T15:02:03+00:00" }, + { + "name": "phpstan/phpdoc-parser", + "version": "0.4.3", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "928179efc5368145a8b03cb20d58cb3f3136afae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/928179efc5368145a8b03cb20d58cb3f3136afae", + "reference": "928179efc5368145a8b03cb20d58cb3f3136afae", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "require-dev": { + "consistence/coding-standard": "^3.5", + "ergebnis/composer-normalize": "^2.0.2", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "phing/phing": "^2.16.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^6.3", + "slevomat/coding-standard": "^4.7.2", + "symfony/process": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "time": "2020-01-25T20:42:48+00:00" + }, { "name": "phpstan/phpstan", "version": "0.12.18", @@ -16482,6 +16403,47 @@ "homepage": "https://github.com/sebastianbergmann/version", "time": "2016-10-03T07:35:21+00:00" }, + { + "name": "slevomat/coding-standard", + "version": "6.1.5", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "d767b5e302ff096327466c97fec3cb57f6d16086" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/d767b5e302ff096327466c97fec3cb57f6d16086", + "reference": "d767b5e302ff096327466c97fec3cb57f6d16086", + "shasum": "" + }, + "require": { + "php": "^7.1", + "phpstan/phpdoc-parser": "0.3.5 - 0.4.3", + "squizlabs/php_codesniffer": "^3.5.4" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "0.6.2", + "grogy/php-parallel-lint": "1.1.0", + "phing/phing": "2.16.3", + "phpstan/phpstan": "0.11.19|0.12.9", + "phpstan/phpstan-phpunit": "0.11.2|0.12.6", + "phpstan/phpstan-strict-rules": "0.11.1|0.12.2", + "phpunit/phpunit": "7.5.18|8.5.2" + }, + "type": "phpcodesniffer-standard", + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "time": "2020-02-05T21:17:34+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.5.4", @@ -16845,20 +16807,6 @@ ], "description": "Symfony PHPUnit Bridge", "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": "2020-02-24T14:58:55+00:00" }, { diff --git a/phpcs-ruleset.xml.dist b/phpcs-ruleset.xml.dist index d74e977aab..1ebcc7b742 100644 --- a/phpcs-ruleset.xml.dist +++ b/phpcs-ruleset.xml.dist @@ -1,8 +1,11 @@ - + - - Drupal coding standard + + Joinup coding standard + + + *.gif @@ -19,7 +22,6 @@ web/themes/joinup/vendor/* web/themes/joinup/prototype/gulpfile.js - @@ -30,4 +32,46 @@ web/modules/custom/joinup_subscription/README.md + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e15402bed8d7ffa50f9073f2328871d0b4c3c4ec Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 26 Mar 2020 19:48:57 +0200 Subject: [PATCH 399/957] ISAICP-5907: Adhere to coding standards. --- tests/src/Context/DrupalContext.php | 2 ++ tests/src/Context/MinkContext.php | 2 ++ tests/src/Context/ScreenshotContext.php | 20 +++++++++---------- .../WysiwygEditorNotFoundException.php | 2 ++ tests/src/Traits/EntityReferenceTrait.php | 2 ++ tests/src/Traits/MaterialDesignTrait.php | 2 ++ tests/src/Traits/RandomGeneratorTrait.php | 2 ++ tests/src/Traits/WorkflowTrait.php | 2 ++ tests/src/Traits/WysiwygTrait.php | 2 ++ .../adms_validator.post_update.php | 2 ++ .../src/AdmsValidationResult.php | 4 ++-- .../src/AdmsValidatorInterface.php | 2 ++ .../src/Form/AdmsValidatorForm.php | 2 +- .../asset_distribution.behat.inc | 2 +- .../asset_distribution.install | 2 ++ .../asset_distribution.module | 2 +- .../src/AssetDistributionRelations.php | 2 ++ .../AssetDistributionController.php | 2 ++ .../Controller/DownloadTrackingController.php | 4 +++- .../src/DownloadEventStorageSchema.php | 2 ++ .../src/Entity/DownloadEvent.php | 2 ++ .../src/Form/AnonymousDownloadForm.php | 2 ++ .../TrackedHostedFileDownloadFormatter.php | 2 ++ .../Constraint/DistributionSingleParent.php | 2 ++ .../Validation/Constraint/DownloadEvent.php | 2 ++ .../Constraint/DownloadEventValidator.php | 2 ++ ...UniqueAssetDistributionTitleConstraint.php | 2 ++ .../UniqueAssetDistributionTitleValidator.php | 2 ++ .../processor/IndexDistributionData.php | 2 ++ .../AssetDistributionValidationTest.php | 2 +- .../custom/asset_release/asset_release.module | 2 ++ .../src/AssetReleaseRelations.php | 2 ++ .../src/Cache/AssetReleaseCacheContext.php | 2 ++ .../AssetReleaseRouteContext.php | 2 ++ ...iqueAssetReleaseTitleVersionConstraint.php | 2 ++ ...niqueAssetReleaseTitleVersionValidator.php | 2 ++ .../AssetReleaseWorkflowStatePermission.php | 2 +- .../ExistingSite/AssetReleaseWorkflowTest.php | 2 +- .../SyncFieldsFromParentSolutionTest.php | 6 ++++-- .../custom/collection/collection.module | 4 ++-- .../src/Cache/CollectionCacheContext.php | 2 ++ .../Context/CollectionOwnerCacheContext.php | 2 +- .../src/Plugin/Condition/Collection.php | 2 ++ .../FieldType/LastUpdatedFieldItemList.php | 2 ++ .../CollectionWorkflowStatePermission.php | 2 +- .../contact_form/src/ContactFormEvents.php | 2 ++ .../src/Controller/ContactFormController.php | 2 ++ .../NotificationSubscriber.php | 2 +- .../SenderNotificationSubscriber.php | 2 +- .../ContactInformationFulfillmentGuard.php | 2 ++ .../ContactInformationWorkflowTest.php | 2 +- .../src/CustomPageOgMenuLinksManager.php | 14 ++++++------- .../CustomPageOgMenuLinksManagerInterface.php | 10 +++++----- .../Plugin/Field/FieldWidget/SearchWidget.php | 2 ++ .../Plugin/Menu/LocalAction/CustomPageAdd.php | 2 ++ .../src/Routing/RouteSubscriber.php | 2 ++ .../CustomPageOgMenuLinksManagerTest.php | 6 ++++-- .../src/Controller/DashboardController.php | 2 ++ .../custom/demo_content/demo_content.install | 2 ++ .../src/EventSubscriber/ImportSubscriber.php | 6 +++--- ...pEuLoginCasAccountLinkEventsSubscriber.php | 6 +++--- .../JoinupEuLoginCasEventsSubscriber.php | 6 +++--- .../WebtoolsAnalyticsSubscriber.php | 2 +- .../Plugin/Block/EiraDeprecatedTermBlock.php | 2 +- .../pipeline/Pipeline/EuSicPipeline.php | 2 ++ .../joinup_communities/eupl/src/Eupl.php | 2 ++ .../JoinupCollectionLeaveController.php | 2 +- .../Pipeline/JoinupCollectionPipeline.php | 2 ++ .../src/Routing/RouteSubscriber.php | 2 ++ .../Plugin/pipeline/Pipeline/NioPipeline.php | 2 ++ .../joinup_communities/semic/src/Semic.php | 2 ++ .../spain_ctt/includes/remove_duplicates.inc | 2 +- .../pipeline/Pipeline/SpainCttPipeline.php | 2 ++ .../FieldFormatter/TallinnEntryFormatter.php | 2 ++ .../Field/FieldType/TallinnEntryItem.php | 2 ++ .../Field/FieldWidget/TallinnEntryWidget.php | 2 ++ .../src/EventSubscriber/RegisterNamespace.php | 4 +++- ...ionTestResourceTypeConstraintValidator.php | 2 ++ .../src/EventSubscriber/EventSubscriber.php | 2 ++ .../src/Guard/CommunityContentGuard.php | 2 +- .../JoinupCommunityContentServiceProvider.php | 2 ++ .../CommunityContentWorkflowTestBase.php | 2 +- .../tests/src/Kernel/CustomTokensTest.php | 2 +- .../src/Controller/GroupMembersController.php | 2 ++ .../src/Controller/NotFoundController.php | 2 ++ .../custom/joinup_core/src/Element/Chip.php | 2 ++ .../joinup_core/src/Element/Datetime.php | 4 +++- .../Controller/JoinupRdfListBuilder.php | 2 ++ .../JoinupCoreOgSubscriber.php | 2 ++ .../src/FieldStorageDefinition.php | 2 ++ .../joinup_core/src/JoinupPermissions.php | 2 ++ .../src/JoinupVersionInterface.php | 2 ++ .../src/Plugin/Action/ChangeGroupAction.php | 4 ++-- .../src/Plugin/Block/StatisticsBlock.php | 2 ++ .../src/Plugin/Block/UserUnpublishedBlock.php | 4 +++- .../Condition/RequestRouteCondition.php | 2 ++ .../JoinupTimestampTimeagoFormatter.php | 2 ++ .../Field/FieldType/EntityBundlePairItem.php | 2 ++ .../Plugin/Field/FieldType/ReportLinkItem.php | 2 ++ .../CurrentWorkflowStateWidget.php | 2 ++ ...ltipleCardinalitySupportingEmailWidget.php | 2 ++ ...ultipleCardinalitySupportingLinkWidget.php | 2 ++ ...leCardinalitySupportingTextFieldWidget.php | 2 ++ .../src/Plugin/Menu/TourMenuLink.php | 2 ++ .../SocialMediaLinks/Iconset/JoinupIcons.php | 2 ++ .../Validation/Constraint/EmailConstraint.php | 2 ++ .../Constraint/EmailConstraintValidator.php | 2 ++ .../Constraint/ParentReferenceConstraint.php | 2 ++ .../ParentReferenceConstraintValidator.php | 2 ++ .../UniqueFieldInBundleConstraint.php | 2 ++ .../Constraint/UniqueFieldValueConstraint.php | 2 ++ .../UniqueFieldValueConstraintValidator.php | 2 ++ .../AggregatedEntityReferenceLabel.php | 2 ++ .../facets/widget/LinksInlineWidget.php | 2 ++ .../src/Plugin/facets/widget/TypeWidget.php | 2 ++ .../Id/JoinupEntityIdGenerator.php | 2 ++ .../Id/PolicyDomainVocabulary.php | 2 ++ .../src/Plugin/views/style/Tiles.php | 2 ++ .../src/ReportLinkFieldItemList.php | 2 ++ ...eCardinalitySupportingFieldWidgetTrait.php | 2 ++ .../custom/joinup_core/src/WorkflowHelper.php | 2 ++ .../src/ExistingSite/FileUrlFieldTest.php | 8 ++++---- .../tests/src/Kernel/JoinupKernelTestBase.php | 2 ++ .../Condition/RequestRouteConditionTest.php | 2 ++ .../Kernel/RdfEntityValidationTestBase.php | 2 ++ .../tests/src/Traits/FileUrlTrait.php | 4 +++- .../custom/joinup_debug/joinup_debug.module | 2 +- .../joinup_discussion.behat.inc | 2 +- .../joinup_discussion.module | 2 +- .../CanInviteToDiscussionCacheContext.php | 2 ++ .../src/DiscussionObserver.php | 2 +- .../src/Event/DiscussionEvents.php | 2 ++ .../EventSubscriber/InvitationSubscriber.php | 6 +++--- .../SubscribedDiscussionSubscriber.php | 2 +- .../WorkflowTransitionEventSubscriber.php | 2 ++ .../src/Form/InviteToDiscussionForm.php | 4 ++-- .../ExistingSite/DiscussionWorkflowTest.php | 2 +- .../joinup_event/joinup_event.behat.inc | 2 +- .../Constraint/EventLocationConstraint.php | 2 ++ .../EventLocationConstraintValidator.php | 2 ++ ...upFederationAdms2ConvertPassPluginBase.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass11.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass1To3.php | 2 +- .../Plugin/Adms2ConvertPass/Pass27To30.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass37.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass38.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass4.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass50.php | 2 +- .../Plugin/Adms2ConvertPass/Pass76To79.php | 2 +- .../src/Plugin/Adms2ConvertPass/Pass7To10.php | 2 +- ...ibutionSingleParentConstraintValidator.php | 2 +- .../JoinupEntityReferenceConstraintTrait.php | 2 ++ .../Plugin/pipeline/Step/AdmsValidation.php | 2 +- .../Plugin/pipeline/Step/BrokenReferences.php | 2 +- .../Plugin/pipeline/Step/ConvertToAdms2.php | 2 ++ .../src/Plugin/pipeline/Step/Import.php | 4 ++-- .../Plugin/pipeline/Step/JoinupValidation.php | 4 ++-- .../src/Plugin/pipeline/Step/ManualUpload.php | 2 +- .../pipeline/Step/ProvenanceActivity.php | 2 +- .../Plugin/pipeline/Step/ThreeWayMerge.php | 4 ++-- .../pipeline/Step/UserSelectionFilter.php | 2 +- .../src/StagingCandidateGraphsInterface.php | 2 ++ ...JoinupFederationInvalidTestingPipeline.php | 2 ++ .../JoinupFederationTestingPipeline.php | 2 ++ .../src/Kernel/AdmsValidationStepTest.php | 2 ++ .../Kernel/StagingGraphValidReferenceTest.php | 4 +++- .../tests/src/Kernel/StepTestBase.php | 2 +- .../Controller/FrontPageMenuController.php | 2 ++ .../src/Routing/RouteSubscriber.php | 2 ++ .../Cache/Context/GroupOwnerCacheContext.php | 2 +- .../src/Controller/AboutPageController.php | 2 +- .../joinup_group/src/JoinupGroupHelper.php | 2 +- .../src/JoinupGroupManagerInterface.php | 2 ++ .../src/Plugin/Block/OverviewMessageBlock.php | 2 +- .../src/Controller/InvitationController.php | 8 ++++---- .../Controller/UserAutoCompleteController.php | 2 ++ .../joinup_invite/src/Entity/Invitation.php | 6 +++--- .../src/Event/InvitationEvent.php | 8 ++++---- .../src/Event/InvitationEventInterface.php | 8 ++++---- .../src/Event/InvitationEvents.php | 2 ++ .../Controller/LicenceOverviewController.php | 2 +- .../src/Kernel/LicenceValidationTest.php | 2 +- .../CollectionRdfSubscriber.php | 2 +- .../src/EventSubscriber/CommentSubscriber.php | 2 +- .../CommunityContentSubscriber.php | 2 +- .../NotificationSubscriberBase.php | 2 +- .../OgMembershipSubscriber.php | 2 +- .../src/NotificationEvents.php | 2 ++ .../src/Annotation/ArbitraryFacet.php | 2 ++ .../src/ArbitraryFacetWidgetDecorator.php | 8 +++++--- .../src/Plugin/ArbitraryFacetManager.php | 4 +++- .../SolariumEventSubscriber.php | 2 ++ .../processor/JoinupEntityLatestRevision.php | 2 ++ .../JoinupEntityPublishedRevision.php | 2 ++ .../JoinupSparqlDefaultGraphsSubscriber.php | 2 ++ .../src/Functional/ContentNegotiationTest.php | 4 ++-- .../Kernel/JoinupSparqlDefaultGraphsTest.php | 2 +- .../joinup_subscription.module | 2 +- .../joinup_subscription.post_update.php | 4 ++-- .../UserAlreadySubscribedException.php | 2 ++ .../src/Form/MySubscriptionsForm.php | 2 +- .../src/Plugin/ActionLink/SafeUnflag.php | 2 ++ .../Kernel/JoinupSubscriberServiceTest.php | 10 ++++++---- .../src/ContextProvider/UserRouteContext.php | 2 ++ .../src/Plugin/Block/UserHeaderBlock.php | 2 ++ .../src/UserFullNameFieldItemList.php | 2 ++ .../custom/joinup_video/src/JoinupVideo.php | 2 ++ .../src/Plugin/Filter/JoinupVideo.php | 2 ++ .../video_embed_field/Provider/GoogleDocs.php | 4 +++- .../Provider/InternalPath.php | 2 ++ .../Provider/JoinupEcVideo.php | 2 ++ .../video_embed_field/Provider/Prezi.php | 2 ++ .../video_embed_field/Provider/Slideshare.php | 2 ++ .../tests/src/Unit/JoinupEcVideoTest.php | 4 +++- .../custom/moderation/moderation.behat.inc | 2 ++ .../Form/ContentModerationOverviewForm.php | 2 ++ .../OgCommentEventSubscriber.php | 2 ++ .../src/OgCommentAccessControlHandler.php | 4 +++- .../og_comment/src/OgCommentFieldItemList.php | 4 +++- .../OgCommentDefaultFormatter.php | 12 +++++------ .../owner/src/Guard/OwnerFulfillmentGuard.php | 2 ++ .../src/Kernel/UniqueAssociatedWithTest.php | 4 +++- .../Kernel/RdfSchemaFieldValidationTest.php | 4 +++- .../Plugin/Field/FieldWidget/SearchWidget.php | 2 ++ .../facets/facet_source/SearchApiField.php | 2 ++ .../facet_source/SearchApiFieldDeriver.php | 2 ++ .../Context/SolutionOwnerCacheContext.php | 2 +- .../src/Cache/SolutionCacheContext.php | 2 ++ .../src/Controller/SolutionController.php | 2 ++ .../EventSubscriber/SolutionOgSubscriber.php | 2 ++ .../src/Guard/SolutionFulfillmentGuard.php | 2 ++ .../src/Kernel/SolutionAffiliationTest.php | 4 ++-- .../src/Kernel/SolutionValidationTest.php | 2 +- .../WorkflowTransitionEventSubscriber.php | 2 ++ .../src/RevisionManagerInterface.php | 2 ++ .../StateMachineRevisionsRouteSubscriber.php | 2 ++ .../RefreshCachedFieldsEventSubscriber.php | 8 ++++---- .../tests/src/Kernel/RefreshCountersTest.php | 4 ++-- web/profiles/joinup/joinup.behat.inc | 6 +++--- web/profiles/joinup/joinup.post_update.php | 4 ++-- web/profiles/joinup/joinup.profile | 2 ++ .../joinup/src/Access/Uid1OnlyAccess.php | 2 ++ .../src/Form/SolutionsByLicenceForm.php | 2 +- web/profiles/joinup/src/Form/TcaForm.php | 2 ++ web/profiles/joinup/src/JoinupPermissions.php | 2 ++ .../joinup/src/PinServiceInterface.php | 2 ++ .../src/Plugin/Block/AddContentBlock.php | 2 ++ .../joinup/src/Routing/RouteSubscriber.php | 2 ++ web/themes/joinup/joinup_theme.theme | 2 ++ 249 files changed, 499 insertions(+), 173 deletions(-) diff --git a/tests/src/Context/DrupalContext.php b/tests/src/Context/DrupalContext.php index 74a12cb928..186b93209b 100644 --- a/tests/src/Context/DrupalContext.php +++ b/tests/src/Context/DrupalContext.php @@ -1,5 +1,7 @@ createScreenshot($name, $message); } @@ -115,7 +115,7 @@ public function takeScreenshot(string $name = NULL) : void { * * @Then I take a screenshot */ - public function takeScreenshotUnnamed() : void { + public function takeScreenshotUnnamed(): void { $file_name = 'behat-screenshot-' . user_password(); $message = "Screenshot created in @file_name"; $this->createScreenshot($file_name, $message); @@ -129,7 +129,7 @@ public function takeScreenshotUnnamed() : void { * * @AfterStep */ - public function screenshotForPhpNotices(AfterStepScope $event) : void { + public function screenshotForPhpNotices(AfterStepScope $event): void { $environment = $event->getEnvironment(); // Make sure the environment has the MessageContext. $class = 'Drupal\DrupalExtension\Context\MessageContext'; @@ -170,7 +170,7 @@ public function screenshotForPhpNotices(AfterStepScope $event) : void { * * @AfterStep */ - public function takeScreenshotAfterFailedStep(AfterStepScope $event) : void { + public function takeScreenshotAfterFailedStep(AfterStepScope $event): void { if ($event->getTestResult()->isPassed()) { // Not a failed step. return; @@ -192,7 +192,7 @@ public function takeScreenshotAfterFailedStep(AfterStepScope $event) : void { * @param string $message * The message to be printed. '@file_name' will be replaced with $file_name. */ - public function createScreenshot(string $file_name, string $message) : void { + public function createScreenshot(string $file_name, string $message): void { try { if ($this->getSession()->getDriver() instanceof Selenium2Driver) { $file_name .= '.png'; @@ -239,7 +239,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 { // Don't attempt to save the screenshot if no folder name has been // configured. if (empty($this->localDir)) { @@ -270,7 +270,7 @@ protected function save(string $screenshot, string $file_name) : ?string { * @throws \Exception * Thrown if the destination folder doesn't exist and couldn't be created. */ - protected function upload(string $screenshot, string $file_name) : void { + protected function upload(string $screenshot, string $file_name): void { // Don't attempt to upload the screenshot if any of the required parameters // are missing. $required_parameters = ['s3Dir', 's3Region', 's3Bucket']; @@ -295,7 +295,7 @@ protected function upload(string $screenshot, string $file_name) : void { * @return \Aws\S3\S3ClientInterface * The client. */ - protected function getS3Client() : S3ClientInterface { + protected function getS3Client(): S3ClientInterface { $options = [ 'version' => 'latest', 'region' => $this->s3Region, diff --git a/tests/src/Exception/WysiwygEditorNotFoundException.php b/tests/src/Exception/WysiwygEditorNotFoundException.php index 5b0dbef2da..e4824b79b7 100644 --- a/tests/src/Exception/WysiwygEditorNotFoundException.php +++ b/tests/src/Exception/WysiwygEditorNotFoundException.php @@ -1,5 +1,7 @@ errors); @@ -65,7 +65,7 @@ public function toRows() : array { * @return int * Error count. */ - public function errorCount() : int { + public function errorCount(): int { return count($this->errors); } diff --git a/web/modules/custom/adms_validator/src/AdmsValidatorInterface.php b/web/modules/custom/adms_validator/src/AdmsValidatorInterface.php index c456acad88..9dbb9f4b7e 100644 --- a/web/modules/custom/adms_validator/src/AdmsValidatorInterface.php +++ b/web/modules/custom/adms_validator/src/AdmsValidatorInterface.php @@ -1,5 +1,7 @@ entityTypeManager->getStorage('menu_link_content'); $node_storage = $this->entityTypeManager->getStorage('node'); @@ -99,7 +99,7 @@ public function getChildren(NodeInterface $custom_page) : array { /** * {@inheritdoc} */ - public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface { + public function addLink(NodeInterface $custom_page): CustomPageOgMenuLinksManagerInterface { $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); if ($og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { @@ -116,7 +116,7 @@ public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManag /** * {@inheritdoc} */ - public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgMenuLinksManagerInterface { + public function moveLinks(NodeInterface $custom_page, $group_id): CustomPageOgMenuLinksManagerInterface { $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); if ($source_og_menu_instance = $this->getOgMenuInstanceByCustomPage($custom_page)) { @@ -145,7 +145,7 @@ public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgM /** * {@inheritdoc} */ - public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface { + public function deleteLinks(NodeInterface $custom_page): CustomPageOgMenuLinksManagerInterface { $menu_link_content_storage = $this->entityTypeManager->getStorage('menu_link_content'); $this->verifyCustomPage($custom_page); /** @var \Drupal\Core\Menu\MenuLinkTreeInterface $t */ @@ -181,7 +181,7 @@ public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksM /** * {@inheritdoc} */ - public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page) : ?OgMenuInstanceInterface { + public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page): ?OgMenuInstanceInterface { $this->verifyCustomPage($custom_page); if ($group_id = $custom_page->get(OgGroupAudienceHelperInterface::DEFAULT_FIELD)->target_id) { return $this->getOgMenuInstanceByGroupId($group_id); @@ -195,7 +195,7 @@ public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page) : ?OgM * @param \Drupal\node\NodeInterface $custom_page * The node to check. */ - protected function verifyCustomPage(NodeInterface $custom_page) : void { + protected function verifyCustomPage(NodeInterface $custom_page): void { $bundle = $custom_page->bundle(); if ($bundle !== 'custom_page') { throw new \InvalidArgumentException("The node is not a custom page, but a '$bundle'."); @@ -211,7 +211,7 @@ protected function verifyCustomPage(NodeInterface $custom_page) : void { * @return \Drupal\og_menu\OgMenuInstanceInterface|null * The OG menu instance or NULL if none can be determined. */ - protected function getOgMenuInstanceByGroupId(string $group_id) : ?OgMenuInstanceInterface { + protected function getOgMenuInstanceByGroupId(string $group_id): ?OgMenuInstanceInterface { if (Rdf::load($group_id)) { $properties = [ 'type' => 'navigation', diff --git a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php index 3ad80b0a55..4c0d23300a 100644 --- a/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php +++ b/web/modules/custom/custom_page/src/CustomPageOgMenuLinksManagerInterface.php @@ -21,7 +21,7 @@ interface CustomPageOgMenuLinksManagerInterface { * @return \Drupal\node\NodeInterface[] * A list of child nodes. */ - public function getChildren(NodeInterface $custom_page) : array; + public function getChildren(NodeInterface $custom_page): array; /** * Adds a OG menu link pointing to a custom page. @@ -31,7 +31,7 @@ public function getChildren(NodeInterface $custom_page) : array; * * @return $this */ - public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface; + public function addLink(NodeInterface $custom_page): CustomPageOgMenuLinksManagerInterface; /** * Move the OG menu links of a custom page to a new group OG menu instance. @@ -43,7 +43,7 @@ public function addLink(NodeInterface $custom_page) : CustomPageOgMenuLinksManag * * @return $this */ - public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgMenuLinksManagerInterface; + public function moveLinks(NodeInterface $custom_page, $group_id): CustomPageOgMenuLinksManagerInterface; /** * Deletes all the corresponding OG menu links pointing to a custom page. @@ -53,7 +53,7 @@ public function moveLinks(NodeInterface $custom_page, $group_id) : CustomPageOgM * * @return $this */ - public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksManagerInterface; + public function deleteLinks(NodeInterface $custom_page): CustomPageOgMenuLinksManagerInterface; /** * Gets the OG menu instance, given a custom page. @@ -64,6 +64,6 @@ public function deleteLinks(NodeInterface $custom_page) : CustomPageOgMenuLinksM * @return \Drupal\og_menu\OgMenuInstanceInterface|null * The OG menu instance or NULL if none can be determined. */ - public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page) : ?OgMenuInstanceInterface; + public function getOgMenuInstanceByCustomPage(NodeInterface $custom_page): ?OgMenuInstanceInterface; } diff --git a/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php b/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php index d951fb8c1e..371e93e056 100644 --- a/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php +++ b/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php @@ -1,5 +1,7 @@ getOgMenuInstance(); if (empty($menu_instance)) { return NULL; @@ -356,7 +356,7 @@ protected function getOgMenuLink(NodeInterface $custom_page) : ?MenuLinkContentI * @return \Drupal\og_menu\OgMenuInstanceInterface|null * The OG menu instance. */ - protected function getOgMenuInstance() : ?OgMenuInstanceInterface { + protected function getOgMenuInstance(): ?OgMenuInstanceInterface { if (!isset($this->ogMenuInstance)) { $og_menu_storage = $this->entityTypeManager->getStorage('ogmenu_instance'); // @todo If we ever support more than one OG Menu then we should no longer diff --git a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php b/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php index d82eed4abc..074070e7e7 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php +++ b/web/modules/custom/joinup_core/src/Plugin/Block/StatisticsBlock.php @@ -1,5 +1,7 @@ bundle() !== 'discussion') { return; } diff --git a/web/modules/custom/joinup_discussion/src/Cache/CanInviteToDiscussionCacheContext.php b/web/modules/custom/joinup_discussion/src/Cache/CanInviteToDiscussionCacheContext.php index dde7498c77..1ed34fa529 100644 --- a/web/modules/custom/joinup_discussion/src/Cache/CanInviteToDiscussionCacheContext.php +++ b/web/modules/custom/joinup_discussion/src/Cache/CanInviteToDiscussionCacheContext.php @@ -1,5 +1,7 @@ getInvitation(); // Ignore invitations to other content entities. @@ -92,7 +92,7 @@ public function acceptInvitation(InvitationEventInterface $event) : void { * @param \Drupal\joinup_invite\Event\InvitationEventInterface $event * The event that was fired. */ - public function rejectInvitation(InvitationEventInterface $event) : void { + public function rejectInvitation(InvitationEventInterface $event): void { $invitation = $event->getInvitation(); // Ignore invitations to other content entities. diff --git a/web/modules/custom/joinup_discussion/src/EventSubscriber/SubscribedDiscussionSubscriber.php b/web/modules/custom/joinup_discussion/src/EventSubscriber/SubscribedDiscussionSubscriber.php index 9ec4498cd6..b456075ddd 100644 --- a/web/modules/custom/joinup_discussion/src/EventSubscriber/SubscribedDiscussionSubscriber.php +++ b/web/modules/custom/joinup_discussion/src/EventSubscriber/SubscribedDiscussionSubscriber.php @@ -12,8 +12,8 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\joinup_discussion\Event\DiscussionDeleteEvent; -use Drupal\joinup_discussion\Event\DiscussionUpdateEvent; use Drupal\joinup_discussion\Event\DiscussionEvents; +use Drupal\joinup_discussion\Event\DiscussionUpdateEvent; use Drupal\joinup_notification\JoinupMessageDeliveryInterface; use Drupal\joinup_notification\MessageArgumentGenerator; use Drupal\joinup_subscription\JoinupDiscussionSubscriptionInterface; diff --git a/web/modules/custom/joinup_discussion/src/EventSubscriber/WorkflowTransitionEventSubscriber.php b/web/modules/custom/joinup_discussion/src/EventSubscriber/WorkflowTransitionEventSubscriber.php index 297469929c..92faf49e89 100644 --- a/web/modules/custom/joinup_discussion/src/EventSubscriber/WorkflowTransitionEventSubscriber.php +++ b/web/modules/custom/joinup_discussion/src/EventSubscriber/WorkflowTransitionEventSubscriber.php @@ -1,5 +1,7 @@ generateArguments($invitation->getEntity()); $message = $this->invitationMessageHelper->createMessage($invitation, self::TEMPLATE_DISCUSSION_INVITE, $arguments); $message->save(); diff --git a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php index 9fb0f200e1..dd187c8597 100644 --- a/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php +++ b/web/modules/custom/joinup_discussion/tests/src/ExistingSite/DiscussionWorkflowTest.php @@ -4,8 +4,8 @@ namespace Drupal\Tests\joinup_discussion\ExistingSite; -use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; use Drupal\Tests\joinup_community_content\ExistingSite\CommunityContentWorkflowTestBase; +use Drupal\joinup_community_content\CommunityContentWorkflowAccessControlHandler; /** * Tests CRUD operations and workflow transitions for the discussion node. diff --git a/web/modules/custom/joinup_event/joinup_event.behat.inc b/web/modules/custom/joinup_event/joinup_event.behat.inc index 5a6ce7aef2..1ebf2f74f9 100644 --- a/web/modules/custom/joinup_event/joinup_event.behat.inc +++ b/web/modules/custom/joinup_event/joinup_event.behat.inc @@ -9,9 +9,9 @@ declare(strict_types = 1); use Behat\Behat\Hook\Scope\AfterFeatureScope; use Drupal\Core\Site\Settings; -use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope; +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\joinup\Traits\NodeTrait; /** diff --git a/web/modules/custom/joinup_event/src/Plugin/Validation/Constraint/EventLocationConstraint.php b/web/modules/custom/joinup_event/src/Plugin/Validation/Constraint/EventLocationConstraint.php index 0188c8ed6e..c96c336c43 100644 --- a/web/modules/custom/joinup_event/src/Plugin/Validation/Constraint/EventLocationConstraint.php +++ b/web/modules/custom/joinup_event/src/Plugin/Validation/Constraint/EventLocationConstraint.php @@ -1,5 +1,7 @@ $predicates) { foreach ($predicates as $predicate => $objects) { diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass11.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass11.php index 48cdd3b8b6..8d823a2c83 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass11.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass11.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #4. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php index ef218e0bac..b01afd9543 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php @@ -5,9 +5,9 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; +use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\sparql_entity_storage\Entity\Query\Sparql\SparqlArg; -use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; /** * Conversion Passes #1, #2 and #3. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass27To30.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass27To30.php index 419843fca0..de8238fe1b 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass27To30.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass27To30.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #4. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass37.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass37.php index 4bf3e00aa2..410ccd6b2c 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass37.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass37.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #37. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass38.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass38.php index 3a19ebfc3d..283ea9e14a 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass38.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass38.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #38. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass4.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass4.php index 663f6f4f1e..bc31f37977 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass4.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass4.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #4. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass50.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass50.php index 27c6f786d1..aee84b3ff1 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass50.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass50.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #50. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass76To79.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass76To79.php index b155cf99ae..7b6eb2160f 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass76To79.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass76To79.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #76, #77, #78 and #79. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass7To10.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass7To10.php index 7723a410d5..8598e8ce08 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass7To10.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass7To10.php @@ -5,8 +5,8 @@ namespace Drupal\joinup_federation\Plugin\Adms2ConvertPass; use Drupal\KernelTests\KernelTestBase; -use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; use Drupal\Tests\joinup_federation\Kernel\ConvertToAdms2StepTest; +use Drupal\joinup_federation\JoinupFederationAdms2ConvertPassPluginBase; /** * Conversion Pass #7, #8, #9, #10. diff --git a/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/FederationDistributionSingleParentConstraintValidator.php b/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/FederationDistributionSingleParentConstraintValidator.php index 31f1a8e46c..1863a98008 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/FederationDistributionSingleParentConstraintValidator.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/FederationDistributionSingleParentConstraintValidator.php @@ -4,9 +4,9 @@ namespace Drupal\joinup_federation\Plugin\Validation\Constraint; -use Drupal\asset_distribution\Plugin\Validation\Constraint\DistributionSingleParentValidator; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\asset_distribution\Plugin\Validation\Constraint\DistributionSingleParentValidator; use Drupal\joinup_federation\StagingCandidateGraphsInterface; use Drupal\sparql_entity_storage\Entity\Query\Sparql\SparqlQueryInterface; use Symfony\Component\DependencyInjection\ContainerInterface; diff --git a/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/JoinupEntityReferenceConstraintTrait.php b/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/JoinupEntityReferenceConstraintTrait.php index dc4d913a01..3d0417655c 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/JoinupEntityReferenceConstraintTrait.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Validation/Constraint/JoinupEntityReferenceConstraintTrait.php @@ -1,5 +1,7 @@ accept()->save(); @@ -121,7 +121,7 @@ public function updateInvitation(InvitationInterface $invitation, string $action * @return \Drupal\Core\Access\AccessResultInterface * The access result. */ - public function access(InvitationInterface $invitation, string $action, string $hash) : AccessResultInterface { + public function access(InvitationInterface $invitation, string $action, string $hash): AccessResultInterface { $valid_action = in_array($action, [self::ACTION_ACCEPT, self::ACTION_REJECT]); return AccessResult::allowedIf($valid_action && static::generateHash($invitation, $action) === $hash); } @@ -140,7 +140,7 @@ public function access(InvitationInterface $invitation, string $action, string $ * A unique hash consisting of 8 lowercase alphanumeric characters, dashes * and underscores. */ - public static function generateHash(InvitationInterface $invitation, string $action) : string { + public static function generateHash(InvitationInterface $invitation, string $action): string { $data = $invitation->id(); $data .= $action; return strtolower(substr(Crypt::hmacBase64($data, Settings::getHashSalt()), 0, 8)); @@ -157,7 +157,7 @@ public static function generateHash(InvitationInterface $invitation, string $act * @return \Drupal\joinup_invite\Event\InvitationEventInterface * The event. */ - protected function getEvent(InvitationInterface $invitation, string $action) : InvitationEventInterface { + protected function getEvent(InvitationInterface $invitation, string $action): InvitationEventInterface { return (new InvitationEvent()) ->setInvitation($invitation) ->setAction($action); diff --git a/web/modules/custom/joinup_invite/src/Controller/UserAutoCompleteController.php b/web/modules/custom/joinup_invite/src/Controller/UserAutoCompleteController.php index bc4f979441..56a21a00b6 100644 --- a/web/modules/custom/joinup_invite/src/Controller/UserAutoCompleteController.php +++ b/web/modules/custom/joinup_invite/src/Controller/UserAutoCompleteController.php @@ -1,5 +1,7 @@ invitation; } /** * {@inheritdoc} */ - public function setInvitation(InvitationInterface $invitation) : InvitationEventInterface { + public function setInvitation(InvitationInterface $invitation): InvitationEventInterface { $this->invitation = $invitation; return $this; } @@ -44,14 +44,14 @@ public function setInvitation(InvitationInterface $invitation) : InvitationEvent /** * {@inheritdoc} */ - public function getAction() : string { + public function getAction(): string { return $this->action; } /** * {@inheritdoc} */ - public function setAction(string $action) : InvitationEventInterface { + public function setAction(string $action): InvitationEventInterface { $this->action = $action; return $this; } diff --git a/web/modules/custom/joinup_invite/src/Event/InvitationEventInterface.php b/web/modules/custom/joinup_invite/src/Event/InvitationEventInterface.php index 3530f37914..d3af04557c 100644 --- a/web/modules/custom/joinup_invite/src/Event/InvitationEventInterface.php +++ b/web/modules/custom/joinup_invite/src/Event/InvitationEventInterface.php @@ -17,7 +17,7 @@ interface InvitationEventInterface { * @return \Drupal\joinup_invite\Entity\InvitationInterface * The invitation. */ - public function getInvitation() : InvitationInterface; + public function getInvitation(): InvitationInterface; /** * Stores the invitation for which the event takes place. @@ -27,7 +27,7 @@ public function getInvitation() : InvitationInterface; * * @return $this */ - public function setInvitation(InvitationInterface $invitation) : self; + public function setInvitation(InvitationInterface $invitation): self; /** * Returns the action taken on the invitation for which the event takes place. @@ -35,7 +35,7 @@ public function setInvitation(InvitationInterface $invitation) : self; * @return string * The action. */ - public function getAction() : string; + public function getAction(): string; /** * Stores the action taken on the invitation for which the event takes place. @@ -45,6 +45,6 @@ public function getAction() : string; * * @return $this */ - public function setAction(string $action) : self; + public function setAction(string $action): self; } diff --git a/web/modules/custom/joinup_invite/src/Event/InvitationEvents.php b/web/modules/custom/joinup_invite/src/Event/InvitationEvents.php index 1dde67f779..98db93a4c9 100644 --- a/web/modules/custom/joinup_invite/src/Event/InvitationEvents.php +++ b/web/modules/custom/joinup_invite/src/Event/InvitationEvents.php @@ -1,5 +1,7 @@ createUser(); @@ -181,7 +183,7 @@ protected function createSubscribedUsers(int $count = 3) : array { * @param \Drupal\Core\Session\AccountInterface[] $expected_subscribers * The subscribers that are expected to be present. */ - protected function assertSubscribers(array $expected_subscribers) : void { + protected function assertSubscribers(array $expected_subscribers): void { $actual_subscribers = $this->subscriptionService->getSubscribers($this->entity, $this->testFlagId); foreach ($expected_subscribers as $expected_subscriber) { // Check that an entry with the subscriber ID is present in the list. diff --git a/web/modules/custom/joinup_user/src/ContextProvider/UserRouteContext.php b/web/modules/custom/joinup_user/src/ContextProvider/UserRouteContext.php index 97cb92d869..4da81b6c48 100644 --- a/web/modules/custom/joinup_user/src/ContextProvider/UserRouteContext.php +++ b/web/modules/custom/joinup_user/src/ContextProvider/UserRouteContext.php @@ -1,5 +1,7 @@ Date: Thu, 26 Mar 2020 19:53:17 +0200 Subject: [PATCH 400/957] ISAICP-5907: Adhere to coding standards. --- .../custom/asset_distribution/asset_distribution.install | 4 ++-- web/modules/custom/asset_release/asset_release.module | 4 ++-- web/modules/custom/collection/collection.install | 2 ++ web/modules/custom/collection/collection.post_update.php | 2 ++ web/modules/custom/contact_form/contact_form.behat.inc | 2 ++ web/modules/custom/custom_page/custom_page.post_update.php | 2 ++ web/modules/custom/demo_users/demo_users.module | 2 ++ web/modules/custom/joinup_communities/eira/eira.module | 2 ++ web/modules/custom/joinup_communities/semic/semic.module | 2 ++ .../spain_ctt/includes/remove_duplicates.inc | 2 ++ .../joinup_communities/spain_ctt/spain_ctt.post_update.php | 2 ++ .../custom/joinup_communities/tallinn/tallinn.behat.inc | 2 ++ web/modules/custom/joinup_communities/tallinn/tallinn.install | 2 ++ web/modules/custom/joinup_communities/tallinn/tallinn.module | 2 ++ .../custom/joinup_communities/tallinn/tallinn.post_update.php | 2 ++ web/modules/custom/joinup_communities/trr/trr.module | 2 ++ .../joinup_community_content/joinup_community_content.install | 2 ++ web/modules/custom/joinup_core/joinup_core.drush.inc | 2 ++ web/modules/custom/joinup_core/joinup_core.install | 2 ++ web/modules/custom/joinup_core/joinup_core.tokens.inc | 2 ++ web/modules/custom/joinup_discussion/joinup_discussion.module | 2 ++ .../joinup_discussion/joinup_discussion.post_update.php | 2 ++ web/modules/custom/joinup_document/joinup_document.module | 2 ++ web/modules/custom/joinup_federation/joinup_federation.module | 2 ++ .../joinup_federation_test/joinup_federation_test.module | 2 ++ web/modules/custom/joinup_invite/joinup_invite.module | 2 ++ .../custom/joinup_invite/joinup_invite.post_update.php | 2 ++ web/modules/custom/joinup_licence/joinup_licence.install | 2 ++ .../custom/joinup_licence/joinup_licence.post_update.php | 2 ++ web/modules/custom/joinup_search/joinup_search.module | 2 ++ .../search_api_arbitrary_facet.module | 2 ++ .../custom/joinup_subscription/joinup_subscription.install | 2 ++ .../joinup_subscription/joinup_subscription.post_update.php | 2 ++ web/modules/custom/joinup_user/joinup_user.install | 2 ++ web/modules/custom/joinup_video/joinup_video.post_update.php | 2 ++ web/modules/custom/og_comment/og_comment.module | 2 ++ web/modules/custom/owner/owner.install | 2 ++ web/modules/custom/owner/owner.module | 2 ++ web/modules/custom/rdf_demo/rdf_demo.module | 2 ++ .../custom/rdf_entity_provenance/rdf_entity_provenance.module | 2 ++ web/modules/custom/search_api_field/search_api_field.module | 2 ++ web/modules/custom/solution/solution.post_update.php | 2 ++ 42 files changed, 84 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/asset_distribution/asset_distribution.install b/web/modules/custom/asset_distribution/asset_distribution.install index 77fca02382..857154e5ed 100644 --- a/web/modules/custom/asset_distribution/asset_distribution.install +++ b/web/modules/custom/asset_distribution/asset_distribution.install @@ -1,12 +1,12 @@ Date: Thu, 26 Mar 2020 20:04:51 +0200 Subject: [PATCH 401/957] ISAICP-5907: Adhere to coding standards. --- .../src/Controller/AssetDistributionController.php | 2 +- .../src/Controller/AssetReleaseController.php | 2 +- .../src/Controller/CustomPageController.php | 2 +- .../trr/src/EventSubscriber/RegisterNamespace.php | 2 +- .../joinup_community_content/src/Form/ShareForm.php | 12 +----------- .../src/Form/UnshareForm.php | 12 +----------- .../custom/joinup_core/src/RequirementsHelper.php | 2 +- .../custom/joinup_group/src/Form/ShareForm.php | 2 +- .../custom/joinup_group/src/Form/UnshareForm.php | 2 +- .../src/Plugin/Block/LicenceFilterBlock.php | 2 +- .../src/ArbitraryFacetWidgetDecorator.php | 2 +- .../joinup_video/src/Plugin/Filter/JoinupVideo.php | 2 +- .../solution/src/Controller/SolutionController.php | 2 +- web/modules/custom/solution/src/Form/ShareForm.php | 12 +----------- web/modules/custom/solution/src/Form/UnshareForm.php | 12 +----------- .../Routing/StateMachineRevisionsRouteSubscriber.php | 2 +- .../tests/modules/stats_test/src/Mocks/TestQuery.php | 5 +++-- 17 files changed, 19 insertions(+), 58 deletions(-) diff --git a/web/modules/custom/asset_distribution/src/Controller/AssetDistributionController.php b/web/modules/custom/asset_distribution/src/Controller/AssetDistributionController.php index 991525f067..dcbc9f9a99 100644 --- a/web/modules/custom/asset_distribution/src/Controller/AssetDistributionController.php +++ b/web/modules/custom/asset_distribution/src/Controller/AssetDistributionController.php @@ -12,7 +12,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Class AssetDistributionController. + * Controller for asset distribution forms. * * Handles the form to perform actions when it is called by a route that * includes an rdf_entity id. diff --git a/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php b/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php index 083c82ea45..d0b82ce2b0 100644 --- a/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php +++ b/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** - * Class AssetReleaseController. + * Controller for asset release forms. * * Handles the form to perform actions when it is called by a route that * includes an rdf_entity id. diff --git a/web/modules/custom/custom_page/src/Controller/CustomPageController.php b/web/modules/custom/custom_page/src/Controller/CustomPageController.php index d83dd386bd..6f11cff4c9 100644 --- a/web/modules/custom/custom_page/src/Controller/CustomPageController.php +++ b/web/modules/custom/custom_page/src/Controller/CustomPageController.php @@ -13,7 +13,7 @@ use Drupal\rdf_entity\RdfInterface; /** - * Class CustomPageController. + * Controller for custom pages. * * Handles the form to perform actions when it is called by a route that * includes an rdf_entity id. diff --git a/web/modules/custom/joinup_communities/trr/src/EventSubscriber/RegisterNamespace.php b/web/modules/custom/joinup_communities/trr/src/EventSubscriber/RegisterNamespace.php index aa641cde24..701e04428e 100644 --- a/web/modules/custom/joinup_communities/trr/src/EventSubscriber/RegisterNamespace.php +++ b/web/modules/custom/joinup_communities/trr/src/EventSubscriber/RegisterNamespace.php @@ -9,7 +9,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** - * Class RegisterNamespace. + * Event subscriber that registers the TRR namespace on every page load. */ class RegisterNamespace implements EventSubscriberInterface { diff --git a/web/modules/custom/joinup_community_content/src/Form/ShareForm.php b/web/modules/custom/joinup_community_content/src/Form/ShareForm.php index 41378d3349..0028770b13 100644 --- a/web/modules/custom/joinup_community_content/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_community_content/src/Form/ShareForm.php @@ -21,17 +21,7 @@ class ShareForm extends OriginalForm { /** - * Form constructor. - * - * @param array $form - * An associative array containing the structure of the form. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The current state of the form. - * @param \Drupal\node\NodeInterface $node - * The entity being shared. - * - * @return array - * The form structure. + * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, NodeInterface $node = NULL): array { return parent::doBuildForm($form, $form_state, $node); diff --git a/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php b/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php index 9f22d08127..b168b8b57e 100644 --- a/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php +++ b/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php @@ -22,17 +22,7 @@ class UnshareForm extends OriginalForm { /** - * Form constructor. - * - * @param array $form - * An associative array containing the structure of the form. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The current state of the form. - * @param \Drupal\node\NodeInterface $node - * The entity being unshared. - * - * @return array - * The form structure. + * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, NodeInterface $node = NULL): array { return parent::doBuildForm($form, $form_state, $node); diff --git a/web/modules/custom/joinup_core/src/RequirementsHelper.php b/web/modules/custom/joinup_core/src/RequirementsHelper.php index d57363b2a9..a257f833b8 100644 --- a/web/modules/custom/joinup_core/src/RequirementsHelper.php +++ b/web/modules/custom/joinup_core/src/RequirementsHelper.php @@ -27,7 +27,7 @@ class RequirementsHelper { protected $sparqlConnection; /** - * RequirementsHelper constructor. + * Constructs a new RequirementsHelper. * * @param \Drupal\Core\Database\Connection $connection * The SQL connection class for the primary database storage. diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 3330c2a0bc..0e86442799 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -27,7 +27,7 @@ public function getFormId(): string { } /** - * Form constructor. + * Form builder for the share form. * * @param array $form * An associative array containing the structure of the form. diff --git a/web/modules/custom/joinup_group/src/Form/UnshareForm.php b/web/modules/custom/joinup_group/src/Form/UnshareForm.php index 9702b837ad..be57798349 100644 --- a/web/modules/custom/joinup_group/src/Form/UnshareForm.php +++ b/web/modules/custom/joinup_group/src/Form/UnshareForm.php @@ -21,7 +21,7 @@ public function getFormId(): string { } /** - * Form constructor. + * Form builder for the unshare form. * * @param array $form * An associative array containing the structure of the form. diff --git a/web/modules/custom/joinup_licence/src/Plugin/Block/LicenceFilterBlock.php b/web/modules/custom/joinup_licence/src/Plugin/Block/LicenceFilterBlock.php index a007c76c9c..9cfbcbf1d1 100644 --- a/web/modules/custom/joinup_licence/src/Plugin/Block/LicenceFilterBlock.php +++ b/web/modules/custom/joinup_licence/src/Plugin/Block/LicenceFilterBlock.php @@ -29,7 +29,7 @@ class LicenceFilterBlock extends BlockBase implements ContainerFactoryPluginInte protected $entityTypeManager; /** - * LicenceFilterBlock constructor. + * Constructs a new LicenceFilterBlock. * * @param array $configuration * A configuration array containing information about the plugin instance. diff --git a/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/ArbitraryFacetWidgetDecorator.php b/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/ArbitraryFacetWidgetDecorator.php index df464a17c8..a728647812 100644 --- a/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/ArbitraryFacetWidgetDecorator.php +++ b/web/modules/custom/joinup_search/modules/search_api_arbitrary_facet/src/ArbitraryFacetWidgetDecorator.php @@ -14,7 +14,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Class ArbitraryFacetWidgetDecorator. + * Decorator for the arbitrary facet widget. */ class ArbitraryFacetWidgetDecorator implements WidgetPluginInterface, ContainerFactoryPluginInterface { 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 6bbc2fb2b9..7da476391b 100644 --- a/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php +++ b/web/modules/custom/joinup_video/src/Plugin/Filter/JoinupVideo.php @@ -59,7 +59,7 @@ class JoinupVideo extends FilterBase implements ContainerFactoryPluginInterface protected $currentUser; /** - * VideoEmbedWysiwyg constructor. + * Constructs a new JoinupVideo filter. * * @param array $configuration * Plugin configuration. diff --git a/web/modules/custom/solution/src/Controller/SolutionController.php b/web/modules/custom/solution/src/Controller/SolutionController.php index c74dace6ba..0250d52610 100644 --- a/web/modules/custom/solution/src/Controller/SolutionController.php +++ b/web/modules/custom/solution/src/Controller/SolutionController.php @@ -10,7 +10,7 @@ use Drupal\rdf_entity\RdfInterface; /** - * Class SolutionController. + * Controller for solution forms. * * Handles the form to perform actions when it is called by a route that * includes an rdf_entity id. diff --git a/web/modules/custom/solution/src/Form/ShareForm.php b/web/modules/custom/solution/src/Form/ShareForm.php index 7a383d749f..9a773b8290 100644 --- a/web/modules/custom/solution/src/Form/ShareForm.php +++ b/web/modules/custom/solution/src/Form/ShareForm.php @@ -21,17 +21,7 @@ class ShareForm extends OriginalForm { /** - * Form constructor. - * - * @param array $form - * An associative array containing the structure of the form. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The current state of the form. - * @param \Drupal\rdf_entity\RdfInterface $rdf_entity - * The entity being shared. - * - * @return array - * The form structure. + * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { return parent::doBuildForm($form, $form_state, $rdf_entity); diff --git a/web/modules/custom/solution/src/Form/UnshareForm.php b/web/modules/custom/solution/src/Form/UnshareForm.php index 26bc12c004..671c9ec41d 100644 --- a/web/modules/custom/solution/src/Form/UnshareForm.php +++ b/web/modules/custom/solution/src/Form/UnshareForm.php @@ -22,17 +22,7 @@ class UnshareForm extends OriginalForm { /** - * Form constructor. - * - * @param array $form - * An associative array containing the structure of the form. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * The current state of the form. - * @param \Drupal\rdf_entity\RdfInterface $rdf_entity - * The entity being unshared. - * - * @return array - * The form structure. + * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { return parent::doBuildForm($form, $form_state, $rdf_entity); diff --git a/web/modules/custom/state_machine_revisions/src/Routing/StateMachineRevisionsRouteSubscriber.php b/web/modules/custom/state_machine_revisions/src/Routing/StateMachineRevisionsRouteSubscriber.php index 62f0047bef..5c1e54eae5 100644 --- a/web/modules/custom/state_machine_revisions/src/Routing/StateMachineRevisionsRouteSubscriber.php +++ b/web/modules/custom/state_machine_revisions/src/Routing/StateMachineRevisionsRouteSubscriber.php @@ -44,7 +44,7 @@ class StateMachineRevisionsRouteSubscriber extends RouteSubscriberBase { protected $entityTypes; /** - * StateMachineRevisionsRouteSubscriber constructor. + * Constructs a new StateMachineRevisionsRouteSubscriber. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. diff --git a/web/modules/custom/stats/tests/modules/stats_test/src/Mocks/TestQuery.php b/web/modules/custom/stats/tests/modules/stats_test/src/Mocks/TestQuery.php index 967be9a82f..20a8291874 100644 --- a/web/modules/custom/stats/tests/modules/stats_test/src/Mocks/TestQuery.php +++ b/web/modules/custom/stats/tests/modules/stats_test/src/Mocks/TestQuery.php @@ -17,9 +17,10 @@ class TestQuery extends Query { /** - * TestQuery constructor. + * Constructs a new TestQuery. */ - public function __construct() {} + public function __construct() { + } /** * {@inheritdoc} From 26b9fd9f812c88a5cbe96577fdc554f186c63d32 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 26 Mar 2020 20:21:04 +0200 Subject: [PATCH 402/957] ISAICP-5907: Fix TypeError: substr() expects parameter 1 to be string, null given. --- web/themes/joinup/joinup_theme.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 7182e363e3..ef8786ea44 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1161,7 +1161,7 @@ function joinup_theme_preprocess_user(&$variables) { // Truncate business title. $business_title = $variables['user']->get('field_user_business_title')->value; - $variables['short_business_title'] = substr($business_title, 0, 30); + $variables['short_business_title'] = !empty($business_title) ? substr($business_title, 0, 30) : ''; } /** From 767e9e1c71ebba00cedc26b7aadede93be308197 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 01:09:58 +0200 Subject: [PATCH 403/957] ISAICP-5648: Allow selective banner display. --- composer.json | 3 ++- composer.lock | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 442f556a5b..cb6f1d683e 100644 --- a/composer.json +++ b/composer.json @@ -329,7 +329,8 @@ "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 in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff" + "Add the possibility to display a marker in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff", + "Allow selective display of banner @see https://github.com/openeuropa/oe_webtools/pull/122": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/122.diff" } } }, diff --git a/composer.lock b/composer.lock index b8f7460316..1870411c9e 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": "bafb725c6737304b5fb2bff3a0b19bbc", + "content-hash": "4252a8e48cf4576526c4cb2e2d694faf", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -8918,7 +8918,8 @@ "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 in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff" + "Add the possibility to display a marker in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff", + "Allow selective display of banner @see https://github.com/openeuropa/oe_webtools/pull/122": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/122.diff" } }, "autoload": { From 55a87c7059d319df08f63bab37bfaff1a21e0aec Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 01:13:40 +0200 Subject: [PATCH 404/957] ISAICP-5648: Enable and configure oe_webtools_globan module. --- config/sync/core.extension.yml | 1 + config/sync/oe_webtools_globan.settings.yml | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 config/sync/oe_webtools_globan.settings.yml diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index b7df322263..d4c472f16e 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -102,6 +102,7 @@ module: oe_webtools_analytics: 0 oe_webtools_cookie_consent: 0 oe_webtools_geocoding: 0 + oe_webtools_globan: 0 oe_webtools_maps: 0 og: 0 og_comment: 0 diff --git a/config/sync/oe_webtools_globan.settings.yml b/config/sync/oe_webtools_globan.settings.yml new file mode 100644 index 0000000000..21240c7ea0 --- /dev/null +++ b/config/sync/oe_webtools_globan.settings.yml @@ -0,0 +1,9 @@ +display_eu_flag: true +background_theme: dark +display_eu_institutions_links: true +override_page_lang: '' +visibility: + action: show + pages: '' +_core: + default_config_hash: HJKRLZYv8UUsI3vEcFMfo1ySREdFv1ERM1kjHptDhdI From 411943751d1aeeaecdac06fc505e03a2ef41be68 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 01:20:25 +0200 Subject: [PATCH 405/957] ISAICP-5648: Add test coverage. --- .../tests/src/ExistingSite/EuBrandingTest.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php new file mode 100644 index 0000000000..10a210af53 --- /dev/null +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php @@ -0,0 +1,36 @@ +drupalGet(''); + $this->assertSession()->responseContains(''); + + // Random picked up pages. + $pages = [ + '/contact', + '/search', + '/collections', + '/solutions', + '/keep-up-to-date', + '/search', + ]; + foreach ($pages as $page) { + $this->drupalGet($page); + $this->assertSession()->responseNotContains('?globan=111" defer>'); + } + } + +} From 3015ba922bb2ee376a1d691632e0003210f631fa Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Thu, 26 Mar 2020 22:36:52 +0200 Subject: [PATCH 406/957] ISAICP-5578: Enable the open_graph module and configure it for all types. --- config/sync/core.extension.yml | 1 + .../sync/metatag.metatag_defaults.global.yml | 6 +++++ config/sync/metatag.metatag_defaults.node.yml | 7 +++++- ...atag.metatag_defaults.node__discussion.yml | 12 +++++----- .../metatag.metatag_defaults.node__event.yml | 12 ++++++---- .../metatag.metatag_defaults.node__news.yml | 23 +++++++++++++------ .../metatag.metatag_defaults.global.yml | 6 +++++ .../install/metatag.metatag_defaults.node.yml | 7 +++++- .../metatag.metatag_defaults.node__event.yml | 12 ++++++---- .../metatag.metatag_defaults.node__news.yml | 23 +++++++++++++------ 10 files changed, 79 insertions(+), 30 deletions(-) diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index b7df322263..36ca9287c2 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -94,6 +94,7 @@ module: message_notify: 0 meta_entity: 0 metatag: 0 + metatag_open_graph: 0 moderation: 0 nio: 0 node: 0 diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index 5ed764926d..a2582f59c9 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -9,3 +9,9 @@ label: Global tags: canonical_url: '[current-page:url]' title: '[current-page:title] | [site:name]' + og_url: '[current-page:url]' + og_site_name: '[site:name]' + og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' + og_title: '[current-page:title]' + og_image_type: image/svg + og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' diff --git a/config/sync/metatag.metatag_defaults.node.yml b/config/sync/metatag.metatag_defaults.node.yml index 8f328ff716..25dd3f927e 100644 --- a/config/sync/metatag.metatag_defaults.node.yml +++ b/config/sync/metatag.metatag_defaults.node.yml @@ -7,6 +7,11 @@ _core: id: node label: Content tags: + canonical_url: '[node:url]' title: '[node:title] | [site:name]' description: '[node:summary]' - canonical_url: '[node:url]' + og_type: '[node:content-type:name]' + og_url: '[node:url:absolute]' + og_site_name: '[node:title]' + og_title: '[node:title]' + og_description: '[node:summary]' diff --git a/config/sync/metatag.metatag_defaults.node__discussion.yml b/config/sync/metatag.metatag_defaults.node__discussion.yml index b89616fc5d..ef8033811c 100644 --- a/config/sync/metatag.metatag_defaults.node__discussion.yml +++ b/config/sync/metatag.metatag_defaults.node__discussion.yml @@ -8,13 +8,13 @@ tags: schema_social_media_posting_name: '[node:title]' schema_social_media_posting_about: '[node:field_keywords]' schema_social_media_posting_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_shared_content: 'a:6:{s:5:"pivot";s:1:"1";s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:52:"[node:field_attachment:entity:created:html_datetime]";}' schema_social_media_posting_date_modified: '[node:changed:html_datetime]' - schema_social_media_posting_main_entity_of_page: '[current-page:url]' + schema_social_media_posting_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' schema_social_media_posting_headline: '[node:title]' - schema_social_media_posting_description: '[node:summary]' - schema_social_media_posting_is_accessible_for_free: 'True' - schema_social_media_posting_date_published: '[node:published:html_datetime]' schema_social_media_posting_type: DiscussionForumPosting - schema_social_media_posting_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_social_media_posting_date_published: '[node:published:html_datetime]' + schema_social_media_posting_is_accessible_for_free: 'True' + schema_social_media_posting_main_entity_of_page: '[current-page:url]' + schema_social_media_posting_description: '[node:summary]' schema_social_media_posting_image: 'a:2:{s:5:"@type";s:11:"ImageObject";s:3:"url";s:143:"https://joinup.ec.europa.eu/sites/default/files/styles/image_style_collection_logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png";}' - schema_social_media_posting_shared_content: 'a:6:{s:5:"pivot";s:1:"1";s:5:"@type";s:11:"MediaObject";s:3:"@id";s:34:"[node:field_attachment:entity:url]";s:4:"name";s:35:"[node:field_attachment:entity:name]";s:3:"url";s:34:"[node:field_attachment:entity:url]";s:13:"datePublished";s:52:"[node:field_attachment:entity:created:html_datetime]";}' diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index 0969be3956..01aa4e24e6 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -5,12 +5,16 @@ dependencies: { } id: node__event label: 'Content: Event' tags: + og_image_height: '[node:field_event_logo:height]' + og_image_width: '[node:field_event_logo:width]' + og_image_url: '[node:field_event_logo:entity:url]' + og_image_type: '[node:field_event_logo:entity:mime]' + schema_event_id: '[node:event_url]' schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' + schema_event_description: '[node:summary]' schema_event_url: '[node:event_url]' - schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:40:"[node:field_event_online_location:0:uri]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' - schema_event_id: '[node:event_url]' + schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_type: Event - schema_event_description: '[node:summary]' - schema_event_name: '[node:title]' schema_event_start_date: '[node:field_event_date:start_date:html_datetime]' + schema_event_name: '[node:title]' diff --git a/config/sync/metatag.metatag_defaults.node__news.yml b/config/sync/metatag.metatag_defaults.node__news.yml index 2cfeba4cb5..3575a15cdf 100644 --- a/config/sync/metatag.metatag_defaults.node__news.yml +++ b/config/sync/metatag.metatag_defaults.node__news.yml @@ -5,15 +5,24 @@ dependencies: { } id: node__news label: 'Content: News' tags: - schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' - schema_article_is_accessible_for_free: 'True' + article_tag: '[node:field_keywords]' + article_published_time: '[node:published:html_datetime]' + og_image_height: '[node:field_news_logo:height]' + og_image_width: '[node:field_news_logo:width]' + article_publisher: '[node:field_keywords]' + article_modified_time: '[node:changed:html_datetime]' + article_author: '[node:author:display-name]' + og_image_type: '[node:field_news_logo:entity:mime]' + og_image: '[node:field_news_logo:entity:url]' schema_article_type: NewsArticle - schema_article_main_entity_of_page: '[current-page:url]' - schema_article_name: '[node:title]' schema_article_about: '[node:field_keywords]' + schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_description: '[node:summary]' schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' - schema_article_date_modified: '[node:changed:html_datetime]' - schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' - schema_article_description: '[node:summary]' + schema_article_main_entity_of_page: '[current-page:url]' + schema_article_name: '[node:title]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' + schema_article_is_accessible_for_free: 'True' + schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_date_modified: '[node:changed:html_datetime]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml index b0ccb81ddf..22ebb0a4d0 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml @@ -6,3 +6,9 @@ label: Global tags: canonical_url: '[current-page:url]' title: '[current-page:title] | [site:name]' + og_url: '[current-page:url]' + og_site_name: '[site:name]' + og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' + og_title: '[current-page:title]' + og_image_type: image/svg + og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml index 5e7841a46e..a82a7c284d 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml @@ -4,6 +4,11 @@ dependencies: { } id: node label: Content tags: + canonical_url: '[node:url]' title: '[node:title] | [site:name]' description: '[node:summary]' - canonical_url: '[node:url]' + og_type: '[node:content-type:name]' + og_url: '[node:url:absolute]' + og_site_name: '[node:title]' + og_title: '[node:title]' + og_description: '[node:summary]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml index 900aef1f0f..65b8d824a6 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml @@ -4,12 +4,16 @@ dependencies: { } id: node__event label: 'Content: Event' tags: + og_image_height: '[node:field_event_logo:height]' + og_image_width: '[node:field_event_logo:width]' + og_image_url: '[node:field_event_logo:entity:url]' + og_image_type: '[node:field_event_logo:entity:mime]' + schema_event_id: '[node:event_url]' schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' + schema_event_description: '[node:summary]' schema_event_url: '[node:event_url]' - schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_location: 'a:5:{s:5:"@type";s:5:"Place";s:4:"name";s:21:"[node:field_location]";s:3:"url";s:40:"[node:field_event_online_location:0:uri]";s:7:"address";a:2:{s:5:"@type";s:13:"PostalAddress";s:13:"streetAddress";s:21:"[node:field_location]";}s:3:"geo";a:3:{s:5:"@type";s:14:"GeoCoordinates";s:8:"latitude";s:34:"[node:field_event_coordinates:lat]";s:9:"longitude";s:34:"[node:field_event_coordinates:lon]";}}' - schema_event_id: '[node:event_url]' + schema_event_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:34:"[node:field_event_logo:entity:url]";s:5:"width";s:29:"[node:field_event_logo:width]";s:6:"height";s:30:"[node:field_event_logo:height]";}' schema_event_type: Event - schema_event_description: '[node:summary]' - schema_event_name: '[node:title]' schema_event_start_date: '[node:field_event_date:start_date:html_datetime]' + schema_event_name: '[node:title]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml index 6778a3f932..e774fdf4d9 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__news.yml @@ -4,15 +4,24 @@ dependencies: { } id: node__news label: 'Content: News' tags: - schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' - schema_article_is_accessible_for_free: 'True' + article_tag: '[node:field_keywords]' + article_published_time: '[node:published:html_datetime]' + og_image_height: '[node:field_news_logo:height]' + og_image_width: '[node:field_news_logo:width]' + article_publisher: '[node:field_keywords]' + article_modified_time: '[node:changed:html_datetime]' + article_author: '[node:author:display-name]' + og_image_type: '[node:field_news_logo:entity:mime]' + og_image: '[node:field_news_logo:entity:url]' schema_article_type: NewsArticle - schema_article_main_entity_of_page: '[current-page:url]' - schema_article_name: '[node:title]' schema_article_about: '[node:field_keywords]' + schema_article_author: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_description: '[node:summary]' schema_article_date_published: '[node:published:html_datetime]' schema_article_headline: '[node:field_news_headline]' - schema_article_date_modified: '[node:changed:html_datetime]' - schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' - schema_article_description: '[node:summary]' + schema_article_main_entity_of_page: '[current-page:url]' + schema_article_name: '[node:title]' schema_article_image: 'a:5:{s:5:"@type";s:11:"ImageObject";s:20:"representativeOfPage";s:4:"True";s:3:"url";s:33:"[node:field_news_logo:entity:url]";s:5:"width";s:28:"[node:field_news_logo:width]";s:6:"height";s:29:"[node:field_news_logo:height]";}' + schema_article_is_accessible_for_free: 'True' + schema_article_publisher: 'a:4:{s:5:"@type";s:6:"Person";s:3:"@id";s:17:"[node:author:url]";s:4:"name";s:26:"[node:author:display-name]";s:3:"url";s:17:"[node:author:url]";}' + schema_article_date_modified: '[node:changed:html_datetime]' From 787714ca8029af2d5219ef93df51be5c0fc8b977 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 06:38:10 +0200 Subject: [PATCH 407/957] ISAICP-5578: Force the site url to be the url of the homepage. --- config/sync/metatag.metatag_defaults.front.yml | 1 + .../joinup_seo/config/install/metatag.metatag_defaults.front.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/sync/metatag.metatag_defaults.front.yml b/config/sync/metatag.metatag_defaults.front.yml index c5c98d417d..bb6a517d7b 100644 --- a/config/sync/metatag.metatag_defaults.front.yml +++ b/config/sync/metatag.metatag_defaults.front.yml @@ -7,6 +7,7 @@ _core: id: front label: 'Front page' tags: + og_url: '[site:url]' abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' title: '[site:name]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml index 2efa88385a..55d42dc5c6 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml @@ -4,6 +4,7 @@ dependencies: { } id: front label: 'Front page' tags: + og_url: '[site:url]' abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' title: '[site:name]' From cb5d9cbddac8b94bc8b514997a302b25d5567bbf Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 09:20:25 +0200 Subject: [PATCH 408/957] ISAICP-5578: Configure the site name on the front page and the global variables. --- config/sync/metatag.metatag_defaults.front.yml | 1 + .../joinup_seo/config/install/metatag.metatag_defaults.front.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/sync/metatag.metatag_defaults.front.yml b/config/sync/metatag.metatag_defaults.front.yml index bb6a517d7b..8df37c615e 100644 --- a/config/sync/metatag.metatag_defaults.front.yml +++ b/config/sync/metatag.metatag_defaults.front.yml @@ -8,6 +8,7 @@ id: front label: 'Front page' tags: og_url: '[site:url]' + og_title: '[site:name]' abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' title: '[site:name]' diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml index 55d42dc5c6..eaeea1c3c4 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.front.yml @@ -5,6 +5,7 @@ id: front label: 'Front page' tags: og_url: '[site:url]' + og_title: '[site:name]' abstract: 'Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions.' description: 'Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme.' title: '[site:name]' From 0229684ef1fde70d1023fa4211f4639c47aaf174 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 09:27:43 +0200 Subject: [PATCH 409/957] ISAICP-5578: Expand the tests to assert also metatags. Also, add a test for base pages. --- .../joinup_seo/basic_metatags.feature | 22 +++- .../custom/joinup_seo/joinup_seo.behat.inc | 106 +++++++++++++++--- 2 files changed, 109 insertions(+), 19 deletions(-) diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature index 7c9aea4858..a697bf050a 100644 --- a/tests/features/joinup_seo/basic_metatags.feature +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -7,10 +7,28 @@ Feature: Scenario Outline: Front page metatags. Given I am When I am on the homepage - Then the "description" metatag should be set to "Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme." - And the "abstract" metatag should be set to "Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions." + Then the following meta tags should available in the html: + | identifier | value | + | description | Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme. | + | abstract | Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions. | + | og:url | $base_url$/ | + | og:site_name | Joinup | + | og:title | Joinup | + | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:type | image/svg | And the HTML title of the page should be "Joinup" + When I click "Collections" + Then the following meta tags should available in the html: + | identifier | value | + | og:url | $base_url$/collections | + | og:site_name | Joinup | + | og:title | Collections | + | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:type | image/svg | + Examples: | user type | | an anonymous user | diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 773151f0ee..be3e8e73ff 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -17,6 +17,67 @@ use PHPUnit\Framework\Assert; */ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { + /** + * Asserts that a list of meta tags are presented in the page. + * + * @codingStandardsIgnoreStart + * | identifier | value | + * | description | Some description | + * | og:title | My site | + * @codingStandardsIgnoreEnd + * The "identifier" and the "meta value" table headers are mandatory. The + * "identifier" can be either the name or the property value of the meta + * entry. + * + * @param \Behat\Gherkin\Node\TableNode $list + * A list of meta tags to check for. + * + * @throws \Exception + * Thrown if at least one of the tags is not found or has a wrong value. + * + * @Given the following meta tags should available in the html: + */ + public function assertMetaTagListInPage(TableNode $list): void { + $page = $this->getSession()->getPage(); + $missing = []; + $errors = []; + foreach ($list->getColumnsHash() as $row) { + $identifier = $row['identifier']; + $xpath = "//head/meta[@name='{$identifier}' or @property='{$identifier}']/@content"; + $tag = $page->find('xpath', $xpath); + if (empty($tag)) { + $missing[$identifier] = $identifier; + } + else { + $row['value'] = $this->escapeStringWithVariables($row['value']); + $actual = $tag->getText(); + $found = preg_match("#{$row['value']}#", $actual) === 1; + + if ($found === FALSE) { + $errors[] = [ + 'property' => $identifier, + 'expected' => $row['value'], + 'found' => $actual, + ]; + } + } + } + + // Construct the error messages for each graph found. + $error_messages = []; + if (!empty($missing)) { + $properties = implode(', ', $missing); + $error_messages[] = "Meta entries not found: {$properties}"; + } + foreach ($errors as $error) { + $error_messages[] = "Wrong property '{$error['property']}' value: Expected '{$error['expected']}' but '{$error['found']}' was found."; + } + + if (!empty($error_messages)) { + throw new Exception(implode("\n", $error_messages)); + } + } + /** * Asserts a meta tag value in the page. * @@ -113,11 +174,6 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}' or none of them contain a '{$sub_property}' property."); } - // The url structure is very important in the SEO metatags as a wrong url - // or an internal path could cause search engines to be missleaded. Thus, - // the full url must be always asserted. - $base_url = \Drupal::request()->getSchemeAndHttpHost(); - $hash = $table->getColumnsHash(); $missing_properties = []; $wrong_value = []; @@ -133,18 +189,8 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte continue; } - $row['value'] = str_replace('$base_url$', $base_url, $row['value']); - if (strpos($row['value'], '$random_text$') || strpos($row['value'], '$timezone$')) { - $row['value'] = preg_quote($row['value'], '#'); - // $random_text$ is escaped into \$random_text\$ from the preg_quote - // above. - $row['value'] = str_replace('\$random_text\$', '([^/]*)?', $row['value']); - $row['value'] = str_replace('\$timezone\$', '\d{2}', $row['value']); - $found = preg_match("#{$row['value']}#", $graph[$row['property']]) === 1; - } - else { - $found = $graph[$row['property']] === $row['value']; - } + $row['value'] = $this->escapeStringWithVariables($row['value']); + $found = preg_match("#^{$row['value']}$#", $graph[$row['property']]) === 1; if ($found === FALSE) { $wrong_value[$index][] = [ @@ -180,6 +226,32 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte throw new Exception(implode("\n", $error_messages)); } + /** + * Escapes available variables from string and prepares it for a regex match. + * + * @param string $string + * The string to convert. + * + * @return string + * The converted string. + */ + 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 missleaded. Thus, + // the full url must be always asserted. + $base_url = \Drupal::request()->getSchemeAndHttpHost(); + + $string = str_replace('$base_url$', $base_url, $string); + $string = preg_quote($string, '#'); + if (strpos($string, '$random_text$') || strpos($string, '$timezone$')) { + // $random_text$ is escaped into \$random_text\$ from the preg_quote + // above. + $string = str_replace('\$random_text\$', '([^/]*)?', $string); + $string = str_replace('\$timezone\$', '\d{2}', $string); + } + return $string; + } + /** * Retrieves the entity metatags as a JSON array from the page. * From d896d1d5889e99af5f63cfa4c62276a93200b40e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 10:28:20 +0200 Subject: [PATCH 410/957] ISAICP-5907: Scrutinize also ./src folder. --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index a84cfe8a99..998c1ad7ce 100644 --- a/build.properties +++ b/build.properties @@ -104,7 +104,7 @@ behat.screenshots.s3.dir = phpcs.prepush.enable = 1 # Paths to check, delimited by semicolons. -phpcs.files = ${website.modules.dir};${website.profiles.dir};${website.themes.dir};${behat.dir}/src +phpcs.files = ${website.modules.dir};${website.profiles.dir};${website.themes.dir};${behat.dir}/src;${project.basedir}/src # Paths to ignore, delimited by semicolons. phpcs.ignore = ${website.modules.dir}/contrib;${website.themes.dir}/joinup/prototype;${website.modules.dir}/custom/joinup_communities/tallinn/lib From 16ecef3563392e85699d11f39a988f65094f0e5a Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 10:31:33 +0200 Subject: [PATCH 411/957] ISAICP-5907: Nullablity symbol should be present before each nullable and optional parameter. --- phpcs-ruleset.xml.dist | 5 ++++ tests/src/Context/ScreenshotContext.php | 18 +++++++------- tests/src/Traits/EntityTrait.php | 4 ++-- tests/src/Traits/NodeTrait.php | 8 +++---- tests/src/Traits/OgTrait.php | 6 ++--- tests/src/Traits/RdfEntityTrait.php | 4 ++-- tests/src/Traits/TraversingTrait.php | 24 +++++++++---------- tests/src/Traits/UtilityTrait.php | 2 +- tests/src/Traits/WorkflowTrait.php | 4 ++-- .../adms_validator/src/AdmsValidator.php | 2 +- .../src/Form/AnonymousDownloadForm.php | 2 +- .../src/Controller/AssetReleaseController.php | 4 ++-- .../custom/collection/collection.behat.inc | 2 +- .../src/Form/JoinCollectionForm.php | 2 +- .../src/Form/LeaveCollectionConfirmForm.php | 2 +- .../src/Form/SubscribeToCollectionForm.php | 2 +- .../custom/custom_page/custom_page.module | 2 +- .../src/Controller/CustomPageController.php | 2 +- .../isa2_analytics/isa2_analytics.behat.inc | 4 ++-- .../joinup_community_content.tokens.inc | 2 +- .../src/Access/NodeRevisionAccessCheck.php | 2 +- ...ityContentWorkflowAccessControlHandler.php | 4 ++-- .../Controller/CommunityContentController.php | 4 ++-- .../src/Form/ShareForm.php | 2 +- .../src/Form/UnshareForm.php | 2 +- .../custom/joinup_core/joinup_core.behat.inc | 18 +++++++------- .../src/Plugin/Action/ChangeGroupAction.php | 4 ++-- .../custom/joinup_core/src/WorkflowHelper.php | 8 +++---- .../src/WorkflowHelperInterface.php | 6 ++--- .../src/Form/InviteToDiscussionForm.php | 6 ++--- .../custom/joinup_event/joinup_event.module | 2 +- .../src/Plugin/Adms2ConvertPass/Pass1To3.php | 2 +- .../Plugin/DataType/RdfEntityReference.php | 6 ++--- .../AdmsSchemaEntityReferenceFieldsTrait.php | 2 +- .../src/RdfEntityReferenceFieldItemList.php | 6 ++--- .../tests/src/Kernel/StepTestBase.php | 8 +++---- .../src/Access/JoinupFrontPageMenuAccess.php | 4 ++-- .../joinup_group/src/Form/ShareForm.php | 4 ++-- .../joinup_group/src/Form/UnshareForm.php | 4 ++-- .../Plugin/Action/DeleteGroupMembership.php | 4 ++-- .../Action/TransferGroupOwnershipAction.php | 4 ++-- .../src/Form/InviteToGroupForm.php | 2 +- .../NotificationSubscriberBase.php | 4 ++-- .../src/MessageArgumentGenerator.php | 2 +- .../custom/joinup_search/joinup_search.module | 2 +- .../custom/joinup_seo/joinup_seo.behat.inc | 6 ++--- .../joinup_subscription.behat.inc | 4 ++-- .../src/Form/MySubscriptionsForm.php | 2 +- .../custom/joinup_user/joinup_user.module | 2 +- .../Form/ContentModerationOverviewForm.php | 2 +- .../og_comment/src/OgCommentFieldItemList.php | 2 +- .../custom/solution/src/Form/ShareForm.php | 2 +- .../custom/solution/src/Form/UnshareForm.php | 2 +- .../Plugin/Action/ChangeCollectionAction.php | 4 ++-- web/profiles/joinup/joinup.behat.inc | 4 ++-- .../src/Form/SolutionsByLicenceForm.php | 8 +++---- web/profiles/joinup/src/PinService.php | 2 +- .../joinup/src/PinServiceInterface.php | 4 ++-- 58 files changed, 131 insertions(+), 126 deletions(-) diff --git a/phpcs-ruleset.xml.dist b/phpcs-ruleset.xml.dist index 1ebcc7b742..3b3226f287 100644 --- a/phpcs-ruleset.xml.dist +++ b/phpcs-ruleset.xml.dist @@ -40,6 +40,10 @@ + + + + @@ -54,6 +58,7 @@ + diff --git a/tests/src/Context/ScreenshotContext.php b/tests/src/Context/ScreenshotContext.php index a604b99918..c3f04d2813 100644 --- a/tests/src/Context/ScreenshotContext.php +++ b/tests/src/Context/ScreenshotContext.php @@ -67,28 +67,28 @@ class ScreenshotContext extends RawMinkContext { /** * Constructs a new ScreenshotContext context. * - * @param string $localDir + * @param string|null $localDir * Optional directory where the screenshots are saved. If omitted the * screenshots will not be saved. - * @param string $s3Dir + * @param string|null $s3Dir * Optional folder on an Amazon S3 bucket where screenshots will be uploaded * to. If omitted, the screenshots will not be uploaded to AWS S3. - * @param string $s3Region + * @param string|null $s3Region * Optional AWS region where the Amazon S3 bucket is located. If omitted, * the screenshots will not be uploaded to AWS S3. - * @param string $s3Bucket + * @param string|null $s3Bucket * Optional name of the Amazon S3 bucket where screenshots will be uploaded. * If omitted, the screenshots will not be uploaded to AWS S3. - * @param string $s3Key + * @param string|null $s3Key * The key to use to authenticate with Amazon S3. If omitted, the key will * be taken from the environment variables. - * @param string $s3Secret + * @param string|null $s3Secret * The secret to use to authenticate with Amazon S3. If omitted, the secret * will be taken from the environment variables. * * @see tests/behat.yml.dist */ - public function __construct(string $localDir = NULL, string $s3Dir = NULL, string $s3Region = NULL, string $s3Bucket = NULL, string $s3Key = NULL, string $s3Secret = NULL) { + public function __construct(?string $localDir = NULL, ?string $s3Dir = NULL, ?string $s3Region = NULL, ?string $s3Bucket = NULL, ?string $s3Key = NULL, ?string $s3Secret = NULL) { $this->localDir = $localDir; $this->s3Dir = $s3Dir; $this->s3Region = $s3Region; @@ -100,12 +100,12 @@ public function __construct(string $localDir = NULL, string $s3Dir = NULL, strin /** * Saves a screenshot under a given name. * - * @param string $name + * @param string|null $name * The file name. * * @Then I take a screenshot :name */ - public function takeScreenshot(string $name = NULL): void { + public function takeScreenshot(?string $name = NULL): void { $message = "Screenshot created in @file_name"; $this->createScreenshot($name, $message); } diff --git a/tests/src/Traits/EntityTrait.php b/tests/src/Traits/EntityTrait.php index 7e33b5df60..3cf29c7a75 100644 --- a/tests/src/Traits/EntityTrait.php +++ b/tests/src/Traits/EntityTrait.php @@ -24,7 +24,7 @@ trait EntityTrait { * The entity type to check. * @param string $label * The label to check. - * @param string $bundle + * @param string|null $bundle * Optional bundle to check. If omitted, the entity can be of any bundle. * * @return \Drupal\Core\Entity\EntityInterface @@ -34,7 +34,7 @@ trait EntityTrait { * Thrown when an entity with the given type, label and bundle does not * exist. */ - protected static function getEntityByLabel(string $entity_type_id, string $label, string $bundle = NULL): EntityInterface { + protected static function getEntityByLabel(string $entity_type_id, string $label, ?string $bundle = NULL): EntityInterface { $entity_type_manager = \Drupal::entityTypeManager(); try { $storage = $entity_type_manager->getStorage($entity_type_id); diff --git a/tests/src/Traits/NodeTrait.php b/tests/src/Traits/NodeTrait.php index 633e4ee92a..edbbf071fe 100644 --- a/tests/src/Traits/NodeTrait.php +++ b/tests/src/Traits/NodeTrait.php @@ -18,7 +18,7 @@ trait NodeTrait { * * @param string $title * The node's title. - * @param string $bundle + * @param string|null $bundle * Optional content entity bundle. * * @return \Drupal\node\NodeInterface @@ -27,7 +27,7 @@ trait NodeTrait { * @throws \InvalidArgumentException * Thrown when a node with the given name does not exist. */ - public function getNodeByTitle(string $title, string $bundle = NULL): ?NodeInterface { + public function getNodeByTitle(string $title, ?string $bundle = NULL): ?NodeInterface { $query = \Drupal::entityQuery('node') ->condition('title', $title) ->range(0, 1); @@ -58,13 +58,13 @@ public function getNodeByTitle(string $title, string $bundle = NULL): ?NodeInter * The title of the node. * @param string $bundle * The type of the node. - * @param bool $published + * @param bool|null $published * Whether to request the last published or last unpublished verion. * * @return array * A list of revision IDs. */ - public function getNodeRevisionIdsList(string $title, string $bundle, bool $published = NULL): array { + public function getNodeRevisionIdsList(string $title, string $bundle, ?bool $published = NULL): array { $current_revision = $this->getNodeByTitle($title, $bundle); // We gather all revisions and then filter out the one we want as filtering // by vid will lead in false results. diff --git a/tests/src/Traits/OgTrait.php b/tests/src/Traits/OgTrait.php index 7108744e30..0f91724d81 100644 --- a/tests/src/Traits/OgTrait.php +++ b/tests/src/Traits/OgTrait.php @@ -26,19 +26,19 @@ trait OgTrait { * The organic group entity. * @param \Drupal\og\Entity\OgRole[] $roles * An array of OgRoles to be passed to the membership. - * @param string $state + * @param string|null $state * Optional state to assign to the membership. Can be one of: * - OgMembershipInterface::STATE_ACTIVE * - OgMembershipInterface::STATE_PENDING * - OgMembershipInterface::STATE_BLOCKED. - * @param int $created + * @param int|null $created * (Optional) The created time of the membership. * * @throws \Exception * Throws an exception when the user is anonymous or the entity is not a * group. */ - protected function subscribeUserToGroup(AccountInterface $user, EntityInterface $group, array $roles = [], string $state = NULL, int $created = NULL): void { + protected function subscribeUserToGroup(AccountInterface $user, EntityInterface $group, array $roles = [], ?string $state = NULL, ?int $created = NULL): void { if (!Og::isGroup($group->getEntityTypeId(), $group->bundle())) { throw new \Exception("The {$group->label()} is not a group."); } diff --git a/tests/src/Traits/RdfEntityTrait.php b/tests/src/Traits/RdfEntityTrait.php index 324972436e..67e2f5ebe2 100644 --- a/tests/src/Traits/RdfEntityTrait.php +++ b/tests/src/Traits/RdfEntityTrait.php @@ -21,7 +21,7 @@ trait RdfEntityTrait { * * @param string $label * The RDF entity label. - * @param string $type + * @param string|null $type * Optional RDF entity type. * * @return \Drupal\rdf_entity\RdfInterface @@ -30,7 +30,7 @@ trait RdfEntityTrait { * @throws \InvalidArgumentException * Thrown when an RDF entity with the given name and type does not exist. */ - protected static function getRdfEntityByLabel(string $label, string $type = NULL): RdfInterface { + protected static function getRdfEntityByLabel(string $label, ?string $type = NULL): RdfInterface { $query = \Drupal::entityQuery('rdf_entity') ->condition('label', $label) ->range(0, 1); diff --git a/tests/src/Traits/TraversingTrait.php b/tests/src/Traits/TraversingTrait.php index cd98b2f3fd..339bd2fe37 100644 --- a/tests/src/Traits/TraversingTrait.php +++ b/tests/src/Traits/TraversingTrait.php @@ -20,14 +20,14 @@ trait TraversingTrait { * * @param string $field * The field label. - * @param \Behat\Mink\Element\TraversableElement $region + * @param \Behat\Mink\Element\TraversableElement|null $region * (Optional) The region to search in. If a region is not provided, the * whole page will be used. * * @return \Behat\Mink\Element\TraversableElement|null * The field element or NULL if not found. */ - protected function findAnyFormField(string $field, TraversableElement $region = NULL): ?TraversableElement { + protected function findAnyFormField(string $field, ?TraversableElement $region = NULL): ?TraversableElement { if (!$region) { $region = $this->getSession()->getPage(); } @@ -50,7 +50,7 @@ protected function findAnyFormField(string $field, TraversableElement $region = * * @param string $select * The name of the select element. - * @param \Behat\Mink\Element\TraversableElement $region + * @param \Behat\Mink\Element\TraversableElement|null $region * (optional) The region in which to search for the select. Defaults to the * whole page. * @@ -60,7 +60,7 @@ protected function findAnyFormField(string $field, TraversableElement $region = * @throws \Exception * Thrown when no select field is found. */ - protected function findSelect(string $select, TraversableElement $region = NULL): TraversableElement { + protected function findSelect(string $select, ?TraversableElement $region = NULL): TraversableElement { if (empty($region)) { $region = $this->getSession()->getPage(); } @@ -287,7 +287,7 @@ protected function getListingByHeading(string $type, string $heading): NodeEleme * * @param string $alias * The facet alias. - * @param \Behat\Mink\Element\NodeElement $region + * @param \Behat\Mink\Element\NodeElement|null $region * (optional) Limit the search to a specific region. If empty, the whole * page will be used. Defaults to NULL. * @param string $html_tag @@ -302,7 +302,7 @@ protected function getListingByHeading(string $type, string $heading): NodeEleme * @throws \Exception * Thrown when the facet is not found in the designated area. */ - protected function findFacetByAlias(string $alias, NodeElement $region = NULL, string $html_tag = '*'): NodeElement { + protected function findFacetByAlias(string $alias, ?NodeElement $region = NULL, string $html_tag = '*'): NodeElement { if ($region === NULL) { $region = $this->getSession()->getPage(); } @@ -361,7 +361,7 @@ protected static function getFacetIdFromAlias(string $alias): string { * The date range field name. * @param string $component * The sub-field component. Either "date" or "time". - * @param string $date + * @param string|null $date * (optional) The sub-field name. Either "start" or "end". If left empty, it * is assumed that the field is a simple datetime field and not a range, * thus, the date or time components are looked in the whole field. @@ -372,7 +372,7 @@ protected static function getFacetIdFromAlias(string $alias): string { * @throws \Exception * Thrown when the date range field is not found. */ - protected function findDateRangeComponent(string $field, string $component, string $date = NULL): NodeElement { + protected function findDateRangeComponent(string $field, string $component, ?string $date = NULL): NodeElement { /** @var \Behat\Mink\Element\NodeElement $fieldset */ $fieldset = $this->getSession()->getPage()->find('named', ['fieldset', $field]); @@ -464,7 +464,7 @@ protected function findLinksMarkedAsActive($region = NULL): ?array { * @param string $element * The element name, e.g. 'fieldset', 'field', 'link', 'button', 'content', * 'select', 'checkbox', 'radio', 'file', 'optgroup', 'option', 'table', ... - * @param \Behat\Mink\Element\TraversableElement $region + * @param \Behat\Mink\Element\TraversableElement|null $region * (optional) The region to check in. * * @return \Behat\Mink\Element\NodeElement @@ -475,7 +475,7 @@ protected function findLinksMarkedAsActive($region = NULL): ?array { * * @see \Behat\Mink\Selector\NamedSelector */ - protected function findNamedElementInRegion(string $locator, string $element, TraversableElement $region = NULL): TraversableElement { + protected function findNamedElementInRegion(string $locator, string $element, ?TraversableElement $region = NULL): TraversableElement { if (empty($region)) { $region = $this->getSession()->getPage(); } @@ -558,13 +558,13 @@ protected function getElementsMatchingElementAlias(string $alias): array { * * @param string $filename * The file name. - * @param \Behat\Mink\Element\NodeElement $region + * @param \Behat\Mink\Element\NodeElement|null $region * (optional) The region to check in. * * @return bool * Whether the element exists or not in the given region. */ - protected function findImageInRegion(string $filename, NodeElement $region = NULL): bool { + protected function findImageInRegion(string $filename, ?NodeElement $region = NULL): bool { if (empty($region)) { $region = $this->getSession()->getPage(); } diff --git a/tests/src/Traits/UtilityTrait.php b/tests/src/Traits/UtilityTrait.php index d239ca2d80..ae6a48a58f 100644 --- a/tests/src/Traits/UtilityTrait.php +++ b/tests/src/Traits/UtilityTrait.php @@ -135,7 +135,7 @@ protected function isVisuallyVisible(NodeElement $element): bool { * be reused. When specified, the source property gets unset from the * object. */ - protected static function convertObjectPropertyValues($object, string $property, array $mapping, string $destination = NULL): void { + protected static function convertObjectPropertyValues($object, string $property, array $mapping, ?string $destination = NULL): void { if (!property_exists($object, $property)) { return; } diff --git a/tests/src/Traits/WorkflowTrait.php b/tests/src/Traits/WorkflowTrait.php index 1398965606..a550db0edc 100644 --- a/tests/src/Traits/WorkflowTrait.php +++ b/tests/src/Traits/WorkflowTrait.php @@ -27,7 +27,7 @@ trait WorkflowTrait { * Thrown when the expected transitions array does not exactly match the * array of available options. */ - protected function assertAvailableTransitions(FieldableEntityInterface $entity, array $available_transitions, AccountInterface $user = NULL) { + protected function assertAvailableTransitions(FieldableEntityInterface $entity, array $available_transitions, ?AccountInterface $user = NULL) { $allowed_transitions = $this->getAvailableTransitions($entity, $user); $allowed_transitions = array_values($allowed_transitions); sort($allowed_transitions); @@ -61,7 +61,7 @@ protected function assertAvailableTransitions(FieldableEntityInterface $entity, * @return string[] * An array of available target workflow states. */ - protected function getAvailableTargetStates(FieldableEntityInterface $entity, AccountInterface $user = NULL): array { + protected function getAvailableTargetStates(FieldableEntityInterface $entity, ?AccountInterface $user = NULL): array { return $this->getWorkflowHelper()->getAvailableTargetStates($entity, $user); } diff --git a/web/modules/custom/adms_validator/src/AdmsValidator.php b/web/modules/custom/adms_validator/src/AdmsValidator.php index a6030d027f..c8f4248e84 100644 --- a/web/modules/custom/adms_validator/src/AdmsValidator.php +++ b/web/modules/custom/adms_validator/src/AdmsValidator.php @@ -32,7 +32,7 @@ class AdmsValidator implements AdmsValidatorInterface { /** * {@inheritdoc} */ - public function getValidationQuery(string $graph_uri = NULL): string { + public function getValidationQuery(?string $graph_uri = NULL): string { if (empty($this->validationQuery)) { $this->validationQuery = self::getDefaultValidationQuery($graph_uri); } diff --git a/web/modules/custom/asset_distribution/src/Form/AnonymousDownloadForm.php b/web/modules/custom/asset_distribution/src/Form/AnonymousDownloadForm.php index e447eb8990..442d77d7e2 100644 --- a/web/modules/custom/asset_distribution/src/Form/AnonymousDownloadForm.php +++ b/web/modules/custom/asset_distribution/src/Form/AnonymousDownloadForm.php @@ -64,7 +64,7 @@ public function getFormId() { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, FileInterface $file = NULL) { + public function buildForm(array $form, FormStateInterface $form_state, ?FileInterface $file = NULL) { $this->file = $file; $form['#id'] = Html::getId($this->getFormId()); diff --git a/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php b/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php index d0b82ce2b0..2f80783d66 100644 --- a/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php +++ b/web/modules/custom/asset_release/src/Controller/AssetReleaseController.php @@ -72,13 +72,13 @@ public function add(RdfInterface $rdf_entity): array { * * @param \Drupal\rdf_entity\RdfInterface $rdf_entity * The RDF entity for which the custom page is created. - * @param \Drupal\Core\Session\AccountInterface $account + * @param \Drupal\Core\Session\AccountInterface|null $account * The RDF entity for which the custom page is created. * * @return \Drupal\Core\Access\AccessResultInterface * The access result object. */ - public function createAssetReleaseAccess(RdfInterface $rdf_entity, AccountInterface $account = NULL): AccessResultInterface { + public function createAssetReleaseAccess(RdfInterface $rdf_entity, ?AccountInterface $account = NULL): AccessResultInterface { if ($rdf_entity->bundle() !== 'solution') { throw new NotFoundHttpException(); } diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 7d7a22f298..3a60626659 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -693,7 +693,7 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont * @Then I am member of :labels collection(s) * @Then user :user_name is member of :labels collection(s) */ - public function assertUserIsMemberOfCollection(string $labels, string $user_name = NULL): void { + public function assertUserIsMemberOfCollection(string $labels, ?string $user_name = NULL): void { /** @var \Drupal\user\UserInterface $account */ if (!$user_name) { $user = $this->getUserManager()->getCurrentUser(); diff --git a/web/modules/custom/collection/src/Form/JoinCollectionForm.php b/web/modules/custom/collection/src/Form/JoinCollectionForm.php index c0a461d93c..5165bbae48 100644 --- a/web/modules/custom/collection/src/Form/JoinCollectionForm.php +++ b/web/modules/custom/collection/src/Form/JoinCollectionForm.php @@ -109,7 +109,7 @@ public function getFormId(): string { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, AccountInterface $user = NULL, RdfInterface $collection = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?AccountInterface $user = NULL, ?RdfInterface $collection = NULL): array { $form['#access'] = $this->access(); $user = $this->loadUser((int) $user->id()); diff --git a/web/modules/custom/collection/src/Form/LeaveCollectionConfirmForm.php b/web/modules/custom/collection/src/Form/LeaveCollectionConfirmForm.php index 2528160f44..0487072ddc 100644 --- a/web/modules/custom/collection/src/Form/LeaveCollectionConfirmForm.php +++ b/web/modules/custom/collection/src/Form/LeaveCollectionConfirmForm.php @@ -102,7 +102,7 @@ public function getCancelUrl(): Url { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL): array { // Store the collection on the object so it can be reused. $this->collection = $rdf_entity; diff --git a/web/modules/custom/collection/src/Form/SubscribeToCollectionForm.php b/web/modules/custom/collection/src/Form/SubscribeToCollectionForm.php index c5fd8c7872..a6b39c55c0 100644 --- a/web/modules/custom/collection/src/Form/SubscribeToCollectionForm.php +++ b/web/modules/custom/collection/src/Form/SubscribeToCollectionForm.php @@ -88,7 +88,7 @@ public function getFormId(): string { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL): array { // This form should only be accessible if the user is already a member of // the collection. $membership = $this->getUserNonBlockedMembership($rdf_entity); diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 1832bc4122..d200264de3 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -197,7 +197,7 @@ function custom_page_node_access(NodeInterface $node, $op, AccountInterface $acc /** * Implements hook_entity_field_access(). */ -function custom_page_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { +function custom_page_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, ?FieldItemListInterface $items = NULL) { return AccessResult::allowedIf( $operation === 'edit' && $field_definition->getName() === 'status' diff --git a/web/modules/custom/custom_page/src/Controller/CustomPageController.php b/web/modules/custom/custom_page/src/Controller/CustomPageController.php index 6f11cff4c9..af4385c7a3 100644 --- a/web/modules/custom/custom_page/src/Controller/CustomPageController.php +++ b/web/modules/custom/custom_page/src/Controller/CustomPageController.php @@ -28,7 +28,7 @@ class CustomPageController extends CommunityContentController { * The custom pages are only allowed to be created for collections and * solutions. */ - public function createAccess(RdfInterface $rdf_entity, AccountInterface $account = NULL): AccessResult { + public function createAccess(RdfInterface $rdf_entity, ?AccountInterface $account = NULL): AccessResult { if (empty($account)) { $account = $this->currentUser(); } diff --git a/web/modules/custom/isa2_analytics/isa2_analytics.behat.inc b/web/modules/custom/isa2_analytics/isa2_analytics.behat.inc index 26c0484a29..ac9a2617ea 100644 --- a/web/modules/custom/isa2_analytics/isa2_analytics.behat.inc +++ b/web/modules/custom/isa2_analytics/isa2_analytics.behat.inc @@ -20,14 +20,14 @@ class Isa2AnalyticsSubContext extends DrupalSubContextBase { /** * Checks the presence of a site section in the analytics reporting data. * - * @param string $section + * @param string|null $section * Optional site section to check. If omitted the site section is expected * to be missing from the analytics data. * * @Then the analytics report should not include a site section * @Then the analytics report should include the site section :section */ - public function assertSiteSection(string $section = NULL): void { + public function assertSiteSection(?string $section = NULL): void { if ($section) { $this->assertAnalyticsJsonContainsParameter(AnalyticsEventInterface::SITE_SECTION, $section); } diff --git a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc index f49f4adf3d..79fba20cc1 100644 --- a/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc +++ b/web/modules/custom/joinup_community_content/joinup_community_content.tokens.inc @@ -30,7 +30,7 @@ function joinup_community_content_token_info_alter(&$info) { /** * Implements hook_tokens(). */ -function joinup_community_content_tokens($type, array $tokens, array $data = [], array $options = [], BubbleableMetadata $bubbleable_metadata = NULL) { +function joinup_community_content_tokens($type, array $tokens, array $data = [], array $options = [], ?BubbleableMetadata $bubbleable_metadata = NULL) { $replacements = []; if ($type == 'node' && !empty($data['node'])) { diff --git a/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php b/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php index bc4ef35451..862dce1ff1 100644 --- a/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php +++ b/web/modules/custom/joinup_community_content/src/Access/NodeRevisionAccessCheck.php @@ -63,7 +63,7 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Gro /** * {@inheritdoc} */ - public function access(Route $route, AccountInterface $account, $node_revision = NULL, NodeInterface $node = NULL) { + public function access(Route $route, AccountInterface $account, $node_revision = NULL, ?NodeInterface $node = NULL) { if ($node_revision) { $node = $this->nodeStorage->loadRevision($node_revision); } diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index c221175217..3ed1071587 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -133,13 +133,13 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Mem * The group content entity object. * @param string $operation * The CRUD operation. - * @param \Drupal\Core\Session\AccountInterface $account + * @param \Drupal\Core\Session\AccountInterface|null $account * The user account. * * @return \Drupal\Core\Access\AccessResult * The result of the access check. */ - public function entityAccess(EntityInterface $entity, $operation, AccountInterface $account = NULL): AccessResult { + public function entityAccess(EntityInterface $entity, $operation, ?AccountInterface $account = NULL): AccessResult { if ($account === NULL) { $account = $this->currentUser; } diff --git a/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php b/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php index f277ed1a7f..55536423c9 100644 --- a/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php +++ b/web/modules/custom/joinup_community_content/src/Controller/CommunityContentController.php @@ -78,13 +78,13 @@ public function add(RdfInterface $rdf_entity): array { * * @param \Drupal\rdf_entity\RdfInterface $rdf_entity * The RDF entity for which the document entity is created. - * @param \Drupal\Core\Session\AccountInterface $account + * @param \Drupal\Core\Session\AccountInterface|null $account * The account to check access for. The current user will be used if NULL. * * @return \Drupal\Core\Access\AccessResult * The access result object. */ - public function createAccess(RdfInterface $rdf_entity, AccountInterface $account = NULL): AccessResult { + public function createAccess(RdfInterface $rdf_entity, ?AccountInterface $account = NULL): AccessResult { if (empty($account)) { $account = $this->currentUser(); } diff --git a/web/modules/custom/joinup_community_content/src/Form/ShareForm.php b/web/modules/custom/joinup_community_content/src/Form/ShareForm.php index 0028770b13..c3a3362e90 100644 --- a/web/modules/custom/joinup_community_content/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_community_content/src/Form/ShareForm.php @@ -23,7 +23,7 @@ class ShareForm extends OriginalForm { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, NodeInterface $node = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?NodeInterface $node = NULL): array { return parent::doBuildForm($form, $form_state, $node); } diff --git a/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php b/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php index b168b8b57e..354b3059e6 100644 --- a/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php +++ b/web/modules/custom/joinup_community_content/src/Form/UnshareForm.php @@ -24,7 +24,7 @@ class UnshareForm extends OriginalForm { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, NodeInterface $node = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?NodeInterface $node = NULL): array { return parent::doBuildForm($form, $form_state, $node); } diff --git a/web/modules/custom/joinup_core/joinup_core.behat.inc b/web/modules/custom/joinup_core/joinup_core.behat.inc index 3805935e4e..b975bfbdc9 100644 --- a/web/modules/custom/joinup_core/joinup_core.behat.inc +++ b/web/modules/custom/joinup_core/joinup_core.behat.inc @@ -31,7 +31,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * * @param \Behat\Gherkin\Node\TableNode $table * The table containing the expected chip labels. - * @param string $region + * @param string|null $region * Optional region in which to locate the chips to check. If omitted all * chips found in the entire page will be checked. * @@ -41,7 +41,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * @Then the page should show( only) the( following) chip(s): * @Then the page should show( only) the( following) chip(s) in the :region region: */ - public function assertChipElements(TableNode $table, string $region = NULL): void { + public function assertChipElements(TableNode $table, ?string $region = NULL): void { $chips = $this->getChips($region); $found = array_map(function (Chip $element) { return $element->getText(); @@ -54,10 +54,10 @@ class JoinupCoreSubContext extends DrupalSubContextBase { /** * Asserts that the expected number of chips are shown. * - * @param string $number + * @param string|null $number * The expected number of chips. This is a string rather than an integer * because step definitions are represented in text. - * @param string $region + * @param string|null $region * Optional region in which to locate the chips to check. If omitted all * chips found in the entire page will be checked. * @@ -69,7 +69,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * @Then the :region region should contain :number chip(s) * @Then the :region region should not contain any chips */ - public function assertChipCount(string $number = NULL, string $region = NULL): void { + public function assertChipCount(?string $number = NULL, ?string $region = NULL): void { $number = (int) $number; Assert::assertCount($number, $this->getChips($region)); } @@ -104,7 +104,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { /** * Returns the chips that are present in the given region. * - * @param string $region + * @param string|null $region * Optional region in which to locate the chips to return. If omitted all * chips found in the entire page will be returned. * @@ -114,7 +114,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * @throws \Exception * Thrown when the region is not found. */ - protected function getChips(string $region = NULL): array { + protected function getChips(?string $region = NULL): array { // Default to the entire page if the region is omitted. $base_element = $region ? $this->getRegion($region) : $this->getSession()->getPage(); @@ -149,7 +149,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * * @param string $text * The text that should be present in the chip. - * @param string $region + * @param string|null $region * Optional region in which to locate the chips to return. If omitted all * chips found in the entire page will be returned. * @@ -159,7 +159,7 @@ class JoinupCoreSubContext extends DrupalSubContextBase { * @return \Drupal\joinup\Chip|null * The chip, or NULL if no chip with the given text is present in the page. */ - protected function getChipByText(string $text, string $region = NULL): ?Chip { + protected function getChipByText(string $text, ?string $region = NULL): ?Chip { foreach ($this->getChips($region) as $chip) { if ($chip->getText() === $text) { return $chip; diff --git a/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php b/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php index 9cfe337390..203febe0c2 100644 --- a/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php +++ b/web/modules/custom/joinup_core/src/Plugin/Action/ChangeGroupAction.php @@ -129,7 +129,7 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} */ - public function access($node, AccountInterface $account = NULL, $return_as_object = FALSE) { + public function access($node, ?AccountInterface $account = NULL, $return_as_object = FALSE) { // The access is limited at the view level. return $return_as_object ? AccessResult::allowed() : TRUE; } @@ -234,7 +234,7 @@ public function executeMultiple(array $nodes) { /** * {@inheritdoc} */ - public function execute(NodeInterface $node = NULL) { + public function execute(?NodeInterface $node = NULL) { $this->executeMultiple([$node]); } diff --git a/web/modules/custom/joinup_core/src/WorkflowHelper.php b/web/modules/custom/joinup_core/src/WorkflowHelper.php index 06b044f614..20e1671739 100644 --- a/web/modules/custom/joinup_core/src/WorkflowHelper.php +++ b/web/modules/custom/joinup_core/src/WorkflowHelper.php @@ -83,7 +83,7 @@ public function __construct(AccountProxyInterface $currentUser, AccountSwitcherI /** * {@inheritdoc} */ - public function getAvailableStatesLabels(FieldableEntityInterface $entity, AccountInterface $account = NULL): array { + public function getAvailableStatesLabels(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array { $allowed_transitions = $this->getAvailableTransitions($entity, $account); $allowed_states = array_map(function (WorkflowTransition $transition) { @@ -96,7 +96,7 @@ public function getAvailableStatesLabels(FieldableEntityInterface $entity, Accou /** * {@inheritdoc} */ - public function getAvailableTargetStates(FieldableEntityInterface $entity, AccountInterface $account = NULL): array { + public function getAvailableTargetStates(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array { $allowed_transitions = $this->getAvailableTransitions($entity, $account); $allowed_states = array_map(function (WorkflowTransition $transition) { @@ -114,7 +114,7 @@ public function getAvailableTargetStates(FieldableEntityInterface $entity, Accou /** * {@inheritdoc} */ - public function getAvailableTransitions(FieldableEntityInterface $entity, AccountInterface $account = NULL): array { + public function getAvailableTransitions(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array { // Set the current user so that states available are retrieved for the // specific account. // The proper solution would be to pass the account to the state_machine @@ -170,7 +170,7 @@ public function getEntityStateFieldDefinitions($entity_type_id, $bundle_id): arr /** * {@inheritdoc} */ - public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, AccountInterface $account = NULL): array { + public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array { return array_map(function (WorkflowTransition $transition) { return (string) $transition->getLabel(); }, $this->getAvailableTransitions($entity, $account)); diff --git a/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php b/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php index 935eacc626..8eb3517988 100644 --- a/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php +++ b/web/modules/custom/joinup_core/src/WorkflowHelperInterface.php @@ -36,7 +36,7 @@ interface WorkflowHelperInterface { * @return string[] * An array of available target workflow states. */ - public function getAvailableTargetStates(FieldableEntityInterface $entity, AccountInterface $account = NULL): array; + public function getAvailableTargetStates(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array; /** * Returns the available transitions labels of an entity for the given user. @@ -52,7 +52,7 @@ public function getAvailableTargetStates(FieldableEntityInterface $entity, Accou * @return array * An array of transition labels. */ - public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, AccountInterface $account = NULL): array; + public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array; /** * Returns the available transition states of an entity for the given user. @@ -65,7 +65,7 @@ public function getAvailableTransitionsLabels(FieldableEntityInterface $entity, * @return \Drupal\state_machine\Plugin\Workflow\WorkflowTransition[] * An array of transition objects. */ - public function getAvailableTransitions(FieldableEntityInterface $entity, AccountInterface $account = NULL): array; + public function getAvailableTransitions(FieldableEntityInterface $entity, ?AccountInterface $account = NULL): array; /** * Returns the state field definitions of an entity. diff --git a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php index d8bd16e729..69529ef7b9 100644 --- a/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php +++ b/web/modules/custom/joinup_discussion/src/Form/InviteToDiscussionForm.php @@ -180,7 +180,7 @@ protected function getCancelButtonUrl(): Url { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, NodeInterface $node = NULL) { + public function buildForm(array $form, FormStateInterface $form_state, ?NodeInterface $node = NULL) { $this->discussion = $node; return parent::build($form, $form_state); @@ -280,13 +280,13 @@ public function submitForm(array &$form, FormStateInterface $form_state) { * * @param \Drupal\Core\Session\AccountProxyInterface $account * The user for which to check access. - * @param \Drupal\node\NodeInterface $node + * @param \Drupal\node\NodeInterface|null $node * The discussion to which users will be invited. * * @return \Drupal\Core\Access\AccessResult * The access result object. */ - public function access(AccountProxyInterface $account, NodeInterface $node = NULL): AccessResult { + public function access(AccountProxyInterface $account, ?NodeInterface $node = NULL): AccessResult { $access = FALSE; // The node should be a published discussion. diff --git a/web/modules/custom/joinup_event/joinup_event.module b/web/modules/custom/joinup_event/joinup_event.module index ec3b44957c..13d4324654 100644 --- a/web/modules/custom/joinup_event/joinup_event.module +++ b/web/modules/custom/joinup_event/joinup_event.module @@ -67,7 +67,7 @@ function joinup_event_token_info_alter(&$info) { /** * Implements hook_tokens(). */ -function joinup_event_tokens($type, array $tokens, array $data = [], array $options = [], BubbleableMetadata $bubbleable_metadata = NULL) { +function joinup_event_tokens($type, array $tokens, array $data = [], array $options = [], ?BubbleableMetadata $bubbleable_metadata = NULL) { $replacements = []; if ($type == 'node' && !empty($data['node'])) { diff --git a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php index b01afd9543..5a1887e556 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php +++ b/web/modules/custom/joinup_federation/src/Plugin/Adms2ConvertPass/Pass1To3.php @@ -136,7 +136,7 @@ public function getTestingRdfData(): ?string { * otherwise an associative array of ADMS v2 type URIs keyed by ADMSv1 type * URIs. */ - protected static function getAdms1To2TypeConversionMap(string $adms1_uri = NULL) { + protected static function getAdms1To2TypeConversionMap(?string $adms1_uri = NULL) { $conversion_map = [ 'http://www.w3.org/ns/adms#Asset' => static::ASSET, 'http://www.w3.org/ns/adms#AssetRepository' => static::ASSET_CATALOG, diff --git a/web/modules/custom/joinup_federation/src/Plugin/DataType/RdfEntityReference.php b/web/modules/custom/joinup_federation/src/Plugin/DataType/RdfEntityReference.php index e989152abe..5b4f5d100f 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/DataType/RdfEntityReference.php +++ b/web/modules/custom/joinup_federation/src/Plugin/DataType/RdfEntityReference.php @@ -35,11 +35,11 @@ class RdfEntityReference extends EntityReference { * @param string|null $name * (optional) The name of the created property, or NULL if it is the root * of a typed data tree. Defaults to NULL. - * @param \Drupal\Core\TypedData\TypedDataInterface $parent + * @param \Drupal\Core\TypedData\TypedDataInterface|null $parent * (optional) The parent object of the data property, or NULL if it is the * root of a typed data tree. Defaults to NULL. */ - public function __construct(DataDefinitionInterface $definition, StagingCandidateGraphsInterface $staging_candidate_graphs, ?string $name = NULL, TypedDataInterface $parent = NULL) { + public function __construct(DataDefinitionInterface $definition, StagingCandidateGraphsInterface $staging_candidate_graphs, ?string $name = NULL, ?TypedDataInterface $parent = NULL) { parent::__construct($definition, $name, $parent); $this->stagingCandidateGraphs = $staging_candidate_graphs; } @@ -47,7 +47,7 @@ public function __construct(DataDefinitionInterface $definition, StagingCandidat /** * {@inheritdoc} */ - public static function createInstance($definition, $name = NULL, TraversableTypedDataInterface $parent = NULL): self { + public static function createInstance($definition, $name = NULL, ?TraversableTypedDataInterface $parent = NULL): self { return new static( $definition, \Drupal::service('joinup_federation.staging_candidate_graphs'), diff --git a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsSchemaEntityReferenceFieldsTrait.php b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsSchemaEntityReferenceFieldsTrait.php index 45d78b1c49..9d22e0be4e 100644 --- a/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsSchemaEntityReferenceFieldsTrait.php +++ b/web/modules/custom/joinup_federation/src/Plugin/pipeline/Step/AdmsSchemaEntityReferenceFieldsTrait.php @@ -29,7 +29,7 @@ trait AdmsSchemaEntityReferenceFieldsTrait { * Associative array with the list of fields keyed by field name and having * the target entity type ID as value. */ - protected function getAdmsSchemaEntityReferenceFields(string $bundle, array $target_entity_type_ids = NULL): array { + protected function getAdmsSchemaEntityReferenceFields(string $bundle, ?array $target_entity_type_ids = NULL): array { if (!isset($this->admsSchemaEntityReferenceFields[$bundle])) { $this->admsSchemaEntityReferenceFields[$bundle] = []; /** @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */ diff --git a/web/modules/custom/joinup_federation/src/RdfEntityReferenceFieldItemList.php b/web/modules/custom/joinup_federation/src/RdfEntityReferenceFieldItemList.php index 6f5d8e6393..ea2b49ef77 100644 --- a/web/modules/custom/joinup_federation/src/RdfEntityReferenceFieldItemList.php +++ b/web/modules/custom/joinup_federation/src/RdfEntityReferenceFieldItemList.php @@ -32,11 +32,11 @@ class RdfEntityReferenceFieldItemList extends EntityReferenceFieldItemList { * @param string|null $name * (optional) The name of the created property, or NULL if it is the root * of a typed data tree. Defaults to NULL. - * @param \Drupal\Core\TypedData\TypedDataInterface $parent + * @param \Drupal\Core\TypedData\TypedDataInterface|null $parent * (optional) The parent object of the data property, or NULL if it is the * root of a typed data tree. Defaults to NULL. */ - public function __construct(DataDefinitionInterface $definition, StagingCandidateGraphsInterface $staging_candidate_graphs, ?string $name = NULL, TypedDataInterface $parent = NULL) { + public function __construct(DataDefinitionInterface $definition, StagingCandidateGraphsInterface $staging_candidate_graphs, ?string $name = NULL, ?TypedDataInterface $parent = NULL) { parent::__construct($definition, $name, $parent); $this->stagingCandidateGraphs = $staging_candidate_graphs; } @@ -44,7 +44,7 @@ public function __construct(DataDefinitionInterface $definition, StagingCandidat /** * {@inheritdoc} */ - public static function createInstance($definition, $name = NULL, TraversableTypedDataInterface $parent = NULL): self { + public static function createInstance($definition, $name = NULL, ?TraversableTypedDataInterface $parent = NULL): self { return new static( $definition, \Drupal::service('joinup_federation.staging_candidate_graphs'), diff --git a/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php b/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php index c13a2fa0de..7cedd7e458 100644 --- a/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php +++ b/web/modules/custom/joinup_federation/tests/src/Kernel/StepTestBase.php @@ -70,11 +70,11 @@ protected function setUpPipeline(): void { * * @param string $step_plugin_id * The pipeline step. - * @param \Drupal\pipeline\PipelineStateInterface $state + * @param \Drupal\pipeline\PipelineStateInterface|null $state * (optional) The pipeline state object. If missed a brand new will be * created from the passed step. */ - protected function runPipelinePrepare(string $step_plugin_id, PipelineStateInterface $state = NULL) { + protected function runPipelinePrepare(string $step_plugin_id, ?PipelineStateInterface $state = NULL) { $step_plugin_instance = $this->pipeline->createStepInstance($step_plugin_id); if (!$state) { $state = (new PipelineState())->setStepId($step_plugin_id); @@ -88,11 +88,11 @@ protected function runPipelinePrepare(string $step_plugin_id, PipelineStateInter * * @param string $step_plugin_id * The pipeline step. - * @param \Drupal\pipeline\PipelineStateInterface $state + * @param \Drupal\pipeline\PipelineStateInterface|null $state * (optional) The pipeline state object. If missed a brand new will be * created from the passed step. */ - protected function runPipelineStep(string $step_plugin_id, PipelineStateInterface $state = NULL) { + protected function runPipelineStep(string $step_plugin_id, ?PipelineStateInterface $state = NULL) { $step_plugin_instance = $this->pipeline->createStepInstance($step_plugin_id); if (!$state) { $state = (new PipelineState())->setStepId($step_plugin_id); diff --git a/web/modules/custom/joinup_front_page/src/Access/JoinupFrontPageMenuAccess.php b/web/modules/custom/joinup_front_page/src/Access/JoinupFrontPageMenuAccess.php index 5cc3495238..dca192950c 100644 --- a/web/modules/custom/joinup_front_page/src/Access/JoinupFrontPageMenuAccess.php +++ b/web/modules/custom/joinup_front_page/src/Access/JoinupFrontPageMenuAccess.php @@ -31,7 +31,7 @@ public function menuAccess(AccountInterface $account, Menu $menu): AccessResultI /** * {@inheritdoc} */ - public function menuLinkAccess(AccountInterface $account, MenuLinkInterface $menu_link_plugin = NULL): AccessResultInterface { + public function menuLinkAccess(AccountInterface $account, ?MenuLinkInterface $menu_link_plugin = NULL): AccessResultInterface { if ($menu_link_plugin->getMenuName() === 'front-page') { // Disallow editing new links for the front-page menu. return AccessResult::forbidden(); @@ -42,7 +42,7 @@ public function menuLinkAccess(AccountInterface $account, MenuLinkInterface $men /** * {@inheritdoc} */ - public function menuItemAccess(AccountInterface $account, MenuLinkContent $menu_link_content = NULL): AccessResultInterface { + public function menuItemAccess(AccountInterface $account, ?MenuLinkContent $menu_link_content = NULL): AccessResultInterface { if ($menu_link_content->getMenuName() === 'front-page') { // Disable canonical page access. return AccessResult::forbidden(); diff --git a/web/modules/custom/joinup_group/src/Form/ShareForm.php b/web/modules/custom/joinup_group/src/Form/ShareForm.php index 0e86442799..f0d23a1714 100644 --- a/web/modules/custom/joinup_group/src/Form/ShareForm.php +++ b/web/modules/custom/joinup_group/src/Form/ShareForm.php @@ -33,7 +33,7 @@ public function getFormId(): string { * An associative array containing the structure of the form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. - * @param \Drupal\Core\Entity\EntityInterface $entity + * @param \Drupal\Core\Entity\EntityInterface|null $entity * The entity being shared. * * @return array @@ -42,7 +42,7 @@ public function getFormId(): string { * @throws \Drupal\Core\TypedData\Exception\MissingDataException * Thrown when the group reference is not populated. */ - public function doBuildForm(array $form, FormStateInterface $form_state, EntityInterface $entity = NULL): array { + public function doBuildForm(array $form, FormStateInterface $form_state, ?EntityInterface $entity = NULL): array { $this->entity = $entity; $form['share'] = [ diff --git a/web/modules/custom/joinup_group/src/Form/UnshareForm.php b/web/modules/custom/joinup_group/src/Form/UnshareForm.php index be57798349..6602af7726 100644 --- a/web/modules/custom/joinup_group/src/Form/UnshareForm.php +++ b/web/modules/custom/joinup_group/src/Form/UnshareForm.php @@ -27,13 +27,13 @@ public function getFormId(): string { * An associative array containing the structure of the form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. - * @param \Drupal\Core\Entity\EntityInterface $entity + * @param \Drupal\Core\Entity\EntityInterface|null $entity * The entity being unshared. * * @return array * The form structure. */ - public function doBuildForm(array $form, FormStateInterface $form_state, EntityInterface $entity = NULL): array { + public function doBuildForm(array $form, FormStateInterface $form_state, ?EntityInterface $entity = NULL): array { $this->entity = $entity; $options = array_map(function ($collection) { diff --git a/web/modules/custom/joinup_group/src/Plugin/Action/DeleteGroupMembership.php b/web/modules/custom/joinup_group/src/Plugin/Action/DeleteGroupMembership.php index 483a6cf6c5..2bf24b303f 100644 --- a/web/modules/custom/joinup_group/src/Plugin/Action/DeleteGroupMembership.php +++ b/web/modules/custom/joinup_group/src/Plugin/Action/DeleteGroupMembership.php @@ -74,14 +74,14 @@ public function executeMultiple(array $memberships): void { /** * {@inheritdoc} */ - public function execute(OgMembership $membership = NULL): void { + public function execute(?OgMembership $membership = NULL): void { $this->executeMultiple([$membership]); } /** * {@inheritdoc} */ - public function access($membership, AccountInterface $account = NULL, $return_as_object = FALSE) { + public function access($membership, ?AccountInterface $account = NULL, $return_as_object = FALSE) { /** @var \Drupal\og\Entity\OgMembership $membership */ // 'Joinup' collection membership cannot be revoked. if ($membership->getGroupId() === JoinupCollectionHelper::getCollectionId()) { diff --git a/web/modules/custom/joinup_group/src/Plugin/Action/TransferGroupOwnershipAction.php b/web/modules/custom/joinup_group/src/Plugin/Action/TransferGroupOwnershipAction.php index b95a8ada66..58ea30f00c 100644 --- a/web/modules/custom/joinup_group/src/Plugin/Action/TransferGroupOwnershipAction.php +++ b/web/modules/custom/joinup_group/src/Plugin/Action/TransferGroupOwnershipAction.php @@ -100,7 +100,7 @@ public function executeMultiple(array $memberships): void { /** * {@inheritdoc} */ - public function execute(OgMembership $membership = NULL): void { + public function execute(?OgMembership $membership = NULL): void { /** @var \Drupal\rdf_entity\RdfInterface $group */ $group = $membership->getGroup(); @@ -127,7 +127,7 @@ public function execute(OgMembership $membership = NULL): void { /** * {@inheritdoc} */ - public function access($membership, AccountInterface $account = NULL, $return_as_object = FALSE) { + public function access($membership, ?AccountInterface $account = NULL, $return_as_object = FALSE) { /** @var \Drupal\og\OgMembershipInterface $membership */ /** @var \Drupal\rdf_entity\RdfInterface $group */ $group = $membership->getGroup(); diff --git a/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php b/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php index d6c43318f5..3bcdc37586 100644 --- a/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php +++ b/web/modules/custom/joinup_invite/src/Form/InviteToGroupForm.php @@ -81,7 +81,7 @@ protected function getCancelButtonUrl(): Url { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL) { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL) { $this->rdfEntity = $rdf_entity; $form['role'] = [ diff --git a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php index 903c1165fa..0732d74ec6 100644 --- a/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php +++ b/web/modules/custom/joinup_notification/src/EventSubscriber/NotificationSubscriberBase.php @@ -144,13 +144,13 @@ protected function initialize(NotificationEvent $event) { * @param array $user_data * A structured array of user ownership and roles and their corresponding * message ids. - * @param \Drupal\Core\Entity\EntityInterface $entity + * @param \Drupal\Core\Entity\EntityInterface|null $entity * Optionally alter the entity to be checked. * * @return array * An array of message ids that every key is an array of user ids. */ - protected function getUsersMessages(array $user_data, EntityInterface $entity = NULL) { + protected function getUsersMessages(array $user_data, ?EntityInterface $entity = NULL) { $entity = $entity ?: $this->entity; // Ensure proper loops. $user_data += [ diff --git a/web/modules/custom/joinup_notification/src/MessageArgumentGenerator.php b/web/modules/custom/joinup_notification/src/MessageArgumentGenerator.php index 917dd24fd7..0f01eaca90 100644 --- a/web/modules/custom/joinup_notification/src/MessageArgumentGenerator.php +++ b/web/modules/custom/joinup_notification/src/MessageArgumentGenerator.php @@ -34,7 +34,7 @@ class MessageArgumentGenerator { * @throws \Drupal\Core\TypedData\Exception\MissingDataException * Thrown when the first name or last name is not known. */ - public static function getActorArguments(UserInterface $actor = NULL): array { + public static function getActorArguments(?UserInterface $actor = NULL): array { $arguments = []; // Default to the current user. diff --git a/web/modules/custom/joinup_search/joinup_search.module b/web/modules/custom/joinup_search/joinup_search.module index 41db972c50..c0ea8556cc 100644 --- a/web/modules/custom/joinup_search/joinup_search.module +++ b/web/modules/custom/joinup_search/joinup_search.module @@ -35,7 +35,7 @@ function joinup_search_theme($existing, $type, $theme, $path) { * Grant access to fields of type search only to moderators except from * custom_page pages. */ -function joinup_search_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { +function joinup_search_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, ?FieldItemListInterface $items = NULL) { // Limit access to search fields only on edit. if ($operation !== 'edit' || $field_definition->getType() !== 'search_api_field') { return AccessResult::neutral(); diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 773151f0ee..0e83b4b3ef 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -107,7 +107,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * @Given the metatag (sub)graph of the item with :property :value should have the following properties in index :delta: * @Given the metatag (sub)graph of the item with :property :value should have the following :sub_property properties in index :delta: */ - public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, string $sub_property = NULL, $delta = NULL): void { + public function assertPropertiesOfMetatagGraph(string $property, string $value, TableNode $table, ?string $sub_property = NULL, $delta = NULL): void { $graphs = $this->getGraphsFromMetatags($property, $value, $sub_property); if (empty($graphs)) { throw new \Exception("No graphs were found that have a property '{$property}' of value '{$value}' or none of them contain a '{$sub_property}' property."); @@ -210,7 +210,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The first graph that matches the criteria as an array or null if no match * is found. */ - protected function getGraphsFromMetatags(string $property, string $value, string $sub_graph = NULL): ?array { + protected function getGraphsFromMetatags(string $property, string $value, ?string $sub_graph = NULL): ?array { $json = $this->getMetatagsAsJson(); $sub_graphs = $this->getSubGraphsFromGraph($json, $property, $value); if (!empty($sub_graph)) { @@ -247,7 +247,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * @return array * An array of subgraphs that match the above criteria. */ - protected function getSubGraphsFromGraph(array $graph, string $identifier, string $identifier_value = NULL, bool $reset = TRUE): array { + protected function getSubGraphsFromGraph(array $graph, string $identifier, ?string $identifier_value = NULL, bool $reset = TRUE): array { static $graphs_found = []; if ($reset) { $graphs_found = []; diff --git a/web/modules/custom/joinup_subscription/joinup_subscription.behat.inc b/web/modules/custom/joinup_subscription/joinup_subscription.behat.inc index 636b6561f0..92f913ecf8 100644 --- a/web/modules/custom/joinup_subscription/joinup_subscription.behat.inc +++ b/web/modules/custom/joinup_subscription/joinup_subscription.behat.inc @@ -56,13 +56,13 @@ class JoinupSubscriptionSubContext extends DrupalSubContextBase implements Drupa /** * Navigates to the My subscriptions form of the given user. * - * @param string $username + * @param string|null $username * The name of the user. * * @When I go to the subscription settings of :username * @When I go to my subscriptions */ - public function visitMySubscriptions(string $username = NULL): void { + public function visitMySubscriptions(?string $username = NULL): void { if (!empty($username)) { $user = $this->getUserByName($username); $url = Url::fromRoute('joinup_subscription.subscriptions', [ diff --git a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php index 290d356d56..524561f2bc 100644 --- a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php +++ b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php @@ -94,7 +94,7 @@ public function getFormId() { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, AccountInterface $user = NULL) { + public function buildForm(array $form, FormStateInterface $form_state, ?AccountInterface $user = NULL) { // When no user is passed we cannot show anything useful. if (empty($user)) { throw new \InvalidArgumentException('No user account supplied.'); diff --git a/web/modules/custom/joinup_user/joinup_user.module b/web/modules/custom/joinup_user/joinup_user.module index 159d14a95f..3db79153e2 100644 --- a/web/modules/custom/joinup_user/joinup_user.module +++ b/web/modules/custom/joinup_user/joinup_user.module @@ -395,7 +395,7 @@ function joinup_user_search_api_query_search_api_field_field_user_content_alter( * * @see \Drupal\user\Controller\UserController::userTitle() */ -function joinup_user_canonical_title(UserInterface $user = NULL) { +function joinup_user_canonical_title(?UserInterface $user = NULL) { return $user ? ['#markup' => $user->get('full_name')->value, '#allowed_tags' => Xss::getHtmlTagList()] : ''; } diff --git a/web/modules/custom/moderation/src/Form/ContentModerationOverviewForm.php b/web/modules/custom/moderation/src/Form/ContentModerationOverviewForm.php index e730b8777b..e783f8cc60 100644 --- a/web/modules/custom/moderation/src/Form/ContentModerationOverviewForm.php +++ b/web/modules/custom/moderation/src/Form/ContentModerationOverviewForm.php @@ -75,7 +75,7 @@ public function getFormId() { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL) { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL) { $result = $this->getModerationItems($rdf_entity); $count = $this->getModerationItemCount($result); diff --git a/web/modules/custom/og_comment/src/OgCommentFieldItemList.php b/web/modules/custom/og_comment/src/OgCommentFieldItemList.php index 64b0f383ce..919be0abbd 100644 --- a/web/modules/custom/og_comment/src/OgCommentFieldItemList.php +++ b/web/modules/custom/og_comment/src/OgCommentFieldItemList.php @@ -31,7 +31,7 @@ class OgCommentFieldItemList extends CommentFieldItemList { /** * {@inheritdoc} */ - public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) { + public function access($operation = 'view', ?AccountInterface $account = NULL, $return_as_object = FALSE) { $host_entity = $this->getEntity(); // We cannot inject services in this plugin as it extends TypedData and it // does not support dependency injection. diff --git a/web/modules/custom/solution/src/Form/ShareForm.php b/web/modules/custom/solution/src/Form/ShareForm.php index 9a773b8290..955d57c15f 100644 --- a/web/modules/custom/solution/src/Form/ShareForm.php +++ b/web/modules/custom/solution/src/Form/ShareForm.php @@ -23,7 +23,7 @@ class ShareForm extends OriginalForm { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL): array { return parent::doBuildForm($form, $form_state, $rdf_entity); } diff --git a/web/modules/custom/solution/src/Form/UnshareForm.php b/web/modules/custom/solution/src/Form/UnshareForm.php index 671c9ec41d..c02c56adb9 100644 --- a/web/modules/custom/solution/src/Form/UnshareForm.php +++ b/web/modules/custom/solution/src/Form/UnshareForm.php @@ -24,7 +24,7 @@ class UnshareForm extends OriginalForm { /** * {@inheritdoc} */ - public function buildForm(array $form, FormStateInterface $form_state, RdfInterface $rdf_entity = NULL): array { + public function buildForm(array $form, FormStateInterface $form_state, ?RdfInterface $rdf_entity = NULL): array { return parent::doBuildForm($form, $form_state, $rdf_entity); } diff --git a/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php index a2f0d29ffc..3c654baf40 100644 --- a/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php +++ b/web/modules/custom/solution/src/Plugin/Action/ChangeCollectionAction.php @@ -63,7 +63,7 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} */ - public function access($solution, AccountInterface $account = NULL, $return_as_object = FALSE) { + public function access($solution, ?AccountInterface $account = NULL, $return_as_object = FALSE) { // The access is limited at the view level. return $return_as_object ? AccessResult::allowed() : TRUE; } @@ -84,7 +84,7 @@ public function executeMultiple(array $solutions): void { /** * {@inheritdoc} */ - public function execute(RdfInterface $solution = NULL): void { + public function execute(?RdfInterface $solution = NULL): void { $this->executeMultiple([$solution]); } diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index f020cde6b1..6b32b5325f 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -2687,7 +2687,7 @@ JS; * The button label. * @param string $status * The expected status. Possible values are 'enabled' and 'disabled'. - * @param string $region + * @param string|null $region * (optional) The region name. If left empty, the whole page will be used. * * @throws \InvalidArgumentException @@ -2700,7 +2700,7 @@ JS; * @Then the :button button on the :region region should be :status * @Then the :button button should be :status */ - public function assertButtonStatus(string $button, string $status, string $region = NULL): void { + public function assertButtonStatus(string $button, string $status, ?string $region = NULL): void { if (!in_array($status, ['enabled', 'disabled'])) { throw new InvalidArgumentException('Allowed values for status variable are "enabled" and "disabled".'); } diff --git a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php index 35b644bfec..8a087fa19c 100644 --- a/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php +++ b/web/profiles/joinup/src/Form/SolutionsByLicenceForm.php @@ -169,13 +169,13 @@ protected function getLicenceOptions(): array { /** * Returns the query that counts total of the results. * - * @param string $licence_id + * @param string|null $licence_id * (Optional) A licence id to narrow down the results with. * * @return string * The count query. */ - protected function getCountQuery(string $licence_id = NULL): string { + protected function getCountQuery(?string $licence_id = NULL): string { $query = <<get(self::SOLUTION_PIN_FIELD)->isEmpty(); diff --git a/web/profiles/joinup/src/PinServiceInterface.php b/web/profiles/joinup/src/PinServiceInterface.php index 98c44188e5..01f3e261cf 100644 --- a/web/profiles/joinup/src/PinServiceInterface.php +++ b/web/profiles/joinup/src/PinServiceInterface.php @@ -17,7 +17,7 @@ interface PinServiceInterface { * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity to check. - * @param \Drupal\rdf_entity\RdfInterface $group + * @param \Drupal\rdf_entity\RdfInterface|null $group * The rdf group where the entity should be pinned. Defaults to NULL, * so the function will return TRUE if the entity is pinned in any * group. @@ -25,7 +25,7 @@ interface PinServiceInterface { * @return bool * True if the entity is pinned, false otherwise. */ - public function isEntityPinned(ContentEntityInterface $entity, RdfInterface $group = NULL); + public function isEntityPinned(ContentEntityInterface $entity, ?RdfInterface $group = NULL); /** * Sets the entity pinned status inside a certain group. From 97d7fb498092c2606cbef60d62fc9ff51c2f266e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 11:50:33 +0200 Subject: [PATCH 412/957] ISAICP-5902: Fix CS after merge. --- .../src/CommunityContentWorkflowAccessControlHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php index 90b5c66087..b7e8ef919e 100644 --- a/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php +++ b/web/modules/custom/joinup_community_content/src/CommunityContentWorkflowAccessControlHandler.php @@ -10,8 +10,8 @@ use Drupal\Core\Entity\EntityPublishedInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\joinup_group\JoinupGroupHelper; +use Drupal\joinup_workflow\WorkflowHelperInterface; use Drupal\node\NodeInterface; use Drupal\node\NodeStorageInterface; use Drupal\og\Entity\OgMembership; From 523867c77f90418be3942a53708564626bd94142 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 27 Mar 2020 12:15:57 +0200 Subject: [PATCH 413/957] ISAICP-5708: Update the proxy class for the custom page OG Menu links manager. An existing protected method has been promoted to public. --- .../src/ProxyClass/CustomPageOgMenuLinksManager.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/modules/custom/custom_page/src/ProxyClass/CustomPageOgMenuLinksManager.php b/web/modules/custom/custom_page/src/ProxyClass/CustomPageOgMenuLinksManager.php index 7accbb9c74..07b57fcaba 100644 --- a/web/modules/custom/custom_page/src/ProxyClass/CustomPageOgMenuLinksManager.php +++ b/web/modules/custom/custom_page/src/ProxyClass/CustomPageOgMenuLinksManager.php @@ -107,6 +107,14 @@ public function getOgMenuInstanceByCustomPage(\Drupal\node\NodeInterface $custom return $this->lazyLoadItself()->getOgMenuInstanceByCustomPage($custom_page); } + /** + * {@inheritdoc} + */ + public function getOgMenuInstanceByGroupId(string $group_id) : ?\Drupal\og_menu\OgMenuInstanceInterface + { + return $this->lazyLoadItself()->getOgMenuInstanceByGroupId($group_id); + } + } } From a5a950764d1f71deb271a3f3415d1d52f375af72 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 27 Mar 2020 12:30:15 +0200 Subject: [PATCH 414/957] ISAICP-5708: Use the correct name of the content type which is being included during processing. --- ...eBasicPageContent.php => IncludeCustomPageContent.php} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename web/modules/custom/custom_page/src/Plugin/search_api/processor/{IncludeBasicPageContent.php => IncludeCustomPageContent.php} (93%) diff --git a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php similarity index 93% rename from web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php rename to web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php index 0936e02c78..0c63ce46a9 100644 --- a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeBasicPageContent.php +++ b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php @@ -23,15 +23,15 @@ * custom pages. * * @SearchApiProcessor( - * id = "include_basic_page_content", - * label = @Translation("Include basic page content"), - * description = @Translation("Improves searchability of collections and solutions by including the content of basic pages."), + * id = "include_custom_page_content", + * label = @Translation("Include custom page content"), + * description = @Translation("Improves searchability of collections and solutions by including the content of custom pages."), * stages = { * "preprocess_index" = 0, * }, * ) */ -class IncludeBasicPageContent extends ProcessorPluginBase { +class IncludeCustomPageContent extends ProcessorPluginBase { /** * The custom page provider service. From aae29dadc29e1f98de60277df75cc8935b87341a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 27 Mar 2020 12:31:28 +0200 Subject: [PATCH 415/957] ISAICP-5708: Enable the new search preprocessor. --- config/sync/search_api.index.published.yml | 16 ++++++++++------ config/sync/search_api.index.unpublished.yml | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/config/sync/search_api.index.published.yml b/config/sync/search_api.index.published.yml index d69c715082..55944c8996 100644 --- a/config/sync/search_api.index.published.yml +++ b/config/sync/search_api.index.published.yml @@ -39,9 +39,10 @@ dependencies: - publication_date - user - search_api + - asset_distribution + - custom_page - joinup_search - search_api_solr - - asset_distribution id: published name: 'Published entities index' description: '' @@ -535,8 +536,11 @@ processor_settings: - label - title weights: - preprocess_index: -49 + preprocess_index: -48 preprocess_query: -50 + include_custom_page_content: + weights: + preprocess_index: -49 index_distribution_data: weights: preprocess_index: -50 @@ -602,7 +606,7 @@ processor_settings: - will - with weights: - preprocess_index: -46 + preprocess_index: -45 preprocess_query: -47 tokenizer: all_fields: false @@ -634,7 +638,7 @@ processor_settings: overlap_cjk: 1 minimum_word_size: '3' weights: - preprocess_index: -48 + preprocess_index: -47 preprocess_query: -49 transliteration: all_fields: false @@ -662,7 +666,7 @@ processor_settings: - label - title weights: - preprocess_index: -47 + preprocess_index: -46 preprocess_query: -48 type_boost: boosts: @@ -684,7 +688,7 @@ processor_settings: 'entity:user': datasource_boost: !!float 0 weights: - preprocess_index: -41 + preprocess_index: -42 tracker_settings: default: indexing_order: fifo diff --git a/config/sync/search_api.index.unpublished.yml b/config/sync/search_api.index.unpublished.yml index eb9a5d286a..0e84c27dfc 100644 --- a/config/sync/search_api.index.unpublished.yml +++ b/config/sync/search_api.index.unpublished.yml @@ -36,9 +36,10 @@ dependencies: - rdf_entity - user - search_api + - asset_distribution - joinup_search - search_api_solr - - asset_distribution + - custom_page id: unpublished name: 'Unpublished entities index' description: '' @@ -495,8 +496,11 @@ processor_settings: - label - title weights: - preprocess_index: -49 + preprocess_index: -48 preprocess_query: -50 + include_custom_page_content: + weights: + preprocess_index: -49 index_distribution_data: weights: preprocess_index: -50 @@ -563,7 +567,7 @@ processor_settings: - will - with weights: - preprocess_index: -46 + preprocess_index: -45 preprocess_query: -47 tokenizer: all_fields: false @@ -596,7 +600,7 @@ processor_settings: overlap_cjk: 1 minimum_word_size: '3' weights: - preprocess_index: -48 + preprocess_index: -47 preprocess_query: -49 transliteration: all_fields: false @@ -624,7 +628,7 @@ processor_settings: - label - title weights: - preprocess_index: -47 + preprocess_index: -46 preprocess_query: -48 type_boost: boosts: @@ -649,7 +653,7 @@ processor_settings: 'entity:user': datasource_boost: !!float 0 weights: - preprocess_index: -41 + preprocess_index: -42 tracker_settings: default: indexing_order: fifo From 92360010d3b84f787348540efc8565651f43fce9 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 13:16:22 +0200 Subject: [PATCH 416/957] ISAICP-5578: Refactor the variables so that they don't need to be escaped. --- tests/features/joinup_seo/discussion.feature | 26 ++++++------- tests/features/joinup_seo/document.feature | 26 ++++++------- tests/features/joinup_seo/event.feature | 14 +++---- tests/features/joinup_seo/news.feature | 38 +++++++++---------- .../custom/joinup_seo/joinup_seo.behat.inc | 14 ++++--- 5 files changed, 60 insertions(+), 58 deletions(-) diff --git a/tests/features/joinup_seo/discussion.feature b/tests/features/joinup_seo/discussion.feature index 856a2ed966..6e3856997e 100644 --- a/tests/features/joinup_seo/discussion.feature +++ b/tests/features/joinup_seo/discussion.feature @@ -27,7 +27,7 @@ Feature: SEO for discussion forum posts. | datePublished | 2019-12-25T13:00:00+0100 | | isAccessibleForFree | True | | dateModified | 2020-01-01T13:00:00+0100 | - | mainEntityOfPage | $base_url$/collection/joinup-seo-discussion-collection/discussion/discussions-are-now-forum-posts | + | mainEntityOfPage | __base_url__/collection/joinup-seo-discussion-collection/discussion/discussions-are-now-forum-posts | # Adding numerical property values is turning the "about" property into an array comparison. And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "about" properties: | property | value | @@ -45,35 +45,35 @@ Feature: SEO for discussion forum posts. And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 0: | property | value | | @type | MediaObject | - # $random_text$ can be any string that is appointed by the system and we + # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. - | @id | $base_url$/sites/default/files/test$random_text$.zip | + | @id | __base_url__/sites/default/files/test__random_text__.zip | | name | test.zip | - | url | $base_url$/sites/default/files/test$random_text$.zip | + | url | __base_url__/sites/default/files/test__random_text__.zip | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 1: | property | value | | @type | MediaObject | - # $random_text$ can be any string that is appointed by the system and we + # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. - | @id | $base_url$/sites/default/files/test$random_text$.zip | + | @id | __base_url__/sites/default/files/test__random_text__.zip | | name | test1.zip | - | url | $base_url$/sites/default/files/test$random_text$.zip | + | url | __base_url__/sites/default/files/test__random_text__.zip | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "author" properties: | property | value | | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the - # $random_text$ does not include a / character. - | @id | $base_url$/user/$random_text$ | + # __random_text__ does not include a / character. + | @id | __base_url__/user/__random_text__ | | name | Kindle eReader | - | url | $base_url$/user/$random_text$ | + | url | __base_url__/user/__random_text__ | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "publisher" properties: | property | value | | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the - # $random_text$ does not include a / character. - | @id | $base_url$/user/$random_text$ | + # __random_text__ does not include a / character. + | @id | __base_url__/user/__random_text__ | | name | Kindle eReader | - | url | $base_url$/user/$random_text$ | + | url | __base_url__/user/__random_text__ | When I click "Keep up to date" Then I should see the "Discussions are now forum posts" tile diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index 11ea0b2ffc..d231fc029e 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -31,10 +31,10 @@ Feature: SEO for document content. | name | SEO document | | license | https://example.com/license1 | | description | Document test1.zip | - | datePublished | 2019-12-25T$timezone$:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | | isAccessibleForFree | True | - | dateModified | 2020-01-01T$timezone$:00:00+0100 | - | mainEntityOfPage | $base_url$/sites/default/files/test$random_text$.zip | + | dateModified | 2020-01-01T__timezone__:00:00+0100 | + | mainEntityOfPage | __base_url__/sites/default/files/test__random_text__.zip | # Adding numerical property values is turning the "about" property into an array comparison. And the metatag graph of the item with "name" "SEO document" should have the following "about" properties: | property | value | @@ -44,20 +44,20 @@ Feature: SEO for document content. And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: | property | value | | @type | MediaObject | - # $random_text$ can be any string that is appointed by the system and we + # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. - | @id | $base_url$/sites/default/files/test$random_text$.zip | + | @id | __base_url__/sites/default/files/test__random_text__.zip | | name | test.zip | - | url | $base_url$/sites/default/files/test$random_text$.zip | - | datePublished | 2019-12-25T$timezone$:00:00+0100 | + | url | __base_url__/sites/default/files/test__random_text__.zip | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | And the metatag graph of the item with "name" "SEO document" should have the following "author" properties: | property | value | | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the - # $random_text$ does not include a / character. - | @id | $base_url$/user/$random_text$ | + # __random_text__ does not include a / character. + | @id | __base_url__/user/__random_text__ | | name | Scrapper Jedi | - | url | $base_url$/user/$random_text$ | + | url | __base_url__/user/__random_text__ | When I click "Keep up to date" Then I should see the "SEO document" tile @@ -80,9 +80,9 @@ Feature: SEO for document content. | headline | SEO document | | name | SEO document | | description | Remote url example | - | datePublished | 2019-12-25T$timezone$:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | | isAccessibleForFree | True | - | dateModified | 2020-01-01T$timezone$:00:00+0100 | + | dateModified | 2020-01-01T__timezone__:00:00+0100 | | mainEntityOfPage | http://example.com/some-file-url.extension | And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: | property | value | @@ -90,4 +90,4 @@ Feature: SEO for document content. | @id | http://example.com/some-file-url.extension | | name | some-file-url.extension | | url | http://example.com/some-file-url.extension | - | datePublished | 2019-12-25T$timezone$:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 5e26892cbc..3f15004800 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -30,19 +30,19 @@ Feature: SEO for news articles. | url | | # Summary is preferred over the body of the entity. | description | Summary of event. | - # The $timezone$ variable will allow any 2-digit number in the string. This is because of different timezones in + # The __timezone__ variable will allow any 2-digit number in the string. This is because of different timezones in # different environments. - | startDate | 2019-12-25T$timezone$:00:00+0100 | - | endDate | 2020-01-01T$timezone$:00:00+0100 | - # $base_url$ will be replaced with the base url of the website. + | startDate | 2019-12-25T__timezone__:00:00+0100 | + | endDate | 2020-01-01T__timezone__:00:00+0100 | + # __base_url__ will be replaced with the base url of the website. | @id | | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: | property | value | | @type | ImageObject | | representativeOfPage | True | - # $random_text$ can be any string that is appointed by the system and we + # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name of the image. - | url | $base_url$/sites/default/files/$random_text$.jpg | + | url | __base_url__/sites/default/files/__random_text__.jpg | | width | 377 | | height | 139 | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: @@ -72,7 +72,7 @@ Feature: SEO for news articles. Examples: | web url | expected url | location | expected location | - | | $base_url$/collection/joinup-seo-event-collection/event/joinup-seo-event | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | + | | __base_url__/collection/joinup-seo-event-collection/event/joinup-seo-event | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | # Urls need a title value in the 0 index and a url in the 1 index of the # value to work, otherwise it is parsed wrongly. # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 6c25f38906..481fbb098b 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -19,16 +19,16 @@ Feature: SEO for news articles. Then the metatag JSON should be attached in the page And 1 metatag graph of type "NewsArticle" should exist in the page And the metatag graph of the item with "name" "Joinup SEO news" should have the following properties: - | property | value | - | @type | NewsArticle | - | headline | Headline of Joinup SEO news | + | property | value | + | @type | NewsArticle | + | headline | Headline of Joinup SEO news | # Summary is preferred over the body of the entity. - | description | Summary of news. | - | isAccessibleForFree | True | - | datePublished | 2019-12-25T13:00:00+0100 | - | dateModified | 2020-01-01T13:00:00+0100 | - # $base_url$ will be replaced with the base url of the website. - | mainEntityOfPage | $base_url$/collection/joinup-seo-news-collection/news/joinup-seo-news | + | description | Summary of news. | + | isAccessibleForFree | True | + | datePublished | 2019-12-25T13:00:00+0100 | + | dateModified | 2020-01-01T13:00:00+0100 | + # __base_url__ will be replaced with the base url of the website. + | mainEntityOfPage | __base_url__/collection/joinup-seo-news-collection/news/joinup-seo-news | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "image" properties: | property | value | | @type | ImageObject | @@ -39,17 +39,17 @@ Feature: SEO for news articles. | width | 377 | | height | 139 | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "author" properties: - | property | value | - | @type | Person | - | @id | $base_url$/user/$random_text$ | - | name | Kurk Smith | - | url | $base_url$/user/$random_text$ | + | property | value | + | @type | Person | + | @id | __base_url__/user/__random_text__ | + | name | Kurk Smith | + | url | __base_url__/user/__random_text__ | And the metatag graph of the item with "name" "Joinup SEO news" should have the following "publisher" properties: - | property | value | - | @type | Person | - | @id | $base_url$/user/$random_text$ | - | name | Kurk Smith | - | url | $base_url$/user/$random_text$ | + | property | value | + | @type | Person | + | @id | __base_url__/user/__random_text__ | + | name | Kurk Smith | + | url | __base_url__/user/__random_text__ | When I click "Keep up to date" Then I should see the "Joinup SEO news" tile diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index be3e8e73ff..e76b521391 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -241,13 +241,15 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte // the full url must be always asserted. $base_url = \Drupal::request()->getSchemeAndHttpHost(); - $string = str_replace('$base_url$', $base_url, $string); $string = preg_quote($string, '#'); - if (strpos($string, '$random_text$') || strpos($string, '$timezone$')) { - // $random_text$ is escaped into \$random_text\$ from the preg_quote - // above. - $string = str_replace('\$random_text\$', '([^/]*)?', $string); - $string = str_replace('\$timezone\$', '\d{2}', $string); + $replacements = [ + '__base_url__' => preg_quote($base_url), + '__random_text__' => '([^/]*)?', + '__timezone__' => '\d{2}', + ]; + + foreach ($replacements as $search => $replace) { + $string = str_replace($search, $replace, $string); } return $string; } From 63f6b90ea866f945acdcc6b5a45e39db6e3076ae Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 13:17:08 +0200 Subject: [PATCH 417/957] ISAICP-5578: The svg is not only an svg, but an svg+xml. --- .../sync/metatag.metatag_defaults.global.yml | 2 +- .../features/joinup_seo/basic_metatags.feature | 18 +++++++++--------- .../metatag.metatag_defaults.global.yml | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index a2582f59c9..efe6df6804 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -13,5 +13,5 @@ tags: og_site_name: '[site:name]' og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' og_title: '[current-page:title]' - og_image_type: image/svg + og_image_type: 'image/svg+xml' og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature index a697bf050a..e7f58b6482 100644 --- a/tests/features/joinup_seo/basic_metatags.feature +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -11,23 +11,23 @@ Feature: | identifier | value | | description | Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme. | | abstract | Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions. | - | og:url | $base_url$/ | + | og:url | __base_url__/ | | og:site_name | Joinup | | og:title | Joinup | | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:type | image/svg | + | og:image:type | image/svg+xml | And the HTML title of the page should be "Joinup" When I click "Collections" Then the following meta tags should available in the html: - | identifier | value | - | og:url | $base_url$/collections | - | og:site_name | Joinup | - | og:title | Collections | - | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:type | image/svg | + | identifier | value | + | og:url | __base_url__/collections | + | og:site_name | Joinup | + | og:title | Collections | + | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:type | image/svg+xml | Examples: | user type | diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml index 22ebb0a4d0..e5742c2338 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml @@ -10,5 +10,5 @@ tags: og_site_name: '[site:name]' og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' og_title: '[current-page:title]' - og_image_type: image/svg + og_image_type: 'image/svg+xml' og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' From a4ed95a91a5ed619a45d00224078b6449939f1ad Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 13:24:35 +0200 Subject: [PATCH 418/957] ISAICP-5648: Revert showing only to frontpage. Show everywhere. --- composer.json | 3 +-- composer.lock | 5 ++--- .../tests/src/ExistingSite/EuBrandingTest.php | 9 +++------ 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index ce5dd2d0e1..17ad4ecbf2 100644 --- a/composer.json +++ b/composer.json @@ -330,8 +330,7 @@ "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 in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff", - "Allow selective display of banner @see https://github.com/openeuropa/oe_webtools/pull/122": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/122.diff" + "Add the possibility to display a marker in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff" } } }, diff --git a/composer.lock b/composer.lock index dd6fb3f0bf..692afa0694 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": "ecfda2b9bd5c37c03c858a2af91e1334", + "content-hash": "ce8e9c3a6683b1c7a4e42e7dd924a26f", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -8918,8 +8918,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 in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff", - "Allow selective display of banner @see https://github.com/openeuropa/oe_webtools/pull/122": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/122.diff" + "Add the possibility to display a marker in the map. @see https://github.com/openeuropa/oe_webtools/pull/111": "https://patch-diff.githubusercontent.com/raw/openeuropa/oe_webtools/pull/111.diff" } }, "autoload": { diff --git a/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php b/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php index 10a210af53..bb22c2a7d6 100644 --- a/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php +++ b/web/modules/custom/joinup_core/tests/src/ExistingSite/EuBrandingTest.php @@ -12,24 +12,21 @@ class EuBrandingTest extends JoinupExistingSiteTestBase { /** - * Tests that EU webtools global banner appears only on the home page. + * Tests that EU webtools global banner appears on all pages. */ public function testEuGlobalBanner(): void { - $this->drupalGet(''); - $this->assertSession()->responseContains(''); - // Random picked up pages. $pages = [ + '', '/contact', '/search', '/collections', '/solutions', '/keep-up-to-date', - '/search', ]; foreach ($pages as $page) { $this->drupalGet($page); - $this->assertSession()->responseNotContains('?globan=111" defer>'); + $this->assertSession()->responseContains(''); } } From 23830d4f505e70e386398e545b25b7bfbe6eace2 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 13:35:39 +0200 Subject: [PATCH 419/957] ISAICP-5578: Have image urls be consistent. No need for explicit https version of the logo since our urls are https already. --- .../sync/metatag.metatag_defaults.global.yml | 1 - .../metatag.metatag_defaults.node__event.yml | 2 +- config/sync/system.logging.yml | 2 +- .../joinup_seo/basic_metatags.feature | 30 +++++++++---------- .../metatag.metatag_defaults.node__event.yml | 2 +- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index efe6df6804..0e95a07e16 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -11,7 +11,6 @@ tags: title: '[current-page:title] | [site:name]' og_url: '[current-page:url]' og_site_name: '[site:name]' - og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' og_title: '[current-page:title]' og_image_type: 'image/svg+xml' og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' diff --git a/config/sync/metatag.metatag_defaults.node__event.yml b/config/sync/metatag.metatag_defaults.node__event.yml index 01aa4e24e6..36586014ab 100644 --- a/config/sync/metatag.metatag_defaults.node__event.yml +++ b/config/sync/metatag.metatag_defaults.node__event.yml @@ -7,7 +7,7 @@ label: 'Content: Event' tags: og_image_height: '[node:field_event_logo:height]' og_image_width: '[node:field_event_logo:width]' - og_image_url: '[node:field_event_logo:entity:url]' + og_image: '[node:field_event_logo:entity:url]' og_image_type: '[node:field_event_logo:entity:mime]' schema_event_id: '[node:event_url]' schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' diff --git a/config/sync/system.logging.yml b/config/sync/system.logging.yml index e95b28a484..ef04ecc043 100644 --- a/config/sync/system.logging.yml +++ b/config/sync/system.logging.yml @@ -1,3 +1,3 @@ -error_level: hide +error_level: verbose _core: default_config_hash: u3-njszl92FaxjrCMiq0yDcjAfcdx72w1zT1O9dx6aA diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature index e7f58b6482..8d099876e3 100644 --- a/tests/features/joinup_seo/basic_metatags.feature +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -8,26 +8,24 @@ Feature: Given I am When I am on the homepage Then the following meta tags should available in the html: - | identifier | value | - | description | Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme. | - | abstract | Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions. | - | og:url | __base_url__/ | - | og:site_name | Joinup | - | og:title | Joinup | - | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:type | image/svg+xml | + | identifier | value | + | description | Joinup is a collaborative platform created by the European Commission and funded by the European Union via the Interoperability solutions for public administrations, businesses and citizens (ISA2) Programme. | + | abstract | Joinup offers several services that aim to help e-Government professionals share their experience with each other. We also hope to support them to find, choose, re-use, develop and implement interoperability solutions. | + | og:url | __base_url__/ | + | og:site_name | Joinup | + | og:title | Joinup | + | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:type | image/svg+xml | And the HTML title of the page should be "Joinup" When I click "Collections" Then the following meta tags should available in the html: - | identifier | value | - | og:url | __base_url__/collections | - | og:site_name | Joinup | - | og:title | Collections | - | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:secure_url | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:type | image/svg+xml | + | identifier | value | + | og:url | __base_url__/collections | + | og:site_name | Joinup | + | og:title | Collections | + | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image:type | image/svg+xml | Examples: | user type | diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml index 65b8d824a6..bca89a70a2 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node__event.yml @@ -6,7 +6,7 @@ label: 'Content: Event' tags: og_image_height: '[node:field_event_logo:height]' og_image_width: '[node:field_event_logo:width]' - og_image_url: '[node:field_event_logo:entity:url]' + og_image: '[node:field_event_logo:entity:url]' og_image_type: '[node:field_event_logo:entity:mime]' schema_event_id: '[node:event_url]' schema_event_end_date: '[node:field_event_date:end_date:html_datetime]' From c1c9e1cfe6cf1e01b4f264a579244b6e66ce4012 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 27 Mar 2020 14:36:46 +0200 Subject: [PATCH 420/957] ISAICP-5708: Try to retrieve the custom pages from the menu links. --- .../custom_page/custom_page.services.yml | 2 +- .../custom_page/src/CustomPageProvider.php | 27 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/custom_page/custom_page.services.yml b/web/modules/custom/custom_page/custom_page.services.yml index f32e949954..ff90f149c6 100644 --- a/web/modules/custom/custom_page/custom_page.services.yml +++ b/web/modules/custom/custom_page/custom_page.services.yml @@ -5,7 +5,7 @@ services: lazy: true custom_page.provider: class: Drupal\custom_page\CustomPageProvider - arguments: ['@custom_page.og_menu_links_manager'] + arguments: ['@entity_type.manager', '@custom_page.og_menu_links_manager'] custom_page.route_subscriber: class: Drupal\custom_page\Routing\RouteSubscriber tags: diff --git a/web/modules/custom/custom_page/src/CustomPageProvider.php b/web/modules/custom/custom_page/src/CustomPageProvider.php index 2fa79e53a2..54b9ee28f5 100644 --- a/web/modules/custom/custom_page/src/CustomPageProvider.php +++ b/web/modules/custom/custom_page/src/CustomPageProvider.php @@ -4,11 +4,20 @@ namespace Drupal\custom_page; +use Drupal\Core\Entity\EntityTypeManagerInterface; + /** * Provides custom pages to whoever desires them. */ class CustomPageProvider implements CustomPageProviderInterface { + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + /** * The custom page menu links manager. * @@ -19,10 +28,13 @@ class CustomPageProvider implements CustomPageProviderInterface { /** * Builds a new custom page OG menu links updater service. * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager + * The entity type manager. * @param \Drupal\custom_page\CustomPageOgMenuLinksManagerInterface $menuLinkManager * The custom page menu link manager. */ - public function __construct(CustomPageOgMenuLinksManagerInterface $menuLinkManager) { + public function __construct(EntityTypeManagerInterface $entityTypeManager, CustomPageOgMenuLinksManagerInterface $menuLinkManager) { + $this->entityTypeManager = $entityTypeManager; $this->menuLinkManager = $menuLinkManager; } @@ -40,7 +52,18 @@ public function __construct(CustomPageOgMenuLinksManagerInterface $menuLinkManag */ public function getCustomPagesByGroupId(string $group_id, bool $include_disabled = FALSE): array { $menu_instance = $this->menuLinkManager->getOgMenuInstanceByGroupId($group_id); - // @todo Implement. + if (!empty($menu_instance)) { + $properties = [ + 'bundle' => 'menu_link_content', + 'menu_name' => "ogmenu-{$menu_instance->id()}", + ]; + if (!$include_disabled) { + $properties['enabled'] = 1; + } + + $storage = $this->entityTypeManager->getStorage('menu_link_content'); + $entities = $storage->loadByProperties($properties); + } return []; } From 531ba22e1d32562490fc4dea7a9c527a8297dc57 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 15:51:53 +0200 Subject: [PATCH 421/957] ISAICP-5921: Temporary register UnchangedWorkflowStateUpdateEvent with classmap. --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 17ad4ecbf2..5e0d3fb384 100644 --- a/composer.json +++ b/composer.json @@ -152,6 +152,7 @@ "DrupalProject\\": "src" }, "classmap": [ + "web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php", "scripts/composer/CaptureGitReleaseTag.php", "scripts/composer/RemoveWrongPatchedObjects.php", "scripts/composer/ScriptHandler.php", From c812d3ab58549e55eac35dac608487dabf268148 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 16:07:38 +0200 Subject: [PATCH 422/957] ISAICP-5648: Revert also configuration. --- config/sync/oe_webtools_globan.settings.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/config/sync/oe_webtools_globan.settings.yml b/config/sync/oe_webtools_globan.settings.yml index 21240c7ea0..8c88ffeb16 100644 --- a/config/sync/oe_webtools_globan.settings.yml +++ b/config/sync/oe_webtools_globan.settings.yml @@ -2,8 +2,5 @@ display_eu_flag: true background_theme: dark display_eu_institutions_links: true override_page_lang: '' -visibility: - action: show - pages: '' _core: default_config_hash: HJKRLZYv8UUsI3vEcFMfo1ySREdFv1ERM1kjHptDhdI From 55e698fe399421fa1e9dd8d472014519b91bc728 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 16:16:44 +0200 Subject: [PATCH 423/957] ISAICP-5578: Strict string checking and fix of the site name in nodes. --- config/sync/metatag.metatag_defaults.node.yml | 2 +- tests/features/joinup_seo/news.feature | 8 ++++++++ .../config/install/metatag.metatag_defaults.node.yml | 2 +- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.node.yml b/config/sync/metatag.metatag_defaults.node.yml index 25dd3f927e..0d3492d7cc 100644 --- a/config/sync/metatag.metatag_defaults.node.yml +++ b/config/sync/metatag.metatag_defaults.node.yml @@ -12,6 +12,6 @@ tags: description: '[node:summary]' og_type: '[node:content-type:name]' og_url: '[node:url:absolute]' - og_site_name: '[node:title]' + og_site_name: '[site:name]' og_title: '[node:title]' og_description: '[node:summary]' diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 481fbb098b..284471489a 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -50,6 +50,14 @@ Feature: SEO for news articles. | @id | __base_url__/user/__random_text__ | | name | Kurk Smith | | url | __base_url__/user/__random_text__ | + And the following meta tags should available in the html: + | identifier | value | + | description | Summary of news. | + | og:url | __base_url__/collection/joinup-seo-news-collection/news/joinup-seo-news | + | og:site_name | Joinup | + | og:title | Joinup SEO news | + | og:image | __base_url__/sites/default/files/__random_text__.jpg | + | og:image:type | image/jpeg | When I click "Keep up to date" Then I should see the "Joinup SEO news" tile diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml index a82a7c284d..9cbc45bd92 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.node.yml @@ -9,6 +9,6 @@ tags: description: '[node:summary]' og_type: '[node:content-type:name]' og_url: '[node:url:absolute]' - og_site_name: '[node:title]' + og_site_name: '[site:name]' og_title: '[node:title]' og_description: '[node:summary]' diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index e76b521391..2d620a370f 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -51,7 +51,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte else { $row['value'] = $this->escapeStringWithVariables($row['value']); $actual = $tag->getText(); - $found = preg_match("#{$row['value']}#", $actual) === 1; + $found = preg_match("#^{$row['value']}$#", $actual) === 1; if ($found === FALSE) { $errors[] = [ From 94799b9af86aa4a4250edb5e6c04743f59846de2 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 16:20:02 +0200 Subject: [PATCH 424/957] ISAICP-5578: Add all metadata properties for news. --- tests/features/joinup_seo/news.feature | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/features/joinup_seo/news.feature b/tests/features/joinup_seo/news.feature index 284471489a..bcee477dbb 100644 --- a/tests/features/joinup_seo/news.feature +++ b/tests/features/joinup_seo/news.feature @@ -51,13 +51,19 @@ Feature: SEO for news articles. | name | Kurk Smith | | url | __base_url__/user/__random_text__ | And the following meta tags should available in the html: - | identifier | value | - | description | Summary of news. | - | og:url | __base_url__/collection/joinup-seo-news-collection/news/joinup-seo-news | - | og:site_name | Joinup | - | og:title | Joinup SEO news | - | og:image | __base_url__/sites/default/files/__random_text__.jpg | - | og:image:type | image/jpeg | + | identifier | value | + | description | Summary of news. | + | og:url | __base_url__/collection/joinup-seo-news-collection/news/joinup-seo-news | + | og:site_name | Joinup | + | og:title | Joinup SEO news | + | og:description | Summary of news. | + | og:image | __base_url__/sites/default/files/__random_text__.jpg | + | og:image:type | image/jpeg | + | og:image:width | 377 | + | og:image:height | 139 | + | article:author | Kurk Smith | + | article:published_time | 2019-12-25T13:00:00+0100 | + | article:modified_time | 2020-01-01T13:00:00+0100 | When I click "Keep up to date" Then I should see the "Joinup SEO news" tile From c4d1c880e39811618264dbc646ddc09718193371 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 16:22:45 +0200 Subject: [PATCH 425/957] ISAICP-5921: Hardcode the event ID instead of introducing a dependency. See https://www.drupal.org/project/drupal/issues/2825358. --- composer.json | 1 - .../src/EventSubscriber/CollectionEventSubscriber.php | 2 +- .../src/EventSubscriber/EventSubscriber.php | 2 +- .../src/Event/UnchangedWorkflowStateUpdateEvent.php | 2 -- .../src/Plugin/Field/FieldWidget/StateMachineButtons.php | 2 +- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 5e0d3fb384..17ad4ecbf2 100644 --- a/composer.json +++ b/composer.json @@ -152,7 +152,6 @@ "DrupalProject\\": "src" }, "classmap": [ - "web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php", "scripts/composer/CaptureGitReleaseTag.php", "scripts/composer/RemoveWrongPatchedObjects.php", "scripts/composer/ScriptHandler.php", diff --git a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php index bd1b7d6454..ae4b288b4a 100644 --- a/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php +++ b/web/modules/custom/collection/src/EventSubscriber/CollectionEventSubscriber.php @@ -55,7 +55,7 @@ public function __construct(AccountInterface $currentUser, WorkflowStatePermissi public static function getSubscribedEvents() { return [ PermissionEventInterface::EVENT_NAME => 'provideDefaultOgPermissions', - UnchangedWorkflowStateUpdateEvent::EVENT_NAME => 'onUnchangedWorkflowStateUpdate', + 'joinup_workflow.unchanged_workflow_state_update' => 'onUnchangedWorkflowStateUpdate', ]; } diff --git a/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php b/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php index 49f27090b3..647d7ab29c 100644 --- a/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php +++ b/web/modules/custom/joinup_community_content/src/EventSubscriber/EventSubscriber.php @@ -67,7 +67,7 @@ public function __construct(EntityTypeBundleInfoInterface $entity_type_bundle_in public static function getSubscribedEvents() { return [ OgPermissionEventInterface::EVENT_NAME => [['provideOgRevisionPermissions']], - UnchangedWorkflowStateUpdateEvent::EVENT_NAME => 'onUnchangedWorkflowStateUpdate', + 'joinup_workflow.unchanged_workflow_state_update' => 'onUnchangedWorkflowStateUpdate', ]; } diff --git a/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php index 023a39bd26..ddc87d56d5 100644 --- a/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php +++ b/web/modules/custom/joinup_workflow/src/Event/UnchangedWorkflowStateUpdateEvent.php @@ -17,8 +17,6 @@ */ class UnchangedWorkflowStateUpdateEvent extends Event { - const EVENT_NAME = 'joinup_workflow.unchanged_workflow_state_update'; - /** * The entity being updated. * diff --git a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php index ded2c8ab64..b6df0bde64 100644 --- a/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php +++ b/web/modules/custom/joinup_workflow/src/Plugin/Field/FieldWidget/StateMachineButtons.php @@ -125,7 +125,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen // access, we will add a submit button for the same state update. $state = $items->value; $event = new UnchangedWorkflowStateUpdateEvent($items->getEntity(), $state, $this->getDefaultSameStateUpdateLabel($state), -20); - $this->eventDispatcher->dispatch(UnchangedWorkflowStateUpdateEvent::EVENT_NAME, $event); + $this->eventDispatcher->dispatch('joinup_workflow.unchanged_workflow_state_update', $event); if (!$event->getAccess()->isForbidden()) { $element['#same_state_button'] = [ From 4c5f435414c74f6e3adc01ccb6d294ba7724f081 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 16:25:00 +0200 Subject: [PATCH 426/957] ISAICP-5578: Expand the event SEO test to include the metatags checks. --- tests/features/joinup_seo/event.feature | 37 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/tests/features/joinup_seo/event.feature b/tests/features/joinup_seo/event.feature index 3f15004800..e608cfaccd 100644 --- a/tests/features/joinup_seo/event.feature +++ b/tests/features/joinup_seo/event.feature @@ -19,32 +19,32 @@ Feature: SEO for news articles. Then the metatag JSON should be attached in the page And 1 metatag graph of type "Event" should exist in the page And the metatag graph of the item with "name" "Joinup SEO event" should have the following properties: - | property | value | - | @type | Event | - | name | Joinup SEO event | + | property | value | + | @type | Event | + | name | Joinup SEO event | # Though it would be nice to have this to the Joinup URL, Search Engines # expect this to be the URL of the event. If a website is provided, then # that means that the entity in Joinup is simply a promotion, and all the # handling of registrations etc, already has a website, thus we point to # that location. - | url | | + | url | | # Summary is preferred over the body of the entity. - | description | Summary of event. | + | description | Summary of event. | # The __timezone__ variable will allow any 2-digit number in the string. This is because of different timezones in # different environments. | startDate | 2019-12-25T__timezone__:00:00+0100 | | endDate | 2020-01-01T__timezone__:00:00+0100 | # __base_url__ will be replaced with the base url of the website. - | @id | | + | @id | | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "image" properties: - | property | value | - | @type | ImageObject | - | representativeOfPage | True | + | property | value | + | @type | ImageObject | + | representativeOfPage | True | # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name of the image. | url | __base_url__/sites/default/files/__random_text__.jpg | - | width | 377 | - | height | 139 | + | width | 377 | + | height | 139 | And the metatag graph of the item with "name" "Joinup SEO event" should have the following "location" properties: | property | value | | @type | Place | @@ -62,6 +62,17 @@ Feature: SEO for news articles. # Geo coordinates are hardcoded as offered by the service. | latitude | 45.82372 | | longitude | 6.55121 | + And the following meta tags should available in the html: + | identifier | value | + | description | Summary of event. | + | og:url | __base_url__/collection/joinup-seo-event-collection/event/joinup-seo-event | + | og:site_name | Joinup | + | og:title | Joinup SEO event | + | og:description | Summary of event. | + | og:image | __base_url__/sites/default/files/__random_text__.jpg | + | og:image:type | image/jpeg | + | og:image:width | 377 | + | og:image:height | 139 | When I click "Keep up to date" Then I should see the "Joinup SEO event" tile @@ -71,12 +82,12 @@ Feature: SEO for news articles. And the metatag JSON should not be attached in the page Examples: - | web url | expected url | location | expected location | + | web url | expected url | location | expected location | | | __base_url__/collection/joinup-seo-event-collection/event/joinup-seo-event | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | # Urls need a title value in the 0 index and a url in the 1 index of the # value to work, otherwise it is parsed wrongly. # @see: \Drupal\Driver\Fields\Drupal8\LinkHandler::expand - | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | + | 0: Some url - 1: http://some-random-event-url | http://some-random-event-url | Rue Belliard 28, Brussels, Belgium | Rue Belliard 28 | Scenario: Events without physical address but with online location should still show the online location. Given collections: From f1e50e6f5fa977c7c642b8f8919a814f83f34929 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 16:28:10 +0200 Subject: [PATCH 427/957] ISAICP-5578: Expand the discussion SEO test to include the metatags checks. --- tests/features/joinup_seo/discussion.feature | 47 +++++++++++--------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/tests/features/joinup_seo/discussion.feature b/tests/features/joinup_seo/discussion.feature index 6e3856997e..7d9738b458 100644 --- a/tests/features/joinup_seo/discussion.feature +++ b/tests/features/joinup_seo/discussion.feature @@ -19,14 +19,14 @@ Feature: SEO for discussion forum posts. Then the metatag JSON should be attached in the page And 1 metatag graph of type "DiscussionForumPosting" should exist in the page And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following properties: - | property | value | - | @type | DiscussionForumPosting | - | headline | Discussions are now forum posts | - | name | Discussions are now forum posts | - | description | This discussion is to ensure that SEO tags are set properly. | - | datePublished | 2019-12-25T13:00:00+0100 | - | isAccessibleForFree | True | - | dateModified | 2020-01-01T13:00:00+0100 | + | property | value | + | @type | DiscussionForumPosting | + | headline | Discussions are now forum posts | + | name | Discussions are now forum posts | + | description | This discussion is to ensure that SEO tags are set properly. | + | datePublished | 2019-12-25T13:00:00+0100 | + | isAccessibleForFree | True | + | dateModified | 2020-01-01T13:00:00+0100 | | mainEntityOfPage | __base_url__/collection/joinup-seo-discussion-collection/discussion/discussions-are-now-forum-posts | # Adding numerical property values is turning the "about" property into an array comparison. And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "about" properties: @@ -43,37 +43,44 @@ Feature: SEO for discussion forum posts. | url | https://joinup.ec.europa.eu/sites/default/files/styles/image_style_collection_logo/public/collection/logo/2019-04/190404-logo-JOINUP-blue-2.png | # The index is the delta in the field attachment, with 0 meaning the first of the values. And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 0: - | property | value | - | @type | MediaObject | + | property | value | + | @type | MediaObject | # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. | @id | __base_url__/sites/default/files/test__random_text__.zip | - | name | test.zip | + | name | test.zip | | url | __base_url__/sites/default/files/test__random_text__.zip | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "sharedContent" properties in index 1: - | property | value | - | @type | MediaObject | + | property | value | + | @type | MediaObject | # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. | @id | __base_url__/sites/default/files/test__random_text__.zip | - | name | test1.zip | + | name | test1.zip | | url | __base_url__/sites/default/files/test__random_text__.zip | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "author" properties: - | property | value | - | @type | Person | + | property | value | + | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the # __random_text__ does not include a / character. | @id | __base_url__/user/__random_text__ | - | name | Kindle eReader | + | name | Kindle eReader | | url | __base_url__/user/__random_text__ | And the metatag graph of the item with "name" "Discussions are now forum posts" should have the following "publisher" properties: - | property | value | - | @type | Person | + | property | value | + | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the # __random_text__ does not include a / character. | @id | __base_url__/user/__random_text__ | - | name | Kindle eReader | + | name | Kindle eReader | | url | __base_url__/user/__random_text__ | + And the following meta tags should available in the html: + | identifier | value | + | description | This discussion is to ensure that SEO tags are set properly. | + | og:url | __base_url__/collection/joinup-seo-discussion-collection/discussion/discussions-are-now-forum-posts | + | og:site_name | Joinup | + | og:title | Discussions are now forum posts | + | og:description | This discussion is to ensure that SEO tags are set properly. | When I click "Keep up to date" Then I should see the "Discussions are now forum posts" tile From 34713a685bda883efbf04555b1ed217d04fc22da Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Fri, 27 Mar 2020 16:30:45 +0200 Subject: [PATCH 428/957] ISAICP-5578: Expand the document SEO test to include the metatags checks. --- tests/features/joinup_seo/document.feature | 45 +++++++++++++--------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/tests/features/joinup_seo/document.feature b/tests/features/joinup_seo/document.feature index d231fc029e..0e2b6ffb89 100644 --- a/tests/features/joinup_seo/document.feature +++ b/tests/features/joinup_seo/document.feature @@ -25,15 +25,15 @@ Feature: SEO for document content. Then the metatag JSON should be attached in the page And 1 metatag graph of type "DigitalDocument" should exist in the page And the metatag graph of the item with "name" "SEO document" should have the following properties: - | property | value | - | @type | DigitalDocument | - | headline | SEO document | - | name | SEO document | - | license | https://example.com/license1 | - | description | Document test1.zip | - | datePublished | 2019-12-25T__timezone__:00:00+0100 | - | isAccessibleForFree | True | - | dateModified | 2020-01-01T__timezone__:00:00+0100 | + | property | value | + | @type | DigitalDocument | + | headline | SEO document | + | name | SEO document | + | license | https://example.com/license1 | + | description | Document test1.zip | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | + | isAccessibleForFree | True | + | dateModified | 2020-01-01T__timezone__:00:00+0100 | | mainEntityOfPage | __base_url__/sites/default/files/test__random_text__.zip | # Adding numerical property values is turning the "about" property into an array comparison. And the metatag graph of the item with "name" "SEO document" should have the following "about" properties: @@ -42,22 +42,29 @@ Feature: SEO for document content. | 1 | key2 | | 2 | key3 | And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: - | property | value | - | @type | MediaObject | + | property | value | + | @type | MediaObject | # __random_text__ can be any string that is appointed by the system and we # cannot predict. In this case it is the random file name suffix before the file extension. | @id | __base_url__/sites/default/files/test__random_text__.zip | - | name | test.zip | + | name | test.zip | | url | __base_url__/sites/default/files/test__random_text__.zip | - | datePublished | 2019-12-25T__timezone__:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | And the metatag graph of the item with "name" "SEO document" should have the following "author" properties: - | property | value | - | @type | Person | + | property | value | + | @type | Person | # The user id is only a number but we can be quite certain that this will be a url to the user since the # __random_text__ does not include a / character. | @id | __base_url__/user/__random_text__ | - | name | Scrapper Jedi | + | name | Scrapper Jedi | | url | __base_url__/user/__random_text__ | + And the following meta tags should available in the html: + | identifier | value | + | description | Document test1.zip | + | og:url | __base_url__/collection/joinup-seo-document-collection/document/seo-document | + | og:site_name | Joinup | + | og:title | SEO document | + | og:description | Document test1.zip | When I click "Keep up to date" Then I should see the "SEO document" tile @@ -80,9 +87,9 @@ Feature: SEO for document content. | headline | SEO document | | name | SEO document | | description | Remote url example | - | datePublished | 2019-12-25T__timezone__:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | | isAccessibleForFree | True | - | dateModified | 2020-01-01T__timezone__:00:00+0100 | + | dateModified | 2020-01-01T__timezone__:00:00+0100 | | mainEntityOfPage | http://example.com/some-file-url.extension | And the metatag graph of the item with "name" "SEO document" should have the following "associatedMedia" properties: | property | value | @@ -90,4 +97,4 @@ Feature: SEO for document content. | @id | http://example.com/some-file-url.extension | | name | some-file-url.extension | | url | http://example.com/some-file-url.extension | - | datePublished | 2019-12-25T__timezone__:00:00+0100 | + | datePublished | 2019-12-25T__timezone__:00:00+0100 | From fe6b51fc567d185bc1e3ecaa0bcf2a10f6f7852e Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 19:19:00 +0200 Subject: [PATCH 429/957] ISAICP-5612: Inject licence data in page. --- .../Controller/LicenceComparerController.php | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_licence/src/Controller/LicenceComparerController.php b/web/modules/custom/joinup_licence/src/Controller/LicenceComparerController.php index 4d30630bec..d5f34bafa9 100644 --- a/web/modules/custom/joinup_licence/src/Controller/LicenceComparerController.php +++ b/web/modules/custom/joinup_licence/src/Controller/LicenceComparerController.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_licence\Controller; +use Drupal\Component\Serialization\Json; use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Controller\ControllerBase; use Drupal\joinup_licence\LicenceComparerHelper; @@ -45,12 +46,20 @@ public function compare(array $licences): array { } } - // Collect cache metadata from dependencies. $cache_metadata = new CacheableMetadata(); - foreach ($this->licences as $licence) { + $data = []; + foreach ($this->licences as $spdx_id => $licence) { + // Collect cache metadata from dependencies. $cache_metadata ->addCacheableDependency($licence) ->addCacheableDependency($licence->field_licence_spdx_licence->entity); + + // Build licence data to be attached as Json to the page. + $data[$spdx_id] = [ + 'title' => $licence->label(), + 'description' => check_markup($licence->field_licence_description->value, 'content_editor'), + 'spdxUrl' => $licence->field_licence_spdx_licence->target_id, + ]; } $build = [ @@ -62,6 +71,22 @@ public function compare(array $licences): array { 'class' => ['licence-comparer'], ], ], + '#attached' => [ + 'html_head' => [ + [ + [ + '#type' => 'html_tag', + '#tag' => 'script', + '#value' => Json::encode($data), + '#attributes' => [ + 'type' => 'application/json', + 'data-drupal-selector' => 'licence-comparer-data', + ], + ], + 'licence_comparer_data', + ], + ], + ], ]; $cache_metadata @@ -194,6 +219,7 @@ protected function buildHeader(string $category): array { 'class' => [ 'licence-comparer__header', ], + 'data-licence-id' => $spdx_id, ]; } From 414d8c6632281017a5c0d39752baf488b4c05870 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Fri, 27 Mar 2020 19:19:08 +0200 Subject: [PATCH 430/957] ISAICP-5612: Provide test coverage. --- tests/features/communities/eupl/jla.feature | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/features/communities/eupl/jla.feature b/tests/features/communities/eupl/jla.feature index 1825a859b1..78166d0f1e 100644 --- a/tests/features/communities/eupl/jla.feature +++ b/tests/features/communities/eupl/jla.feature @@ -138,9 +138,9 @@ Feature: | http://joinup.eu/spdx/UPL-1.0 | UPL-1.0 | UPL-1.0 | | http://joinup.eu/spdx/LGPL-2.1 | LGPL-2.1 | LGPL-2.1 | And licences: - | uri | title | spdx licence | legal type | - | http://joinup.eu/licence/apache20 | Apache License, Version 2.0 | Apache-2.0 | Strong Community, Royalty free, Modify, Governments/EU, Use/reproduce | - | http://joinup.eu/licence/gpl2plus | GNU General Public License v2.0 or later | GPL-2.0+ | Distribute | + | uri | title | spdx licence | legal type | description | + | http://joinup.eu/licence/apache20 | Apache License, Version 2.0 | Apache-2.0 | Strong Community, Royalty free, Modify, Governments/EU, Use/reproduce | Apache-2.0 descr | + | http://joinup.eu/licence/gpl2plus | GNU General Public License v2.0 or later | GPL-2.0+ | Distribute | GPL-2.0+ descr | # Test the page when the comparision list is missed. When I am on "/licence/compare" @@ -184,6 +184,7 @@ Feature: When I visit "/licence/compare/Apache-2.0;GPL-2.0+" Then I should see the "licence comparer" table + And the response should contain "" And the "licence comparer" table should be: | Can | Apache-2.0 | GPL-2.0+ | | | | | Use/reproduce | x | | | | | From 50f94aac65d54560a99c6e88e25e21920f1b4763 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 28 Mar 2020 14:25:58 +0200 Subject: [PATCH 431/957] ISAICP-5578: Wrong change of error verbosity. --- config/sync/system.logging.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/system.logging.yml b/config/sync/system.logging.yml index ef04ecc043..e95b28a484 100644 --- a/config/sync/system.logging.yml +++ b/config/sync/system.logging.yml @@ -1,3 +1,3 @@ -error_level: verbose +error_level: hide _core: default_config_hash: u3-njszl92FaxjrCMiq0yDcjAfcdx72w1zT1O9dx6aA From b12e5eb83d7cb860fd060edc7bca5bb28cf12992 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 28 Mar 2020 14:27:18 +0200 Subject: [PATCH 432/957] ISAICP-5578: Don't harcode the logo URL. --- config/sync/metatag.metatag_defaults.global.yml | 3 ++- tests/features/joinup_seo/basic_metatags.feature | 14 +++++++------- .../install/metatag.metatag_defaults.global.yml | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index 0e95a07e16..759e8e8a5c 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -11,6 +11,7 @@ tags: title: '[current-page:title] | [site:name]' og_url: '[current-page:url]' og_site_name: '[site:name]' + og_image_secure_url: '[site:url]themes/joinup/images/logo.svg' og_title: '[current-page:title]' og_image_type: 'image/svg+xml' - og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' + og_image: '[site:url]themes/joinup/images/logo.svg' diff --git a/tests/features/joinup_seo/basic_metatags.feature b/tests/features/joinup_seo/basic_metatags.feature index 8d099876e3..67680241e8 100644 --- a/tests/features/joinup_seo/basic_metatags.feature +++ b/tests/features/joinup_seo/basic_metatags.feature @@ -14,18 +14,18 @@ Feature: | og:url | __base_url__/ | | og:site_name | Joinup | | og:title | Joinup | - | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | + | og:image | __base_url__/themes/joinup/images/logo.svg | | og:image:type | image/svg+xml | And the HTML title of the page should be "Joinup" When I click "Collections" Then the following meta tags should available in the html: - | identifier | value | - | og:url | __base_url__/collections | - | og:site_name | Joinup | - | og:title | Collections | - | og:image | https://joinup.ec.europa.eu/themes/joinup/images/logo.svg | - | og:image:type | image/svg+xml | + | identifier | value | + | og:url | __base_url__/collections | + | og:site_name | Joinup | + | og:title | Collections | + | og:image | __base_url__/themes/joinup/images/logo.svg | + | og:image:type | image/svg+xml | Examples: | user type | diff --git a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml index e5742c2338..a237f84ebc 100644 --- a/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml +++ b/web/modules/custom/joinup_seo/config/install/metatag.metatag_defaults.global.yml @@ -8,7 +8,7 @@ tags: title: '[current-page:title] | [site:name]' og_url: '[current-page:url]' og_site_name: '[site:name]' - og_image_secure_url: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' + og_image_secure_url: '[site:url]themes/joinup/images/logo.svg' og_title: '[current-page:title]' og_image_type: 'image/svg+xml' - og_image: 'https://joinup.ec.europa.eu/themes/joinup/images/logo.svg' + og_image: '[site:url]themes/joinup/images/logo.svg' From ba6000c046f85503d4704ab7a61d3e8e00fec893 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 28 Mar 2020 14:28:28 +0200 Subject: [PATCH 433/957] ISAICP-5578: Fix acronym letter capitalization and verb past tense form. --- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index faf914bdb4..3f163b54ad 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -236,9 +236,9 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The converted string. */ 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 missleaded. Thus, - // the full url must be always asserted. + // 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(); $string = preg_quote($string, '#'); From 4b47ef99171a43f528c5268ba79f8bbf90a1f2ef Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Sat, 28 Mar 2020 14:28:55 +0200 Subject: [PATCH 434/957] ISAICP-5578: Optimize replacement code. --- web/modules/custom/joinup_seo/joinup_seo.behat.inc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 3f163b54ad..a61f91fa91 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -248,10 +248,7 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte '__timezone__' => '\d{2}', ]; - foreach ($replacements as $search => $replace) { - $string = str_replace($search, $replace, $string); - } - return $string; + return strtr($string, $replacements); } /** From fe42a73863c6a77852c52d6836518b8b5474e245 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 29 Mar 2020 22:16:55 +0300 Subject: [PATCH 435/957] ISAICP-5413: Provide a test to ensure that metadata are attached to the rdf_entities. --- tests/features/joinup_seo/rdf_entity.feature | 47 +++++++++++++++ .../custom/joinup_seo/joinup_seo.behat.inc | 57 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 tests/features/joinup_seo/rdf_entity.feature diff --git a/tests/features/joinup_seo/rdf_entity.feature b/tests/features/joinup_seo/rdf_entity.feature new file mode 100644 index 0000000000..b6d62191af --- /dev/null +++ b/tests/features/joinup_seo/rdf_entity.feature @@ -0,0 +1,47 @@ +@api @terms +Feature: SEO for RDF entities. + As an owner of the website + in order for my RDF entities to be better visible on the web + I need proper meta information to be encapsulated in the html code. + + Scenario Outline: Basic JSON meta information for collections and solutions. + Given the following : + | title | SEO entity | + | state | validated | + + When I visit the "SEO entity" + Then the rdf metadata of the "SEO entity" rdf entity should be attached in the page + + When I click "" + Then the rdf metadata of the "SEO entity" rdf entity should not be attached in the page + + Examples: + | type | link | + | collection | Collections | + | solution | Solutions | + + Scenario: Basic JSON meta information for releases and distributions. + Given the following solution: + | title | SEO solution | + | state | validated | + And the following release: + | title | SEO release | + | is version of | SEO solution | + | state | validated | + And the following distribution: + | title | SEO distribution | + | parent | SEO release | + + When I go to the "SEO release" release + Then the rdf metadata of the "SEO release" rdf entity should be attached in the page + + When I go to the "SEO distribution" distribution + Then the rdf metadata of the "SEO distribution" rdf entity should be attached in the page + + Scenario: Basic JSON meta information for licences. + Given the following licence: + | title | SEO licence | + | description | Licence to perform SEO | + | type | Public domain | + When I go to the "SEO licence" licence + Then the rdf metadata of the "SEO licence" rdf entity should be attached in the page diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 0e83b4b3ef..46d50a9bb1 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -10,6 +10,8 @@ declare(strict_types = 1); use Behat\Gherkin\Node\TableNode; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Context\DrupalSubContextInterface; +use Drupal\joinup\Traits\RdfEntityTrait; +use Drupal\rdf_entity\RdfInterface; use PHPUnit\Framework\Assert; /** @@ -17,6 +19,8 @@ use PHPUnit\Framework\Assert; */ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubContextInterface { + use RdfEntityTrait; + /** * Asserts a meta tag value in the page. * @@ -276,4 +280,57 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte return $graphs_found; } + /** + * Asserts that the full metadata of the entity are attached in the page. + * + * @param string $title + * The rdf entity title. + * + * @throws \Exception + * Thrown when the entity is not found or the metadata are not displayed in + * the page. + * + * @Then the rdf metadata of the :title rdf entity should be attached in the page + */ + public function assertSerializedRdfMetadataInPage(string $title): void { + $rdf_entity = $this->getRdfEntityByLabel($title); + $json_output = $this->generateSerializedData($rdf_entity); + $this->assertSession()->responseContains($json_output); + } + + /** + * Asserts that the full metadata of the entity are not attached in the page. + * + * @param string $title + * The rdf entity title. + * + * @throws \Exception + * Thrown when the entity is not found or the metadata are not displayed in + * the page. + * + * @Then the rdf metadata of the :title rdf entity should not be attached in the page + */ + public function assertSerializedRdfMetadataNotInPage(string $title): void { + $rdf_entity = $this->getRdfEntityByLabel($title); + $json_output = $this->generateSerializedData($rdf_entity); + $this->assertSession()->responseNotContains($json_output); + } + + /** + * Generates the serialized metadata for the RDF entity. + * + * @param \Drupal\rdf_entity\RdfInterface $rdf_entity + * The RDF entity. + * + * @return string + * The serialized metadata. + */ + protected function generateSerializedData(RdfInterface $rdf_entity): string { + /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ + $serializer = \Drupal::service('sparql_entity.serializer'); + $json_output = $serializer->serializeEntity($rdf_entity, 'jsonld'); + $json_output = trim($json_output, '[]'); + return $json_output; + } + } From 1cc89a1a4c1c4909c21f2c188956b4e18aee3a62 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Sun, 29 Mar 2020 22:20:45 +0300 Subject: [PATCH 436/957] ISAICP-5413: Provide metadata for rdf_entities according to their serialized objects. --- .../custom/joinup_seo/joinup_seo.module | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index e1ce51a98f..91e15a4645 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -62,3 +62,52 @@ function joinup_seo_metatags_alter(array &$metatags, array &$context) { } $metatags['schema_social_media_posting_shared_content'] = serialize($tags); } + +/** + * Implements hook_page_attachments(). + */ +function joinup_seo_page_attachments(array &$attachments) { + /** @var \Drupal\Core\Routing\RouteMatchInterface $route_match */ + $route_match = \Drupal::service('current_route_match'); + if ($route_match->getRouteName() !== 'entity.rdf_entity.canonical') { + return; + } + + if (!$entity = $route_match->getParameter('rdf_entity')) { + return; + } + + $allowed_bundles = [ + 'collection', + 'solution', + 'asset_release', + 'asset_distribution', + 'licence', + ]; + // Owners and contact information entities are not viewable by anonymous users + // in their canonical route so there is no point attaching metadata to these + // pages. + if (!in_array($entity->bundle(), $allowed_bundles)) { + return; + } + + /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ + $serializer = \Drupal::service('sparql_entity.serializer'); + if (!$output = $serializer->serializeEntity($entity, 'jsonld')) { + return; + } + + // Serializer returns an array so we remove the outer array enclosure tags + // to output the only element standalone. Works like reset(). + $output = trim($output, '[]'); + $attachments['#attached']['html_head'][] = [ + [ + '#tag' => 'script', + '#attributes' => [ + 'type' => 'application/json', + ], + '#value' => $output, + ], + 'rdf_entity_ld_json', + ]; +} From 8ec14aa79405d36b9b67a3aa8e5b483358bfc9fd Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 30 Mar 2020 10:35:01 +0300 Subject: [PATCH 437/957] ISAICP-5413: Specify the region of the text to ensure that the text from the source is not included. --- tests/features/collection/collection.about.feature | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/features/collection/collection.about.feature b/tests/features/collection/collection.about.feature index 48adb74e46..183d0dcc23 100644 --- a/tests/features/collection/collection.about.feature +++ b/tests/features/collection/collection.about.feature @@ -32,7 +32,7 @@ Feature: About page Then the page should contain the html text "Fit while working is dope" And I should see the text "leo blandit a ornare non sollicitudin iaculis…" # Check that later chunks of text in the abstract are not rendered. - But I should not see the text "purus. Integer nec enim facilisis mi fermentum mollis sed vitae lacus" + But I should not see the text "purus. Integer nec enim facilisis mi fermentum mollis sed vitae lacus" in the Content region And I should not see the text "This collection is intended to show ways of being fit while working" # The 'Read more' link leads to the About page. @@ -54,7 +54,7 @@ Feature: About page And I press "Publish" Then I should see the heading "Fitness at work" And the page should contain the html text "This collection is intended to show ways of being fit while working" - And I should see the text "In consequat sapien risus a malesuada…" - But I should not see the text "malesuada eros auctor eget. Curabitur at" + And I should see the text "In consequat sapien risus a malesuada…" in the Content region + But I should not see the text "malesuada eros auctor eget. Curabitur at" in the Content region When I click "Read more" in the "Content" region Then I should see the heading "About Fitness at work" From 9749d33786fd32afcbb3edd17ec5ddc1d246d75f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 30 Mar 2020 13:31:30 +0300 Subject: [PATCH 438/957] ISAICP-5931: Remove incorrect hook implementation. --- .../custom/custom_page/custom_page.module | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index d200264de3..e8f8f4789e 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -8,7 +8,6 @@ declare(strict_types = 1); use Drupal\Core\Access\AccessResult; -use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Field\FieldDefinitionInterface; @@ -16,11 +15,9 @@ use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_group\JoinupGroupHelper; use Drupal\node\NodeInterface; -use Drupal\og\Entity\OgMembership; use Drupal\og\Og; use Drupal\og\OgGroupAudienceHelperInterface; use Drupal\search_api\Query\QueryInterface; -use Drupal\user\Entity\User; /** * Implements hook_entity_bundle_field_info_alter(). @@ -33,29 +30,6 @@ function custom_page_entity_bundle_field_info_alter(&$fields, EntityTypeInterfac } } -/** - * Implements hook_og_membership_insert(). - * - * We will invalidate the specific user's rdf_entity tag based cache - * every time a new membership is inserted.. - * The reason behind this is that we want to cache content per users - * e.g. blocks. OG invalidates the cache of the specific user's membership - * when the membership is updated or deleted but flushes all membership list - * when a new membership is created. - * This will have an impact to the performance if we had to flush all the - * membership specific content for all users every time a membership is created. - * - * @var \Drupal\og\Entity\OgMembership $og_membership - * The membership that has just been inserted. - */ -function custom_page_og_membership_insert(OgMembership $og_membership) { - $account = \Drupal::currentUser(); - $current_user = User::load($account->id()); - $tag = 'rdf_entity:' . $current_user->getEntityTypeId() . ':' . $current_user->id(); - - Cache::invalidateTags([$tag]); -} - /** * Implements hook_ENTITY_TYPE_insert(). * From c842880a110a8fb6cfaedc90c4f654df063f3211 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Mon, 30 Mar 2020 14:40:38 +0300 Subject: [PATCH 439/957] ISAICP-5708: Ensure that the parent group is reindexed whenever a custom page changes. --- .../custom/custom_page/custom_page.module | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index d200264de3..b89533bf07 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -19,6 +19,7 @@ use Drupal\node\NodeInterface; use Drupal\og\Entity\OgMembership; use Drupal\og\Og; use Drupal\og\OgGroupAudienceHelperInterface; +use Drupal\search_api\Plugin\search_api\datasource\ContentEntity; use Drupal\search_api\Query\QueryInterface; use Drupal\user\Entity\User; @@ -59,16 +60,35 @@ function custom_page_og_membership_insert(OgMembership $og_membership) { /** * Implements hook_ENTITY_TYPE_insert(). * - * Create a menu link when a custom page gets saved. + * - Creates a menu link whenever a new custom page is created. + * - Reindexes the parent collection/solution so that they are searchable using + * the content of the new custom page. */ function custom_page_node_insert(EntityInterface $entity) { if ($entity->bundle() === 'custom_page') { \Drupal::service('custom_page.og_menu_links_manager')->addLink($entity); } + + // The content of custom pages is included in the search index of their + // collections and solutions, so that the parent group can be found when + // searching for keywords contained in their custom pages. Make sure to + // reindex the parent group so that the new custom page is included. + // @see \Drupal\custom_page\Plugin\search_api\processor\IncludeCustomPageContent + $parent = $entity->og_audience->entity; + if (!empty($parent)) { + ContentEntity::indexEntity($entity->og_audience->entity); + } } /** * Implements hook_ENTITY_TYPE_update(). + * + * - Updates links to this custom page if the title has changed or if the page + * becomes (un)published. + * - When a custom page moves to a new group, move the link to the menu of the + * new group. + * - Reindexes the parent collection/solution so that they are searchable using + * the content of the new custom page. */ function custom_page_node_update(NodeInterface $entity) { if ($entity->bundle() !== 'custom_page') { @@ -97,6 +117,38 @@ function custom_page_node_update(NodeInterface $entity) { \Drupal::service('custom_page.og_menu_links_manager') ->moveLinks($original, $entity->og_audience->target_id); } + + // The content of custom pages is included in the search index of their + // collections and solutions, so that the parent group can be found when + // searching for keywords contained in their custom pages. Make sure to + // reindex the parent group so that the changed content is included. + // @see \Drupal\custom_page\Plugin\search_api\processor\IncludeCustomPageContent + $parent = $entity->og_audience->entity; + if (!empty($parent)) { + ContentEntity::indexEntity($entity->og_audience->entity); + } +} + +/** + * Implements hook_ENTITY_TYPE_delete(). + * + * - Reindexes the parent collection/solution so that the content of the deleted + * custom page no longer shows up in the search results for the parent group. + */ +function custom_page_node_delete(NodeInterface $entity) { + if ($entity->bundle() !== 'custom_page') { + return; + } + + // The content of custom pages is included in the search index of their + // collections and solutions, so that the parent group can be found when + // searching for keywords contained in their custom pages. Make sure to + // reindex the parent group so that the deleted content is no longer included. + // @see \Drupal\custom_page\Plugin\search_api\processor\IncludeCustomPageContent + $parent = $entity->og_audience->entity; + if (!empty($parent)) { + ContentEntity::indexEntity($entity->og_audience->entity); + } } /** From 1533cff523d41b72cbff56589565c3425aec4648 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 30 Mar 2020 20:20:22 +0300 Subject: [PATCH 440/957] ISAICP-5872: Provide a fix for the accounts with empty email. --- .../joinup_core/joinup_core.post_update.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index b02c67b45d..1db7c0d03b 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1134,3 +1134,29 @@ function joinup_core_post_update_delete_orphaned_solutions() { $solution->delete(); } } + +/** + * Implements hook_post_update_NAME(). + */ +function joinup_core_post_update_fix_broken_accounts(&$sandbox) { + // Delete test accounts without email. + foreach (['test_cancel', 'test_cancel_mod'] as $user_name) { + if ($user = user_load_by_name($user_name)) { + $user->delete(); + } + } + + $user_storage = \Drupal::entityTypeManager()->getStorage('user'); + $uids = $user_storage + ->getQuery() + ->notExists('mail') + ->execute(); + // Remove the anonymous user. + unset($uids['0']); + /** @var \Drupal\user\UserInterface $user */ + foreach ($user_storage->loadMultiple($uids) as $user) { + $mail = $user->getAccountName() . '@example.com'; + $user->setEmail($mail); + $user->save(); + } +} From 4f4d026d4d6f65688b740164834885ae550b92f3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Mon, 30 Mar 2020 20:43:07 +0300 Subject: [PATCH 441/957] ISAICP-5872: Fix QA remarks. --- web/modules/custom/joinup_core/joinup_core.post_update.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 1db7c0d03b..15dd0a6424 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1136,7 +1136,7 @@ function joinup_core_post_update_delete_orphaned_solutions() { } /** - * Implements hook_post_update_NAME(). + * Fix broken accounts with empty emails. */ function joinup_core_post_update_fix_broken_accounts(&$sandbox) { // Delete test accounts without email. @@ -1150,9 +1150,9 @@ function joinup_core_post_update_fix_broken_accounts(&$sandbox) { $uids = $user_storage ->getQuery() ->notExists('mail') + ->condition('uid', 0, '!=') ->execute(); - // Remove the anonymous user. - unset($uids['0']); + /** @var \Drupal\user\UserInterface $user */ foreach ($user_storage->loadMultiple($uids) as $user) { $mail = $user->getAccountName() . '@example.com'; From 7823efe43f493bf9899db00457f642fd265fa593 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Tue, 31 Mar 2020 10:48:00 +0300 Subject: [PATCH 442/957] ISAICP-5872: Move the post-update path in the right place. --- .../joinup_core/joinup_core.post_update.php | 26 ------------------- .../joinup_user/joinup_user.post_update.php | 26 +++++++++++++++++++ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/web/modules/custom/joinup_core/joinup_core.post_update.php b/web/modules/custom/joinup_core/joinup_core.post_update.php index 15dd0a6424..b02c67b45d 100644 --- a/web/modules/custom/joinup_core/joinup_core.post_update.php +++ b/web/modules/custom/joinup_core/joinup_core.post_update.php @@ -1134,29 +1134,3 @@ function joinup_core_post_update_delete_orphaned_solutions() { $solution->delete(); } } - -/** - * Fix broken accounts with empty emails. - */ -function joinup_core_post_update_fix_broken_accounts(&$sandbox) { - // Delete test accounts without email. - foreach (['test_cancel', 'test_cancel_mod'] as $user_name) { - if ($user = user_load_by_name($user_name)) { - $user->delete(); - } - } - - $user_storage = \Drupal::entityTypeManager()->getStorage('user'); - $uids = $user_storage - ->getQuery() - ->notExists('mail') - ->condition('uid', 0, '!=') - ->execute(); - - /** @var \Drupal\user\UserInterface $user */ - foreach ($user_storage->loadMultiple($uids) as $user) { - $mail = $user->getAccountName() . '@example.com'; - $user->setEmail($mail); - $user->save(); - } -} diff --git a/web/modules/custom/joinup_user/joinup_user.post_update.php b/web/modules/custom/joinup_user/joinup_user.post_update.php index bcdd4e1855..6642dab376 100644 --- a/web/modules/custom/joinup_user/joinup_user.post_update.php +++ b/web/modules/custom/joinup_user/joinup_user.post_update.php @@ -180,3 +180,29 @@ function joinup_user_post_update_unsubscribe_all_members() { $database = \Drupal::database(); $database->truncate('og_membership__subscription_bundles')->execute(); } + +/** + * Fix broken accounts with empty emails. + */ +function joinup_user_post_update_fix_broken_accounts(): void { + // Delete test accounts without email. + foreach (['test_cancel', 'test_cancel_mod'] as $user_name) { + if ($user = user_load_by_name($user_name)) { + $user->delete(); + } + } + + $user_storage = \Drupal::entityTypeManager()->getStorage('user'); + $uids = $user_storage + ->getQuery() + ->notExists('mail') + ->condition('uid', 0, '!=') + ->execute(); + + /** @var \Drupal\user\UserInterface $user */ + foreach ($user_storage->loadMultiple($uids) as $user) { + $mail = $user->getAccountName() . '@example.com'; + $user->setEmail($mail); + $user->save(); + } +} From 89ebb7d0374ff45d5f0f19fbac4f20636feac959 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 31 Mar 2020 12:20:06 +0300 Subject: [PATCH 443/957] ISAICP-5442: Update the test to verify the states of the button. --- tests/features/joinup_subscription/my_subscriptions.feature | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/features/joinup_subscription/my_subscriptions.feature b/tests/features/joinup_subscription/my_subscriptions.feature index cfe46822da..e2e20d5537 100644 --- a/tests/features/joinup_subscription/my_subscriptions.feature +++ b/tests/features/joinup_subscription/my_subscriptions.feature @@ -74,6 +74,7 @@ Feature: My subscriptions And I click "My subscriptions" Then I should see the heading "My subscriptions" And I should see the text "No collection memberships yet. Join one or more collections to subscribe to their content!" + But I should not see the link "Unsubscribe from all" And I should not see the text "Alpha Centauri" # Log in as a user that is a member of 3 collections. The subscriptions for @@ -87,6 +88,7 @@ Feature: My subscriptions # The empty text should not be shown now. Then I should not see the text "No collection memberships yet." + And I should not see the link "Unsubscribe from all" And the following collection content subscriptions should be selected: | Alpha Centauri | | @@ -129,6 +131,8 @@ Feature: My subscriptions And I wait for AJAX to finish Then I should not see the "Save changes" button on the "Alpha Centauri" subscription card But I should see the "Saved!" button on the "Alpha Centauri" subscription card + # The button "Unsubscribe from all" is now visible. + And I should see the link "Unsubscribe from all" And the "Saved!" button on the "Alpha Centauri" subscription card should be disabled And the "Save changes" button on the "Barnard's Star" subscription card should be disabled @@ -153,6 +157,8 @@ Feature: My subscriptions And the "Save changes" button on the "Wolf 359" subscription card should be enabled Given I press "Save changes" on the "Alpha Centauri" subscription card And I wait for AJAX to finish + # No subscriptions actually exist even though one is selected. + And I should not see the link "Unsubscribe from all" Then I should not see the "Save changes" button on the "Alpha Centauri" subscription card But I should see the "Saved!" button on the "Alpha Centauri" subscription card From e01721a83f8e9f5a64993c085c0f5fc551a3e128 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 31 Mar 2020 12:24:32 +0300 Subject: [PATCH 444/957] ISAICP-5442: Properly enable/disable the 'Unsubscribe from all' button. --- .../src/Form/MySubscriptionsForm.php | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php index 524561f2bc..31a4f37f8a 100644 --- a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php +++ b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php @@ -6,6 +6,8 @@ use Drupal\Component\Serialization\Json; use Drupal\Component\Utility\Html; +use Drupal\Core\Ajax\AjaxResponse; +use Drupal\Core\Ajax\ReplaceCommand; use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormBase; @@ -136,10 +138,9 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $form['collections']['#tree'] = TRUE; $bundle_info = $this->entityTypeBundleInfo->getBundleInfo('node'); - // Keep track if the user has any memberships with active subscriptions. If - // this is the case we will show the 'Unsubscribe from all' button at the - // bottom of the form. - $memberships_with_subscription = FALSE; + // Keep track of the collections with subscriptions in order to properly + // show or hide the 'Unsubscribe from all' button in the end of the page. + $collections_with_subscription = $form_state->has('collections_with_subscription') ? $form_state->get('collections_with_subscription') : []; foreach ($memberships as $membership) { $collection = $membership->getGroup(); if ($collection === NULL) { @@ -177,13 +178,14 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $subscription_status = []; + $membership_has_subscription = FALSE; foreach (CommunityContentHelper::BUNDLES as $key => $bundle_id) { $subscription_bundles = $membership->get('subscription_bundles')->getIterator()->getArrayCopy(); $value = array_reduce($subscription_bundles, function (bool $carry, EntityBundlePairItem $entity_bundle_pair) use ($bundle_id): bool { return $carry || $entity_bundle_pair->getBundleId() === $bundle_id; }, FALSE); - if (!$memberships_with_subscription && $value) { - $memberships_with_subscription = TRUE; + if (!$membership_has_subscription && $value) { + $membership_has_subscription = TRUE; } $form['collections'][$collection->id()]['bundles'][$bundle_id] = [ '#type' => 'checkbox', @@ -199,10 +201,13 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $subscription_status[$key] = $value; } + if ($membership_has_subscription) { + $collections_with_subscription[$collection->id()] = $collection->id(); + } + $form['collections'][$collection->id()]['bundles']['submit'] = [ '#ajax' => [ 'callback' => '::reloadCollection', - 'wrapper' => 'collection-' . $clean_collection_id, ], '#name' => 'submit-' . $clean_collection_id, '#submit' => ['::submitForm'], @@ -225,18 +230,23 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $form['edit-actions'] = [ '#type' => 'container', + '#id' => 'edit-actions', '#attributes' => ['class' => 'form__subscribe-actions'], ]; $form['edit-actions']['unsubscribe_all'] = [ '#type' => 'link', + '#attached' => [], '#title' => $this->t('Unsubscribe from all'), '#url' => Url::fromRoute('joinup_subscription.unsubscribe_all', [ 'user' => $user->id(), ]), - '#access' => $memberships_with_subscription, + '#access' => !empty($collections_with_subscription), ]; + // Store the information for the AJAX submit handlers to properly update the + // form. + $form_state->set('collections_with_subscription', $collections_with_subscription); return $form; } @@ -247,7 +257,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $collection_id = $this->getTriggeringElementCollectionId($form_state); $collection = $this->entityTypeManager->getStorage('rdf_entity')->load($collection_id); $user = $form_state->getBuildInfo()['args'][0]; - $membership = $this->membershipManager->getMembership($collection, $user); + $membership = $this->membershipManager->getMembership($collection, $user->id()); // Check if the subscriptions have changed. This allows us to skip saving // the membership entity if nothing changed. @@ -311,11 +321,12 @@ public function reloadFrequency(array &$form, FormStateInterface $form_state): a * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * - * @return array - * The render array containing the updated collection to refresh. + * @return \Drupal\Core\Ajax\AjaxResponse + * An AJAX response. */ - public function reloadCollection(array &$form, FormStateInterface $form_state): array { + public function reloadCollection(array &$form, FormStateInterface $form_state): AjaxResponse { $submitted_collection_id = $this->getTriggeringElementCollectionId($form_state); + $collections_with_subscription = $form_state->get('collections_with_subscription'); $form['collections'][$submitted_collection_id]['bundles']['submit']['#value'] = $this->t('Saved!'); // Change status of checkboxes. @@ -325,7 +336,22 @@ public function reloadCollection(array &$form, FormStateInterface $form_state): } $form['collections'][$submitted_collection_id]['bundles']['submit']['#attributes']['data-drupal-subscriptions'] = Json::encode($subscription_status); - return $form['collections'][$submitted_collection_id]; + // Add or remove the collection to the list of collections with a + // subscription to properly handle the 'Unsubscribe from all' button. + if (empty(array_filter($subscription_status)) && isset($collections_with_subscription[$submitted_collection_id])) { + unset($collections_with_subscription[$submitted_collection_id]); + } + else { + $collections_with_subscription[$submitted_collection_id] = $submitted_collection_id; + } + + $form_state->set('collections_with_subscription', $collections_with_subscription); + $form['edit-actions']['unsubscribe_all']['#access'] = !empty($collections_with_subscription); + + $response = new AjaxResponse(); + $response->addCommand(new ReplaceCommand("#{$form['collections'][$submitted_collection_id]['#id']}", $form['collections'][$submitted_collection_id])); + $response->addCommand(new ReplaceCommand('#edit-actions', $form['edit-actions'])); + return $response; } /** From efe83012489fbbec2035ffc6bf998fb79e35e5c5 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 31 Mar 2020 15:07:27 +0300 Subject: [PATCH 445/957] ISAICP-5413: Do not output the data only for certain cases. --- web/modules/custom/joinup_seo/joinup_seo.module | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index 91e15a4645..69f993316f 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -77,20 +77,6 @@ function joinup_seo_page_attachments(array &$attachments) { return; } - $allowed_bundles = [ - 'collection', - 'solution', - 'asset_release', - 'asset_distribution', - 'licence', - ]; - // Owners and contact information entities are not viewable by anonymous users - // in their canonical route so there is no point attaching metadata to these - // pages. - if (!in_array($entity->bundle(), $allowed_bundles)) { - return; - } - /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ $serializer = \Drupal::service('sparql_entity.serializer'); if (!$output = $serializer->serializeEntity($entity, 'jsonld')) { From 1872a2e4b8e5ffc5dff790849ee7ef150af8b9e4 Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 31 Mar 2020 15:32:24 +0200 Subject: [PATCH 446/957] gulpfile updated so sass can be runned --- web/themes/joinup/prototype/gulpfile.js | 78 +- web/themes/joinup/prototype/package-lock.json | 30369 +++------------- web/themes/joinup/prototype/package.json | 15 +- 3 files changed, 5107 insertions(+), 25355 deletions(-) diff --git a/web/themes/joinup/prototype/gulpfile.js b/web/themes/joinup/prototype/gulpfile.js index e89d8b5c4e..b4d8686c95 100644 --- a/web/themes/joinup/prototype/gulpfile.js +++ b/web/themes/joinup/prototype/gulpfile.js @@ -4,18 +4,16 @@ var gulp = require('gulp'), concat = require('gulp-concat'), watch = require('gulp-watch'), sass = require('gulp-sass'), - styleguide = require('sc5-styleguide'), livereload = require('gulp-livereload'); mustache = require('gulp-mustache'); - // Set paths var paths = { - sass: ['sass/**/*.+(scss|sass)'], + sass: ['scss/**/*.scss','scss/**/*.scss' ], sassStyleguide: [ '../vendor/material-design-lite/material.css', - 'sass/**/*.+(scss|sass)', - '!sass/_*.+(scss|sass)' + 'scss/**/*.+(scss|sass)', + '!scss/_*.+(scss|sass)' ], html: ['sass/**/*.html'], mustache: [ @@ -29,84 +27,66 @@ var paths = { } }; -// TODO: contat scripts and add them to styleguide +// Contat scripts gulp.task('scripts', function(){ return gulp.src(paths.scripts.components) .pipe(concat('bootsmacss.js')) .pipe(gulp.dest('js')); }); - // Define SASS compiling task -gulp.task('sass', function () { - gulp.src('sass/app.sass') +gulp.task('sass', function (done) { + gulp.src('./scss/**/*.scss') .pipe(sass( {outputStyle: 'compressed'} ).on('error', sass.logError)) - .pipe(rename('style.min.css')) - .pipe(gulp.dest('../css')) + .pipe(gulp.dest('../css')) .pipe(gulp.dest('css')) .pipe(livereload()); + done(); }); - // Define Mustache compiling task -gulp.task('mustache', function() { +gulp.task('mustache', function(done) { return gulp.src("./html-prototype-sandbox/*.html") .pipe(mustache()) .pipe(gulp.dest("./html-prototype")); }); - -// Define rendering styleguide task -// https://github.com/SC5/sc5-styleguide#build-options -gulp.task('styleguide:generate', function() { - return gulp.src(paths.sassStyleguide) - .pipe(styleguide.generate({ - extraHead: [ - '', - '', - '', - ], - disableEncapsulation: true, - title: 'Joinup styleguide', - server: true, - sideNav: true, - rootPath: paths.styleguide, - overviewPath: 'README.md', - commonClass: 'body' - })) - .pipe(gulp.dest(paths.styleguide)); -}); -gulp.task('styleguide:applystyles', function() { - return gulp.src(paths.sassStyleguide) - .pipe(sass({ - errLogToConsole: true - })) - .pipe(styleguide.applyStyles()) - .pipe(gulp.dest(paths.styleguide)); -}); -gulp.task('styleguide', ['styleguide:generate', 'styleguide:applystyles']); // Define copying images for styleguide task -gulp.task('images', function() { +gulp.task('images', function(done) { gulp.src(['../images/**']) .pipe(gulp.dest(paths.styleguide + '/images')) .pipe(gulp.dest('images')); + done(); }); + // Define copying fonts for styleguide task -gulp.task('fonts', function() { +gulp.task('fonts', function(done) { gulp.src(['../fonts/**']) .pipe(gulp.dest(paths.styleguide + '/fonts')) .pipe(gulp.dest('fonts')); + done(); }); + // Define copying javascript for styleguide task -gulp.task('js', function() { +gulp.task('js', function(done) { gulp.src(['js/**', '../vendor/material-design-lite/material.min.js', '../../../../web/core/assets/vendor/jquery/jquery.min.js']) .pipe(gulp.dest(paths.styleguide + '/js')); + done(); }); -// Listen folders for changes and apply defined tasks -gulp.task('default', ['styleguide', 'sass', 'images', 'fonts', 'js', 'mustache'], function() { +// Define watch tasks +gulp.task('watch', function(done) { livereload.listen(45729); - gulp.watch([paths.sass, paths.html, paths.mustache], ['styleguide', 'sass', 'images', 'fonts', 'js', 'mustache']); + gulp.watch(paths.sass, gulp.series('sass')); + gulp.watch(paths.html, gulp.series('images', 'fonts', 'js')); + gulp.watch(paths.mustache, gulp.series('mustache')); + gulp.watch(paths.scripts.base,gulp.series('js')); + done(); +}); + +// Listen folders for changes and apply defined tasks +gulp.task('default', gulp.parallel('sass', 'images', 'fonts', 'js', 'mustache'), function(done) { + done(); }); diff --git a/web/themes/joinup/prototype/package-lock.json b/web/themes/joinup/prototype/package-lock.json index cec907c340..5cc1126f44 100644 --- a/web/themes/joinup/prototype/package-lock.json +++ b/web/themes/joinup/prototype/package-lock.json @@ -4,6 +4,39 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -20,10 +53,13 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "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" + } }, "ansi-wrap": { "version": "0.1.0", @@ -31,25665 +67,5404 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, - "bootstrap-sass": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz", - "integrity": "sha1-ZZbHq0D2Y3OTMjqwvIDQZPxjBJg=", - "dev": true + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" } }, - "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=", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "dev": true, "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "async-done": "^1.2.2" } }, - "flexboxgrid": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/flexboxgrid/-/flexboxgrid-6.3.1.tgz", - "integrity": "sha1-6ZiYr8B7cEdyK7galYpfuk1OIP0=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, "requires": { - "sparkles": "^1.0.0" + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" } }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "archy": { + "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } + "is-descriptor": "^1.0.0" } }, - "interpret": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", - "integrity": "sha1-1Xn7f2k7hYAElHrzn6DbSfeVYCw=", - "dev": true - }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^0.4.2", - "fined": "^1.0.1", - "flagged-respawn": "^0.3.2", - "lodash.isplainobject": "^4.0.4", - "lodash.isstring": "^4.0.1", - "lodash.mapvalues": "^4.4.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "findup-sync": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.2.tgz", - "integrity": "sha1-qBF9D3MST1pFRoOVef5S1xKfteU=", - "dev": true, - "requires": { - "detect-file": "^0.1.0", - "is-glob": "^2.0.1", - "micromatch": "^2.3.7", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0" - }, - "dependencies": { - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - } - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - }, - "dependencies": { - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - } - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - }, - "dependencies": { - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - } - } - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "dependencies": { - "global-prefix": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.4.tgz", - "integrity": "sha1-BRWNsc3i3UkbRV4pDrOri/xFxuE=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "osenv": "^0.1.3", - "which": "^1.2.10" - }, - "dependencies": { - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "osenv": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", - "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", - "dev": true - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - } - } - } - } - } - } - }, - "fined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.0.1.tgz", - "integrity": "sha1-xIr5q1qOD0AKA3XoQVTDdnTav9Q=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.1", - "lodash.assignwith": "^4.0.7", - "lodash.isarray": "^4.0.0", - "lodash.isempty": "^4.2.1", - "lodash.isplainobject": "^4.0.4", - "lodash.isstring": "^4.0.1", - "lodash.pick": "^4.2.1", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha1-EnqX8CrcQXUalU0ksN4X4QDgOOs=", - "dev": true - }, - "lodash.isarray": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-4.0.0.tgz", - "integrity": "sha1-KspJayjEym1yZxUxNZDALm6jRAM=", - "dev": true - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true, - "requires": { - "is-absolute": "^0.2.3", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "dependencies": { - "is-absolute": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.5.tgz", - "integrity": "sha1-mUFCufRo0nwU+/DNMP5325NMp20=", - "dev": true, - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.1.1" - }, - "dependencies": { - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "^0.1.1" - }, - "dependencies": { - "is-unc-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.1.tgz", - "integrity": "sha1-qyUz13rXM1YRJMPcD1zYuQBUyGs=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.0" - }, - "dependencies": { - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.1.1.tgz", - "integrity": "sha1-vjEHFUMc+rzMVKs5USEPoLbQGr4=", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - }, - "dependencies": { - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - } - } - } - } - } - } - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "orchestrator": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.7.tgz", - "integrity": "sha1-xFBk4ixaKnuZc09AmpX/7cfTw98=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" - }, - "dependencies": { - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "pretty-hrtime": { + "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.2.tgz", - "integrity": "sha1-cMqW9NBiikQ7kYdY95QWqae8n6g=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "v8flags": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", - "integrity": "sha1-vKjzDw1tYGEswsAGQeaWLUKuaIE=", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "user-home": "^1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - } - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - }, - "dependencies": { - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - } - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - }, - "dependencies": { - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "~0.1.0" - }, - "dependencies": { - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - } - } - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - }, - "dependencies": { - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "gulp-concat": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.0.tgz", - "integrity": "sha1-WFz7EVQR80h3MTEUBWa2qBxpy5E=", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "concat-with-sourcemaps": "^1.0.0", - "gulp-util": "^3.0.1", - "through2": "^0.6.3" + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "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" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { - "concat-with-sourcemaps": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", - "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } + "is-extendable": "^0.1.0" } } } }, - "gulp-livereload": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-3.8.1.tgz", - "integrity": "sha1-APdEstdJ0+njdGWJyKRKysd5tQ8=", + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "chalk": "^0.5.1", - "debug": "^2.1.0", - "event-stream": "^3.1.7", - "gulp-util": "^3.0.2", - "lodash.assign": "^3.0.0", - "mini-lr": "^0.1.8" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" }, "dependencies": { - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "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-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - } - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - }, - "dependencies": { - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "from": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.3.tgz", - "integrity": "sha1-72OsIGKsMqz3hi4NQLRLiW8i87w=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - } - } - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } - } - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - }, - "dependencies": { - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - } - } - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - }, - "dependencies": { - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - } - } - }, - "mini-lr": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/mini-lr/-/mini-lr-0.1.9.tgz", - "integrity": "sha1-AhmdJzR5U9H9HW297UJh8Yey0PY=", - "dev": true, - "requires": { - "body-parser": "~1.14.0", - "debug": "^2.2.0", - "faye-websocket": "~0.7.2", - "livereload-js": "^2.2.0", - "parseurl": "~1.3.0", - "qs": "~2.2.3" - }, - "dependencies": { - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "requires": { - "bytes": "2.2.0", - "content-type": "~1.0.1", - "debug": "~2.2.0", - "depd": "~1.1.0", - "http-errors": "~1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "~2.3.0", - "qs": "5.2.0", - "raw-body": "~2.1.5", - "type-is": "~1.6.10" - }, - "dependencies": { - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", - "dev": true - }, - "depd": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", - "dev": true - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "statuses": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz", - "integrity": "sha1-jlV1jLIOdoLB9Pzo3KswvwHR4Ho=", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - }, - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - } - } - }, - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - } - } - }, - "type-is": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", - "integrity": "sha1-boO6e8MM0zp7sLf7AHN6IIW/nQg=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.11" - }, - "dependencies": { - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - } - } - } - } - }, - "faye-websocket": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz", - "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=", - "dev": true, - "requires": { - "websocket-driver": ">=0.3.6" - }, - "dependencies": { - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - }, - "dependencies": { - "websocket-extensions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", - "dev": true - } - } - } - } - }, - "livereload-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", - "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", - "dev": true - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", - "dev": true - }, - "qs": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz", - "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", - "dev": true - } - } + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true } } }, - "gulp-mustache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-mustache/-/gulp-mustache-2.2.0.tgz", - "integrity": "sha1-qaqPMV0CMIy6mP5ud7l/p4XjLH8=", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "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": { - "gulp-util": "^3.0.7", - "mustache": "^2.2.1", - "through2": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-sass": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-2.1.1.tgz", - "integrity": "sha1-ayZq27NpkZkt+KOQaoITktDi/nU=", + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "gulp-util": "^3.0", - "node-sass": "^3.4.1", - "object-assign": "^4.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, "dependencies": { - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } - } - }, - "node-sass": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.9.3.tgz", - "integrity": "sha1-m7yRg+mLiMjS9xI1GHAFYhAs8xo=", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.clonedeep": "^4.3.2", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", - "npmlog": "^4.0.0", - "request": "^2.61.0", - "sass-graph": "^2.1.1" - }, - "dependencies": { - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "yallist": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", - "dev": true - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "gaze": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.1.tgz", - "integrity": "sha1-q4HVV9G1FfV1K9XxEX1vo8Tp20E=", - "dev": true, - "requires": { - "globule": "^1.0.0" - }, - "dependencies": { - "globule": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.0.0.tgz", - "integrity": "sha1-8irrqszgK+SSRT6XnDrptpg/HGw=", - "dev": true, - "requires": { - "glob": "~7.0.3", - "lodash": "~4.9.0", - "minimatch": "~3.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.9.0.tgz", - "integrity": "sha1-TCDXQvA86F3HAODderm8q4Xm/BQ=", - "dev": true - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - } - } - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "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 - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true - }, - "node-gyp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.4.0.tgz", - "integrity": "sha1-3aVYOTs+y74kyea4cDxxGUxj+jY=", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3", - "osenv": "0", - "path-array": "^1.0.0", - "request": "2", - "rimraf": "2", - "semver": "2.x || 3.x || 4 || 5", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "fstream": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - } - } - }, - "npmlog": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz", - "integrity": "sha1-LUb6h0M3r5SYovErtD2NC+SjaHM=", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.6.0", - "set-blocking": "~2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", - "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "gauge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", - "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-color": "^0.1.7", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz", - "integrity": "sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA=", - "dev": true - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - } - } - }, - "osenv": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", - "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", - "dev": true - } - } - }, - "path-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", - "integrity": "sha1-fi8PNfB6IBUSK4aLfqwOssT+wnE=", - "dev": true, - "requires": { - "array-index": "^1.0.0" - }, - "dependencies": { - "array-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", - "integrity": "sha1-7FanSe4QPk4Ix5C5w1PfFgVbl/k=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "es6-symbol": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "es6-symbol": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz", - "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "es5-ext": { - "version": "0.10.12", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz", - "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", - "dev": true, - "requires": { - "es6-iterator": "2", - "es6-symbol": "~3.1" - }, - "dependencies": { - "es6-iterator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", - "integrity": "sha1-vZaFZ9YWNeM8C4BydhPJy0sJa6w=", - "dev": true, - "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.7", - "es6-symbol": "3" - } - } - } - } - } - } - } - } - } - }, - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "npmlog": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.0.tgz", - "integrity": "sha1-4JRQOWHHDBd063ZpIIDo1Xip+I8=", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.6.0", - "set-blocking": "~2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", - "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "gauge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", - "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-color": "^0.1.7", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz", - "integrity": "sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA=", - "dev": true - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - } - } - }, - "request": { - "version": "2.74.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "bl": "~1.1.2", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc4", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", - "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", - "dev": true - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "dev": true, - "requires": { - "async": "^2.0.1", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.11" - }, - "dependencies": { - "async": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", - "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", - "dev": true, - "requires": { - "lodash": "^4.8.0" - }, - "dependencies": { - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - }, - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "jsprim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", - "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", - "dev": true, - "requires": { - "extsprintf": "1.0.2", - "json-schema": "0.2.2", - "verror": "1.3.6" - }, - "dependencies": { - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "json-schema": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", - "dev": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - } - } - }, - "sshpk": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.0.tgz", - "integrity": "sha1-EE1roq+yrAmauVZ8DRk5d/Kcbfo=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", - "integrity": "sha1-PKdrhSQccXC/fZcD57mqdGMAQNQ=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", - "integrity": "sha1-PaOC9nDyXe1417PReSEZvKC3Ey0=", - "dev": true, - "optional": true - } - } - }, - "dashdash": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", - "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "getpass": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", - "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", - "dev": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "qs": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", - "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", - "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "sass-graph": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.1.2.tgz", - "integrity": "sha1-llEEviPoEDy35fcQ32WTWzF9pXs=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - }, - "dependencies": { - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "wrap-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz", - "integrity": "sha1-fTD4+HP5pbvDpk2ryNF34HGuQm8=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - }, - "dependencies": { - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - } - } - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - } - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - } - } - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } } } }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - } - }, - "gulp-watch": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.9.tgz", - "integrity": "sha1-2/UdKpzTgwPsXq4nIKwDfGbQovU=", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "anymatch": "^1.3.0", - "chokidar": "^1.5.2", - "glob-parent": "^2.0.0", - "gulp-util": "^3.0.6", - "object-assign": "^4.1.0", - "path-is-absolute": "^1.0.0", - "readable-stream": "^2.0.1", - "vinyl": "^0.5.0", - "vinyl-file": "^1.2.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "micromatch": "^2.1.5" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - }, - "dependencies": { - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - }, - "dependencies": { - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - } - } - } - } - } - } - }, - "chokidar": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz", - "integrity": "sha1-kMMq1IApAddxPeUy3ChOlqY60Fg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "fsevents": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz", - "integrity": "sha1-VY6Mw4ZD2O9A/kUVhIbQ0ldY7uQ=", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.29" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz", - "integrity": "sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA=", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", - "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", - "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true, - "optional": true - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", - "integrity": "sha1-9bStV04st8zB64Pm/nm47K33pSY=", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true, - "optional": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "optional": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "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, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", - "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "optional": true, - "requires": { - "ms": "0.7.1" - } - }, - "deep-extend": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", - "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "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, - "optional": true - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "dev": true, - "optional": true, - "requires": { - "async": "^1.5.2", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.10" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "gauge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", - "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-color": "^0.1.7", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true, - "optional": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "optional": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "getpass": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", - "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true, - "optional": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true, - "optional": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "dev": true, - "optional": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", - "xtend": "^4.0.0" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", - "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2", - "json-schema": "0.2.2", - "verror": "1.3.6" - } - }, - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "optional": true, - "requires": { - "mime-db": "~1.23.0" - } - }, - "minimatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.29", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz", - "integrity": "sha1-sL0TY1uvfRvnriM8FvvPMwms03w=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "~0.5.0", - "nopt": "~3.0.1", - "npmlog": "~3.1.2", - "rc": "~1.1.0", - "request": "2.x", - "rimraf": "~2.5.0", - "semver": "~5.2.0", - "tar": "~2.2.0", - "tar-pack": "~3.1.0" - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true, - "optional": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz", - "integrity": "sha1-LUb6h0M3r5SYovErtD2NC+SjaHM=", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.6.0", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true, - "optional": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true, - "optional": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "optional": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "optional": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", - "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", - "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~1.0.4" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", - "integrity": "sha1-cLl5HG/LhIDbRL0VWg9rtY8XJGg=", - "dev": true, - "optional": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.73.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz", - "integrity": "sha1-X3ip/eQ3CryP9kedeoSnGhS4eKI=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "bl": "~1.1.2", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc4", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.2.0", - "tunnel-agent": "~0.4.1" - } - }, - "rimraf": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz", - "integrity": "sha1-bl792kqi8DQX9rKldK7Cn0tlJwU=", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "semver": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz", - "integrity": "sha1-KBmVuAwUSCCUFd28TPUMJpzvVcU=", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", - "integrity": "sha1-iQzJ1hTcUpLlyxpUOwPJq6pcN04=", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz", - "integrity": "sha1-vIz5oi9YMnOfEvORDaweuXtJcIw=", - "dev": true, - "optional": true, - "requires": { - "debug": "~2.2.0", - "fstream": "~1.0.10", - "fstream-ignore": "~1.0.5", - "once": "~1.3.3", - "readable-stream": "~2.1.4", - "rimraf": "~2.5.1", - "tar": "~2.2.1", - "uid-number": "~0.0.6" - } - }, - "tough-cookie": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", - "integrity": "sha1-yDoYMPTl7wuT7yo0iOck+N4Basc=", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true, - "optional": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - }, - "dependencies": { - "binary-extensions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.6.0.tgz", - "integrity": "sha1-qiGEy8Q00phixmppv4HMCjOD7nk=", - "dev": true - } - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - } - } - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - } - } - }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - } - } - }, - "vinyl-file": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-1.3.0.tgz", - "integrity": "sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "vinyl": "^1.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - } - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - } - } - } + "is-descriptor": "^0.1.0" } } } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "glogg": "^1.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { - "sparkles": "^1.0.0" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true + "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" + } }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "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 }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", "dev": true }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "safe-buffer": "~5.1.1" } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" } }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "array-find-index": "^1.0.1" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "duplexer2": "0.0.2" + "assert-plus": "^1.0.0" } }, - "mustache": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", - "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", "dev": true }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true + "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" + } }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "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" + } }, - "sc5-styleguide": { - "version": "0.3.47", - "resolved": "https://registry.npmjs.org/sc5-styleguide/-/sc5-styleguide-0.3.47.tgz", - "integrity": "sha1-0E9OW3tkTAZjUIzzrrXYYXmxg6Y=", + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "autoprefixer": "^6.3.2", - "basic-auth-connect": "~1.0.0", - "bemto.jade": "0.2.2", - "body-parser": "~1.14.1", - "chalk": "~1.1.1", - "cheerio": "^0.19.0", - "cookie-parser": "~1.4.0", - "css": "~2.2.0", - "cssnext": "^1.8.4", - "express": "~4.13.0", - "fs-extra": "^0.26.2", - "gonzales-pe": "3.0.0-31", - "gulp": "~3.9.0", - "gulp-concat": "~2.6.0", - "gulp-cssnext": "^1.0.1", - "gulp-mustache": "~2.0.1", - "gulp-postcss": "^6.1.0", - "gulp-rename": "^1.2.2", - "gulp-replace": "^0.5.3", - "gulp-util": "~3.0.5", - "jade": "^1.8.1", - "kss": "~2.1.0", - "lodash": "~3.10.1", - "markdown-it": "^5.1.0", - "minimatch": "~3.0.0", - "minimist": "^1.2.0", - "morgan": "~1.6.0", - "node-localcache": "^0.1.3", - "postcss": "^5.0.14", - "postcss-advanced-variables": "^1.2.2", - "postcss-color-alpha": "^1.0.3", - "postcss-color-function": "^2.0.0", - "postcss-conditionals": "^2.0.1", - "postcss-custom-media": "^5.0.1", - "postcss-import": "^8.0.2", - "postcss-inline-comment": "^2.0.0", - "postcss-mixins": "^4.0.0", - "postcss-nested": "^1.0.0", - "postcss-partial-import": "^1.3.0", - "q": "~1.4.1", - "run-sequence": "~1.1.0", - "socket.io": "~1.3.5", - "through2": "~2.0.0", - "vinyl": "~1.1.0", - "vinyl-fs": "~2.2.1", - "yargs": "~3.30.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "autoprefixer": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.4.1.tgz", - "integrity": "sha1-wbqEYXWfr1+3c329vl6kanjGim8=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "browserslist": "~1.3.6", - "caniuse-db": "^1.0.30000527", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.1.2", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.3.6.tgz", - "integrity": "sha1-lS/0jVZGPTtTj4XvL46t39KEsTM=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000525" - } - }, - "caniuse-db": { - "version": "1.0.30000528", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000528.tgz", - "integrity": "sha1-zZG9ItwhVc0zW8GcnpM9FDvdFCA=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "basic-auth-connect": { + "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", - "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=", - "dev": true - }, - "bemto.jade": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/bemto.jade/-/bemto.jade-0.2.2.tgz", - "integrity": "sha1-3F2O65glVt0V7WyTGjeXlatBzEQ=", - "dev": true - }, - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "bytes": "2.2.0", - "content-type": "~1.0.1", - "debug": "~2.2.0", - "depd": "~1.1.0", - "http-errors": "~1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "~2.3.0", - "qs": "5.2.0", - "raw-body": "~2.1.5", - "type-is": "~1.6.10" - }, - "dependencies": { - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "depd": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", - "dev": true - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "statuses": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.0.tgz", - "integrity": "sha1-jlV1jLIOdoLB9Pzo3KswvwHR4Ho=", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - }, - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - } - } - }, - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - } - } - }, - "type-is": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", - "integrity": "sha1-boO6e8MM0zp7sLf7AHN6IIW/nQg=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.11" - }, - "dependencies": { - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - } - } - } + "kind-of": "^6.0.0" } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "cheerio": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", - "dev": true, - "requires": { - "css-select": "~1.0.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "~3.8.1", - "lodash": "^3.2.0" - }, - "dependencies": { - "css-select": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "1.0", - "domutils": "1.4", - "nth-check": "~1.0.0" - }, - "dependencies": { - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "css-what": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", - "dev": true - }, - "domutils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", - "dev": true, - "requires": { - "domelementtype": "1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - } - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - } - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, - "cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "css": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", - "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "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 + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.3.0", - "urix": "^0.1.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - }, - "source-map-resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", - "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", - "dev": true, - "requires": { - "atob": "~1.1.0", - "resolve-url": "~0.2.1", - "source-map-url": "~0.3.0", - "urix": "~0.1.0" - }, - "dependencies": { - "atob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", - "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "source-map-url": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", - "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - } + "is-descriptor": "^0.1.0" } }, - "cssnext": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/cssnext/-/cssnext-1.8.4.tgz", - "integrity": "sha1-wewiqVwg6gt0QfOvL2ZK3Gch4YE=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "autoprefixer-core": "^5.0.0", - "caniuse-api": "^1.3.1", - "chalk": "^1.0.0", - "chokidar": "^1.0.0", - "commander": "^2.3.0", - "cssnano": "^2.6.1", - "exit": "^0.1.2", - "mkdirp": "^0.5.1", - "pixrem": "^1.1.0", - "pleeease-filters": "^1.0.0", - "postcss": "^4.0.2", - "postcss-calc": "^4.0.0", - "postcss-color-function": "^1.1.0", - "postcss-color-gray": "^2.0.0", - "postcss-color-hex-alpha": "^1.1.0", - "postcss-color-hwb": "^1.1.0", - "postcss-color-rebeccapurple": "^1.1.0", - "postcss-color-rgba-fallback": "^1.0.0", - "postcss-custom-media": "^4.0.0", - "postcss-custom-properties": "^4.0.0", - "postcss-custom-selectors": "^2.3.0", - "postcss-font-variant": "^1.0.0", - "postcss-import": "^6.0.0", - "postcss-media-minmax": "^1.1.0", - "postcss-messages": "^0.2.2", - "postcss-pseudo-class-any-link": "^0.2.1", - "postcss-pseudoelements": "^2.1.1", - "postcss-reporter": "^0.1.0", - "postcss-selector-matches": "^1.2.1", - "postcss-selector-not": "^1.0.1", - "postcss-url": "^4.0.1", - "read-file-stdin": "^0.2.0", - "to-slug-case": "^0.1.2", - "to-space-case": "^0.1.3", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "autoprefixer-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz", - "integrity": "sha1-5kDEFK5Bmq4hwa1DyOoPPbgqVm0=", - "dev": true, - "requires": { - "browserslist": "~0.4.0", - "caniuse-db": "^1.0.30000214", - "num2fraction": "^1.1.0", - "postcss": "~4.1.12" - }, - "dependencies": { - "browserslist": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz", - "integrity": "sha1-O9SrkZncG5FQ1NbbpNnTqrvIbdQ=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000153" - } - }, - "caniuse-db": { - "version": "1.0.30000528", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000528.tgz", - "integrity": "sha1-zZG9ItwhVc0zW8GcnpM9FDvdFCA=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - } - } - }, - "caniuse-api": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.5.2.tgz", - "integrity": "sha1-jzk8aC9mHAqZe3e7pugmSD+zYA4=", - "dev": true, - "requires": { - "browserslist": "^1.0.1", - "caniuse-db": "^1.0.30000346", - "lodash.memoize": "^4.1.0", - "lodash.uniq": "^4.3.0", - "shelljs": "^0.7.0" - }, - "dependencies": { - "browserslist": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.3.6.tgz", - "integrity": "sha1-lS/0jVZGPTtTj4XvL46t39KEsTM=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000525" - } - }, - "caniuse-db": { - "version": "1.0.30000528", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000528.tgz", - "integrity": "sha1-zZG9ItwhVc0zW8GcnpM9FDvdFCA=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "shelljs": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.4.tgz", - "integrity": "sha1-uPBLOnTd+v6iKs+Y4L5F3tU9Wcg=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "interpret": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", - "integrity": "sha1-1Xn7f2k7hYAElHrzn6DbSfeVYCw=", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - } - } - } - } - }, - "chokidar": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz", - "integrity": "sha1-kMMq1IApAddxPeUy3ChOlqY60Fg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "micromatch": "^2.1.5" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - }, - "dependencies": { - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - }, - "dependencies": { - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - } - } - } - } - } - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "fsevents": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.14.tgz", - "integrity": "sha1-VY6Mw4ZD2O9A/kUVhIbQ0ldY7uQ=", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.29" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz", - "integrity": "sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA=", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", - "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", - "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true, - "optional": true - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - } - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz", - "integrity": "sha1-9bStV04st8zB64Pm/nm47K33pSY=", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true, - "optional": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "optional": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "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, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", - "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "optional": true, - "requires": { - "ms": "0.7.1" - } - }, - "deep-extend": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", - "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "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, - "optional": true - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "1.0.0-rc4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", - "dev": true, - "optional": true, - "requires": { - "async": "^1.5.2", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.10" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "gauge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", - "integrity": "sha1-01MBrRjpaQK0dR3LvkD0IYuUKkY=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-color": "^0.1.7", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true, - "optional": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "optional": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "getpass": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", - "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true, - "optional": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true, - "optional": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "dev": true, - "optional": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", - "xtend": "^4.0.0" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", - "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2", - "json-schema": "0.2.2", - "verror": "1.3.6" - } - }, - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "optional": true, - "requires": { - "mime-db": "~1.23.0" - } - }, - "minimatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.29", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz", - "integrity": "sha1-sL0TY1uvfRvnriM8FvvPMwms03w=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "~0.5.0", - "nopt": "~3.0.1", - "npmlog": "~3.1.2", - "rc": "~1.1.0", - "request": "2.x", - "rimraf": "~2.5.0", - "semver": "~5.2.0", - "tar": "~2.2.0", - "tar-pack": "~3.1.0" - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true, - "optional": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz", - "integrity": "sha1-LUb6h0M3r5SYovErtD2NC+SjaHM=", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.6.0", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true, - "optional": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true, - "optional": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "optional": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "optional": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", - "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", - "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~1.0.4" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz", - "integrity": "sha1-cLl5HG/LhIDbRL0VWg9rtY8XJGg=", - "dev": true, - "optional": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.73.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz", - "integrity": "sha1-X3ip/eQ3CryP9kedeoSnGhS4eKI=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "bl": "~1.1.2", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc4", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.2.0", - "tunnel-agent": "~0.4.1" - } - }, - "rimraf": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz", - "integrity": "sha1-bl792kqi8DQX9rKldK7Cn0tlJwU=", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "semver": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz", - "integrity": "sha1-KBmVuAwUSCCUFd28TPUMJpzvVcU=", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", - "integrity": "sha1-iQzJ1hTcUpLlyxpUOwPJq6pcN04=", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz", - "integrity": "sha1-vIz5oi9YMnOfEvORDaweuXtJcIw=", - "dev": true, - "optional": true, - "requires": { - "debug": "~2.2.0", - "fstream": "~1.0.10", - "fstream-ignore": "~1.0.5", - "once": "~1.3.3", - "readable-stream": "~2.1.4", - "rimraf": "~2.5.1", - "tar": "~2.2.1", - "uid-number": "~0.0.6" - } - }, - "tough-cookie": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", - "integrity": "sha1-yDoYMPTl7wuT7yo0iOck+N4Basc=", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true, - "optional": true - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - }, - "dependencies": { - "binary-extensions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.6.0.tgz", - "integrity": "sha1-qiGEy8Q00phixmppv4HMCjOD7nk=", - "dev": true - } - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - } - } - } - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "cssnano": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-2.6.1.tgz", - "integrity": "sha1-f7NyEsz/RNPpNuAmxvZ14xR9gCQ=", - "dev": true, - "requires": { - "autoprefixer-core": "^5.2.1", - "balanced-match": "^0.2.0", - "css-list": "^0.1.2", - "decamelize": "^1.0.0", - "defined": "^1.0.0", - "indexes-of": "^1.0.1", - "minimist": "^1.1.3", - "postcss": "^4.1.16", - "postcss-calc": "^4.1.0", - "postcss-colormin": "^1.2.5", - "postcss-convert-values": "^1.2.4", - "postcss-discard-comments": "^1.2.1", - "postcss-discard-duplicates": "^1.1.5", - "postcss-discard-empty": "^1.1.2", - "postcss-discard-unused": "^1.0.3", - "postcss-filter-plugins": "^1.0.0", - "postcss-font-family": "^1.2.1", - "postcss-merge-idents": "^1.0.1", - "postcss-merge-longhand": "^1.0.1", - "postcss-merge-rules": "^1.3.5", - "postcss-minify-font-weight": "^1.0.1", - "postcss-minify-selectors": "^1.5.0", - "postcss-normalize-url": "^2.1.1", - "postcss-ordered-values": "^1.0.1", - "postcss-reduce-idents": "^1.0.2", - "postcss-single-charset": "^0.3.0", - "postcss-unique-selectors": "^1.0.0", - "postcss-zindex": "^1.1.3", - "read-file-stdin": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - }, - "css-list": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/css-list/-/css-list-0.1.3.tgz", - "integrity": "sha1-p7M7RBn4PUEjIN3pEzoNEASUjXA=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "postcss-colormin": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-1.2.7.tgz", - "integrity": "sha1-63Pb6DgE6pGYNWsTL2+Z9GAP1lQ=", - "dev": true, - "requires": { - "color": "^0.10.1", - "colormin": "^1.0.3", - "postcss": "^4.1.16", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "dev": true, - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.3.tgz", - "integrity": "sha1-S60dDVJJndANvW8IaEQkZ+STlOY=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "color-convert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.5.0.tgz", - "integrity": "sha1-eitO+0SI34W8pkQ8sDi3EA++feE=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "^1.0.2" - }, - "dependencies": { - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", - "dev": true - } - } - } - } - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - }, - "postcss-convert-values": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-1.3.1.tgz", - "integrity": "sha1-I/GHxhP6d7Y3p4BblIteCJlpDkY=", - "dev": true, - "requires": { - "postcss": "^4.1.16", - "postcss-value-parser": "^1.1.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-1.4.2.tgz", - "integrity": "sha1-GGVjPhNwH4pyHng02tGFyxRKrQw=", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-1.2.1.tgz", - "integrity": "sha1-hR3Ka5NUwPtjFssaEEj29eOWCtA=", - "dev": true, - "requires": { - "node-balanced": "0.0.14", - "postcss": "^4.1.16" - }, - "dependencies": { - "node-balanced": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/node-balanced/-/node-balanced-0.0.14.tgz", - "integrity": "sha1-ozxyeFfTBE8eiL5y3X2anQtPwh8=", - "dev": true - } - } - }, - "postcss-discard-duplicates": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-1.2.1.tgz", - "integrity": "sha1-SbsztNNHcQWwDQSDlfc6KQK8miU=", - "dev": true, - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-discard-empty": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-1.1.2.tgz", - "integrity": "sha1-KsVayPy4HCMEPmMQaTT9Y0cNXA0=", - "dev": true, - "requires": { - "postcss": "^4.1.13" - } - }, - "postcss-discard-unused": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-1.0.3.tgz", - "integrity": "sha1-Xsy5v6xGXqa+VjQpepx3gczQmIY=", - "dev": true, - "requires": { - "flatten": "0.0.1", - "postcss": "^4.1.16", - "uniqs": "^2.0.0" - }, - "dependencies": { - "flatten": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-0.0.1.tgz", - "integrity": "sha1-VURAdm2goNYDmZ9DNFP2wvxqdcE=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - } - } - }, - "postcss-filter-plugins": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-1.0.1.tgz", - "integrity": "sha1-J/gnnV76t6o8FwmIE5hrS50dUOI=", - "dev": true, - "requires": { - "postcss": "^4.1.11", - "uniqid": "^1.0.0" - }, - "dependencies": { - "uniqid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-1.0.0.tgz", - "integrity": "sha1-JYJSTgdASESkLelPviv1SeG3RVU=", - "dev": true - } - } - }, - "postcss-font-family": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-font-family/-/postcss-font-family-1.2.1.tgz", - "integrity": "sha1-dQJSSzmDox5q9k5LqhA07W7YQYw=", - "dev": true, - "requires": { - "object-assign": "^3.0.0", - "postcss": "^4.1.16", - "uniqs": "^2.0.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - } - } - }, - "postcss-merge-idents": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-1.0.2.tgz", - "integrity": "sha1-qToNrXj2UugjfZrew0LkHSwd01s=", - "dev": true, - "requires": { - "css-list": "^0.1.0", - "postcss": "^4.1.9" - } - }, - "postcss-merge-longhand": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-1.0.2.tgz", - "integrity": "sha1-QxcgZfz4We4RztMUH1ZkFMZzBX4=", - "dev": true, - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-merge-rules": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-1.3.6.tgz", - "integrity": "sha1-sUrRf31AEqMYut032r1ZuT8TUy8=", - "dev": true, - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-minify-font-weight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-weight/-/postcss-minify-font-weight-1.0.1.tgz", - "integrity": "sha1-aI5CzfI27Osb1WOojPHSTQOgWIg=", - "dev": true, - "requires": { - "postcss": "^4.1.11" - } - }, - "postcss-minify-selectors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-1.5.0.tgz", - "integrity": "sha1-5ZxWxtSVXaFXz30iv4Bptur1Jic=", - "dev": true, - "requires": { - "javascript-natural-sort": "^0.7.1", - "normalize-selector": "^0.2.0", - "postcss": "^4.1.16", - "postcss-selector-parser": "^1.1.2", - "uniqs": "^2.0.0" - }, - "dependencies": { - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=", - "dev": true - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, - "postcss-selector-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz", - "integrity": "sha1-0u4Z33pk+O8hwacchvfUg1yIwoE=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - } - } - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-2.1.3.tgz", - "integrity": "sha1-8StfShFDyV6gJfx/jgBQkFmPNgI=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.3.0", - "object-assign": "^4.0.1", - "postcss": "^4.1.16", - "postcss-value-parser": "^1.4.2" - }, - "dependencies": { - "is-absolute-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.0.0.tgz", - "integrity": "sha1-nEsgsOXAy++aR5o2ft5vmRZ581k=", - "dev": true - }, - "normalize-url": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.6.1.tgz", - "integrity": "sha1-qfJU+gZbvCk0RhwMCUI4FZdhVaI=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "query-string": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.2.3.tgz", - "integrity": "sha1-nycnPSB6JajuTHuMdNzUXVVtuCI=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "dependencies": { - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "postcss-value-parser": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-1.4.2.tgz", - "integrity": "sha1-GGVjPhNwH4pyHng02tGFyxRKrQw=", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-1.1.1.tgz", - "integrity": "sha1-nu1PrS55Kr/D0EAs93O6+G/ne4E=", - "dev": true, - "requires": { - "postcss": "^4.1.16", - "postcss-value-parser": "^1.1.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-1.4.2.tgz", - "integrity": "sha1-GGVjPhNwH4pyHng02tGFyxRKrQw=", - "dev": true - } - } - }, - "postcss-reduce-idents": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-1.0.3.tgz", - "integrity": "sha1-p58bJIXiPZs8x6gfXsY6XCvewg0=", - "dev": true, - "requires": { - "postcss": "^4.1.2", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - }, - "postcss-single-charset": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/postcss-single-charset/-/postcss-single-charset-0.3.0.tgz", - "integrity": "sha1-2n/Q3szPYy8bdMei7j41vilFZXM=", - "dev": true, - "requires": { - "fs-extra": "^0.14.0", - "postcss": "^4.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.14.0.tgz", - "integrity": "sha1-RmCWxroticIAA4DaskULeFn/Z0M=", - "dev": true, - "requires": { - "jsonfile": "^2.0.0", - "ncp": "^1.0.1", - "rimraf": "^2.2.8" - }, - "dependencies": { - "jsonfile": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz", - "integrity": "sha1-KLyynFlrW3qv005mKjKbpizYQvw=", - "dev": true - }, - "ncp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", - "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=", - "dev": true - }, - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - } - } - } - } - } - } - }, - "postcss-unique-selectors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-1.0.1.tgz", - "integrity": "sha1-SBfnTHtPmZzgTI5mRRoZaRT12zw=", - "dev": true, - "requires": { - "javascript-natural-sort": "^0.7.1", - "postcss": "^4.1.10", - "uniqs": "^2.0.0" - }, - "dependencies": { - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - } - } - }, - "postcss-zindex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-1.1.3.tgz", - "integrity": "sha1-SVZKtJ092hcGf42sHIM11/LQDOE=", - "dev": true, - "requires": { - "postcss": "^4.1.2" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "pixrem": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pixrem/-/pixrem-1.3.1.tgz", - "integrity": "sha1-BMe7Q5GjzN/03jA7/pQfJDWZfWw=", - "dev": true, - "requires": { - "browserslist": "^0.5.0", - "postcss": "^4.0.0", - "reduce-css-calc": "^1.2.0" - }, - "dependencies": { - "browserslist": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.5.0.tgz", - "integrity": "sha1-uCiCSTY3w0K2atMYLJGeHaxtFyQ=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000214" - }, - "dependencies": { - "caniuse-db": { - "version": "1.0.30000528", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000528.tgz", - "integrity": "sha1-zZG9ItwhVc0zW8GcnpM9FDvdFCA=", - "dev": true - } - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "math-expression-evaluator": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.14.tgz", - "integrity": "sha1-OVEXce2WAkBfupr//xfrTSo4Q6s=", - "dev": true, - "requires": { - "lodash.indexof": "^4.0.5" - }, - "dependencies": { - "lodash.indexof": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lodash.indexof/-/lodash.indexof-4.0.5.tgz", - "integrity": "sha1-U3FK3Czd1u2HY4+JOqm2wk4x7zw=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - } - } - }, - "pleeease-filters": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pleeease-filters/-/pleeease-filters-1.0.1.tgz", - "integrity": "sha1-nlOe8JbE9yVlqdQF0C+w5Vw/888=", - "dev": true, - "requires": { - "onecolor": "~2.4.0", - "postcss": "^4.0.2" - }, - "dependencies": { - "onecolor": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-2.4.2.tgz", - "integrity": "sha1-pT7D/xccNEYBbdUhDRobVEv32HQ=", - "dev": true - } - } - }, - "postcss": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", - "integrity": "sha1-TESbTIr53zyvbTf44eV10DYXWNw=", - "dev": true, - "requires": { - "es6-promise": "~2.3.0", - "js-base64": "~2.1.8", - "source-map": "~0.4.2" - }, - "dependencies": { - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", - "dev": true - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - }, - "postcss-calc": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-4.1.0.tgz", - "integrity": "sha1-vuf/ySjHmGmZ7vF7LdiXDIk31HI=", - "dev": true, - "requires": { - "postcss": "^4.1.11", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.0" - }, - "dependencies": { - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "math-expression-evaluator": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.14.tgz", - "integrity": "sha1-OVEXce2WAkBfupr//xfrTSo4Q6s=", - "dev": true, - "requires": { - "lodash.indexof": "^4.0.5" - }, - "dependencies": { - "lodash.indexof": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/lodash.indexof/-/lodash.indexof-4.0.5.tgz", - "integrity": "sha1-U3FK3Czd1u2HY4+JOqm2wk4x7zw=", - "dev": true - } - } - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - } - } - }, - "postcss-color-function": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-1.3.2.tgz", - "integrity": "sha1-YLOhzkXftwQEx87f5jPdaFxswYk=", - "dev": true, - "requires": { - "balanced-match": "^0.1.0", - "css-color-function": "^1.2.0", - "postcss": "^4.1.11", - "postcss-message-helpers": "^1.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - }, - "css-color-function": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-color-function/-/css-color-function-1.3.0.tgz", - "integrity": "sha1-csdnuvl48BuKipT0Lxe6XSKndvw=", - "dev": true, - "requires": { - "balanced-match": "0.1.0", - "color": "^0.11.0", - "debug": "~0.7.4", - "rgb": "~0.1.0" - }, - "dependencies": { - "color": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.3.tgz", - "integrity": "sha1-S60dDVJJndANvW8IaEQkZ+STlOY=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "color-convert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.5.0.tgz", - "integrity": "sha1-eitO+0SI34W8pkQ8sDi3EA++feE=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "rgb": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/rgb/-/rgb-0.1.0.tgz", - "integrity": "sha1-vieykej+/+rBvZlylyG/pA/AN7U=", - "dev": true - } - } - }, - "postcss-message-helpers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-1.1.1.tgz", - "integrity": "sha1-zoV0R65YyOwQh+DUq/CYKrT96qI=", - "dev": true - } - } - }, - "postcss-color-gray": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-2.0.0.tgz", - "integrity": "sha1-K84HftGr5qCObUuP/9ZLmJkFWaU=", - "dev": true, - "requires": { - "color": "^0.7.3", - "postcss-message-helpers": "^2.0.0", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/color/-/color-0.7.3.tgz", - "integrity": "sha1-qzrkvGy4z62110nEDzSuoIgQT4k=", - "dev": true, - "requires": { - "color-convert": "0.5.x", - "color-string": "0.2.x" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.2.4.tgz", - "integrity": "sha1-Ih/2QjT3Gqo+E7yMfoyV883Y+Bo=", - "dev": true, - "requires": { - "color-name": "1.0.x" - }, - "dependencies": { - "color-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.0.1.tgz", - "integrity": "sha1-azSyspt3FgE5crC51b7c+7Zxjfg=", - "dev": true - } - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - }, - "postcss-color-hex-alpha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-1.3.0.tgz", - "integrity": "sha1-RjL45gKYbqwqShECpoPjc/a3gCU=", - "dev": true, - "requires": { - "color": "^0.10.1", - "postcss": "^4.1.16", - "postcss-message-helpers": "^2.0.0" - }, - "dependencies": { - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "dev": true, - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - } - } - }, - "postcss-color-hwb": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-color-hwb/-/postcss-color-hwb-1.2.0.tgz", - "integrity": "sha1-YrwPaYRyCS7+B2ctirOLS1qOgB8=", - "dev": true, - "requires": { - "color": "^0.10.1", - "postcss": "^4.1.16", - "postcss-message-helpers": "^2.0.0", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "dev": true, - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - }, - "postcss-color-rebeccapurple": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-1.2.0.tgz", - "integrity": "sha1-jh/VRTl/vaxNuLHCHZQgmP8QPE8=", - "dev": true, - "requires": { - "color": "^0.9.0", - "postcss": "^4.1.13" - }, - "dependencies": { - "color": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/color/-/color-0.9.0.tgz", - "integrity": "sha1-kRRtRgzdVUPqH6IKoLWXM3UJtk0=", - "dev": true, - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - } - } - }, - "postcss-color-rgba-fallback": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-1.3.1.tgz", - "integrity": "sha1-nGessEhhkughm4OKsIkiYzewyfw=", - "dev": true, - "requires": { - "color-string": "^0.3.0", - "postcss": "^4.1.16" - }, - "dependencies": { - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "postcss-custom-media": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-4.1.0.tgz", - "integrity": "sha1-uZvl7elbcu0eidwYoTjsXGPfS+4=", - "dev": true, - "requires": { - "postcss": "^4.1.4" - } - }, - "postcss-custom-properties": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-4.2.0.tgz", - "integrity": "sha1-SrJRk7y1FQiH9aQwr+ANZ7p5RBs=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0", - "postcss": "^4.1.4" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - }, - "postcss-custom-selectors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-2.3.0.tgz", - "integrity": "sha1-cfzZX8NOObKhpYnDF7Nef/q+EzI=", - "dev": true, - "requires": { - "balanced-match": "^0.2.0", - "postcss": "^4.1.7", - "postcss-selector-matches": "^1.2.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - } - } - }, - "postcss-font-variant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-1.2.0.tgz", - "integrity": "sha1-QhXRxckIMJsfKpcciTcUoaGGn5I=", - "dev": true, - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-import": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-6.2.0.tgz", - "integrity": "sha1-buF+jtiusrNRBI8vPi961vjs9zo=", - "dev": true, - "requires": { - "clone": "^0.1.17", - "es6-promise": "^2.3.0", - "glob": "^5.0.1", - "object-assign": "^3.0.0", - "postcss": "^4.1.4", - "postcss-message-helpers": "^2.0.0", - "resolve": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true - }, - "es6-promise": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "postcss-media-minmax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-1.2.0.tgz", - "integrity": "sha1-3BePctqq3eir5PRhr6xOi+V5Qxg=", - "dev": true, - "requires": { - "postcss": "^4.1.14" - } - }, - "postcss-messages": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/postcss-messages/-/postcss-messages-0.2.2.tgz", - "integrity": "sha1-iaejrRbnRCA1s/cPd8cq82iB04Q=", - "dev": true, - "requires": { - "postcss": "~4.1.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-0.2.1.tgz", - "integrity": "sha1-yjvuIjuv1iTcYo3zYSnntJN8Nfc=", - "dev": true, - "requires": { - "postcss": "^4.1.9", - "postcss-selector-parser": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz", - "integrity": "sha1-0u4Z33pk+O8hwacchvfUg1yIwoE=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - } - } - } - } - }, - "postcss-pseudoelements": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-pseudoelements/-/postcss-pseudoelements-2.2.0.tgz", - "integrity": "sha1-Sy3TGER5I3xyP08ddA7cNv64db4=", - "dev": true, - "requires": { - "postcss": "^4.1.11" - } - }, - "postcss-reporter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-0.1.0.tgz", - "integrity": "sha1-l1SuL2Xv5Q0MTJt4WSna15b2Z2I=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash.difference": "^3.2.1", - "postcss": "^4.1.0" - }, - "dependencies": { - "lodash.difference": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-3.2.2.tgz", - "integrity": "sha1-3EY//+ZhmrSvSaPIes5mlaKF3eY=", - "dev": true, - "requires": { - "lodash._basedifference": "^3.0.0", - "lodash._baseflatten": "^3.0.0", - "lodash.restparam": "^3.0.0" - }, - "dependencies": { - "lodash._basedifference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basedifference/-/lodash._basedifference-3.0.3.tgz", - "integrity": "sha1-8sIEKWwqeOArOJCBtu3KyTPPYpw=", - "dev": true, - "requires": { - "lodash._baseindexof": "^3.0.0", - "lodash._cacheindexof": "^3.0.0", - "lodash._createcache": "^3.0.0" - }, - "dependencies": { - "lodash._baseindexof": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", - "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", - "dev": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", - "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", - "dev": true - }, - "lodash._createcache": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", - "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - } - } - } - } - }, - "lodash._baseflatten": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", - "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", - "dev": true, - "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - } - } - } - } - }, - "postcss-selector-matches": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-1.2.1.tgz", - "integrity": "sha1-2ZQK/XB2en+i9RUKVQ+gp0GvDsw=", - "dev": true, - "requires": { - "balanced-match": "^0.2.0", - "postcss": "^4.1.7" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - } - } - }, - "postcss-selector-not": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-1.2.1.tgz", - "integrity": "sha1-vE/3IlhHhBciAxVC/JQQwcfMs1w=", - "dev": true, - "requires": { - "balanced-match": "^0.2.0", - "postcss": "^4.1.7" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", - "dev": true - } - } - }, - "postcss-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-4.0.1.tgz", - "integrity": "sha1-URRBXeWAi53fuoQ5in4kZHhceBE=", - "dev": true, - "requires": { - "directory-encoder": "^0.6.1", - "js-base64": "^2.1.5", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "path-is-absolute": "^1.0.0", - "postcss": "^4.1.11", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "directory-encoder": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/directory-encoder/-/directory-encoder-0.6.1.tgz", - "integrity": "sha1-rBHFF5JTeWMA5snZX48NG89UGQ8=", - "dev": true, - "requires": { - "fs-extra": "0.8.1", - "handlebars": "1.1.2", - "img-stats": "0.4.2", - "lodash": "2.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.8.1.tgz", - "integrity": "sha1-Dld5/7/t9RG8dVWVx/A8BtS0Po0=", - "dev": true, - "requires": { - "jsonfile": "~1.1.0", - "mkdirp": "0.3.x", - "ncp": "~0.4.2", - "rimraf": "~2.2.0" - }, - "dependencies": { - "jsonfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz", - "integrity": "sha1-2k/WrXfxolUgPqY8e8Mtwx72RDM=", - "dev": true - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "handlebars": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.1.2.tgz", - "integrity": "sha1-U2DstaSH/OARResiXMrzsp2z9D4=", - "dev": true, - "requires": { - "optimist": "~0.3", - "uglify-js": "~2.3" - }, - "dependencies": { - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, - "requires": { - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", - "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", - "dev": true, - "optional": true, - "requires": { - "async": "~0.2.6", - "optimist": "~0.3.5", - "source-map": "~0.1.7" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true, - "optional": true - } - } - } - } - } - } - }, - "img-stats": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/img-stats/-/img-stats-0.4.2.tgz", - "integrity": "sha1-DhnOTlXllJGF4CPwV8KKtajjInc=", - "dev": true, - "requires": { - "xmldom": "0.1.16" - }, - "dependencies": { - "xmldom": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.16.tgz", - "integrity": "sha1-zyYCgysatcPmgT/KCP5wGWuhXow=", - "dev": true - } - } - }, - "lodash": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.0.tgz", - "integrity": "sha1-VQdJgogzgba3E0t0KlkAu72rawk=", - "dev": true - } - } - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "reduce-function-call": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", - "integrity": "sha1-+gLhJuaVgkJjyrkdOlsP3B3Sepo=", - "dev": true, - "requires": { - "balanced-match": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - } - } - } - } - }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "requires": { - "gather-stream": "^1.0.0" - }, - "dependencies": { - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - } - } - }, - "to-slug-case": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/to-slug-case/-/to-slug-case-0.1.2.tgz", - "integrity": "sha1-X06eloVswx/jvZU/ZzxZcqlCv1g=", - "dev": true, - "requires": { - "to-space-case": "0.1.2" - }, - "dependencies": { - "to-space-case": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-0.1.2.tgz", - "integrity": "sha1-mma+Pr5T8nefaH8CYu/9H8W20V4=", - "dev": true, - "requires": { - "to-no-case": "0.1.1" - }, - "dependencies": { - "to-no-case": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-0.1.1.tgz", - "integrity": "sha1-zzPHDg8oFo2V5BWavxUOjFQu+f4=", - "dev": true - } - } - } - } - }, - "to-space-case": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-0.1.3.tgz", - "integrity": "sha1-uHhF8NM4P2toFRUInGvBoRyIwsM=", - "dev": true, - "requires": { - "to-no-case": "0.1.2" - }, - "dependencies": { - "to-no-case": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-0.1.2.tgz", - "integrity": "sha1-qJ59r113dcP/42vmRgPhYNKhtwk=", - "dev": true - } - } - }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - } + "is-extendable": "^0.1.0" } - }, - "express": { - "version": "4.13.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", - "integrity": "sha1-PAt288d1kMg0VzkGHsC9O6Bn7CQ=", + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "accepts": "~1.2.12", - "array-flatten": "1.1.1", - "content-disposition": "0.5.1", - "content-type": "~1.0.1", - "cookie": "0.1.5", - "cookie-signature": "1.0.6", - "debug": "~2.2.0", - "depd": "~1.1.0", - "escape-html": "~1.0.3", - "etag": "~1.7.0", - "finalhandler": "0.4.1", - "fresh": "0.3.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.1", - "path-to-regexp": "0.1.7", - "proxy-addr": "~1.0.10", - "qs": "4.0.0", - "range-parser": "~1.0.3", - "send": "0.13.1", - "serve-static": "~1.10.2", - "type-is": "~1.6.6", - "utils-merge": "1.0.0", - "vary": "~1.0.1" - }, - "dependencies": { - "accepts": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", - "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", - "dev": true, - "requires": { - "mime-types": "~2.1.6", - "negotiator": "0.5.3" - }, - "dependencies": { - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - }, - "negotiator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", - "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=", - "dev": true - } - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "content-disposition": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz", - "integrity": "sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs=", - "dev": true - }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", - "dev": true - }, - "cookie": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz", - "integrity": "sha1-armUiksa4hlSzSWIUwpHItQETXw=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "depd": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "etag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", - "dev": true - }, - "finalhandler": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", - "dev": true, - "requires": { - "debug": "~2.2.0", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - } - } - }, - "fresh": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - }, - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "proxy-addr": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", - "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=", - "dev": true, - "requires": { - "forwarded": "~0.1.0", - "ipaddr.js": "1.0.5" - }, - "dependencies": { - "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=", - "dev": true - }, - "ipaddr.js": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz", - "integrity": "sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c=", - "dev": true - } - } - }, - "qs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=", - "dev": true - }, - "range-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", - "dev": true - }, - "send": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", - "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", - "dev": true, - "requires": { - "debug": "~2.2.0", - "depd": "~1.1.0", - "destroy": "~1.0.4", - "escape-html": "~1.0.3", - "etag": "~1.7.0", - "fresh": "0.3.0", - "http-errors": "~1.3.1", - "mime": "1.3.4", - "ms": "0.7.1", - "on-finished": "~2.3.0", - "range-parser": "~1.0.3", - "statuses": "~1.2.1" - }, - "dependencies": { - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "statuses": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", - "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", - "dev": true, - "requires": { - "escape-html": "~1.0.3", - "parseurl": "~1.3.1", - "send": "0.13.2" - }, - "dependencies": { - "send": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", - "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", - "dev": true, - "requires": { - "debug": "~2.2.0", - "depd": "~1.1.0", - "destroy": "~1.0.4", - "escape-html": "~1.0.3", - "etag": "~1.7.0", - "fresh": "0.3.0", - "http-errors": "~1.3.1", - "mime": "1.3.4", - "ms": "0.7.1", - "on-finished": "~2.3.0", - "range-parser": "~1.0.3", - "statuses": "~1.2.1" - }, - "dependencies": { - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "statuses": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", - "dev": true - } - } - } - } - }, - "type-is": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", - "integrity": "sha1-boO6e8MM0zp7sLf7AHN6IIW/nQg=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.11" - }, - "dependencies": { - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - } - } - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", - "dev": true - }, - "vary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", - "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=", - "dev": true - } + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "jsonfile": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz", - "integrity": "sha1-KLyynFlrW3qv005mKjKbpizYQvw=", - "dev": true - }, - "klaw": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.0.tgz", - "integrity": "sha1-iFe/vB2CS63xPT0CQdi75G+xL3M=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - } - } - } + "kind-of": "^3.0.2" } }, - "gonzales-pe": { - "version": "3.0.0-31", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-3.0.0-31.tgz", - "integrity": "sha1-3DDZ3GB8uEhRj6ZztOTKFYPbJVI=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "minimist": "1.1.x" - }, - "dependencies": { - "minimist": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", - "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", - "dev": true - } + "isarray": "1.0.0" } }, - "gulp-cssnext": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gulp-cssnext/-/gulp-cssnext-1.0.1.tgz", - "integrity": "sha1-RreapKfbF9g40lmM336iR7Wp7Nw=", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "cssnext": "^1.0.0", - "gulp-util": "^3.0.0", - "through2": "^0.6.1" - }, - "dependencies": { - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } + "is-plain-object": "^2.0.4" } - }, - "gulp-mustache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gulp-mustache/-/gulp-mustache-2.0.2.tgz", - "integrity": "sha1-wM/2ephA4ro3akw+0yYL0W0q0j0=", + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "gulp-util": "3.0.7", - "mustache": "2.2.0", - "through2": "2.0.0" - }, - "dependencies": { - "mustache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.2.0.tgz", - "integrity": "sha1-0pgTtJm4BncStQM0fqw0LGFnJ8c=", - "dev": true - }, - "through2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.0.tgz", - "integrity": "sha1-9BocMd9eEp5DFERvZuygXNajBIA=", - "dev": true, - "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } + "is-descriptor": "^1.0.0" } }, - "gulp-postcss": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-6.1.1.tgz", - "integrity": "sha1-h01E6f9srd3VfOPJVSAuVy0mkBU=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "gulp-util": "^3.0.7", - "postcss": "^5.0.14", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - } + "is-extendable": "^0.1.0" } }, - "gulp-replace": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.5.4.tgz", - "integrity": "sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "istextorbinary": "1.0.2", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - }, - "dependencies": { - "istextorbinary": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", - "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", - "dev": true, - "requires": { - "binaryextensions": "~1.0.0", - "textextensions": "~1.0.0" - }, - "dependencies": { - "binaryextensions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", - "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", - "dev": true - }, - "textextensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", - "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "replacestream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.2.tgz", - "integrity": "sha1-DEFAcH5PAyP1DeBEhRcIz1i8N70=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "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 - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - } + "kind-of": "^6.0.0" } }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^1.0.11", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "beeper": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.0.tgz", - "integrity": "sha1-nub8HOf1T+qs585zWIsFYDeGaiw=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - }, - "dependencies": { - "array-find-index": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz", - "integrity": "sha1-C8Jd2slB7IpJauJY/UrBiAA+868=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - } - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.3.tgz", - "integrity": "sha1-yjw4KMT+qKpEmXiEs5j8XWdDZEI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - }, - "dependencies": { - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - } - } - }, - "fancy-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz", - "integrity": "sha1-1aUbU+mrIsoH1VjytnrlX9tfy9g=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz", - "integrity": "sha1-n0vSNVnJNllm8zAtu6KwfGuZsVE=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - }, - "dependencies": { - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - } - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - }, - "dependencies": { - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - } - } - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - }, - "dependencies": { - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - }, - "dependencies": { - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - } - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - }, - "dependencies": { - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - } - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - } - } - } + "kind-of": "^6.0.0" } }, - "jade": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", - "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "character-parser": "1.2.1", - "clean-css": "^3.1.9", - "commander": "~2.6.0", - "constantinople": "~3.0.1", - "jstransformer": "0.0.2", - "mkdirp": "~0.5.0", - "transformers": "2.1.0", - "uglify-js": "^2.4.19", - "void-elements": "~2.0.1", - "with": "~4.0.0" - }, - "dependencies": { - "character-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", - "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=", - "dev": true - }, - "clean-css": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.19.tgz", - "integrity": "sha1-wyqKE8o7gkYJsUMGpdp22Hk8eHQ=", - "dev": true, - "requires": { - "commander": "2.8.x", - "source-map": "0.4.x" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", - "dev": true - }, - "constantinople": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", - "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", - "dev": true, - "requires": { - "acorn": "^2.1.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "dev": true - } - } - }, - "jstransformer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", - "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", - "dev": true, - "requires": { - "is-promise": "^2.0.0", - "promise": "^6.0.1" - }, - "dependencies": { - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "promise": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", - "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", - "dev": true, - "requires": { - "asap": "~1.0.0" - }, - "dependencies": { - "asap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", - "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=", - "dev": true - } - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "transformers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", - "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", - "dev": true, - "requires": { - "css": "~1.0.8", - "promise": "~2.0", - "uglify-js": "~2.2.5" - }, - "dependencies": { - "css": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", - "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", - "dev": true, - "requires": { - "css-parse": "1.0.4", - "css-stringify": "1.0.5" - }, - "dependencies": { - "css-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", - "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=", - "dev": true - }, - "css-stringify": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", - "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=", - "dev": true - } - } - }, - "promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", - "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", - "dev": true, - "requires": { - "is-promise": "~1" - }, - "dependencies": { - "is-promise": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", - "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", - "dev": true, - "requires": { - "optimist": "~0.3.5", - "source-map": "~0.1.7" - }, - "dependencies": { - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, - "requires": { - "wordwrap": "~0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - } - } - }, - "uglify-js": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.3.tgz", - "integrity": "sha1-ObOnMpuJ9exQfjRMbiJWhpjvSGg=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - } - } - } - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "with": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", - "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", - "dev": true, - "requires": { - "acorn": "^1.0.1", - "acorn-globals": "^1.0.3" - }, - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=", - "dev": true - }, - "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", - "dev": true, - "requires": { - "acorn": "^2.1.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "dev": true - } - } - } - } - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "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 + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true }, - "kss": { + "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/kss/-/kss-2.1.1.tgz", - "integrity": "sha1-gTh1+0/1AiOdmWsPaVcUYD+dS30=", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, "requires": { - "glob": "^6.0.1", - "handlebars": "^4.0.0 || ^3.0.0 || ^2.0.0", - "marked": "^0.3.5", - "natural": "^0.2.1", - "wrench": "^1.5.8", - "yargs": "^3.30.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "handlebars": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.3.tgz", - "integrity": "sha1-ObOnMpuJ9exQfjRMbiJWhpjvSGg=", - "dev": true, - "optional": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true, - "optional": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true, - "optional": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true, - "optional": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - } - } - } - } - } - } - }, - "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", - "dev": true - }, - "natural": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/natural/-/natural-0.2.1.tgz", - "integrity": "sha1-HrUVap2QtFkZSeIOlOvHe7Iznto=", - "dev": true, - "requires": { - "apparatus": ">= 0.0.9", - "sylvester": ">= 0.0.12", - "underscore": ">=1.3.1" - }, - "dependencies": { - "apparatus": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.9.tgz", - "integrity": "sha1-N9zSWDStC2UQdllikduCPusZCL0=", - "dev": true, - "requires": { - "sylvester": ">= 0.0.8" - } - }, - "sylvester": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz", - "integrity": "sha1-KYexzivS84sNzio0OIiEv6RADqc=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - } - } - }, - "wrench": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", - "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=", - "dev": true - } + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true }, - "markdown-it": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-5.1.0.tgz", - "integrity": "sha1-JShrhGW6xJbz8bd+7VRGQ+m9cY0=", + "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, + "optional": true, "requires": { - "argparse": "~1.0.3", - "entities": "~1.1.1", - "linkify-it": "~1.2.0", - "mdurl": "~1.0.1", - "uc.micro": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", - "integrity": "sha1-wolQZIBVeBDxSovGLXoG9j7X+VE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "linkify-it": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", - "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "uc.micro": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.2.tgz", - "integrity": "sha1-Rm8mMWoLtwfe9mgvkfUBObi41Tg=", - "dev": true - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": 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, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": 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, + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true, + "optional": true }, - "morgan": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", - "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, + "optional": true, "requires": { - "basic-auth": "~1.0.3", - "debug": "~2.2.0", - "depd": "~1.0.1", - "on-finished": "~2.3.0", - "on-headers": "~1.0.0" - }, - "dependencies": { - "basic-auth": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", - "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "depd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - }, - "dependencies": { - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - } - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - } + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node-localcache": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-localcache/-/node-localcache-0.1.4.tgz", - "integrity": "sha1-OIE9z6YoU1VggieLKBWg5VEDILU=", + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, + "optional": true, "requires": { - "chalk": "1.1.1", - "lodash": "4.13.1", - "mkpath": "1.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", - "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", - "dev": true, - "requires": { - "ansi-styles": "^2.1.0", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "lodash": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=", - "dev": true - }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - } + "minipass": "^2.9.0" } }, - "postcss": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.0.tgz", - "integrity": "sha1-zb7ka0Wr7CRe1+6OkF/DNsHc4sk=", + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, + "optional": true, "requires": { - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.1.2" - }, - "dependencies": { - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - } - } - } + "minimist": "^1.2.5" } }, - "postcss-advanced-variables": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-advanced-variables/-/postcss-advanced-variables-1.2.2.tgz", - "integrity": "sha1-kKYhMmLmagUKNotKnF1HeNctvXQ=", + "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, + "optional": true + }, + "needle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", + "dev": true, + "optional": true, "requires": { - "postcss": "^5.0.10" + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, - "postcss-color-alpha": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-alpha/-/postcss-color-alpha-1.0.3.tgz", - "integrity": "sha1-82GsU44mJW4FIHHo0dPUzEZamds=", + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, + "optional": true, "requires": { - "color": "^0.10.1", - "postcss": "^5.0.8", - "postcss-message-helpers": "^2.0.0" - }, - "dependencies": { - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "dev": true, - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - } + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": 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, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" } }, - "postcss-color-function": { + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "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, + "optional": true + }, + "process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-function/-/postcss-color-function-2.0.1.tgz", - "integrity": "sha1-mtIm9VDop8f4uKd4YFRbbdf1UkE=", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "requires": { - "css-color-function": "^1.2.0", - "postcss": "^5.0.4", - "postcss-message-helpers": "^2.0.0", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "css-color-function": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-color-function/-/css-color-function-1.3.0.tgz", - "integrity": "sha1-csdnuvl48BuKipT0Lxe6XSKndvw=", - "dev": true, - "requires": { - "balanced-match": "0.1.0", - "color": "^0.11.0", - "debug": "~0.7.4", - "rgb": "~0.1.0" - }, - "dependencies": { - "balanced-match": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz", - "integrity": "sha1-tQS9BYabOSWd0MXvw12EMXbczEo=", - "dev": true - }, - "color": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.3.tgz", - "integrity": "sha1-S60dDVJJndANvW8IaEQkZ+STlOY=", - "dev": true, - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "color-convert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.5.0.tgz", - "integrity": "sha1-eitO+0SI34W8pkQ8sDi3EA++feE=", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - }, - "dependencies": { - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - } - } - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "rgb": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/rgb/-/rgb-0.1.0.tgz", - "integrity": "sha1-vieykej+/+rBvZlylyG/pA/AN7U=", - "dev": true - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - } + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, - "postcss-conditionals": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-conditionals/-/postcss-conditionals-2.0.2.tgz", - "integrity": "sha1-iV8BAzbWcYKTz60qFWL6Mw39AOI=", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "optional": true, "requires": { - "css-color-converter": "^1.0.2", - "css-unit-converter": "^1.0.0", - "postcss": "^5.0.4" - }, - "dependencies": { - "css-color-converter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-color-converter/-/css-color-converter-1.1.0.tgz", - "integrity": "sha1-wufZPC6WyK2Msax6Hy5J2AUq3jY=", - "dev": true, - "requires": { - "color-convert": "^0.5.2", - "color-name": "^1.0.0" - }, - "dependencies": { - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - }, - "css-unit-converter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.0.0.tgz", - "integrity": "sha1-jOxWofG4pR2o2O6FP845ii8hbNY=", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } }, - "postcss-custom-media": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-5.0.1.tgz", - "integrity": "sha1-E40loYS/LrVN4S1VpsAcMKnYvYE=", + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + } + }, + "gulp-livereload": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-4.0.2.tgz", + "integrity": "sha512-InmaR50Xl1xB1WdEk4mrUgGHv3VhhlRLrx7u60iY5AAer90FlK95KXitPcGGQoi28zrUJM189d/h6+V470Ncgg==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "fancy-log": "^1.3.2", + "lodash.assign": "^4.2.0", + "readable-stream": "^3.0.6", + "tiny-lr": "^1.1.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "gulp-mustache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-mustache/-/gulp-mustache-2.2.0.tgz", + "integrity": "sha1-qaqPMV0CMIy6mP5ud7l/p4XjLH8=", + "dev": true, + "requires": { + "gulp-util": "^3.0.7", + "mustache": "^2.2.1", + "through2": "^2.0.0" + } + }, + "gulp-rename": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.3.tgz", + "integrity": "sha512-CmdPM0BjJ105QCX1fk+j7NGhiN/1rCl9HLGss+KllBS/tdYadpjTxqdKyh/5fNV+M3yjT1MFz5z93bXdrTyzAw==", + "dev": true + }, + "gulp-sass": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.2.tgz", + "integrity": "sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "lodash.clonedeep": "^4.3.2", + "node-sass": "^4.8.3", + "plugin-error": "^1.0.1", + "replace-ext": "^1.0.0", + "strip-ansi": "^4.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-watch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz", + "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "anymatch": "^1.3.0", + "chokidar": "^2.0.0", + "fancy-log": "1.3.2", + "glob-parent": "^3.0.1", + "object-assign": "^4.1.0", + "path-is-absolute": "^1.0.1", + "plugin-error": "1.0.1", + "readable-stream": "^2.2.2", + "slash": "^1.0.0", + "vinyl": "^2.1.0", + "vinyl-file": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "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 + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "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-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "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.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.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 + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mustache": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "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-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "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 + }, + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "postcss": "^5.0.0" + "is-extendable": "^0.1.0" } - }, - "postcss-import": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-8.1.2.tgz", - "integrity": "sha1-8dvM5ZDJO1NqEh/+3LY/G3UXSfk=", + } + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "pkg-resolve": "^0.1.7", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "dependencies": { - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "pkg-resolve": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/pkg-resolve/-/pkg-resolve-0.1.14.tgz", - "integrity": "sha1-Mpsudsy7Ny4i5qOkHLMKsEV4Nro=", - "dev": true, - "requires": { - "jspm": "^0.17.0-beta.13", - "resolve": "^1.1.7" - }, - "dependencies": { - "jspm": { - "version": "0.17.0-beta.28", - "resolved": "https://registry.npmjs.org/jspm/-/jspm-0.17.0-beta.28.tgz", - "integrity": "sha1-vhAMRcf6Rf6AAupTAHN33E/cIsg=", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "chalk": "^1.1.1", - "core-js": "^1.2.6", - "glob": "^6.0.1", - "graceful-fs": "^4.1.2", - "jspm-github": "^0.14.10", - "jspm-npm": "^0.29.4", - "jspm-registry": "^0.4.1", - "liftoff": "^2.2.0", - "minimatch": "^3.0.0", - "mkdirp": "~0.5.1", - "ncp": "^2.0.0", - "proper-lockfile": "^1.1.2", - "request": "^2.67.0", - "rimraf": "^2.4.4", - "sane": "^1.3.3", - "semver": "^5.1.0", - "systemjs": "0.19.37", - "systemjs-builder": "0.15.30", - "traceur": "0.0.105", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "bluebird": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", - "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=", - "dev": true - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "jspm-github": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/jspm-github/-/jspm-github-0.14.10.tgz", - "integrity": "sha1-qU7pOE+CHIlOUxdrKBmaTTkuAPs=", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "expand-tilde": "^1.2.0", - "graceful-fs": "^4.1.3", - "mkdirp": "~0.5.0", - "netrc": "^0.1.3", - "request": "~2.53.0", - "rimraf": "~2.3.2", - "semver": "^5.0.1", - "tar-fs": "^1.13.0", - "which": "^1.0.9" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "netrc": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", - "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=", - "dev": true - }, - "request": { - "version": "2.53.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.53.0.tgz", - "integrity": "sha1-GAo66St7Y5gC5PlUXdj83rcddgw=", - "dev": true, - "requires": { - "aws-sign2": "~0.5.0", - "bl": "~0.9.0", - "caseless": "~0.9.0", - "combined-stream": "~0.0.5", - "forever-agent": "~0.5.0", - "form-data": "~0.2.0", - "hawk": "~2.3.0", - "http-signature": "~0.10.0", - "isstream": "~0.1.1", - "json-stringify-safe": "~5.0.0", - "mime-types": "~2.0.1", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.6.0", - "qs": "~2.3.1", - "stringstream": "~0.0.4", - "tough-cookie": ">=0.12.0", - "tunnel-agent": "~0.4.0" - }, - "dependencies": { - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - }, - "caseless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", - "integrity": "sha1-t7Zc5r8UE4hlOc/VM/CzDv+pz4g=", - "dev": true - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, - "requires": { - "delayed-stream": "0.0.5" - }, - "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true - } - } - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", - "dev": true - }, - "form-data": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", - "dev": true, - "requires": { - "async": "~0.9.0", - "combined-stream": "~0.0.4", - "mime-types": "~2.0.3" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - } - } - }, - "hawk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "dev": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" - }, - "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "~1.12.0" - }, - "dependencies": { - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - } - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true - }, - "oauth-sign": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", - "integrity": "sha1-fb6uRPbKRU4fFoRR1jB0ZzWBPOM=", - "dev": true - }, - "qs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", - "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", - "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "rimraf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.3.4.tgz", - "integrity": "sha1-gtm8Gy/PMeIFrHsoE4oCXQjpFZo=", - "dev": true, - "requires": { - "glob": "^4.4.2" - }, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "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 - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - } - } - }, - "tar-fs": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.13.2.tgz", - "integrity": "sha1-Qz6Hn5U41+Hog7qRSQTzOcZBSDU=", - "dev": true, - "requires": { - "mkdirp": "^0.5.0", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "dependencies": { - "pump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.1.tgz", - "integrity": "sha1-8fFAn7m9EIW721drQ7hOxLXq3Bo=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "dependencies": { - "end-of-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", - "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "tar-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz", - "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=", - "dev": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "end-of-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", - "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "jspm-npm": { - "version": "0.29.4", - "resolved": "https://registry.npmjs.org/jspm-npm/-/jspm-npm-0.29.4.tgz", - "integrity": "sha1-uD2Q4rzf/b0CsL+o53Mm8RdaA3Q=", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "buffer-peek-stream": "^1.0.1", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "readdirp": "^2.0.0", - "request": "~2.58.0", - "rmdir": "~1.1.0", - "semver": "^5.0.1", - "systemjs-builder": "^0.15.20", - "tar-fs": "^1.13.0", - "traceur": "0.0.105", - "which": "^1.1.1" - }, - "dependencies": { - "CHANGELOG.md": {}, - "LICENSE": {}, - "README.md": {}, - "buffer-peek-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-peek-stream/-/buffer-peek-stream-1.0.1.tgz", - "integrity": "sha1-U7R1cKE0d4fFutTKLKMCH52LPP0=", - "dev": true - }, - "buffer-peek-stream.js": {}, - "package.json": {}, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - } - } - }, - "request": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.58.0.tgz", - "integrity": "sha1-tfScC5Sqt/rTiGEqH7atA7bMFYA=", - "dev": true, - "requires": { - "aws-sign2": "~0.5.0", - "bl": "~0.9.0", - "caseless": "~0.10.0", - "combined-stream": "~1.0.1", - "extend": "~2.0.1", - "forever-agent": "~0.6.0", - "form-data": "~1.0.0-rc1", - "har-validator": "^1.6.1", - "hawk": "~2.3.0", - "http-signature": "~0.11.0", - "isstream": "~0.1.1", - "json-stringify-safe": "~5.0.0", - "mime-types": "~2.0.1", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.8.0", - "qs": "~3.1.0", - "stringstream": "~0.0.4", - "tough-cookie": ">=0.12.0", - "tunnel-agent": "~0.4.0" - }, - "dependencies": { - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "dev": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - } - } - }, - "caseless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz", - "integrity": "sha1-7WsnGa3NH9GPWNwIHA8aW0OWOQk=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - } - } - }, - "extend": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz", - "integrity": "sha1-HugBBonnOV/5RIJByYZSvHWagmA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "dev": true, - "requires": { - "async": "^2.0.1", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.11" - }, - "dependencies": { - "async": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", - "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", - "dev": true, - "requires": { - "lodash": "^4.8.0" - }, - "dependencies": { - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - } - } - }, - "har-validator": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "integrity": "sha1-2DhCsOtMQ1lgrrEIoGejqpTA7rI=", - "dev": true, - "requires": { - "bluebird": "^2.9.30", - "chalk": "^1.0.0", - "commander": "^2.8.1", - "is-my-json-valid": "^2.12.0" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - }, - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } - } - }, - "hawk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "http-signature": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", - "integrity": "sha1-F5bPZ6ABrVzWhJ3KCZFIXwkIn+Y=", - "dev": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" - }, - "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "~1.12.0" - }, - "dependencies": { - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - } - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "qs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz", - "integrity": "sha1-0OmudFIzoS3EP7TzBVu6RGJhFTw=", - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", - "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "rmdir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rmdir/-/rmdir-1.1.0.tgz", - "integrity": "sha1-ubwZ3jOzEKrnHv7mf73LsIaLwq0=", - "dev": true, - "requires": { - "node.flow": "1.2.3" - }, - "dependencies": { - "node.flow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/node.flow/-/node.flow-1.2.3.tgz", - "integrity": "sha1-4cRKgq7KjXi0WKd/s9xkLy66Jkk=", - "dev": true, - "requires": { - "node.extend": "1.0.8" - }, - "dependencies": { - "node.extend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.0.8.tgz", - "integrity": "sha1-urBDefc4P0WHmQyd8Htqf2Xbdys=", - "dev": true, - "requires": { - "is": "~0.2.6", - "object-keys": "~0.4.0" - }, - "dependencies": { - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - } - } - } - } - } - } - }, - "tar-fs": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.13.2.tgz", - "integrity": "sha1-Qz6Hn5U41+Hog7qRSQTzOcZBSDU=", - "dev": true, - "requires": { - "mkdirp": "^0.5.0", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "dependencies": { - "pump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.1.tgz", - "integrity": "sha1-8fFAn7m9EIW721drQ7hOxLXq3Bo=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "dependencies": { - "end-of-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", - "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "tar-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz", - "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=", - "dev": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "end-of-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", - "integrity": "sha1-6TUyWLqpEIll78QcsO+K3i88+wc=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "jspm-registry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/jspm-registry/-/jspm-registry-0.4.1.tgz", - "integrity": "sha1-KjDEGZBq1x1NppLRUyAJ3SAcWxQ=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.3", - "rimraf": "^2.3.2", - "rsvp": "^3.0.18", - "semver": "^4.3.3" - }, - "dependencies": { - "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^0.4.2", - "fined": "^1.0.1", - "flagged-respawn": "^0.3.2", - "lodash.isplainobject": "^4.0.4", - "lodash.isstring": "^4.0.1", - "lodash.mapvalues": "^4.4.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "findup-sync": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.2.tgz", - "integrity": "sha1-qBF9D3MST1pFRoOVef5S1xKfteU=", - "dev": true, - "requires": { - "detect-file": "^0.1.0", - "is-glob": "^2.0.1", - "micromatch": "^2.3.7", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0" - }, - "dependencies": { - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - } - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - }, - "dependencies": { - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - } - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - }, - "dependencies": { - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - } - } - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "dependencies": { - "global-prefix": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.4.tgz", - "integrity": "sha1-BRWNsc3i3UkbRV4pDrOri/xFxuE=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "osenv": "^0.1.3", - "which": "^1.2.10" - }, - "dependencies": { - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "osenv": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", - "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", - "dev": true - } - } - }, - "which": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz", - "integrity": "sha1-yLLu6muMFln6fB3U/aq+lTPcXos=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - } - } - } - } - } - } - }, - "fined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.0.1.tgz", - "integrity": "sha1-xIr5q1qOD0AKA3XoQVTDdnTav9Q=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.1", - "lodash.assignwith": "^4.0.7", - "lodash.isarray": "^4.0.0", - "lodash.isempty": "^4.2.1", - "lodash.isplainobject": "^4.0.4", - "lodash.isstring": "^4.0.1", - "lodash.pick": "^4.2.1", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha1-EnqX8CrcQXUalU0ksN4X4QDgOOs=", - "dev": true - }, - "lodash.isarray": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-4.0.0.tgz", - "integrity": "sha1-KspJayjEym1yZxUxNZDALm6jRAM=", - "dev": true - }, - "lodash.isempty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true, - "requires": { - "is-absolute": "^0.2.3", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "dependencies": { - "is-absolute": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.5.tgz", - "integrity": "sha1-mUFCufRo0nwU+/DNMP5325NMp20=", - "dev": true, - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.1.1" - }, - "dependencies": { - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true, - "requires": { - "is-unc-path": "^0.1.1" - }, - "dependencies": { - "is-unc-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.1.tgz", - "integrity": "sha1-qyUz13rXM1YRJMPcD1zYuQBUyGs=", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.0" - }, - "dependencies": { - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - } - } - } - } - }, - "is-windows": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.1.1.tgz", - "integrity": "sha1-vjEHFUMc+rzMVKs5USEPoLbQGr4=", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - }, - "dependencies": { - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - } - } - } - } - } - } - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "proper-lockfile": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-1.1.3.tgz", - "integrity": "sha1-F4vq5v9OtVguqan97dWsCinchwM=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "extend": "^3.0.0", - "graceful-fs": "^4.1.2", - "retry": "^0.10.0" - }, - "dependencies": { - "err-code": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.1.tgz", - "integrity": "sha1-c51xtoUfJNBQ6hjHmltyJCB3HVk=", - "dev": true - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "retry": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.0.tgz", - "integrity": "sha1-ZJ4VykCEItmDGBYZNef31lLUNd0=", - "dev": true - } - } - }, - "request": { - "version": "2.74.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "bl": "~1.1.2", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc4", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.2.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", - "integrity": "sha1-/efVKSRm0jDl7g9OA42d+qsI/GE=", - "dev": true - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "requires": { - "readable-stream": "~2.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "dev": true, - "requires": { - "async": "^2.0.1", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.11" - }, - "dependencies": { - "async": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", - "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", - "dev": true, - "requires": { - "lodash": "^4.8.0" - }, - "dependencies": { - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "is-my-json-valid": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "integrity": "sha1-1Vd4qC/rawlj/0vhEdXRaE6JBwc=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - }, - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "jsprim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", - "integrity": "sha1-zi4b74NSBLTzCZkoxgL4tq5hVlA=", - "dev": true, - "requires": { - "extsprintf": "1.0.2", - "json-schema": "0.2.2", - "verror": "1.3.6" - }, - "dependencies": { - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "json-schema": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", - "dev": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - } - } - }, - "sshpk": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.0.tgz", - "integrity": "sha1-EE1roq+yrAmauVZ8DRk5d/Kcbfo=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", - "integrity": "sha1-PKdrhSQccXC/fZcD57mqdGMAQNQ=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", - "integrity": "sha1-PaOC9nDyXe1417PReSEZvKC3Ey0=", - "dev": true, - "optional": true - } - } - }, - "dashdash": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", - "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "getpass": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", - "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", - "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", - "dev": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-types": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, - "requires": { - "mime-db": "~1.23.0" - }, - "dependencies": { - "mime-db": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true - } - } - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "qs": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", - "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz", - "integrity": "sha1-mcd9+7fYBCSeiimdTLD9gf7wg/0=", - "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - } - } - }, - "sane": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", - "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" - }, - "dependencies": { - "exec-sh": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", - "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", - "dev": true, - "requires": { - "merge": "^1.1.3" - }, - "dependencies": { - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - } - } - }, - "fb-watchman": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.0.tgz", - "integrity": "sha1-byaPHzR6azyHXR6J2n4e15rfwOw=", - "dev": true, - "requires": { - "bser": "^1.0.2" - }, - "dependencies": { - "bser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", - "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - }, - "dependencies": { - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - } - } - } - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - }, - "dependencies": { - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - }, - "dependencies": { - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - } - } - } - } - }, - "watch": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", - "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", - "dev": true - } - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "systemjs": { - "version": "0.19.37", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.19.37.tgz", - "integrity": "sha1-WLFSiqU7bPZUWLoWVjQzPzmq254=", - "dev": true, - "requires": { - "when": "^3.7.5" - }, - "dependencies": { - "when": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", - "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", - "dev": true - } - } - }, - "systemjs-builder": { - "version": "0.15.30", - "resolved": "https://registry.npmjs.org/systemjs-builder/-/systemjs-builder-0.15.30.tgz", - "integrity": "sha1-0UZERrPsfa18oKbeKDgsGwa/tpw=", - "dev": true, - "requires": { - "babel-core": "^6.9.0", - "babel-plugin-transform-cjs-system-wrapper": "^0.2.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.6.5", - "babel-plugin-transform-global-system-wrapper": "0.0.1", - "babel-plugin-transform-system-register": "0.0.1", - "bluebird": "^3.3.4", - "data-uri-to-buffer": "0.0.4", - "es6-template-strings": "^2.0.0", - "glob": "^7.0.3", - "mkdirp": "^0.5.1", - "rollup": "^0.31.2", - "source-map": "^0.5.3", - "systemjs": "^0.19.35", - "traceur": "0.0.105", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "babel-core": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.14.0.tgz", - "integrity": "sha1-yeE+1OL5cykhVJb9n7SPKzvLm0I=", - "dev": true, - "requires": { - "babel-code-frame": "^6.8.0", - "babel-generator": "^6.14.0", - "babel-helpers": "^6.8.0", - "babel-messages": "^6.8.0", - "babel-register": "^6.14.0", - "babel-runtime": "^6.9.1", - "babel-template": "^6.14.0", - "babel-traverse": "^6.14.0", - "babel-types": "^6.14.0", - "babylon": "^6.9.0", - "convert-source-map": "^1.1.0", - "debug": "^2.1.1", - "json5": "^0.4.0", - "lodash": "^4.2.0", - "minimatch": "^3.0.2", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^2.0.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "js-tokens": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.14.0.tgz", - "integrity": "sha1-Dz8XPpy5XVAbGnNVmLGlk9vuNwU=", - "dev": true, - "requires": { - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.14.0", - "detect-indent": "^3.0.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - }, - "dependencies": { - "is-finite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - } - } - } - } - }, - "babel-helpers": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.8.0.tgz", - "integrity": "sha1-MhxW+cnKwaKX+Cf9/2OLJ6YpJQM=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "babel-template": "^6.8.0" - } - }, - "babel-messages": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "babel-register": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.14.0.tgz", - "integrity": "sha1-EmH5TuN1gItWTiSoAMwhea+/AGc=", - "dev": true, - "requires": { - "babel-core": "^6.14.0", - "babel-runtime": "^6.11.6", - "core-js": "^2.4.0", - "home-or-tmp": "^1.0.0", - "lodash": "^4.2.0", - "mkdirp": "^0.5.1", - "path-exists": "^1.0.0", - "source-map-support": "^0.2.10" - }, - "dependencies": { - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - }, - "dependencies": { - "os-tmpdir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", - "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", - "dev": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - } - } - }, - "babel-runtime": { - "version": "6.11.6", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz", - "integrity": "sha1-bbcH/vLUnEm/o8tk79tDa1GLgiI=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" - }, - "dependencies": { - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", - "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", - "dev": true - } - } - }, - "babel-template": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.15.0.tgz", - "integrity": "sha1-oPJJyJ1dV+gG/FDQ7FIvvd6t4fI=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.0", - "babel-traverse": "^6.15.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "lodash": "^4.2.0" - } - }, - "babel-traverse": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.15.0.tgz", - "integrity": "sha1-8BFMjITP7jLJTsoCvNDSy8iShHg=", - "dev": true, - "requires": { - "babel-code-frame": "^6.8.0", - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "debug": "^2.2.0", - "globals": "^8.3.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", - "dev": true - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", - "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", - "dev": true, - "requires": { - "js-tokens": "^1.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", - "dev": true - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.15.0.tgz", - "integrity": "sha1-QT1P70dQpIVw3oGfGKZNOaTz3Dg=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", - "dev": true - } - } - }, - "babylon": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.9.1.tgz", - "integrity": "sha1-uDnzkAm/210g43Z3sbeALFn+Mu4=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "convert-source-map": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", - "integrity": "sha1-6fPpxuJyjvwmdmlqcOs4L3MQamc=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", - "dev": true - }, - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "private": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.6.tgz", - "integrity": "sha1-VcapdtD5uvuZJIUTUP5HubX7t8E=", - "dev": true - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, - "babel-plugin-transform-cjs-system-wrapper": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.2.1.tgz", - "integrity": "sha1-6FUHiHe1bU0bkrn5Gzf1mdsCAOM=", - "dev": true, - "requires": { - "babel-plugin-transform-cjs-system-require": "^0.1.1", - "babel-template": "^6.9.0" - }, - "dependencies": { - "babel-plugin-transform-cjs-system-require": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-cjs-system-require/-/babel-plugin-transform-cjs-system-require-0.1.1.tgz", - "integrity": "sha1-/+8m0xvCcOgr271DfbJ3foUWKik=", - "dev": true - }, - "babel-template": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.15.0.tgz", - "integrity": "sha1-oPJJyJ1dV+gG/FDQ7FIvvd6t4fI=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.0", - "babel-traverse": "^6.15.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.11.6", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz", - "integrity": "sha1-bbcH/vLUnEm/o8tk79tDa1GLgiI=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" - }, - "dependencies": { - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", - "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.15.0.tgz", - "integrity": "sha1-8BFMjITP7jLJTsoCvNDSy8iShHg=", - "dev": true, - "requires": { - "babel-code-frame": "^6.8.0", - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "debug": "^2.2.0", - "globals": "^8.3.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^2.0.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "js-tokens": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", - "dev": true - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", - "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", - "dev": true, - "requires": { - "js-tokens": "^1.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", - "dev": true - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.15.0.tgz", - "integrity": "sha1-QT1P70dQpIVw3oGfGKZNOaTz3Dg=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", - "dev": true - } - } - }, - "babylon": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.9.1.tgz", - "integrity": "sha1-uDnzkAm/210g43Z3sbeALFn+Mu4=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - } - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.14.0.tgz", - "integrity": "sha1-xRm1xz4yOI5nnJse30Gy/CPcMwM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.8.0", - "babel-runtime": "^6.11.6", - "babel-template": "^6.14.0" - }, - "dependencies": { - "babel-helper-hoist-variables": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.8.0.tgz", - "integrity": "sha1-iwdm3AJuqepCO8KzTmZaTac3Oq8=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "babel-types": "^6.8.0" - }, - "dependencies": { - "babel-types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.15.0.tgz", - "integrity": "sha1-QT1P70dQpIVw3oGfGKZNOaTz3Dg=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", - "dev": true - } - } - } - } - }, - "babel-runtime": { - "version": "6.11.6", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz", - "integrity": "sha1-bbcH/vLUnEm/o8tk79tDa1GLgiI=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" - }, - "dependencies": { - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", - "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", - "dev": true - } - } - }, - "babel-template": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.15.0.tgz", - "integrity": "sha1-oPJJyJ1dV+gG/FDQ7FIvvd6t4fI=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.0", - "babel-traverse": "^6.15.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-traverse": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.15.0.tgz", - "integrity": "sha1-8BFMjITP7jLJTsoCvNDSy8iShHg=", - "dev": true, - "requires": { - "babel-code-frame": "^6.8.0", - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "debug": "^2.2.0", - "globals": "^8.3.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^2.0.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "js-tokens": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", - "dev": true - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", - "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", - "dev": true, - "requires": { - "js-tokens": "^1.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", - "dev": true - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.15.0.tgz", - "integrity": "sha1-QT1P70dQpIVw3oGfGKZNOaTz3Dg=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", - "dev": true - } - } - }, - "babylon": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.9.1.tgz", - "integrity": "sha1-uDnzkAm/210g43Z3sbeALFn+Mu4=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - } - } - }, - "babel-plugin-transform-global-system-wrapper": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.0.1.tgz", - "integrity": "sha1-r7RpzsDgRom5/n6LH9KA/JSm2PI=", - "dev": true, - "requires": { - "babel-template": "^6.9.0" - }, - "dependencies": { - "babel-template": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.15.0.tgz", - "integrity": "sha1-oPJJyJ1dV+gG/FDQ7FIvvd6t4fI=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.0", - "babel-traverse": "^6.15.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-runtime": { - "version": "6.11.6", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.11.6.tgz", - "integrity": "sha1-bbcH/vLUnEm/o8tk79tDa1GLgiI=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.9.5" - }, - "dependencies": { - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", - "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.15.0.tgz", - "integrity": "sha1-8BFMjITP7jLJTsoCvNDSy8iShHg=", - "dev": true, - "requires": { - "babel-code-frame": "^6.8.0", - "babel-messages": "^6.8.0", - "babel-runtime": "^6.9.0", - "babel-types": "^6.15.0", - "babylon": "^6.9.0", - "debug": "^2.2.0", - "globals": "^8.3.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babel-code-frame": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0", - "chalk": "^1.1.0", - "esutils": "^2.0.2", - "js-tokens": "^2.0.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "js-tokens": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - }, - "dependencies": { - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", - "dev": true - }, - "invariant": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", - "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", - "dev": true, - "requires": { - "js-tokens": "^1.0.1" - }, - "dependencies": { - "js-tokens": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", - "dev": true - } - } - } - } - } - } - }, - "babel-types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.15.0.tgz", - "integrity": "sha1-QT1P70dQpIVw3oGfGKZNOaTz3Dg=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.1", - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^1.0.1" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", - "dev": true - } - } - }, - "babylon": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.9.1.tgz", - "integrity": "sha1-uDnzkAm/210g43Z3sbeALFn+Mu4=", - "dev": true, - "requires": { - "babel-runtime": "^6.0.0" - } - }, - "lodash": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz", - "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=", - "dev": true - } - } - } - } - }, - "babel-plugin-transform-system-register": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz", - "integrity": "sha1-nf9AOQwnY6xRjwsq18XqT2WlviU=", - "dev": true - }, - "data-uri-to-buffer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz", - "integrity": "sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=", - "dev": true - }, - "es6-template-strings": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-template-strings/-/es6-template-strings-2.0.1.tgz", - "integrity": "sha1-sWbGpiVi9Hi7d3X2ypYQOlmbSyw=", - "dev": true, - "requires": { - "es5-ext": "^0.10.12", - "esniff": "^1.1" - }, - "dependencies": { - "es5-ext": { - "version": "0.10.12", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz", - "integrity": "sha1-qoRkHU23a2Krul5F/YBey6sUAEc=", - "dev": true, - "requires": { - "es6-iterator": "2", - "es6-symbol": "~3.1" - }, - "dependencies": { - "es6-iterator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz", - "integrity": "sha1-vZaFZ9YWNeM8C4BydhPJy0sJa6w=", - "dev": true, - "requires": { - "d": "^0.1.1", - "es5-ext": "^0.10.7", - "es6-symbol": "3" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - } - } - }, - "es6-symbol": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz", - "integrity": "sha1-lEgcZV56fK2C66gy2X1UM0ltf/o=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11" - }, - "dependencies": { - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - } - } - } - } - }, - "esniff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", - "integrity": "sha1-xmhJIp+RRk3t4uDUAgHtar9l8qw=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.12" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - } - } - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "rollup": { - "version": "0.31.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.31.2.tgz", - "integrity": "sha1-tHn+Cl+vfDELjMlj2k3Q6wphdNA=", - "dev": true, - "requires": { - "source-map-support": "^0.4.0" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.2.tgz", - "integrity": "sha1-BxDcUxVAHgvtvgiZobuTitvALVs=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - } - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, - "traceur": { - "version": "0.0.105", - "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.105.tgz", - "integrity": "sha1-XPne6D1rd4YcPWxE1ThZrterBHk=", - "dev": true, - "requires": { - "commander": "2.9.x", - "glob": "5.0.x", - "rsvp": "^3.0.13", - "semver": "^4.3.3", - "source-map-support": "~0.2.8" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - }, - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - } - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - } - } - } - } - }, - "uglify-js": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.3.tgz", - "integrity": "sha1-ObOnMpuJ9exQfjRMbiJWhpjvSGg=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - } - } - } - } - } - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "is-descriptor": "^0.1.0" } }, - "postcss-inline-comment": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-inline-comment/-/postcss-inline-comment-2.1.0.tgz", - "integrity": "sha1-wysEU6BDCKHA1J4twqB3eaens8Y=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "postcss": "^5.0.21" + "is-extendable": "^0.1.0" } - }, - "postcss-mixins": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-4.0.2.tgz", - "integrity": "sha1-ZmJ6Wol3lTquVxoibgmUCEoCHcY=", + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "globby": "^4.1.0", - "postcss": "^5.0.21", - "postcss-js": "^0.1.3", - "postcss-simple-vars": "^2.0.0" - }, - "dependencies": { - "globby": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", - "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^6.0.1", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - }, - "dependencies": { - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - } - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "postcss-js": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-0.1.3.tgz", - "integrity": "sha1-jApdqhyRizBzxIBqPFszLGclDAM=", - "dev": true, - "requires": { - "camelcase-css": "^1.0.1", - "postcss": "^5.0.21" - }, - "dependencies": { - "camelcase-css": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-1.0.1.tgz", - "integrity": "sha1-FXxCOCZfXPlKHf/ehkRlUsvz9wU=", - "dev": true - } - } - }, - "postcss-simple-vars": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-simple-vars/-/postcss-simple-vars-2.0.0.tgz", - "integrity": "sha1-0KEJGw2iK3lQcCj3siuXbApguNU=", - "dev": true, - "requires": { - "postcss": "^5.0.21" - } - } + "is-descriptor": "^1.0.0" } }, - "postcss-nested": { + "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-1.0.0.tgz", - "integrity": "sha1-0Ta9S1dr1WMt8ULBKyGYqcz3lN8=", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "postcss": "^5.0.2" + "kind-of": "^6.0.0" } }, - "postcss-partial-import": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-partial-import/-/postcss-partial-import-1.3.0.tgz", - "integrity": "sha1-L0t3OnbHsKabOJ3PR1xNNi0NJXY=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "fs-extra": "^0.24.0", - "fs-promise": "^0.3.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.5", - "string-hash": "^1.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.24.0.tgz", - "integrity": "sha1-1OQ0KpZnXLeEZjOmCZJJMytTmVI=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "jsonfile": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.3.1.tgz", - "integrity": "sha1-KLyynFlrW3qv005mKjKbpizYQvw=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - } - } - } - } - }, - "fs-promise": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.3.1.tgz", - "integrity": "sha1-vzQFA2jyTW3J38ZoirXOrY+GhCo=", - "dev": true, - "requires": { - "any-promise": "~0.1.0" - }, - "dependencies": { - "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "string-hash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.0.tgz", - "integrity": "sha1-5KH+mGL7dr/AGlqgv6/gVht+8l0=", - "dev": true - } + "kind-of": "^6.0.0" } }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "run-sequence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.1.5.tgz", - "integrity": "sha1-VWvUfrR4dzSeNsnFgnSIl9t75Pc=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "chalk": "*", - "gulp-util": "*" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "socket.io": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.3.7.tgz", - "integrity": "sha1-k3R6KbyrYmbw++GREsyl4TiM960=", + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "debug": "2.1.0", - "engine.io": "1.5.4", - "has-binary-data": "0.1.3", - "socket.io-adapter": "0.3.1", - "socket.io-client": "1.3.7", - "socket.io-parser": "2.2.4" - }, - "dependencies": { - "debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.0.tgz", - "integrity": "sha1-M6uRVlnYwsyKQUQ9lNbr03aX7SE=", - "dev": true, - "requires": { - "ms": "0.6.2" - }, - "dependencies": { - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - } - } - }, - "engine.io": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.5.4.tgz", - "integrity": "sha1-xhQQEpEcNQYxwbOQ9TJOtCAuKfI=", - "dev": true, - "requires": { - "base64id": "0.1.0", - "debug": "1.0.3", - "engine.io-parser": "1.2.2", - "ws": "0.8.0" - }, - "dependencies": { - "base64id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", - "dev": true - }, - "debug": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", - "integrity": "sha1-/IxrLWACgEtAgcAgjg9kYLofo+Q=", - "dev": true, - "requires": { - "ms": "0.6.2" - }, - "dependencies": { - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", - "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", - "dev": true, - "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.4", - "has-binary": "0.1.6", - "utf8": "2.1.0" - }, - "dependencies": { - "after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=", - "dev": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "has-binary": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", - "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "utf8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", - "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=", - "dev": true - } - } - }, - "ws": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", - "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", - "dev": true, - "requires": { - "bufferutil": "1.2.x", - "options": ">=0.0.5", - "ultron": "1.0.x", - "utf-8-validate": "1.2.x" - }, - "dependencies": { - "bufferutil": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", - "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", - "dev": true, - "optional": true, - "requires": { - "bindings": "1.2.x", - "nan": "^2.0.5" - }, - "dependencies": { - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - } - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "utf-8-validate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", - "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", - "dev": true, - "optional": true, - "requires": { - "bindings": "1.2.x", - "nan": "^2.0.5" - }, - "dependencies": { - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - } - } - } - } - } - } - }, - "has-binary-data": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.3.tgz", - "integrity": "sha1-jrsYOItX8ZpSMSdaFvwY1R83mq4=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.3.1.tgz", - "integrity": "sha1-34H5cLTfZJOQLZPlGce3J1XDqVg=", - "dev": true, - "requires": { - "debug": "1.0.2", - "object-keys": "1.0.1", - "socket.io-parser": "2.2.2" - }, - "dependencies": { - "debug": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", - "integrity": "sha1-OElZHBDM5khHbDx8Li40FttZY8Q=", - "dev": true, - "requires": { - "ms": "0.6.2" - }, - "dependencies": { - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - } - } - }, - "object-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.1.tgz", - "integrity": "sha1-VYAuhYQsJru167wVer874wJWm6g=", - "dev": true - }, - "socket.io-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", - "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", - "dev": true, - "requires": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "isarray": "0.0.1", - "json3": "3.2.6" - }, - "dependencies": { - "benchmark": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", - "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", - "dev": true - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=", - "dev": true - } - } - } - } - }, - "socket.io-client": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.3.7.tgz", - "integrity": "sha1-erfAabjVBCXrJl8DH4Spfm6+cZw=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "engine.io-client": "1.5.4", - "has-binary": "0.1.6", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.2", - "socket.io-parser": "2.2.4", - "to-array": "0.1.3" - }, - "dependencies": { - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "engine.io-client": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.5.4.tgz", - "integrity": "sha1-xq1lpldSopy5MMaRHledKyjREGw=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "component-inherit": "0.0.3", - "debug": "1.0.4", - "engine.io-parser": "1.2.2", - "has-cors": "1.0.3", - "indexof": "0.0.1", - "parsejson": "0.0.1", - "parseqs": "0.0.2", - "parseuri": "0.0.4", - "ws": "0.8.0", - "xmlhttprequest": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz" - }, - "dependencies": { - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "debug": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", - "dev": true, - "requires": { - "ms": "0.6.2" - }, - "dependencies": { - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", - "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", - "dev": true, - "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.4", - "has-binary": "0.1.6", - "utf8": "2.1.0" - }, - "dependencies": { - "after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=", - "dev": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "utf8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", - "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", - "integrity": "sha1-UCrLmzEE2sM90mMOry+IiwuvTLM=", - "dev": true, - "requires": { - "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" - }, - "dependencies": { - "global": { - "version": "https://github.com/component/global/archive/v2.0.1.tar.gz", - "integrity": "sha1-P7JTQ/tm15mRsPSkKc47VEgO7Dw=", - "dev": true - } - } - }, - "parsejson": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", - "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - }, - "dependencies": { - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - }, - "dependencies": { - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - } - } - } - } - }, - "parseqs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", - "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - }, - "dependencies": { - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - }, - "dependencies": { - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - } - } - } - } - }, - "parseuri": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", - "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - }, - "dependencies": { - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - }, - "dependencies": { - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - } - } - } - } - }, - "ws": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", - "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", - "dev": true, - "requires": { - "bufferutil": "1.2.x", - "options": ">=0.0.5", - "ultron": "1.0.x", - "utf-8-validate": "1.2.x" - }, - "dependencies": { - "bufferutil": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", - "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", - "dev": true, - "optional": true, - "requires": { - "bindings": "1.2.x", - "nan": "^2.0.5" - }, - "dependencies": { - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - } - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "utf-8-validate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", - "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", - "dev": true, - "optional": true, - "requires": { - "bindings": "1.2.x", - "nan": "^2.0.5" - }, - "dependencies": { - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=", - "dev": true, - "optional": true - } - } - } - } - }, - "xmlhttprequest": { - "version": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz", - "integrity": "sha1-IMr6XKpV9ttr+u6EnR62DuQ6X8o=", - "dev": true - } - } - }, - "has-binary": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", - "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "parseuri": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", - "integrity": "sha1-20GHjy1pZHGL6HCzFAlz2Ak74VY=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - }, - "dependencies": { - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - }, - "dependencies": { - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - } - } - } - } - }, - "to-array": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", - "integrity": "sha1-1F2txjY0F/YPKEdP6lDs3btPSZE=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.4.tgz", - "integrity": "sha1-+c4ZvxkJYIzrFdl3IeI7/dHnz2U=", - "dev": true, - "requires": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "isarray": "0.0.1", - "json3": "3.2.6" - }, - "dependencies": { - "benchmark": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", - "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", - "dev": true - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=", - "dev": true - } - } - } + "is-buffer": "^1.1.5" } - }, - "through2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", - "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "readable-stream": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } + "is-descriptor": "^0.1.0" } - }, - "vinyl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.1.1.tgz", - "integrity": "sha1-eUCIfu8JOB6zYmrEwPmrU9S35FA=", + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "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" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - } + "ms": "^2.1.1" } }, - "vinyl-fs": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.2.1.tgz", - "integrity": "sha1-3IZ9LWAzoMWmoQ5M5DT1tBFLsHk=", + "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 + } + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.0.0", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "^1.5.2", - "is-valid-glob": "^0.3.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "duplexify": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.4.5.tgz", - "integrity": "sha1-Dn4oenda91O/V+bnt/IfGD9sOlM=", - "dev": true, - "requires": { - "end-of-stream": "1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", - "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - } - } - }, - "glob-stream": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.4.tgz", - "integrity": "sha1-LaFmABV4xO4X/ZLk7hUINGKucvw=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^2.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - } - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "dev": true - } - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - }, - "dependencies": { - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz", - "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", - "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - }, - "dependencies": { - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - } - } - } - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - } - } - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - }, - "dependencies": { - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - } - } - } - } - } - } - }, - "graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha1-UUw4dysxvuLgi+3CGgrrOr9UwZ4=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", - "integrity": "sha1-6fPpxuJyjvwmdmlqcOs4L3MQamc=", - "dev": true - } - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "merge-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.0.tgz", - "integrity": "sha1-nP0Vb+81Qh4rVAPOEdxusZYrAm4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - } - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - } - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - } + "is-buffer": "^1.1.5" } - }, - "yargs": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.30.0.tgz", - "integrity": "sha1-Xsgu+Mcpb+AvoO43hj9tnZ4krO8=", + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "camelcase": "^1.2.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "wrap-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz", - "integrity": "sha1-fTD4+HP5pbvDpk2ryNF34HGuQm8=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "lcid": "^1.0.0" - }, - "dependencies": { - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - } - } - } + "isarray": "1.0.0" } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true } } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "homedir-polyfill": "^1.0.1" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } } } }, - "time-stamp": { + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } } } } diff --git a/web/themes/joinup/prototype/package.json b/web/themes/joinup/prototype/package.json index 0aea0ab0dd..8ecf7fe612 100644 --- a/web/themes/joinup/prototype/package.json +++ b/web/themes/joinup/prototype/package.json @@ -2,16 +2,13 @@ "name": "bootmacss", "version": "0.1.0", "devDependencies": { - "bootstrap-sass": "~3.3.7", - "flexboxgrid": "~6.3.1", - "gulp": "~3.9.0", - "gulp-rename": "~1.2.2", + "gulp": "^4.0.2", "gulp-concat": "~2.6.0", - "gulp-sass": "~2.1.1", - "gulp-watch": "~4.3.5", - "sc5-styleguide": "~0.3.41", - "gulp-livereload": "~3.8.1", - "gulp-mustache": "~2.2.0" + "gulp-livereload": "^4.0.2", + "gulp-mustache": "~2.2.0", + "gulp-rename": "~1.2.2", + "gulp-sass": "^4.0.2", + "gulp-watch": "^5.0.1" }, "engines": { "node": ">=0.10.0" From 36f9e1452803c17f3320f0298e5d548164b09e22 Mon Sep 17 00:00:00 2001 From: joosthe Date: Tue, 31 Mar 2020 15:34:48 +0200 Subject: [PATCH 447/957] updated with the rename pipe on sass --- web/themes/joinup/prototype/gulpfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/themes/joinup/prototype/gulpfile.js b/web/themes/joinup/prototype/gulpfile.js index b4d8686c95..df4e4a7ecc 100644 --- a/web/themes/joinup/prototype/gulpfile.js +++ b/web/themes/joinup/prototype/gulpfile.js @@ -40,6 +40,7 @@ gulp.task('sass', function (done) { .pipe(sass( {outputStyle: 'compressed'} ).on('error', sass.logError)) + .pipe(rename('style.min.css')) .pipe(gulp.dest('../css')) .pipe(gulp.dest('css')) .pipe(livereload()); From 015b521ef13d9d4ebdeadf7654dfcb355ecdcf66 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 18:44:52 +0300 Subject: [PATCH 448/957] ISAICP-5708: Do not rely on potentially stale group references. --- .../processor/JoinupEntityStatus.php | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 5c665e8d34..b94a752ddb 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -4,6 +4,7 @@ namespace Drupal\joinup_search\Plugin\search_api\processor; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginFormInterface; use Drupal\joinup_group\JoinupGroupHelper; @@ -13,6 +14,7 @@ use Drupal\search_api\Plugin\PluginFormTrait; use Drupal\search_api\Processor\ProcessorPluginBase; use Drupal\user\UserInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Excludes unpublished entities from the index. @@ -30,6 +32,36 @@ class JoinupEntityStatus extends ProcessorPluginBase implements PluginFormInterf use PluginFormTrait; + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + /** @var static $processor */ + $processor = parent::create($container, $configuration, $plugin_id, $plugin_definition); + $processor->setEntityTypeManager($container->get('entity_type.manager')); + return $processor; + } + + /** + * Sets the entity type manager. + * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + * + * @return $this + */ + public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager): self { + $this->entityTypeManager = $entity_type_manager; + return $this; + } + /** * {@inheritdoc} */ @@ -70,12 +102,21 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta * {@inheritdoc} */ public function alterIndexedItems(array &$items) { + $rdf_storage = $this->entityTypeManager->getStorage('rdf_entity'); + + /** @var \Drupal\search_api\Item\Item $item */ foreach ($items as $item_id => $item) { $object = $item->getOriginalObject()->getValue(); $inverse = $this->getConfiguration()['inverse']; $enabled = TRUE; if ($object instanceof NodeInterface) { - $parent = JoinupGroupHelper::getGroup($object); + // Load the parent from the entity storage cache rather than relying on + // the copy that is present in $object->og_audience->entity since this + // might be stale. This ensures that if the parent has been published in + // this request we will act on the actual updated state. + $parent_id = $object->get(JoinupGroupHelper::getGroupField($object))->target_id; + $parent = $rdf_storage->load($parent_id); + // Check if empty to avoid exceptions. // The entity can be published only if the parent entity is published. if (empty($parent) || !$parent->isPublished()) { From f57bebe4ef0b9cdfd5e7b88f935095423556a185 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 18:51:42 +0300 Subject: [PATCH 449/957] ISAICP-5708: Implement the CustomPageProvider service. --- .../custom_page/custom_page.services.yml | 2 +- .../custom_page/src/CustomPageProvider.php | 94 ++++++++++++++----- .../src/CustomPageProviderInterface.php | 8 +- 3 files changed, 74 insertions(+), 30 deletions(-) diff --git a/web/modules/custom/custom_page/custom_page.services.yml b/web/modules/custom/custom_page/custom_page.services.yml index ff90f149c6..b2d9a43586 100644 --- a/web/modules/custom/custom_page/custom_page.services.yml +++ b/web/modules/custom/custom_page/custom_page.services.yml @@ -5,7 +5,7 @@ services: lazy: true custom_page.provider: class: Drupal\custom_page\CustomPageProvider - arguments: ['@entity_type.manager', '@custom_page.og_menu_links_manager'] + arguments: ['@entity_type.manager', '@plugin.manager.menu.link', '@custom_page.og_menu_links_manager'] custom_page.route_subscriber: class: Drupal\custom_page\Routing\RouteSubscriber tags: diff --git a/web/modules/custom/custom_page/src/CustomPageProvider.php b/web/modules/custom/custom_page/src/CustomPageProvider.php index 54b9ee28f5..a96c3363a4 100644 --- a/web/modules/custom/custom_page/src/CustomPageProvider.php +++ b/web/modules/custom/custom_page/src/CustomPageProvider.php @@ -5,6 +5,10 @@ namespace Drupal\custom_page; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\Menu\MenuLinkManagerInterface; +use Drupal\menu_link_content\MenuLinkContentInterface; +use Drupal\menu_link_content\Plugin\Menu\MenuLinkContent; +use Drupal\og\OgGroupAudienceHelperInterface; /** * Provides custom pages to whoever desires them. @@ -18,53 +22,93 @@ class CustomPageProvider implements CustomPageProviderInterface { */ protected $entityTypeManager; + /** + * The core menu link manager. + * + * @var \Drupal\Core\Menu\MenuLinkManagerInterface + */ + protected $menuLinkManager; + /** * The custom page menu links manager. * * @var \Drupal\custom_page\CustomPageOgMenuLinksManagerInterface */ - protected $menuLinkManager; + protected $customPageOgMenuLinksManager; /** * Builds a new custom page OG menu links updater service. * * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager * The entity type manager. - * @param \Drupal\custom_page\CustomPageOgMenuLinksManagerInterface $menuLinkManager + * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menuLinkManager + * The core menu link manager. + * @param \Drupal\custom_page\CustomPageOgMenuLinksManagerInterface $customPageOgMenuLinksManager * The custom page menu link manager. */ - public function __construct(EntityTypeManagerInterface $entityTypeManager, CustomPageOgMenuLinksManagerInterface $menuLinkManager) { + public function __construct(EntityTypeManagerInterface $entityTypeManager, MenuLinkManagerInterface $menuLinkManager, CustomPageOgMenuLinksManagerInterface $customPageOgMenuLinksManager) { $this->entityTypeManager = $entityTypeManager; $this->menuLinkManager = $menuLinkManager; + $this->customPageOgMenuLinksManager = $customPageOgMenuLinksManager; } /** - * Returns the custom pages that belong to the given group. - * - * @param string $group_id - * The entity ID of the group for which to return the custom pages. - * @param bool $include_disabled - * Whether or not to include custom pages that are disabled by the group - * facilitators and are not visible in the group menu. Defaults to FALSE. - * - * @return \Drupal\node\NodeInterface[] - * The custom page entities. + * {@inheritdoc} */ - public function getCustomPagesByGroupId(string $group_id, bool $include_disabled = FALSE): array { - $menu_instance = $this->menuLinkManager->getOgMenuInstanceByGroupId($group_id); - if (!empty($menu_instance)) { - $properties = [ - 'bundle' => 'menu_link_content', - 'menu_name' => "ogmenu-{$menu_instance->id()}", - ]; - if (!$include_disabled) { - $properties['enabled'] = 1; + public function getCustomPagesByGroupId(string $group_id, bool $exclude_disabled = TRUE): array { + // Get a list of all custom pages belonging to the group. + $custom_page_ids = $this->getCustomPageIds($group_id); + + if (!empty($custom_page_ids) && $exclude_disabled) { + // Filter out all pages that are disabled in the group's menu instance. + $ogmenu_instance = $this->customPageOgMenuLinksManager->getOgMenuInstanceByGroupId($group_id); + if (empty($ogmenu_instance)) { + return []; } - $storage = $this->entityTypeManager->getStorage('menu_link_content'); - $entities = $storage->loadByProperties($properties); + $custom_page_ids = array_filter($custom_page_ids, function (string $custom_page_id) use ($ogmenu_instance) { + $menu_links = $this->menuLinkManager->loadLinksByRoute( + 'entity.node.canonical', + ['node' => $custom_page_id], + 'ogmenu-' . $ogmenu_instance->id() + ); + /** @var \Drupal\menu_link_content\Plugin\Menu\MenuLinkContent $menu_link */ + $menu_link = reset($menu_links); + + // Sanity check that our data is valid. + if (empty($menu_link) || !$menu_link instanceof MenuLinkContent || empty($entity_id = $menu_link->getPluginDefinition()['metadata']['entity_id'])) { + return FALSE; + } + + $menu_link_entity = $this->entityTypeManager->getStorage('menu_link_content')->load($entity_id); + return !empty($menu_link_entity) && $menu_link_entity instanceof MenuLinkContentInterface && $menu_link_entity->isEnabled(); + }); + } + + if (empty($custom_page_ids)) { + return []; } - return []; + + return $this->entityTypeManager->getStorage('node')->loadMultiple($custom_page_ids); + } + + /** + * Returns the custom page IDs of published custom pages in the given group. + * + * @param string $group_id + * The ID of the group for which to return the published custom page IDs. + * + * @return string[] + * An array of group IDs. + */ + protected function getCustomPageIds(string $group_id): array { + return $this->entityTypeManager + ->getStorage('node') + ->getQuery() + ->condition(OgGroupAudienceHelperInterface::DEFAULT_FIELD . '.target_id', $group_id) + ->condition('type', 'custom_page') + ->condition('status', 1) + ->execute(); } } diff --git a/web/modules/custom/custom_page/src/CustomPageProviderInterface.php b/web/modules/custom/custom_page/src/CustomPageProviderInterface.php index 4232748ece..680bd97adc 100644 --- a/web/modules/custom/custom_page/src/CustomPageProviderInterface.php +++ b/web/modules/custom/custom_page/src/CustomPageProviderInterface.php @@ -14,13 +14,13 @@ interface CustomPageProviderInterface { * * @param string $group_id * The entity ID of the group for which to return the custom pages. - * @param bool $include_disabled - * Whether or not to include custom pages that are disabled by the group - * facilitators and are not visible in the group menu. Defaults to FALSE. + * @param bool $exclude_disabled + * Whether or not to exclude custom pages that are disabled by the group + * facilitators and are not visible in the group menu. Defaults to TRUE. * * @return \Drupal\node\NodeInterface[] * The custom page entities. */ - public function getCustomPagesByGroupId(string $group_id, bool $include_disabled = FALSE): array; + public function getCustomPagesByGroupId(string $group_id, bool $exclude_disabled = TRUE): array; } From 4a56636a40ceeb25822ccc23799db0472fa32e37 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 18:52:25 +0300 Subject: [PATCH 450/957] ISAICP-5708: Finish the implementation of the IncludeCustomPageContent Search API processor. --- .../search_api/processor/IncludeCustomPageContent.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php index 0c63ce46a9..bf4b259b20 100644 --- a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php +++ b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php @@ -86,12 +86,14 @@ public function preprocessIndexItems(array $items): void { // Only process groups. if (!JoinupGroupHelper::isGroup($entity)) { - return; + continue; } foreach ($this->customPageProvider->getCustomPagesByGroupId($entity->id()) as $custom_page) { - // @todo Implement. - $field = $item->getField('??'); + // Index the custom page data inside the description of the collection + // or solution. Both have their own unique field name. + $field_name = $entity->bundle() === 'collection' ? 'field_ar_description' : 'field_is_description'; + $field = $item->getField($field_name); // Index the title and body text of the custom page. $field->addValue($custom_page->label()); $body_field_item_list = $custom_page->get('body'); From 363c980d5ae5a9939997e8e9671c115baff8852d Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 18:53:28 +0300 Subject: [PATCH 451/957] ISAICP-5708: Checking for the RevisionableInterface is not a reliable way to determine if an entity type is revisionable, since even non-revisionable entity types implement it. --- web/profiles/joinup/joinup.behat.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 6b32b5325f..2b5297955b 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -988,9 +988,12 @@ class JoinupSubContext extends DrupalSubContextBase { $entity_type = self::translateEntityTypeAlias($entity_type); $entity = $this->getEntityByLabel($entity_type, $title); $this->getEntityStateField($entity)->set('value', $state); - if ($entity instanceof RevisionableInterface) { + + // Only create a new revision if the entity type supports it. + if ($entity->getEntityType()->isRevisionable()) { $entity->setNewRevision(TRUE); } + $entity->save(); } From b4e008a61de2388de4b6519352e8aef477da44c0 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 19:17:41 +0300 Subject: [PATCH 452/957] ISAICP-5708: Adhere to coding standards. --- .../Plugin/search_api/processor/IncludeCustomPageContent.php | 3 ++- web/profiles/joinup/joinup.behat.inc | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php index bf4b259b20..595f36d3c8 100644 --- a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php +++ b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php @@ -56,7 +56,8 @@ public static function create(ContainerInterface $container, array $configuratio * @param \Drupal\custom_page\CustomPageProviderInterface $custom_page_provider * The custom page provider. * - * @return self + * @return $this + * The processor, for chaining. */ public function setCustomPageProvider(CustomPageProviderInterface $custom_page_provider): self { $this->customPageProvider = $custom_page_provider; diff --git a/web/profiles/joinup/joinup.behat.inc b/web/profiles/joinup/joinup.behat.inc index 2b5297955b..c6bb27b5ae 100644 --- a/web/profiles/joinup/joinup.behat.inc +++ b/web/profiles/joinup/joinup.behat.inc @@ -12,7 +12,6 @@ use Behat\Gherkin\Node\TableNode; use Behat\Mink\Exception\ElementNotFoundException; use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\RevisionableInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\DrupalExtension\Context\DrupalSubContextBase; use Drupal\DrupalExtension\Hook\Scope\BeforeNodeCreateScope; From 3b0c288bed4c33038dc09183be0f42598e495b6a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 21:54:12 +0300 Subject: [PATCH 453/957] ISAICP-5708: Fix possible error if the parent ID is empty. --- .../processor/JoinupEntityStatus.php | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index b94a752ddb..4bf0245fa2 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -110,20 +110,22 @@ public function alterIndexedItems(array &$items) { $inverse = $this->getConfiguration()['inverse']; $enabled = TRUE; if ($object instanceof NodeInterface) { + $enabled = $object->isPublished(); + // Load the parent from the entity storage cache rather than relying on // the copy that is present in $object->og_audience->entity since this // might be stale. This ensures that if the parent has been published in // this request we will act on the actual updated state. - $parent_id = $object->get(JoinupGroupHelper::getGroupField($object))->target_id; - $parent = $rdf_storage->load($parent_id); - - // Check if empty to avoid exceptions. - // The entity can be published only if the parent entity is published. - if (empty($parent) || !$parent->isPublished()) { + if ($enabled) { + // The entity can be published only if the parent entity is published. $enabled = FALSE; - } - else { - $enabled = $object->isPublished(); + $parent_id = $object->get(JoinupGroupHelper::getGroupField($object))->target_id; + if (!empty($parent_id)) { + $parent = $rdf_storage->load($parent_id); + if (!empty($parent) && $parent->isPublished()) { + $enabled = TRUE; + } + } } } elseif ($object instanceof RdfInterface) { @@ -132,6 +134,7 @@ public function alterIndexedItems(array &$items) { elseif ($object instanceof UserInterface) { $enabled = $object->isActive(); } + $enabled = $inverse ? !$enabled : $enabled; if (!$enabled) { unset($items[$item_id]); From ade83b5a1d10b57e8ccf44a49a3cbcda6098e2a8 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Tue, 31 Mar 2020 21:54:13 +0300 Subject: [PATCH 454/957] ISAICP-5413: Switch to json and use reset() for resetting. --- web/modules/custom/joinup_seo/joinup_seo.module | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index 69f993316f..4de569b8ad 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -79,13 +79,15 @@ function joinup_seo_page_attachments(array &$attachments) { /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ $serializer = \Drupal::service('sparql_entity.serializer'); - if (!$output = $serializer->serializeEntity($entity, 'jsonld')) { + if (!$output = $serializer->serializeEntity($entity, 'json')) { return; } - // Serializer returns an array so we remove the outer array enclosure tags - // to output the only element standalone. Works like reset(). - $output = trim($output, '[]'); + // Serializer returns an array reset() the results to display them properly. + $output = json_decode($output); + $output = (object) $output; + $output = json_encode($output); + $attachments['#attached']['html_head'][] = [ [ '#tag' => 'script', From f59e3bf0c8654980852738fd4504b10ce2354465 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Tue, 31 Mar 2020 21:55:42 +0300 Subject: [PATCH 455/957] ISAICP-5708: Move documentation above the code that it explains. --- .../Plugin/search_api/processor/JoinupEntityStatus.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php index 4bf0245fa2..49bc8ef072 100644 --- a/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php +++ b/web/modules/custom/joinup_search/src/Plugin/search_api/processor/JoinupEntityStatus.php @@ -112,13 +112,14 @@ public function alterIndexedItems(array &$items) { if ($object instanceof NodeInterface) { $enabled = $object->isPublished(); - // Load the parent from the entity storage cache rather than relying on - // the copy that is present in $object->og_audience->entity since this - // might be stale. This ensures that if the parent has been published in - // this request we will act on the actual updated state. if ($enabled) { // The entity can be published only if the parent entity is published. $enabled = FALSE; + + // Load the parent from the entity storage cache rather than relying + // on the copy that is present in $object->og_audience->entity since + // this might be stale. This ensures that if the parent has been + // published in this request we will act on the actual updated state. $parent_id = $object->get(JoinupGroupHelper::getGroupField($object))->target_id; if (!empty($parent_id)) { $parent = $rdf_storage->load($parent_id); From 9003cfed963024344575bbd0e1a3df7f561749fc Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 09:57:11 +0300 Subject: [PATCH 456/957] ISAICP-5708: Remove obsolete step definition. Menu items are created automatically. --- .../custom/collection/collection.behat.inc | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 3a60626659..aced294f05 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -470,48 +470,6 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont } } - /** - * Creates menu items for an og group menu. - * - * This function uses only the navigation menu for the items. - * If the collection passed does not have a menu yet, one is created. - * Nodes are loaded by title. - * - * Table format: - * | collection | label | page | weight | - * | Collection 1 | Page 1 menu label | Page 1 title | 0 | - * | Collection 1 | Page 2 menu label | Page 2 title | 1 | - * | Collection 2 | Page 3 menu label | Page 3 title | 0 | - * - * @param string $bundle - * The bundle of the content entity. - * @param \Behat\Gherkin\Node\TableNode $menu_table - * The menu table. - * - * @Given (the following ):bundle content menu items for the corresponding collections: - */ - public function givenCollectionMenuItems(string $bundle, TableNode $menu_table): void { - foreach ($menu_table->getColumnsHash() as $values) { - $group = $this->getRdfEntityByLabel($values['collection'], 'collection'); - $content = $this->getNodeByTitle($values['page'], $bundle); - $og_menu_instance = $this->getOgMenuInstance($group->id(), 'navigation'); - if (empty($og_menu_instance)) { - $og_menu_instance = $this->createOgMenuInstance($group->id(), 'navigation'); - } - - // Prepare the array to pass to MenuLinkContent::create method. - $menu_item_data = [ - 'title' => $values['label'], - 'link' => ['uri' => 'internal:/node/' . $content->id()], - 'menu_name' => 'ogmenu-' . $og_menu_instance->id(), - 'weight' => $values['weight'], - 'expanded' => TRUE, - ]; - - $this->createOgMenuItem($menu_item_data); - } - } - /** * Alters relationships between menu items for the custom pages menu. * From 5a14ffff0b607acdebeec17b244bffb67aff9048 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 13:59:20 +0300 Subject: [PATCH 457/957] ISAICP-5941: Fix Error Page upstream issues. --- composer.json | 5 +++++ composer.lock | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 17ad4ecbf2..f8dbeafa75 100644 --- a/composer.json +++ b/composer.json @@ -269,6 +269,11 @@ "drupal/drupal-extension": { "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" }, + "drupal/error_page": { + "Sync forked code with Drupal core @see https://www.drupal.org/project/error_page/issues/3124053": "https://www.drupal.org/files/issues/2020-04-01/3124053-2.patch", + "Fix strict typing error @see https://www.drupal.org/project/error_page/issues/3124056": "https://www.drupal.org/files/issues/2020-04-01/3124056-2.patch", + "Fix documentation @see https://www.drupal.org/project/error_page/issues/3111450": "https://www.drupal.org/files/issues/2020-04-01/3111450-2.patch" + }, "drupal/externalauth": { "Clean up linkExistingAccount method so it doesn't needless prefix username with provider name @see https://www.drupal.org/project/externalauth/issues/3104478": "https://www.drupal.org/files/issues/2020-01-08/3104478-3.patch" }, diff --git a/composer.lock b/composer.lock index 692afa0694..269bc2c5b6 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": "ce8e9c3a6683b1c7a4e42e7dd924a26f", + "content-hash": "ab19baa0aad720fda5d9959f5ac3c1f6", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -4104,6 +4104,11 @@ "status": "not-covered", "message": "Project has not opted into security advisory coverage!" } + }, + "patches_applied": { + "Sync forked code with Drupal core @see https://www.drupal.org/project/error_page/issues/3124053": "https://www.drupal.org/files/issues/2020-04-01/3124053-2.patch", + "Fix strict typing error @see https://www.drupal.org/project/error_page/issues/3124056": "https://www.drupal.org/files/issues/2020-04-01/3124056-2.patch", + "Fix documentation @see https://www.drupal.org/project/error_page/issues/3111450": "https://www.drupal.org/files/issues/2020-04-01/3111450-2.patch" } }, "autoload": { @@ -4120,6 +4125,14 @@ "name": "Claudiu Cristea", "homepage": "https://www.drupal.org/u/claudiu.cristea", "role": "maintainer" + }, + { + "name": "idimopoulos", + "homepage": "https://www.drupal.org/user/2578708" + }, + { + "name": "pfrenssen", + "homepage": "https://www.drupal.org/user/382067" } ], "description": "Show a user-friendly page when a fatal error or an exception occurs.", From 3bcec5fda2e03c2c14e48deca748b2511a5c4d75 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 14:00:56 +0300 Subject: [PATCH 458/957] ISAICP-5941: The image node element could be a FilteredMarkup instance. --- web/themes/joinup/joinup_theme.theme | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index ef8786ea44..85e6aa8e0b 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1928,8 +1928,12 @@ function joinup_theme_preprocess_filter_caption(&$variables) { $variables['classes'] = 'image-caption'; } + // The image node element may be an \Drupal\filter\Render\FilteredMarkup + // instance. Cast it to a string to be compatible with `strpos()` as strict + // typing is enforced. + $node = (string) $variables['node']; foreach ($width_array as $width) { - if (strpos($variables['node'], $width) !== FALSE) { + if (strpos($node, $width) !== FALSE) { $variables['classes'] .= ' ' . str_replace('_', '-', $width); } } From abccaa8679bcd483b8f7a597974589cb5d696e31 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 14:03:50 +0300 Subject: [PATCH 459/957] ISAICP-5941: Typo. --- web/themes/joinup/joinup_theme.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index 85e6aa8e0b..bab2fab187 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1928,7 +1928,7 @@ function joinup_theme_preprocess_filter_caption(&$variables) { $variables['classes'] = 'image-caption'; } - // The image node element may be an \Drupal\filter\Render\FilteredMarkup + // The image node element may be a \Drupal\filter\Render\FilteredMarkup // instance. Cast it to a string to be compatible with `strpos()` as strict // typing is enforced. $node = (string) $variables['node']; From e194a6fc33f5d5d6b0e4542e9bbe93c4b292847f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 13:17:01 +0300 Subject: [PATCH 460/957] ISAICP-5708: Factor out menu related code that is useful for all menus, not only the front page menu. --- config/sync/core.extension.yml | 1 + phpcs-ruleset.xml.dist | 1 + .../joinup_front_page.info.yml | 1 + .../joinup_front_page.module | 8 +-- .../src/FrontPageMenuHelper.php | 23 +------ .../src/FrontPageMenuHelperInterface.php | 13 +--- .../Plugin/Block/RecommendedContentBlock.php | 20 +++--- .../src/ProxyClass/FrontPageMenuHelper.php | 8 --- .../custom/joinup_menu/joinup_menu.info.yml | 5 ++ .../joinup_menu/joinup_menu.services.yml | 4 ++ .../joinup_menu/src/JoinupMenuHelper.php | 61 +++++++++++++++++++ .../src/JoinupMenuHelperInterface.php | 23 +++++++ 12 files changed, 112 insertions(+), 56 deletions(-) create mode 100644 web/modules/custom/joinup_menu/joinup_menu.info.yml create mode 100644 web/modules/custom/joinup_menu/joinup_menu.services.yml create mode 100644 web/modules/custom/joinup_menu/src/JoinupMenuHelper.php create mode 100644 web/modules/custom/joinup_menu/src/JoinupMenuHelperInterface.php diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index a84a3fae36..634ba69894 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -70,6 +70,7 @@ module: joinup_invite: 0 joinup_legal: 0 joinup_licence: 0 + joinup_menu: 0 joinup_news: 0 joinup_newsletter: 0 joinup_notification: 0 diff --git a/phpcs-ruleset.xml.dist b/phpcs-ruleset.xml.dist index 3b3226f287..b762e2eb43 100644 --- a/phpcs-ruleset.xml.dist +++ b/phpcs-ruleset.xml.dist @@ -65,6 +65,7 @@ + diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml index 1dc1002d1a..27b08008fc 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.info.yml +++ b/web/modules/custom/joinup_front_page/joinup_front_page.info.yml @@ -7,6 +7,7 @@ package: Joinup dependencies: - 'drupal:user' - 'joinup:joinup_group' + - 'joinup:joinup_menu' - 'joinup:joinup_workflow' - 'menu_admin_per_menu:menu_admin_per_menu' diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.module b/web/modules/custom/joinup_front_page/joinup_front_page.module index 4400b578cb..ad7bb5dd75 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.module +++ b/web/modules/custom/joinup_front_page/joinup_front_page.module @@ -83,11 +83,11 @@ function joinup_front_page_menu_link_content_update(MenuLinkContentInterface $en return; } - /** @var \Drupal\joinup_front_page\FrontPageMenuHelperInterface $front_page_helper */ - $front_page_helper = \Drupal::service('joinup_front_page.front_page_helper'); - $entities = $front_page_helper->loadEntitiesFromMenuItems([$entity]); + /** @var \Drupal\joinup_menu\JoinupMenuHelperInterface $menu_helper */ + $menu_helper = \Drupal::service('joinup_menu.menu_helper'); + $entities = $menu_helper->loadEntitiesFromMenuItems([$entity]); $entity = reset($entities); - $front_page_helper->updateSearchApiEntry($entity); + $menu_helper->updateSearchApiEntry($entity); } /** diff --git a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php index 696000e3d0..7dc4f57540 100644 --- a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php +++ b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php @@ -14,7 +14,7 @@ use Drupal\menu_link_content\MenuLinkContentInterface; /** - * Controller that assigns to or removes entities from the front page menu. + * Service that assigns to or removes entities from the front page menu. */ class FrontPageMenuHelper implements FrontPageMenuHelperInterface { @@ -129,25 +129,4 @@ public function updateSearchApiEntry(EntityInterface $entity): void { } } - /** - * {@inheritdoc} - */ - public function loadEntitiesFromMenuItems(array $menu_items): array { - $items = []; - $node_storage = $this->entityTypeManager->getStorage('node'); - $rdf_storage = $this->entityTypeManager->getStorage('rdf_entity'); - - foreach ($menu_items as $menu_item) { - $url_parameters = $menu_item->getUrlObject()->getRouteParameters(); - if (isset($url_parameters['node'])) { - $items[] = $node_storage->load($url_parameters['node']); - } - else { - $items[] = $rdf_storage->load($url_parameters['rdf_entity']); - } - } - - return $items; - } - } diff --git a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php index 76e704794c..01cabeb938 100644 --- a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php +++ b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php @@ -9,7 +9,7 @@ use Drupal\menu_link_content\MenuLinkContentInterface; /** - * Interface FrontPageMenuHelperInterface. + * Interface for services that deal with the front page menu. */ interface FrontPageMenuHelperInterface { @@ -48,15 +48,4 @@ public function unpinFromFrontPage(FieldableEntityInterface $entity): void; */ public function updateSearchApiEntry(EntityInterface $entity): void; - /** - * Loads the entities related to the passed menu items. - * - * @param \Drupal\menu_link_content\Entity\MenuLinkContent[] $menu_items - * The array of menu items. - * - * @return \Drupal\Core\Entity\EntityInterface[] - * An array of entities in the same order as their menu items. - */ - public function loadEntitiesFromMenuItems(array $menu_items): array; - } diff --git a/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php b/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php index 40b10da61b..db3279d9e4 100644 --- a/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php +++ b/web/modules/custom/joinup_front_page/src/Plugin/Block/RecommendedContentBlock.php @@ -13,7 +13,7 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Session\AccountProxy; use Drupal\joinup_community_content\CommunityContentHelper; -use Drupal\joinup_front_page\FrontPageMenuHelperInterface; +use Drupal\joinup_menu\JoinupMenuHelperInterface; use Drupal\menu_link_content\Entity\MenuLinkContent; use Drupal\og\MembershipManager; use Drupal\search_api\Query\QueryInterface; @@ -63,11 +63,11 @@ class RecommendedContentBlock extends BlockBase implements ContainerFactoryPlugi protected $entityTypeManager; /** - * The front page menu helper service. + * The menu helper service. * - * @var \Drupal\joinup_front_page\FrontPageMenuHelperInterface + * @var \Drupal\joinup_menu\JoinupMenuHelperInterface */ - protected $frontPageHelper; + protected $menuHelper; /** * Constructs a new RecommendedContentBlock object. @@ -84,15 +84,15 @@ class RecommendedContentBlock extends BlockBase implements ContainerFactoryPlugi * The og membership manager service. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager service. - * @param \Drupal\joinup_front_page\FrontPageMenuHelperInterface $front_page_helper - * The front page menu helper service. + * @param \Drupal\joinup_menu\JoinupMenuHelperInterface $menu_helper + * The menu helper service. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxy $current_user, MembershipManager $og_membership_manager, EntityTypeManagerInterface $entity_type_manager, FrontPageMenuHelperInterface $front_page_helper) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxy $current_user, MembershipManager $og_membership_manager, EntityTypeManagerInterface $entity_type_manager, JoinupMenuHelperInterface $menu_helper) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->currentUser = $current_user; $this->ogMembershipManager = $og_membership_manager; $this->entityTypeManager = $entity_type_manager; - $this->frontPageHelper = $front_page_helper; + $this->menuHelper = $menu_helper; } /** @@ -106,7 +106,7 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('current_user'), $container->get('og.membership_manager'), $container->get('entity_type.manager'), - $container->get('joinup_front_page.front_page_helper') + $container->get('joinup_menu.menu_helper') ); } @@ -203,7 +203,7 @@ protected function getPinnedEntities(int $limit): array { }); $menu_items = array_splice($menu_items, 0, $this->configuration['count']); - return $this->frontPageHelper->loadEntitiesFromMenuItems($menu_items); + return $this->menuHelper->loadEntitiesFromMenuItems($menu_items); } /** diff --git a/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php b/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php index 730db32dca..7f9166910c 100644 --- a/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php +++ b/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php @@ -99,14 +99,6 @@ public function updateSearchApiEntry(\Drupal\Core\Entity\EntityInterface $entity $this->lazyLoadItself()->updateSearchApiEntry($entity); } - /** - * {@inheritdoc} - */ - public function loadEntitiesFromMenuItems(array $menu_items) : array - { - return $this->lazyLoadItself()->loadEntitiesFromMenuItems($menu_items); - } - } } diff --git a/web/modules/custom/joinup_menu/joinup_menu.info.yml b/web/modules/custom/joinup_menu/joinup_menu.info.yml new file mode 100644 index 0000000000..414068fa8b --- /dev/null +++ b/web/modules/custom/joinup_menu/joinup_menu.info.yml @@ -0,0 +1,5 @@ +type: module +name: 'Joinup Menu' +description: 'Reusable code to interact with menus in Joinup.' +core: 8.x +package: Joinup diff --git a/web/modules/custom/joinup_menu/joinup_menu.services.yml b/web/modules/custom/joinup_menu/joinup_menu.services.yml new file mode 100644 index 0000000000..c03d1407cd --- /dev/null +++ b/web/modules/custom/joinup_menu/joinup_menu.services.yml @@ -0,0 +1,4 @@ +services: + joinup_menu.menu_helper: + class: Drupal\joinup_menu\JoinupMenuHelper + arguments: ['@entity_type.manager'] diff --git a/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php b/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php new file mode 100644 index 0000000000..e2c14a9160 --- /dev/null +++ b/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php @@ -0,0 +1,61 @@ +entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public function loadEntitiesFromMenuItems(array $menu_items): array { + $items = []; + $storage_handlers = []; + + // Check if storage handlers are registered, so we do not need to introduce + // hard dependencies on modules providing entity types. + foreach (['node', 'rdf_entity'] as $entity_type) { + try { + $storage_handlers[$entity_type] = $this->entityTypeManager->getStorage($entity_type); + } + catch (PluginNotFoundException | InvalidPluginDefinitionException $e) { + } + } + + foreach ($menu_items as $menu_item) { + $url_parameters = $menu_item->getUrlObject()->getRouteParameters(); + foreach (array_keys($storage_handlers) as $entity_type) { + $items[] = $storage_handlers[$entity_type]->load($url_parameters[$entity_type]); + break; + } + } + + return $items; + } + +} diff --git a/web/modules/custom/joinup_menu/src/JoinupMenuHelperInterface.php b/web/modules/custom/joinup_menu/src/JoinupMenuHelperInterface.php new file mode 100644 index 0000000000..92617c5a21 --- /dev/null +++ b/web/modules/custom/joinup_menu/src/JoinupMenuHelperInterface.php @@ -0,0 +1,23 @@ + Date: Wed, 1 Apr 2020 14:51:38 +0300 Subject: [PATCH 461/957] ISAICP-5708: Improve documentation. --- web/modules/custom/joinup_group/src/JoinupGroupHelper.php | 2 +- .../src/SchemaFieldValidatorInterface.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php index 8c97d623d2..6ed9597c39 100644 --- a/web/modules/custom/joinup_group/src/JoinupGroupHelper.php +++ b/web/modules/custom/joinup_group/src/JoinupGroupHelper.php @@ -9,7 +9,7 @@ use Drupal\rdf_entity\RdfInterface; /** - * Helper methods for dealing with groups in Joinup. + * Static helper methods for dealing with groups in Joinup. */ class JoinupGroupHelper { diff --git a/web/modules/custom/rdf_schema_field_validation/src/SchemaFieldValidatorInterface.php b/web/modules/custom/rdf_schema_field_validation/src/SchemaFieldValidatorInterface.php index 3483b937be..b056ee197a 100644 --- a/web/modules/custom/rdf_schema_field_validation/src/SchemaFieldValidatorInterface.php +++ b/web/modules/custom/rdf_schema_field_validation/src/SchemaFieldValidatorInterface.php @@ -5,7 +5,7 @@ namespace Drupal\rdf_schema_field_validation; /** - * Interface SchemaFieldValidatorInterface. + * Interface for services that validate that fields are defined in a schema. */ interface SchemaFieldValidatorInterface { From 012807eaedec77aef2433da0b6a058c71b98e619 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 1 Apr 2020 15:11:49 +0300 Subject: [PATCH 462/957] ISAICP-5413: Use a helper service to ensure proper data are used all around. --- .../custom/joinup_seo/joinup_seo.behat.inc | 8 ++-- .../custom/joinup_seo/joinup_seo.module | 11 ++--- .../custom/joinup_seo/joinup_seo.services.yml | 4 ++ .../joinup_seo/src/JoinupSeoExportHelper.php | 46 +++++++++++++++++++ .../src/JoinupSeoExportHelperInterface.php | 25 ++++++++++ 5 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 web/modules/custom/joinup_seo/joinup_seo.services.yml create mode 100644 web/modules/custom/joinup_seo/src/JoinupSeoExportHelper.php create mode 100644 web/modules/custom/joinup_seo/src/JoinupSeoExportHelperInterface.php diff --git a/web/modules/custom/joinup_seo/joinup_seo.behat.inc b/web/modules/custom/joinup_seo/joinup_seo.behat.inc index 169e7ef45e..35310cbf54 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.behat.inc +++ b/web/modules/custom/joinup_seo/joinup_seo.behat.inc @@ -397,11 +397,9 @@ class JoinupSeoSubContext extends DrupalSubContextBase implements DrupalSubConte * The serialized metadata. */ protected function generateSerializedData(RdfInterface $rdf_entity): string { - /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ - $serializer = \Drupal::service('sparql_entity.serializer'); - $json_output = $serializer->serializeEntity($rdf_entity, 'jsonld'); - $json_output = trim($json_output, '[]'); - return $json_output; + /** @var \Drupal\joinup_seo\JoinupSeoExportHelperInterface $serializer */ + $serializer = \Drupal::service('joinup_seo.export_helper'); + return $serializer->exportRdfEntityMetadata($rdf_entity); } } diff --git a/web/modules/custom/joinup_seo/joinup_seo.module b/web/modules/custom/joinup_seo/joinup_seo.module index 4de569b8ad..03f2d6413e 100644 --- a/web/modules/custom/joinup_seo/joinup_seo.module +++ b/web/modules/custom/joinup_seo/joinup_seo.module @@ -77,17 +77,12 @@ function joinup_seo_page_attachments(array &$attachments) { return; } - /** @var \Drupal\sparql_entity_storage\SparqlSerializerInterface $serializer */ - $serializer = \Drupal::service('sparql_entity.serializer'); - if (!$output = $serializer->serializeEntity($entity, 'json')) { + /** @var \Drupal\joinup_seo\JoinupSeoExportHelperInterface $serializer */ + $serializer = \Drupal::service('joinup_seo.export_helper'); + if (!$output = $serializer->exportRdfEntityMetadata($entity)) { return; } - // Serializer returns an array reset() the results to display them properly. - $output = json_decode($output); - $output = (object) $output; - $output = json_encode($output); - $attachments['#attached']['html_head'][] = [ [ '#tag' => 'script', diff --git a/web/modules/custom/joinup_seo/joinup_seo.services.yml b/web/modules/custom/joinup_seo/joinup_seo.services.yml new file mode 100644 index 0000000000..d6cb85d440 --- /dev/null +++ b/web/modules/custom/joinup_seo/joinup_seo.services.yml @@ -0,0 +1,4 @@ +services: + joinup_seo.export_helper: + class: Drupal\joinup_seo\JoinupSeoExportHelper + arguments: ['@sparql_entity.serializer'] diff --git a/web/modules/custom/joinup_seo/src/JoinupSeoExportHelper.php b/web/modules/custom/joinup_seo/src/JoinupSeoExportHelper.php new file mode 100644 index 0000000000..b8e21a9c26 --- /dev/null +++ b/web/modules/custom/joinup_seo/src/JoinupSeoExportHelper.php @@ -0,0 +1,46 @@ +serializer = $serializer; + } + + /** + * {@inheritdoc} + */ + public function exportRdfEntityMetadata(RdfInterface $entity): string { + if (!$output = $this->serializer->serializeEntity($entity, 'json')) { + return ''; + } + + // Serializer returns an array reset() the results to display them properly. + $output = json_decode($output); + $output = (object) $output; + return json_encode($output); + } + +} diff --git a/web/modules/custom/joinup_seo/src/JoinupSeoExportHelperInterface.php b/web/modules/custom/joinup_seo/src/JoinupSeoExportHelperInterface.php new file mode 100644 index 0000000000..f9b4181f1b --- /dev/null +++ b/web/modules/custom/joinup_seo/src/JoinupSeoExportHelperInterface.php @@ -0,0 +1,25 @@ +. + * + * @param \Drupal\rdf_entity\RdfInterface $entity + * The RDF entity to export. + * + * @return string + * The exported string; + */ + public function exportRdfEntityMetadata(RdfInterface $entity): string; + +} From cf293934f7739f6a344867df28d9241b0ff03734 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 15:21:47 +0300 Subject: [PATCH 463/957] ISAICP-5442: Fix minor QA remarks. --- .../src/Form/MySubscriptionsForm.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php index 31a4f37f8a..2f9239c1c2 100644 --- a/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php +++ b/web/modules/custom/joinup_subscription/src/Form/MySubscriptionsForm.php @@ -178,15 +178,13 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $subscription_status = []; + $subscription_bundles = $membership->get('subscription_bundles')->getIterator()->getArrayCopy(); $membership_has_subscription = FALSE; foreach (CommunityContentHelper::BUNDLES as $key => $bundle_id) { - $subscription_bundles = $membership->get('subscription_bundles')->getIterator()->getArrayCopy(); $value = array_reduce($subscription_bundles, function (bool $carry, EntityBundlePairItem $entity_bundle_pair) use ($bundle_id): bool { return $carry || $entity_bundle_pair->getBundleId() === $bundle_id; }, FALSE); - if (!$membership_has_subscription && $value) { - $membership_has_subscription = TRUE; - } + $membership_has_subscription = $membership_has_subscription || $value; $form['collections'][$collection->id()]['bundles'][$bundle_id] = [ '#type' => 'checkbox', '#title' => $bundle_info[$bundle_id]['label'], @@ -236,7 +234,6 @@ public function buildForm(array $form, FormStateInterface $form_state, ?AccountI $form['edit-actions']['unsubscribe_all'] = [ '#type' => 'link', - '#attached' => [], '#title' => $this->t('Unsubscribe from all'), '#url' => Url::fromRoute('joinup_subscription.unsubscribe_all', [ 'user' => $user->id(), @@ -348,10 +345,9 @@ public function reloadCollection(array &$form, FormStateInterface $form_state): $form_state->set('collections_with_subscription', $collections_with_subscription); $form['edit-actions']['unsubscribe_all']['#access'] = !empty($collections_with_subscription); - $response = new AjaxResponse(); - $response->addCommand(new ReplaceCommand("#{$form['collections'][$submitted_collection_id]['#id']}", $form['collections'][$submitted_collection_id])); - $response->addCommand(new ReplaceCommand('#edit-actions', $form['edit-actions'])); - return $response; + return (new AjaxResponse()) + ->addCommand(new ReplaceCommand("#{$form['collections'][$submitted_collection_id]['#id']}", $form['collections'][$submitted_collection_id])) + ->addCommand(new ReplaceCommand('#edit-actions', $form['edit-actions'])); } /** From 7ae5b8e380142f409f1a78dc985e4621c38d8a35 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 15:48:22 +0300 Subject: [PATCH 464/957] ISAICP-5708: Remove method unrelated to the scope of the service from the public API. --- .../custom/joinup_front_page/joinup_front_page.module | 7 ++++++- .../custom/joinup_front_page/src/FrontPageMenuHelper.php | 7 +++++-- .../src/FrontPageMenuHelperInterface.php | 8 -------- .../src/ProxyClass/FrontPageMenuHelper.php | 8 -------- 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.module b/web/modules/custom/joinup_front_page/joinup_front_page.module index ad7bb5dd75..2aa5b7066c 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.module +++ b/web/modules/custom/joinup_front_page/joinup_front_page.module @@ -14,6 +14,7 @@ use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Form\FormStateInterface; use Drupal\joinup_front_page\FrontPagePinnedFieldItemList; use Drupal\menu_link_content\MenuLinkContentInterface; +use Drupal\search_api\Plugin\search_api\datasource\ContentEntity; /** * Implements hook_entity_base_field_info(). @@ -77,6 +78,9 @@ function joinup_front_page_entity_view_alter(array &$build, EntityInterface $ent /** * Implements hook_ENTITY_TYPE_update(). + * + * Reindexes linked content whenever the front page menu changes. This ensures + * that content added to the menu will also appear in search results. */ function joinup_front_page_menu_link_content_update(MenuLinkContentInterface $entity) { if ($entity->getMenuName() !== 'front-page') { @@ -87,7 +91,8 @@ function joinup_front_page_menu_link_content_update(MenuLinkContentInterface $en $menu_helper = \Drupal::service('joinup_menu.menu_helper'); $entities = $menu_helper->loadEntitiesFromMenuItems([$entity]); $entity = reset($entities); - $menu_helper->updateSearchApiEntry($entity); + $entity->original = $entity; + ContentEntity::indexEntity($entity); } /** diff --git a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php index 7dc4f57540..ff9440c4f1 100644 --- a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php +++ b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelper.php @@ -117,9 +117,12 @@ protected function invalidateEntityTags(FieldableEntityInterface $entity): void } /** - * {@inheritdoc} + * Updates the search api index entry of the entity. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity to be updated. */ - public function updateSearchApiEntry(EntityInterface $entity): void { + protected function updateSearchApiEntry(EntityInterface $entity): void { // Check the existence of the `search_api` module in order to relax the // dependency chain since the `search_api` part is secondary functionality // here. diff --git a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php index 01cabeb938..162fbc1e9c 100644 --- a/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php +++ b/web/modules/custom/joinup_front_page/src/FrontPageMenuHelperInterface.php @@ -40,12 +40,4 @@ public function pinToFrontPage(FieldableEntityInterface $entity): void; */ public function unpinFromFrontPage(FieldableEntityInterface $entity): void; - /** - * Updates the search api index entry of the entity. - * - * @param \Drupal\Core\Entity\EntityInterface $entity - * The entity to be updated. - */ - public function updateSearchApiEntry(EntityInterface $entity): void; - } diff --git a/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php b/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php index 7f9166910c..4e96fe94ff 100644 --- a/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php +++ b/web/modules/custom/joinup_front_page/src/ProxyClass/FrontPageMenuHelper.php @@ -91,14 +91,6 @@ public function unpinFromFrontPage(\Drupal\Core\Entity\FieldableEntityInterface $this->lazyLoadItself()->unpinFromFrontPage($entity); } - /** - * {@inheritdoc} - */ - public function updateSearchApiEntry(\Drupal\Core\Entity\EntityInterface $entity) : void - { - $this->lazyLoadItself()->updateSearchApiEntry($entity); - } - } } From 2c98e5fe60d89e1ab7e5011f9c45608da0764be1 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 15:50:47 +0300 Subject: [PATCH 465/957] ISAICP-5708: Clarify variable name. --- web/modules/custom/joinup_group/joinup_group.module | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_group/joinup_group.module b/web/modules/custom/joinup_group/joinup_group.module index 2a22a40357..123e7cc33d 100644 --- a/web/modules/custom/joinup_group/joinup_group.module +++ b/web/modules/custom/joinup_group/joinup_group.module @@ -244,9 +244,10 @@ function joinup_group_rdf_entity_update(EntityInterface $entity) { /** @var \Drupal\og\MembershipManagerInterface $membership_manager */ $membership_manager = \Drupal::service('og.membership_manager'); $content_ids = $membership_manager->getGroupContentIds($entity, ['node']); - $entities = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($content_ids['node']); - foreach ($entities as $entity_item) { - ContentEntity::indexEntity($entity_item); + $nodes = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($content_ids['node']); + /** @var \Drupal\node\NodeInterface $node */ + foreach ($nodes as $node) { + ContentEntity::indexEntity($node); } } } From 8829b9a8add3f2011b563a5d8e91880bbfef715e Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 16:02:25 +0300 Subject: [PATCH 466/957] ISAICP-5708: Update existing test now that content of custom pages is used to enrich their groups in the search index. --- tests/features/joinup_search/search.feature | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature index 9f02a1074f..96e0f09e27 100644 --- a/tests/features/joinup_search/search.feature +++ b/tests/features/joinup_search/search.feature @@ -173,9 +173,10 @@ Feature: Global search Then the page should show the tiles "Collection alpha, Solution alpha, Release Alpha, Licence Alpha" And I should not see the text "Newsletter omega" - # "Omega" is used in all the node entities titles. + # "Omega" is used in all the node entities titles. Since the content of + # custom pages is added to their collection, we also match the collection. When I enter "omega" in the search bar and press enter - Then the page should show the tiles "News omega, Event Omega, Document omega, Discussion omega, Page omega" + Then the page should show the tiles "Collection alpha, News omega, Event Omega, Document omega, Discussion omega, Page omega" # Orphaned entities are not indexed. # And I should see the text "Newsletter omega" From c76091448c4ad92977e86fbf355a5ec545fd11a6 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 16:11:22 +0300 Subject: [PATCH 467/957] ISAICP-5167: Disable summary for custom pages. --- config/sync/field.field.node.custom_page.body.yml | 6 +++++- config/sync/metatag.metatag_defaults.global.yml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config/sync/field.field.node.custom_page.body.yml b/config/sync/field.field.node.custom_page.body.yml index 42a0d89543..9d0c66d224 100644 --- a/config/sync/field.field.node.custom_page.body.yml +++ b/config/sync/field.field.node.custom_page.body.yml @@ -12,8 +12,12 @@ third_party_settings: allowed_formats: content_editor: content_editor basic_html: '0' + eira_format: '0' + licence: '0' + restricted_html: '0' simple_html: '0' simple_text: '0' + full_html: '0' plain_text: '0' _core: default_config_hash: MYE4qG23Xk8I6KYd15pk0PKdvWfDFQ0PNzZbw7m8UFk @@ -28,6 +32,6 @@ translatable: false default_value: { } default_value_callback: '' settings: - display_summary: true + display_summary: false required_summary: false field_type: text_with_summary diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index 759e8e8a5c..7f6209fa64 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -13,5 +13,5 @@ tags: og_site_name: '[site:name]' og_image_secure_url: '[site:url]themes/joinup/images/logo.svg' og_title: '[current-page:title]' - og_image_type: 'image/svg+xml' + og_image_type: image/svg+xml og_image: '[site:url]themes/joinup/images/logo.svg' From 9f1d867d76bf372ce413bb662e2c788d4495a2e3 Mon Sep 17 00:00:00 2001 From: Ilias Dimopoulos Date: Wed, 1 Apr 2020 16:55:27 +0300 Subject: [PATCH 468/957] ISAICP-5941: Use the new version instead of the patches. --- composer.json | 5 -- composer.lock | 215 +++----------------------------------------------- 2 files changed, 13 insertions(+), 207 deletions(-) diff --git a/composer.json b/composer.json index f8dbeafa75..17ad4ecbf2 100644 --- a/composer.json +++ b/composer.json @@ -269,11 +269,6 @@ "drupal/drupal-extension": { "Add space arround the keywords to avoid wrongly matching @see https://github.com/jhedstrom/drupalextension/pull/561": "https://patch-diff.githubusercontent.com/raw/jhedstrom/drupalextension/pull/561.patch" }, - "drupal/error_page": { - "Sync forked code with Drupal core @see https://www.drupal.org/project/error_page/issues/3124053": "https://www.drupal.org/files/issues/2020-04-01/3124053-2.patch", - "Fix strict typing error @see https://www.drupal.org/project/error_page/issues/3124056": "https://www.drupal.org/files/issues/2020-04-01/3124056-2.patch", - "Fix documentation @see https://www.drupal.org/project/error_page/issues/3111450": "https://www.drupal.org/files/issues/2020-04-01/3111450-2.patch" - }, "drupal/externalauth": { "Clean up linkExistingAccount method so it doesn't needless prefix username with provider name @see https://www.drupal.org/project/externalauth/issues/3104478": "https://www.drupal.org/files/issues/2020-01-08/3104478-3.patch" }, diff --git a/composer.lock b/composer.lock index 269bc2c5b6..b1921436f3 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "ab19baa0aad720fda5d9959f5ac3c1f6", + "content-hash": "ce8e9c3a6683b1c7a4e42e7dd924a26f", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -739,12 +729,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -2396,20 +2380,6 @@ "orm", "persistence" ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", - "type": "tidelift" - } - ], "time": "2020-03-21T15:13:52+00:00" }, { @@ -4077,20 +4047,21 @@ }, { "name": "drupal/error_page", - "version": "1.0.0-alpha1", + "version": "1.0.0-alpha2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/error_page.git", - "reference": "8.x-1.0-alpha1" + "reference": "8.x-1.0-alpha2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/error_page-8.x-1.0-alpha1.zip", - "reference": "8.x-1.0-alpha1", - "shasum": "bcadbcec0aae3f1e68bed176b8b2c1dcba0cd7d6" + "url": "https://ftp.drupal.org/files/projects/error_page-8.x-1.0-alpha2.zip", + "reference": "8.x-1.0-alpha2", + "shasum": "9dbfe7d631f36560a3d957a9de27fae6a6bf8adf" }, "require": { - "drupal/core": "^8 || ^9" + "drupal/core": "^8 || ^9", + "php": ">=7.1" }, "type": "drupal-module", "extra": { @@ -4098,17 +4069,12 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha1", - "datestamp": "1580913668", + "version": "8.x-1.0-alpha2", + "datestamp": "1585747291", "security-coverage": { "status": "not-covered", "message": "Project has not opted into security advisory coverage!" } - }, - "patches_applied": { - "Sync forked code with Drupal core @see https://www.drupal.org/project/error_page/issues/3124053": "https://www.drupal.org/files/issues/2020-04-01/3124053-2.patch", - "Fix strict typing error @see https://www.drupal.org/project/error_page/issues/3124056": "https://www.drupal.org/files/issues/2020-04-01/3124056-2.patch", - "Fix documentation @see https://www.drupal.org/project/error_page/issues/3111450": "https://www.drupal.org/files/issues/2020-04-01/3111450-2.patch" } }, "autoload": { @@ -10400,7 +10366,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-03-02T18:32:28+00:00" }, { "name": "stack/builder", @@ -10979,20 +10945,6 @@ ], "description": "Symfony Finder Component", "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": "2020-02-14T07:42:58+00:00" }, { @@ -11137,20 +11089,6 @@ ], "description": "Symfony HttpKernel Component", "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": "2020-02-29T10:16:41+00:00" }, { @@ -11801,20 +11739,6 @@ "uri", "url" ], - "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": "2020-02-04T08:04:52+00:00" }, { @@ -11894,20 +11818,6 @@ ], "description": "Symfony Serializer Component", "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": "2020-02-24T14:33:45+00:00" }, { @@ -11978,20 +11888,6 @@ ], "description": "Symfony Translation Component", "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": "2020-02-04T07:22:30+00:00" }, { @@ -12078,20 +11974,6 @@ ], "description": "Symfony Validator Component", "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": "2020-02-29T09:08:42+00:00" }, { @@ -12168,20 +12050,6 @@ "debug", "dump" ], - "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": "2020-02-24T13:10:00+00:00" }, { @@ -12241,20 +12109,6 @@ ], "description": "Symfony Yaml Component", "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": "2020-01-16T19:04:26+00:00" }, { @@ -15525,20 +15379,6 @@ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], "time": "2020-03-22T16:51:47+00:00" }, { @@ -16691,20 +16531,6 @@ ], "description": "Symfony BrowserKit Component", "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": "2020-01-01T11:03:25+00:00" }, { @@ -16948,20 +16774,6 @@ ], "description": "Symfony PHPUnit Bridge", "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": "2020-02-24T14:58:55+00:00" }, { @@ -17139,6 +16951,5 @@ }, "platform-overrides": { "php": "7.1.9" - }, - "plugin-api-version": "1.1.0" + } } From a2732fe8048c1a1015a27c4f488e4bd9c77936da Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 18:05:35 +0300 Subject: [PATCH 469/957] ISAICP-5708: Allow to set menu items as enabled in tests. --- .../custom/collection/collection.behat.inc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index aced294f05..9bbe0423c7 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -471,16 +471,18 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont } /** - * Alters relationships between menu items for the custom pages menu. + * Alters custom page menu items for group navigation menus. * * It does not create the menu items as they are created automatically when * the custom pages are created. * * Table format: - * | title | parent | weight | - * | Custom page parent | Custom page child 1 | 1 | - * | Custom page parent | Custom page child 2 | 3 | - * | Custom page parent | Custom page child 3 | 2 | + * | title | parent | weight | enabled | + * | Custom page parent | Custom page child 1 | 1 | yes | + * | Custom page parent | Custom page child 2 | 3 | yes | + * | Custom page parent | Custom page child 3 | 2 | no | + * + * All columns except the 'title' column are optional. * * @param \Behat\Gherkin\Node\TableNode $menu_table * The menu table. @@ -495,11 +497,15 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */ $menu_link_manager = \Drupal::service('plugin.manager.menu.link'); foreach ($menu_table->getColumnsHash() as $values) { - if (isset($values['parent']) && !empty($values['parent'])) { + if (!empty($values['parent'])) { $parent_link = $this->getMenuLinkByTitle($values['parent']); $values['parent'] = $parent_link->getPluginId(); } + if (!empty($values['enabled'])) { + $values['enabled'] = (int) $values['enabled'] === 'yes'; + } + $child_link = $this->getMenuLinkByTitle($values['title']); $menu_link_manager->updateDefinition($child_link->getPluginId(), $values); } From d6b668bdd78e854306cec77440f867a64e43fe7a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 18:06:05 +0300 Subject: [PATCH 470/957] ISAICP-5708: Add a step definition that allows to (un)publish custom pages. Our current set of steps are tailored towards community content which uses workflow states to control their publication. --- .../custom/custom_page/custom_page.behat.inc | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/web/modules/custom/custom_page/custom_page.behat.inc b/web/modules/custom/custom_page/custom_page.behat.inc index 9d1f12a41f..8bb724dba0 100644 --- a/web/modules/custom/custom_page/custom_page.behat.inc +++ b/web/modules/custom/custom_page/custom_page.behat.inc @@ -311,6 +311,33 @@ class CustomPageSubContext extends DrupalSubContextBase implements DrupalSubCont return $this->getOgMenuTree($menu_instance); } + /** + * Changes the publication state of a given custom page. + * + * Note that this is only targeting custom pages because most other node types + * are community content whose workflow state controls if they are published. + * + * @param string $title + * The title of the custom page to update. + * @param string $state + * The publication state to set, can be either 'published' or 'unpublished'. + * + * @throws \Exception + * Thrown when the custom page doesn't exist, or cannot be saved. + * + * @When the publication state of the :title custom page is changed to :state + */ + public function updatePublicationState(string $title, string $state): void { + $node = $this->getNodeByTitle($title, 'custom_page'); + if ($state === 'published') { + $node->setPublished(); + } + else { + $node->setUnpublished(); + } + $node->save(); + } + /** * Asserts that a custom page tile has the logo properly set. * From edbf4be2b6069842764853f516a6f79b29d108f8 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 18:07:35 +0300 Subject: [PATCH 471/957] ISAICP-5708: Do not use the same variable name for two different objects, it is confusing. --- .../custom/joinup_front_page/joinup_front_page.module | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/modules/custom/joinup_front_page/joinup_front_page.module b/web/modules/custom/joinup_front_page/joinup_front_page.module index 2aa5b7066c..52b9a9ce0c 100644 --- a/web/modules/custom/joinup_front_page/joinup_front_page.module +++ b/web/modules/custom/joinup_front_page/joinup_front_page.module @@ -90,9 +90,9 @@ function joinup_front_page_menu_link_content_update(MenuLinkContentInterface $en /** @var \Drupal\joinup_menu\JoinupMenuHelperInterface $menu_helper */ $menu_helper = \Drupal::service('joinup_menu.menu_helper'); $entities = $menu_helper->loadEntitiesFromMenuItems([$entity]); - $entity = reset($entities); - $entity->original = $entity; - ContentEntity::indexEntity($entity); + $linked_entity = reset($entities); + $linked_entity->original = $linked_entity; + ContentEntity::indexEntity($linked_entity); } /** From c433312de43683e30576e3e1e55783da0d263fcc Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 18:14:57 +0300 Subject: [PATCH 472/957] ISAICP-5708: Fix failing tests. Not all routes have all possible route parameters. --- web/modules/custom/joinup_menu/src/JoinupMenuHelper.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php b/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php index e2c14a9160..b28dc253c3 100644 --- a/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php +++ b/web/modules/custom/joinup_menu/src/JoinupMenuHelper.php @@ -50,8 +50,10 @@ public function loadEntitiesFromMenuItems(array $menu_items): array { foreach ($menu_items as $menu_item) { $url_parameters = $menu_item->getUrlObject()->getRouteParameters(); foreach (array_keys($storage_handlers) as $entity_type) { - $items[] = $storage_handlers[$entity_type]->load($url_parameters[$entity_type]); - break; + if (isset($url_parameters[$entity_type])) { + $items[] = $storage_handlers[$entity_type]->load($url_parameters[$entity_type]); + break; + } } } From ca83241b69b021766ffc97d5904a74f20784d2c3 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 19:13:28 +0300 Subject: [PATCH 473/957] ISAICP-5708: Respect operator precedence. --- web/modules/custom/collection/collection.behat.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/collection/collection.behat.inc b/web/modules/custom/collection/collection.behat.inc index 9bbe0423c7..85439c48bb 100644 --- a/web/modules/custom/collection/collection.behat.inc +++ b/web/modules/custom/collection/collection.behat.inc @@ -503,7 +503,7 @@ class CollectionSubContext extends DrupalSubContextBase implements DrupalSubCont } if (!empty($values['enabled'])) { - $values['enabled'] = (int) $values['enabled'] === 'yes'; + $values['enabled'] = (int) ($values['enabled'] === 'yes'); } $child_link = $this->getMenuLinkByTitle($values['title']); From b197bb003aa2a07ae8b1c897df2d6b77c90341f7 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 19:19:05 +0300 Subject: [PATCH 474/957] ISAICP-5708: Reindex the parent group when a custom page becomes enabled or disabled. --- .../custom/custom_page/custom_page.module | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/web/modules/custom/custom_page/custom_page.module b/web/modules/custom/custom_page/custom_page.module index 1db166ec99..8e021c8415 100644 --- a/web/modules/custom/custom_page/custom_page.module +++ b/web/modules/custom/custom_page/custom_page.module @@ -14,6 +14,7 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; use Drupal\joinup_group\JoinupGroupHelper; +use Drupal\menu_link_content\MenuLinkContentInterface; use Drupal\node\NodeInterface; use Drupal\og\Og; use Drupal\og\OgGroupAudienceHelperInterface; @@ -125,6 +126,33 @@ function custom_page_node_delete(NodeInterface $entity) { } } +/** + * Implements hook_ENTITY_TYPE_update(). + * + * Whenever a custom page that is linked in the navigation menu of a collection + * or solution becomes enabled or disabled we need to reindex the group, since + * the content of the custom menu should now be included or excluded. + */ +function custom_page_menu_link_content_update(MenuLinkContentInterface $entity) { + // Do a quick check to see if the menu link entity's ableness has changed. + if ($entity->isEnabled() === $entity->original->isEnabled()) { + return; + } + + /** @var \Drupal\joinup_menu\JoinupMenuHelperInterface $menu_helper */ + $menu_helper = \Drupal::service('joinup_menu.menu_helper'); + $linked_entities = $menu_helper->loadEntitiesFromMenuItems([$entity]); + $linked_entity = reset($linked_entities); + if ($linked_entity->getEntityTypeId() !== 'node' || $linked_entity->bundle() !== 'custom_page') { + return; + } + + $group = JoinupGroupHelper::getGroup($linked_entity); + if (!empty($group)) { + ContentEntity::indexEntity($group); + } +} + /** * Implements hook_entity_type_alter(). * From d2c37c941067589bad539faabcaeb3469d2856e3 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 19:20:25 +0300 Subject: [PATCH 475/957] ISAICP-5708: Add a test. --- tests/features/custom_page/search.feature | 77 +++++++++++++++++++++++ tests/src/Traits/EntityTrait.php | 3 + 2 files changed, 80 insertions(+) create mode 100644 tests/features/custom_page/search.feature diff --git a/tests/features/custom_page/search.feature b/tests/features/custom_page/search.feature new file mode 100644 index 0000000000..0f52327c11 --- /dev/null +++ b/tests/features/custom_page/search.feature @@ -0,0 +1,77 @@ +@api @group-a +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 + I want search results for keywords that match content in my custom pages to include my group + + Scenario Outline: Collections and solutions are found when searching for keywords in custom pages + Given the following s: + | title | state | + | Buddy system | draft | + | Slab allocation | validated | + + # Initially I get no results. This is intended to warm up any caches. + When I enter "memory" in the search bar and press enter + Then I should see "No content found for your search." + + Given custom_page content: + | title | | body | status | + | Splitting and coalescing | Buddy system | Memory split in blocks | published | + | Reduces memory fragmentation | Buddy system | Binary tree | unpublished | + | Memory initialization overhead | Slab allocation | Significant performance drop | unpublished | + | Alleviates fragmentation | Slab allocation | Pre-allocated memory | published | + + And the following custom page menu structure: + | title | enabled | + | Splitting and coalescing | yes | + | Reduces memory fragmentation | no | + | Memory initialization overhead | yes | + | Alleviates fragmentation | no | + + # When I search for a keyword that is present in all 4 custom pages, I will + # only get a single result back. Of the 4 custom pages, two are currently + # published, but only "Alleviates fragmentation" is from a validated group, + # so this should be the only result. + When I enter "memory" in the search bar and press enter + Then the page should show only the tiles "Alleviates fragmentation" + + # The "Alleviates fragmentation" page was not enabled in the navigation menu + # of its parent group. When it becomes enabled, its content will be included + # in the search index for the group, so the group will appear in the search. + When I enable "Alleviates fragmentation" in the navigation menu of the "Slab allocation" + And I enter "memory" in the search bar and press enter + Then the page should show only the tiles "Alleviates fragmentation, Slab allocation" + + # Publish the custom page which is currently unpublished. It should now + # appear in the search results. + When the publication state of the "Memory initialization overhead" custom page is changed to published + When I enter "memory" in the search bar and press enter + Then the page should show only the tiles "Alleviates fragmentation, Memory initialization overhead, Slab allocation" + + # If I search for a unique keyword in the newly published custom page I can + # see that its contents are also used to enrich the group. + When I enter "overhead" in the search bar and press enter + Then the page should show only the tiles "Memory initialization overhead, Slab allocation" + + # Remove the custom page from the navigation menu. It should no longer be + # used to enrich the group, but it should still show up on its own because + # it is published content. + When I disable "Memory initialization overhead" in the navigation menu of the "Slab allocation" + And I enter "overhead" in the search bar and press enter + Then the page should show only the tiles "Memory initialization overhead" + + # Publish the group which is in draft. When searching I should now also get + # this group and its enabled custom page back. + When the workflow state of the "Buddy system" group is changed to "validated" + And I enter "memory" in the search bar and press enter + Then the page should show only the tiles "Alleviates fragmentation, Memory initialization overhead, Slab allocation, Splitting and coalescing, Buddy system" + + # An unpublished custom page doesn't show up in any results. + When I enter "Binary tree" in the search bar and press enter + Then I should see "No content found for your search." + + Examples: + | group | + | collection | + | solution | + diff --git a/tests/src/Traits/EntityTrait.php b/tests/src/Traits/EntityTrait.php index 3cf29c7a75..7b7178d5a9 100644 --- a/tests/src/Traits/EntityTrait.php +++ b/tests/src/Traits/EntityTrait.php @@ -74,7 +74,10 @@ protected static function getEntityByLabel(string $entity_type_id, string $label */ protected static function entityTypeAliases(): array { return [ + 'collection' => 'rdf_entity', 'content' => 'node', + 'group' => 'rdf_entity', + 'solution' => 'rdf_entity', ]; } From 2b3ab1a9151862374c6f64b62fa5a45af810b232 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 19:21:20 +0300 Subject: [PATCH 476/957] ISAICP-5942: Provide sane defaults in 'field_cp_content_listing' field. --- .../field.field.node.custom_page.field_cp_content_listing.yml | 1 + .../field.field.node.custom_page.field_cp_content_listing.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/sync/field.field.node.custom_page.field_cp_content_listing.yml b/config/sync/field.field.node.custom_page.field_cp_content_listing.yml index 9ec35318b8..d6c5a17171 100644 --- a/config/sync/field.field.node.custom_page.field_cp_content_listing.yml +++ b/config/sync/field.field.node.custom_page.field_cp_content_listing.yml @@ -25,6 +25,7 @@ default_value: enabled: 0 query_presets: '' limit: 12 + global_search: false show_shared: false default_value_callback: '' settings: { } diff --git a/web/modules/custom/custom_page/config/install/field.field.node.custom_page.field_cp_content_listing.yml b/web/modules/custom/custom_page/config/install/field.field.node.custom_page.field_cp_content_listing.yml index 3d8b2d9186..0beed6da43 100644 --- a/web/modules/custom/custom_page/config/install/field.field.node.custom_page.field_cp_content_listing.yml +++ b/web/modules/custom/custom_page/config/install/field.field.node.custom_page.field_cp_content_listing.yml @@ -24,6 +24,7 @@ default_value: enabled: 0 query_presets: '' limit: 12 + global_search: false show_shared: false default_value_callback: '' settings: { } From 2a0efaed619e7e868fd9f6933038fb21308cd77f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 19:21:54 +0300 Subject: [PATCH 477/957] ISAICP-5942: Fix existing content, including revisions. --- .../custom_page/custom_page.post_update.php | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/web/modules/custom/custom_page/custom_page.post_update.php b/web/modules/custom/custom_page/custom_page.post_update.php index 908f0c7c18..a5015bf3b7 100644 --- a/web/modules/custom/custom_page/custom_page.post_update.php +++ b/web/modules/custom/custom_page/custom_page.post_update.php @@ -126,3 +126,42 @@ function custom_page_post_update_delete_sub_pages_menu_block() { $block->delete(); } } + +/** + * Provide default 'global_search' value property. + */ +function custom_page_post_update_default_global_search(array &$sandbox): string { + $db = \Drupal::database(); + + // Using direct databases queries rather than the API for performance reasons. + if (!isset($sandbox['rows'])) { + $sandbox['rows'] = []; + foreach (['node__field_cp_content_listing', 'node_revision__field_cp_content_listing'] as $table) { + $rows = $db->select($table) + ->fields($table, ['revision_id', 'field_cp_content_listing_value']) + ->condition('field_cp_content_listing_value', '%"global_search"%', 'NOT LIKE') + ->execute() + ->fetchAllKeyed(); + foreach ($rows as $revision_id => $value) { + $sandbox['rows'][] = [ + 'revision_id' => $revision_id, + 'table' => $table, + 'value' => unserialize($value), + ]; + } + } + $sandbox['total'] = count($rows); + } + + $rows = array_splice($sandbox['rows'], 0, 300); + foreach ($rows as $row) { + $row['value']['global_search'] = FALSE; + $db->update($row['table']) + ->fields(['field_cp_content_listing_value' => serialize($row['value'])]) + ->condition('revision_id', $row['revision_id']) + ->execute(); + } + $sandbox['#finished'] = (int) empty($sandbox['rows']); + + return 'Processed ' . count($rows) . ' items out of ' . $sandbox['total']; +} From a480d649e92c900f86e175ea5101fad89e112215 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Wed, 1 Apr 2020 19:22:30 +0300 Subject: [PATCH 478/957] ISAICP-5942: Default values are sane now. --- .../custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php b/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php index 371e93e056..e2dfc87bff 100644 --- a/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php +++ b/web/modules/custom/custom_page/src/Plugin/Field/FieldWidget/SearchWidget.php @@ -112,7 +112,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#type' => 'checkbox', '#title' => $this->t('Global search'), '#description' => $this->t('If checked, the search will not be limited into the group content.'), - '#default_value' => $default_values['global_search'] ?? FALSE, + '#default_value' => $default_values['global_search'], '#weight' => -11, ]; From 4314e0dac4297e145027c10c81789ac7d49bd582 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 20:55:09 +0300 Subject: [PATCH 479/957] ISAICP-5708: Custom pages now depend on Search API since they need to add themselves to their parent groups when being indexed. --- web/modules/custom/custom_page/custom_page.info.yml | 1 + .../tests/src/Kernel/CustomPageOgMenuLinksManagerTest.php | 1 + 2 files changed, 2 insertions(+) diff --git a/web/modules/custom/custom_page/custom_page.info.yml b/web/modules/custom/custom_page/custom_page.info.yml index 11b45af9bd..f11a39a622 100644 --- a/web/modules/custom/custom_page/custom_page.info.yml +++ b/web/modules/custom/custom_page/custom_page.info.yml @@ -12,6 +12,7 @@ dependencies: - 'joinup:joinup_group' - 'joinup:search_api_field' - 'og:og' + - 'search_api:search_api' - 'smart_trim:smart_trim' config_devel: diff --git a/web/modules/custom/custom_page/tests/src/Kernel/CustomPageOgMenuLinksManagerTest.php b/web/modules/custom/custom_page/tests/src/Kernel/CustomPageOgMenuLinksManagerTest.php index 6130931bac..0774039186 100644 --- a/web/modules/custom/custom_page/tests/src/Kernel/CustomPageOgMenuLinksManagerTest.php +++ b/web/modules/custom/custom_page/tests/src/Kernel/CustomPageOgMenuLinksManagerTest.php @@ -42,6 +42,7 @@ class CustomPageOgMenuLinksManagerTest extends KernelTestBase { 'og_ui', 'rdf_entity', 'rdf_schema_field_validation', + 'search_api', 'sparql_entity_storage', 'system', 'user', From c037351a82883d8281da32af5dc0fb08e606bd6b Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 22:07:43 +0300 Subject: [PATCH 480/957] ISAICP-5708: Clear caches inbetween steps so that services do not rely on stale values from previous steps. --- tests/features/custom_page/search.feature | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/features/custom_page/search.feature b/tests/features/custom_page/search.feature index 0f52327c11..b913a7a7e9 100644 --- a/tests/features/custom_page/search.feature +++ b/tests/features/custom_page/search.feature @@ -4,6 +4,7 @@ Feature: Custom pages enhance search results for their collections/solutions As a facilitator I want search results for keywords that match content in my custom pages to include my group + @clearStaticCache Scenario Outline: Collections and solutions are found when searching for keywords in custom pages Given the following s: | title | state | From edb2f0ed0ddde5be9d5ea64768b77f4437fd19c6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 22:08:39 +0300 Subject: [PATCH 481/957] ISAICP-5708: When enriching group content with custom page content during indexing, correctly map label and body text data. --- .../processor/IncludeCustomPageContent.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php index 595f36d3c8..d2e0a38293 100644 --- a/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php +++ b/web/modules/custom/custom_page/src/Plugin/search_api/processor/IncludeCustomPageContent.php @@ -91,15 +91,16 @@ public function preprocessIndexItems(array $items): void { } foreach ($this->customPageProvider->getCustomPagesByGroupId($entity->id()) as $custom_page) { - // Index the custom page data inside the description of the collection - // or solution. Both have their own unique field name. - $field_name = $entity->bundle() === 'collection' ? 'field_ar_description' : 'field_is_description'; - $field = $item->getField($field_name); - // Index the title and body text of the custom page. - $field->addValue($custom_page->label()); + // Index the title and body text of the custom page data inside the + // collection or solution. + $label_field = $item->getField('label'); + $label_field->addValue($custom_page->label()); + + $body_field_name = $entity->bundle() === 'collection' ? 'field_ar_description' : 'field_is_description'; + $body_field = $item->getField($body_field_name); $body_field_item_list = $custom_page->get('body'); if (!$body_field_item_list->isEmpty()) { - $field->addValue(check_markup($body_field_item_list->value, $body_field_item_list->format)); + $body_field->addValue(check_markup($body_field_item_list->value, $body_field_item_list->format)); } } } From 1b26771b26e3924d0dee88c53b9e51909fae7670 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Wed, 1 Apr 2020 22:57:52 +0300 Subject: [PATCH 482/957] ISAICP-5708: Custom page data is now used to enrich collections. --- tests/features/joinup_search/search.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/joinup_search/search.feature b/tests/features/joinup_search/search.feature index 96e0f09e27..ad9b16fd62 100644 --- a/tests/features/joinup_search/search.feature +++ b/tests/features/joinup_search/search.feature @@ -187,7 +187,7 @@ Feature: Global search # "Epsilon" is used in all the node entities body fields. When I enter "epsilon" in the search bar and press enter - Then the page should show the tiles "News omega, Event Omega, Document omega, Discussion omega, Page omega" + Then the page should show the tiles "Collection alpha, News omega, Event Omega, Document omega, Discussion omega, Page omega" # Orphaned entities are not indexed. # And I should see the text "Newsletter omega" From f99e047caa8e12e6ce3170c57fdfe8c815be9cd1 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 2 Apr 2020 15:00:06 +0300 Subject: [PATCH 483/957] ISAICP-5891: Update dependencies. --- composer.lock | 934 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 698 insertions(+), 236 deletions(-) diff --git a/composer.lock b/composer.lock index b1921436f3..98a05450ab 100644 --- a/composer.lock +++ b/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "ce8e9c3a6683b1c7a4e42e7dd924a26f", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.44", + "version": "3.134.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "00df425deebdde3f3bebfde446a4250695dc47e4" + "reference": "aefab57896b558634d24342bdc3c6814e8e533f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/00df425deebdde3f3bebfde446a4250695dc47e4", - "reference": "00df425deebdde3f3bebfde446a4250695dc47e4", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/aefab57896b558634d24342bdc3c6814e8e533f6", + "reference": "aefab57896b558634d24342bdc3c6814e8e533f6", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-03-25T18:15:47+00:00" + "time": "2020-04-01T18:14:23+00:00" }, { "name": "caxy/php-htmldiff", @@ -440,6 +440,16 @@ "dependency", "package" ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -729,6 +739,12 @@ "Xdebug", "performance" ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + } + ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -1795,20 +1811,21 @@ }, { "name": "doctrine/annotations", - "version": "v1.8.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + "reference": "233e36632422cfc5cc499f14ad6c1476b50cb7b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/233e36632422cfc5cc499f14ad6c1476b50cb7b1", + "reference": "233e36632422cfc5cc499f14ad6c1476b50cb7b1", "shasum": "" }, "require": { "doctrine/lexer": "1.*", + "ext-tokenizer": "*", "php": "^7.1" }, "require-dev": { @@ -1818,7 +1835,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.9.x-dev" } }, "autoload": { @@ -1859,7 +1876,7 @@ "docblock", "parser" ], - "time": "2019-10-01T18:55:10+00:00" + "time": "2020-04-02T08:15:55+00:00" }, { "name": "doctrine/cache", @@ -2380,20 +2397,34 @@ "orm", "persistence" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], "time": "2020-03-21T15:13:52+00:00" }, { "name": "doctrine/reflection", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2" + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/b699ecc7f2784d1e49924fd9858cf1078db6b0e2", - "reference": "b699ecc7f2784d1e49924fd9858cf1078db6b0e2", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", "shasum": "" }, "require": { @@ -2458,7 +2489,7 @@ "reflection", "static" ], - "time": "2020-03-21T11:34:59+00:00" + "time": "2020-03-27T11:06:43+00:00" }, { "name": "drupal/allowed_formats", @@ -3505,20 +3536,20 @@ }, { "name": "drupal/ctools", - "version": "3.2.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/ctools.git", - "reference": "8.x-3.2" + "reference": "8.x-3.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/ctools-8.x-3.2.zip", - "reference": "8.x-3.2", - "shasum": "d6da87239b64ba708a5977e7b33b1e009e36b091" + "url": "https://ftp.drupal.org/files/projects/ctools-8.x-3.4.zip", + "reference": "8.x-3.4", + "shasum": "016ca5abb7ac4ca720352a72e8989f3ef0e20539" }, "require": { - "drupal/core": "^8.5" + "drupal/core": "^8.7.7 || ^9" }, "type": "drupal-module", "extra": { @@ -3526,8 +3557,8 @@ "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-3.2", - "datestamp": "1550728386", + "version": "8.x-3.4", + "datestamp": "1585763383", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -3592,7 +3623,7 @@ "description": "Provides a number of utility and helper APIs for Drupal developers and site builders.", "homepage": "https://www.drupal.org/project/ctools", "support": { - "source": "http://cgit.drupalcode.org/ctools", + "source": "https://git.drupalcode.org/project/ctools", "issues": "https://www.drupal.org/project/issues/ctools" } }, @@ -4449,17 +4480,17 @@ }, { "name": "drupal/geocoder", - "version": "3.0.0-beta9", + "version": "3.0.0-beta10", "source": { "type": "git", "url": "https://git.drupalcode.org/project/geocoder.git", - "reference": "8.x-3.0-beta9" + "reference": "8.x-3.0-beta10" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-3.0-beta9.zip", - "reference": "8.x-3.0-beta9", - "shasum": "29007881f6d79d6838ee97e74cc0d4ab89e8c519" + "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-3.0-beta10.zip", + "reference": "8.x-3.0-beta10", + "shasum": "91856cd9a74e563764ec4173e69eae8ff954dbd4" }, "require": { "davedevelopment/stiphle": "^0.9.2", @@ -4504,8 +4535,8 @@ "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-3.0-beta9", - "datestamp": "1582227193", + "version": "8.x-3.0-beta10", + "datestamp": "1585432653", "security-coverage": { "status": "not-covered", "message": "Beta releases are not covered by Drupal security advisories." @@ -4574,17 +4605,17 @@ }, { "name": "drupal/geofield", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/geofield.git", - "reference": "8.x-1.9" + "reference": "8.x-1.10" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.9.zip", - "reference": "8.x-1.9", - "shasum": "785bfb06a6684e3e310170aaacbfdaff46214052" + "url": "https://ftp.drupal.org/files/projects/geofield-8.x-1.10.zip", + "reference": "8.x-1.10", + "shasum": "4d017d9dd4c27492c650ef8cae9ebdee9a20d191" }, "require": { "drupal/core": "~8.0", @@ -4596,8 +4627,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.9", - "datestamp": "1585173153", + "version": "8.x-1.10", + "datestamp": "1585432867", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5327,20 +5358,20 @@ }, { "name": "drupal/metatag", - "version": "1.11.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/metatag.git", - "reference": "8.x-1.11" + "reference": "8.x-1.12" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/metatag-8.x-1.11.zip", - "reference": "8.x-1.11", - "shasum": "9acb04a741d80b4ab468d118a242271169d11f00" + "url": "https://ftp.drupal.org/files/projects/metatag-8.x-1.12.zip", + "reference": "8.x-1.12", + "shasum": "88e2b29e0fa6835753b30587f9c556c360183629" }, "require": { - "drupal/core": "*", + "drupal/core": "^8 || ^9", "drupal/token": "^1.0" }, "require-dev": { @@ -5359,8 +5390,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.11", - "datestamp": "1576870683", + "version": "8.x-1.12", + "datestamp": "1585646341", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -5389,23 +5420,24 @@ "seo" ], "support": { - "source": "http://cgit.drupalcode.org/metatag", - "issues": "http://drupal.org/project/issues/metatag" + "source": "https://git.drupalcode.org/project/metatag", + "issues": "https://www.drupal.org/project/issues/metatag", + "docs": "https://www.drupal.org/docs/8/modules/metatag" } }, { "name": "drupal/og", - "version": "1.0.0-alpha4", + "version": "1.0.0-alpha5", "source": { "type": "git", "url": "https://git.drupalcode.org/project/og.git", - "reference": "8.x-1.0-alpha4" + "reference": "8.x-1.0-alpha5" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/og-8.x-1.0-alpha4.zip", - "reference": "8.x-1.0-alpha4", - "shasum": "4c49a23c77eb71694a21698bf5515d4310a85973" + "url": "https://ftp.drupal.org/files/projects/og-8.x-1.0-alpha5.zip", + "reference": "8.x-1.0-alpha5", + "shasum": "f4a446191885c076ee97a913b09d19c3960976af" }, "require": { "drupal/core": "~8.7", @@ -5420,8 +5452,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha4", - "datestamp": "1575878585", + "version": "8.x-1.0-alpha5", + "datestamp": "1585733421", "security-coverage": { "status": "not-covered", "message": "Alpha releases are not covered by Drupal security advisories." @@ -6983,10 +7015,22 @@ "GPL-2.0+" ], "authors": [ + { + "name": "AdamPS", + "homepage": "https://www.drupal.org/user/2650563" + }, + { + "name": "Anybody", + "homepage": "https://www.drupal.org/user/291091" + }, { "name": "B-Prod", "homepage": "https://www.drupal.org/user/407852" }, + { + "name": "geek-merlin", + "homepage": "https://www.drupal.org/user/229048" + }, { "name": "sbrattla", "homepage": "https://www.drupal.org/user/53422" @@ -10147,16 +10191,16 @@ }, { "name": "scssphp/scssphp", - "version": "1.0.8", + "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/scssphp/scssphp.git", - "reference": "20d661952d19d4d75508180c453a594423b4f10b" + "reference": "c6626eebae7b123321d5ea803998487d835c260d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/20d661952d19d4d75508180c453a594423b4f10b", - "reference": "20d661952d19d4d75508180c453a594423b4f10b", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/c6626eebae7b123321d5ea803998487d835c260d", + "reference": "c6626eebae7b123321d5ea803998487d835c260d", "shasum": "" }, "require": { @@ -10204,7 +10248,7 @@ "scss", "stylesheet" ], - "time": "2020-02-20T16:44:03+00:00" + "time": "2020-04-01T15:23:18+00:00" }, { "name": "seld/jsonlint", @@ -10366,7 +10410,7 @@ "reference": "master" }, "type": "library", - "time": "2020-03-02T18:32:28+00:00" + "time": "2019-03-13T23:53:42+00:00" }, { "name": "stack/builder", @@ -10532,16 +10576,16 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "bcdf6ff46e115b29be3186391f29e0da82cd6f72" + "reference": "e4636a4f23f157278a19e5db160c63de0da297d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/bcdf6ff46e115b29be3186391f29e0da82cd6f72", - "reference": "bcdf6ff46e115b29be3186391f29e0da82cd6f72", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/e4636a4f23f157278a19e5db160c63de0da297d8", + "reference": "e4636a4f23f157278a19e5db160c63de0da297d8", "shasum": "" }, "require": { @@ -10584,20 +10628,34 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2020-01-04T12:05:51+00:00" + "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": "2020-03-15T09:38:08+00:00" }, { "name": "symfony/console", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6827023c5872bea44b29d145de693b21981cf4cd" + "reference": "bf60d5e606cd595391c5f82bf6b570d9573fa120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6827023c5872bea44b29d145de693b21981cf4cd", - "reference": "6827023c5872bea44b29d145de693b21981cf4cd", + "url": "https://api.github.com/repos/symfony/console/zipball/bf60d5e606cd595391c5f82bf6b570d9573fa120", + "reference": "bf60d5e606cd595391c5f82bf6b570d9573fa120", "shasum": "" }, "require": { @@ -10656,20 +10714,34 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-02-15T13:27:16+00:00" + "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": "2020-03-27T17:07:22+00:00" }, { "name": "symfony/debug", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21" + "reference": "346636d2cae417992ecfd761979b2ab98b339a45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21", - "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21", + "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45", + "reference": "346636d2cae417992ecfd761979b2ab98b339a45", "shasum": "" }, "require": { @@ -10712,20 +10784,34 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-02-23T14:41:43+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee" + "reference": "f516f2bd2f43c82124392fa0a846d8c3261b324b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", - "reference": "b06b36883abc61eb8fb576e89102a9ba6c9ee7ee", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f516f2bd2f43c82124392fa0a846d8c3261b324b", + "reference": "f516f2bd2f43c82124392fa0a846d8c3261b324b", "shasum": "" }, "require": { @@ -10783,20 +10869,34 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-02-19T17:19:43+00:00" + "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": "2020-03-16T08:31:04+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c" + "reference": "9d4e22943b73acc1ba50595b7de1a01fe9dbad48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2f67a869aef3eecf42e7f8be4a8b86c92308686c", - "reference": "2f67a869aef3eecf42e7f8be4a8b86c92308686c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9d4e22943b73acc1ba50595b7de1a01fe9dbad48", + "reference": "9d4e22943b73acc1ba50595b7de1a01fe9dbad48", "shasum": "" }, "require": { @@ -10846,20 +10946,34 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "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": "2020-03-15T09:38:08+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd" + "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/266c9540b475f26122b61ef8b23dd9198f5d1cfd", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/fe297193bf2e6866ed900ed2d5869362768df6a7", + "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7", "shasum": "" }, "require": { @@ -10896,20 +11010,34 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:20:44+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/finder", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" + "reference": "5729f943f9854c5781984ed4907bbb817735776b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", + "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b", + "reference": "5729f943f9854c5781984ed4907bbb817735776b", "shasum": "" }, "require": { @@ -10945,20 +11073,34 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-02-14T07:42:58+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f" + "reference": "a8833c56f6a4abcf17a319d830d71fdb0ba93675" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4d440be93adcfd5e4ee0bdc7acd1c3260625728f", - "reference": "4d440be93adcfd5e4ee0bdc7acd1c3260625728f", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a8833c56f6a4abcf17a319d830d71fdb0ba93675", + "reference": "a8833c56f6a4abcf17a319d830d71fdb0ba93675", "shasum": "" }, "require": { @@ -10999,20 +11141,34 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-02-06T08:18:51+00:00" + "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": "2020-03-23T12:14:52+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0" + "reference": "c15b5acab571224b1bf792692ff2ad63239081fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", - "reference": "449c3f7a9b8c47d178f80610afa6e2873ac0a3c0", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c15b5acab571224b1bf792692ff2ad63239081fe", + "reference": "c15b5acab571224b1bf792692ff2ad63239081fe", "shasum": "" }, "require": { @@ -11089,20 +11245,34 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-02-29T10:16:41+00:00" + "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": "2020-03-30T06:25:13+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38" + "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", - "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", + "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", "shasum": "" }, "require": { @@ -11114,7 +11284,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11147,20 +11317,34 @@ "polyfill", "portable" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e" + "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/926832ce51059bb58211b7b2080a88e0c3b5328e", - "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", + "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", "shasum": "" }, "require": { @@ -11172,7 +11356,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11206,20 +11390,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a" + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a", - "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", "shasum": "" }, "require": { @@ -11233,7 +11431,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11268,20 +11466,34 @@ "portable", "shim" ], - "time": "2020-01-17T12:01:36+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", - "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", "shasum": "" }, "require": { @@ -11293,7 +11505,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11327,20 +11539,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "16ec91cb06998b609501b55b7177b7d7c02badb3" + "reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/16ec91cb06998b609501b55b7177b7d7c02badb3", - "reference": "16ec91cb06998b609501b55b7177b7d7c02badb3", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/d51ec491c8ddceae7dca8dd6c7e30428f543f37d", + "reference": "d51ec491c8ddceae7dca8dd6c7e30428f543f37d", "shasum": "" }, "require": { @@ -11350,7 +11576,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11383,20 +11609,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "419c4940024c30ccc033650373a1fe13890d3255" + "reference": "2a18e37a489803559284416df58c71ccebe50bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/419c4940024c30ccc033650373a1fe13890d3255", - "reference": "419c4940024c30ccc033650373a1fe13890d3255", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/2a18e37a489803559284416df58c71ccebe50bf0", + "reference": "2a18e37a489803559284416df58c71ccebe50bf0", "shasum": "" }, "require": { @@ -11406,7 +11646,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11442,20 +11682,20 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf" + "reference": "37b0976c78b94856543260ce09b460a7bc852747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", - "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", + "reference": "37b0976c78b94856543260ce09b460a7bc852747", "shasum": "" }, "require": { @@ -11464,7 +11704,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11497,20 +11737,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3" + "reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ba3cfcea6d0192cae46c62041f61cbb704b526d3", - "reference": "ba3cfcea6d0192cae46c62041f61cbb704b526d3", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/d8e76c104127675d0ea3df3be0f2ae24a8619027", + "reference": "d8e76c104127675d0ea3df3be0f2ae24a8619027", "shasum": "" }, "require": { @@ -11519,7 +11773,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -11549,20 +11803,34 @@ "polyfill", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-03-02T11:55:35+00:00" }, { "name": "symfony/process", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da" + "reference": "1dbc09f6e14703ae2398efc86b02ae2bcd9a9931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b03b02dcea26ba4c65c16a73bab4f00c186b13da", - "reference": "b03b02dcea26ba4c65c16a73bab4f00c186b13da", + "url": "https://api.github.com/repos/symfony/process/zipball/1dbc09f6e14703ae2398efc86b02ae2bcd9a9931", + "reference": "1dbc09f6e14703ae2398efc86b02ae2bcd9a9931", "shasum": "" }, "require": { @@ -11598,7 +11866,21 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-02-04T08:04:52+00:00" + "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": "2020-03-20T06:07:50+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -11667,16 +11949,16 @@ }, { "name": "symfony/routing", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00" + "reference": "785e4e6b835e9ab4f9412862855d0e1b7a2b4627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/c1377905edfa76e6934dd3c73f9a073305b47c00", - "reference": "c1377905edfa76e6934dd3c73f9a073305b47c00", + "url": "https://api.github.com/repos/symfony/routing/zipball/785e4e6b835e9ab4f9412862855d0e1b7a2b4627", + "reference": "785e4e6b835e9ab4f9412862855d0e1b7a2b4627", "shasum": "" }, "require": { @@ -11739,20 +12021,34 @@ "uri", "url" ], - "time": "2020-02-04T08:04:52+00:00" + "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": "2020-03-25T12:02:26+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3" + "reference": "2b5a266b4e9b4403d669449de059686dd186ed33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f8b99832d016e2d2c77c797c3df561adecd33dd3", - "reference": "f8b99832d016e2d2c77c797c3df561adecd33dd3", + "url": "https://api.github.com/repos/symfony/serializer/zipball/2b5a266b4e9b4403d669449de059686dd186ed33", + "reference": "2b5a266b4e9b4403d669449de059686dd186ed33", "shasum": "" }, "require": { @@ -11818,20 +12114,34 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-02-24T14:33:45+00:00" + "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": "2020-03-16T08:31:04+00:00" }, { "name": "symfony/translation", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34" + "reference": "e06ca83b2682eba25854b97a8a9af22c1da491f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1eb074e0bd94939a30dd14dbecf7a92b165cea34", - "reference": "1eb074e0bd94939a30dd14dbecf7a92b165cea34", + "url": "https://api.github.com/repos/symfony/translation/zipball/e06ca83b2682eba25854b97a8a9af22c1da491f5", + "reference": "e06ca83b2682eba25854b97a8a9af22c1da491f5", "shasum": "" }, "require": { @@ -11888,20 +12198,34 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-02-04T07:22:30+00:00" + "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": "2020-03-16T08:31:04+00:00" }, { "name": "symfony/validator", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe" + "reference": "5d4d0184dbf402233c4d73491285ac3615206e62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", - "reference": "b5ccfc1adf301bb6ca63823455fbd1b20902bcfe", + "url": "https://api.github.com/repos/symfony/validator/zipball/5d4d0184dbf402233c4d73491285ac3615206e62", + "reference": "5d4d0184dbf402233c4d73491285ac3615206e62", "shasum": "" }, "require": { @@ -11974,20 +12298,34 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2020-02-29T09:08:42+00:00" + "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": "2020-03-28T10:14:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "2572839911702b0405479410ea7a1334bfab0b96" + "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96", - "reference": "2572839911702b0405479410ea7a1334bfab0b96", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", + "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", "shasum": "" }, "require": { @@ -12050,20 +12388,34 @@ "debug", "dump" ], - "time": "2020-02-24T13:10:00+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "bc63e15160866e8730a1f738541b194c401f72bf" + "reference": "e701b47e11749970f63803879c4febb520f07b6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/bc63e15160866e8730a1f738541b194c401f72bf", - "reference": "bc63e15160866e8730a1f738541b194c401f72bf", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e701b47e11749970f63803879c4febb520f07b6c", + "reference": "e701b47e11749970f63803879c4febb520f07b6c", "shasum": "" }, "require": { @@ -12109,7 +12461,21 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-16T19:04:26+00:00" + "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": "2020-03-25T12:02:26+00:00" }, { "name": "twig/twig", @@ -13452,20 +13818,20 @@ }, { "name": "drupal/config_devel", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/config_devel.git", - "reference": "8.x-1.4" + "reference": "8.x-1.5" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/config_devel-8.x-1.4.zip", - "reference": "8.x-1.4", - "shasum": "93cbecd4811cbf357cd0a8be19e480f7af32f756" + "url": "https://ftp.drupal.org/files/projects/config_devel-8.x-1.5.zip", + "reference": "8.x-1.5", + "shasum": "881ae68765010ed4d77c54a3c7f11066eb77e0c4" }, "require": { - "drupal/core": "~8.0" + "drupal/core": "*" }, "type": "drupal-module", "extra": { @@ -13473,8 +13839,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.4", - "datestamp": "1569934685", + "version": "8.x-1.5", + "datestamp": "1585735771", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -14532,16 +14898,16 @@ }, { "name": "mglaman/phpstan-drupal", - "version": "0.12.2", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/mglaman/phpstan-drupal.git", - "reference": "bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9" + "reference": "c72367d12498c9f5d3738852d4089b4570690a55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9", - "reference": "bcd4ba1db8f49d282f3fb6558bda5cc21f677cc9", + "url": "https://api.github.com/repos/mglaman/phpstan-drupal/zipball/c72367d12498c9f5d3738852d4089b4570690a55", + "reference": "c72367d12498c9f5d3738852d4089b4570690a55", "shasum": "" }, "require": { @@ -14607,7 +14973,17 @@ } ], "description": "Drupal extension and rules for PHPStan", - "time": "2020-01-27T20:01:01+00:00" + "funding": [ + { + "url": "https://github.com/mglaman", + "type": "github" + }, + { + "url": "https://liberapay.com/mglaman", + "type": "liberapay" + } + ], + "time": "2020-03-31T19:03:49+00:00" }, { "name": "mikey179/vfsstream", @@ -15379,6 +15755,20 @@ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], "time": "2020-03-22T16:51:47+00:00" }, { @@ -16386,33 +16776,38 @@ }, { "name": "slevomat/coding-standard", - "version": "6.1.5", + "version": "6.2.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "d767b5e302ff096327466c97fec3cb57f6d16086" + "reference": "c4bf9cad66da885cc843cc24d708661d9d8fbb95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/d767b5e302ff096327466c97fec3cb57f6d16086", - "reference": "d767b5e302ff096327466c97fec3cb57f6d16086", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/c4bf9cad66da885cc843cc24d708661d9d8fbb95", + "reference": "c4bf9cad66da885cc843cc24d708661d9d8fbb95", "shasum": "" }, "require": { "php": "^7.1", - "phpstan/phpdoc-parser": "0.3.5 - 0.4.3", + "phpstan/phpdoc-parser": "0.4.0 - 0.4.3", "squizlabs/php_codesniffer": "^3.5.4" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "0.6.2", - "grogy/php-parallel-lint": "1.1.0", "phing/phing": "2.16.3", - "phpstan/phpstan": "0.11.19|0.12.9", - "phpstan/phpstan-phpunit": "0.11.2|0.12.6", - "phpstan/phpstan-strict-rules": "0.11.1|0.12.2", - "phpunit/phpunit": "7.5.18|8.5.2" + "php-parallel-lint/php-parallel-lint": "1.1.0", + "phpstan/phpstan": "0.12.18", + "phpstan/phpstan-phpunit": "0.12.6", + "phpstan/phpstan-strict-rules": "0.12.2", + "phpunit/phpunit": "7.5.20|8.5.2|9.0.1" }, "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { "SlevomatCodingStandard\\": "SlevomatCodingStandard" @@ -16423,7 +16818,17 @@ "MIT" ], "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", - "time": "2020-02-05T21:17:34+00:00" + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2020-03-28T22:04:31+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -16478,16 +16883,16 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.38", + "version": "v3.4.39", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "ede0c5fa204586e3fa51053fbea9cea8a5a3ee8b" + "reference": "1c7bcd954ad1fc02354c4cfd3fcd1b0c95245367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ede0c5fa204586e3fa51053fbea9cea8a5a3ee8b", - "reference": "ede0c5fa204586e3fa51053fbea9cea8a5a3ee8b", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/1c7bcd954ad1fc02354c4cfd3fcd1b0c95245367", + "reference": "1c7bcd954ad1fc02354c4cfd3fcd1b0c95245367", "shasum": "" }, "require": { @@ -16531,20 +16936,34 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "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": "2020-03-15T09:38:08+00:00" }, { "name": "symfony/config", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9" + "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", - "reference": "cbfef5ae91ccd3b06621c18d58cd355c68c87ae9", + "url": "https://api.github.com/repos/symfony/config/zipball/3f4a3de1af498ed0ea653d4dc2317794144e6ca4", + "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4", "shasum": "" }, "require": { @@ -16595,20 +17014,34 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-02-04T09:32:40+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22" + "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", - "reference": "d0a6dd288fa8848dcc3d1f58b94de6a7cc5d2d22", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b", + "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b", "shasum": "" }, "require": { @@ -16648,7 +17081,21 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-02-04T09:01:01+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/dom-crawler", @@ -16713,16 +17160,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v4.4.5", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "a270dbfe54994138a8037937fd5934827b8605bf" + "reference": "6937c1a1590da7c314537b4f3f741c9255a7072e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/a270dbfe54994138a8037937fd5934827b8605bf", - "reference": "a270dbfe54994138a8037937fd5934827b8605bf", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/6937c1a1590da7c314537b4f3f741c9255a7072e", + "reference": "6937c1a1590da7c314537b4f3f741c9255a7072e", "shasum": "" }, "require": { @@ -16774,7 +17221,21 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-02-24T14:58:55+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "theseer/tokenizer", @@ -16951,5 +17412,6 @@ }, "platform-overrides": { "php": "7.1.9" - } + }, + "plugin-api-version": "1.1.0" } From 1dc7cc461d0fbb6ea7e886fbed4cc18341ae73ef Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 2 Apr 2020 15:03:04 +0300 Subject: [PATCH 484/957] ISAICP-5891: Use the latest SAPI bulk form patch. --- composer.json | 3 +-- composer.lock | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 17ad4ecbf2..7ec138ce85 100644 --- a/composer.json +++ b/composer.json @@ -262,7 +262,6 @@ "Disable tableselect element options @see https://www.drupal.org/project/drupal/issues/2895352": "https://www.drupal.org/files/issues/2019-12-03/2895352-42-8.8.x.patch", "Make it easier to trigger a tour @see https://www.drupal.org/project/drupal/issues/3012027": "https://www.drupal.org/files/issues/2018-11-07/3012027-2.patch", "Cache tags are not invalidated on revision delete @see https://www.drupal.org/project/drupal/issues/2945928": "https://www.drupal.org/files/issues/entity-cache_revision_deletion-2945928-2.patch", - "Config import creates 'Undefined index: uuid' notice @see https://www.drupal.org/project/drupal/issues/2863785": "https://www.drupal.org/files/issues/config_import_creates-2863785-2.patch", "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch", "Pass current route parameters to the confirmation form route @see https://www.drupal.org/project/drupal/issues/2901412": "https://www.drupal.org/files/issues/2020-02-25/2901412-13.patch" }, @@ -310,7 +309,7 @@ "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch", "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch", - "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-03-09/3117171-5.patch" + "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-04-01/3117171-13.patch" }, "drupal/social_media_links": { "Missing config schema for field, widget and formatter @see https://www.drupal.org/node/2898680": "https://www.drupal.org/files/issues/2898680-6.patch", diff --git a/composer.lock b/composer.lock index 98a05450ab..dd3afb2d51 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": "ce8e9c3a6683b1c7a4e42e7dd924a26f", + "content-hash": "2b9ea4dff8d15ac32929841943979a34", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -3411,7 +3411,6 @@ "Disable tableselect element options @see https://www.drupal.org/project/drupal/issues/2895352": "https://www.drupal.org/files/issues/2019-12-03/2895352-42-8.8.x.patch", "Make it easier to trigger a tour @see https://www.drupal.org/project/drupal/issues/3012027": "https://www.drupal.org/files/issues/2018-11-07/3012027-2.patch", "Cache tags are not invalidated on revision delete @see https://www.drupal.org/project/drupal/issues/2945928": "https://www.drupal.org/files/issues/entity-cache_revision_deletion-2945928-2.patch", - "Config import creates 'Undefined index: uuid' notice @see https://www.drupal.org/project/drupal/issues/2863785": "https://www.drupal.org/files/issues/config_import_creates-2863785-2.patch", "Allow sorting of actions @see https://www.drupal.org/project/drupal/issues/2381293": "https://www.drupal.org/files/issues/2019-12-04/2381293-134.patch", "Pass current route parameters to the confirmation form route @see https://www.drupal.org/project/drupal/issues/2901412": "https://www.drupal.org/files/issues/2020-02-25/2901412-13.patch" } @@ -6373,7 +6372,7 @@ "Views cached results are not taking into account the access check. @see https://www.drupal.org/node/2824640": "resources/patch/search-api-2824640-103-8.x-1.13.patch", "item_id column is too short. @see https://www.drupal.org/node/2829696": "https://www.drupal.org/files/issues/item_id_column_is_too_short-2829696-10-D8.patch", "Add a static method that knows to index a given entity @see https://www.drupal.org/project/search_api/issues/3106342": "https://www.drupal.org/files/issues/2020-01-14/3106342-6.patch", - "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-03-09/3117171-5.patch" + "Bulk Form field for SAPI @see https://www.drupal.org/project/search_api/issues/3117171": "https://www.drupal.org/files/issues/2020-04-01/3117171-13.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", From 07ad87db9fdab494d2f3d8131a449cf9143acb82 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 2 Apr 2020 11:28:40 +0300 Subject: [PATCH 485/957] ISAICP-5891: Fix metatag config diffs. --- config/sync/metatag.metatag_defaults.global.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/metatag.metatag_defaults.global.yml b/config/sync/metatag.metatag_defaults.global.yml index 759e8e8a5c..7f6209fa64 100644 --- a/config/sync/metatag.metatag_defaults.global.yml +++ b/config/sync/metatag.metatag_defaults.global.yml @@ -13,5 +13,5 @@ tags: og_site_name: '[site:name]' og_image_secure_url: '[site:url]themes/joinup/images/logo.svg' og_title: '[current-page:title]' - og_image_type: 'image/svg+xml' + og_image_type: image/svg+xml og_image: '[site:url]themes/joinup/images/logo.svg' From 3edf8c6bb14dd255eaa87fbe071986035691955a Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 2 Apr 2020 12:13:37 +0300 Subject: [PATCH 486/957] ISAICP-5891: Fix config after OG update. --- config/sync/field.field.node.custom_page.og_audience.yml | 1 - config/sync/field.field.node.discussion.og_audience.yml | 1 - config/sync/field.field.node.document.og_audience.yml | 1 - config/sync/field.field.node.event.og_audience.yml | 1 - config/sync/field.field.node.news.og_audience.yml | 1 - config/sync/field.field.node.newsletter.og_audience.yml | 1 - config/sync/field.field.node.tallinn_report.og_audience.yml | 1 - config/sync/field.field.node.video.og_audience.yml | 1 - .../field.field.ogmenu_instance.navigation.og_audience.yml | 1 - .../field.field.rdf_entity.asset_distribution.og_audience.yml | 1 - ....field.rdf_entity.asset_release.field_isr_is_version_of.yml | 1 - .../field.field.rdf_entity.asset_distribution.og_audience.yml | 1 - ....field.rdf_entity.asset_release.field_isr_is_version_of.yml | 1 - .../install/field.field.node.custom_page.og_audience.yml | 1 - .../install/field.field.node.tallinn_report.og_audience.yml | 3 +-- .../config/install/field.field.node.discussion.og_audience.yml | 1 - .../config/install/field.field.node.document.og_audience.yml | 1 - .../config/install/field.field.node.event.og_audience.yml | 1 - .../config/install/field.field.node.news.og_audience.yml | 1 - .../config/install/field.field.node.newsletter.og_audience.yml | 1 - .../config/install/field.field.node.video.og_audience.yml | 1 - .../field.field.rdf_entity.asset_distribution.og_audience.yml | 1 - .../field.field.ogmenu_instance.navigation.og_audience.yml | 1 - 23 files changed, 1 insertion(+), 24 deletions(-) diff --git a/config/sync/field.field.node.custom_page.og_audience.yml b/config/sync/field.field.node.custom_page.og_audience.yml index 6a153b6d87..41f7eebb3b 100644 --- a/config/sync/field.field.node.custom_page.og_audience.yml +++ b/config/sync/field.field.node.custom_page.og_audience.yml @@ -27,5 +27,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.discussion.og_audience.yml b/config/sync/field.field.node.discussion.og_audience.yml index afa06b2932..ab8626ca66 100644 --- a/config/sync/field.field.node.discussion.og_audience.yml +++ b/config/sync/field.field.node.discussion.og_audience.yml @@ -29,5 +29,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.document.og_audience.yml b/config/sync/field.field.node.document.og_audience.yml index 50aed35666..bc36e8fa59 100644 --- a/config/sync/field.field.node.document.og_audience.yml +++ b/config/sync/field.field.node.document.og_audience.yml @@ -27,5 +27,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.event.og_audience.yml b/config/sync/field.field.node.event.og_audience.yml index 9112dd23d9..7e1c8a232c 100644 --- a/config/sync/field.field.node.event.og_audience.yml +++ b/config/sync/field.field.node.event.og_audience.yml @@ -27,5 +27,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.news.og_audience.yml b/config/sync/field.field.node.news.og_audience.yml index b3d723be30..a378ba07f9 100644 --- a/config/sync/field.field.node.news.og_audience.yml +++ b/config/sync/field.field.node.news.og_audience.yml @@ -29,5 +29,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.newsletter.og_audience.yml b/config/sync/field.field.node.newsletter.og_audience.yml index f5a5b1379a..cc75f20f71 100644 --- a/config/sync/field.field.node.newsletter.og_audience.yml +++ b/config/sync/field.field.node.newsletter.og_audience.yml @@ -27,5 +27,4 @@ settings: collection: collection sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.tallinn_report.og_audience.yml b/config/sync/field.field.node.tallinn_report.og_audience.yml index 4610b0b99e..60d598d216 100644 --- a/config/sync/field.field.node.tallinn_report.og_audience.yml +++ b/config/sync/field.field.node.tallinn_report.og_audience.yml @@ -27,5 +27,4 @@ settings: collection: collection sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.node.video.og_audience.yml b/config/sync/field.field.node.video.og_audience.yml index 114b52ffbf..657703d3ca 100644 --- a/config/sync/field.field.node.video.og_audience.yml +++ b/config/sync/field.field.node.video.og_audience.yml @@ -27,5 +27,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.ogmenu_instance.navigation.og_audience.yml b/config/sync/field.field.ogmenu_instance.navigation.og_audience.yml index 742cc4c648..68dc0dfe55 100644 --- a/config/sync/field.field.ogmenu_instance.navigation.og_audience.yml +++ b/config/sync/field.field.ogmenu_instance.navigation.og_audience.yml @@ -29,5 +29,4 @@ settings: field: _none auto_create: false auto_create_bundle: '' - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.rdf_entity.asset_distribution.og_audience.yml b/config/sync/field.field.rdf_entity.asset_distribution.og_audience.yml index 543593f44f..85102e4ab3 100644 --- a/config/sync/field.field.rdf_entity.asset_distribution.og_audience.yml +++ b/config/sync/field.field.rdf_entity.asset_distribution.og_audience.yml @@ -24,5 +24,4 @@ settings: handler_settings: target_bundles: solution: solution - access_override: false field_type: og_standard_reference diff --git a/config/sync/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml b/config/sync/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml index 4602a91832..d72d37af44 100644 --- a/config/sync/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml +++ b/config/sync/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml @@ -26,5 +26,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/asset_distribution/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml b/web/modules/custom/asset_distribution/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml index a39863da73..f57f4d9d9d 100644 --- a/web/modules/custom/asset_distribution/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml +++ b/web/modules/custom/asset_distribution/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml @@ -21,5 +21,4 @@ settings: handler_settings: target_bundles: solution: solution - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/asset_release/config/install/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml b/web/modules/custom/asset_release/config/install/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml index 06fcf61b12..ba30d0f9ce 100644 --- a/web/modules/custom/asset_release/config/install/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml +++ b/web/modules/custom/asset_release/config/install/field.field.rdf_entity.asset_release.field_isr_is_version_of.yml @@ -23,5 +23,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/custom_page/config/install/field.field.node.custom_page.og_audience.yml b/web/modules/custom/custom_page/config/install/field.field.node.custom_page.og_audience.yml index 8232655c32..4ea11e5abd 100644 --- a/web/modules/custom/custom_page/config/install/field.field.node.custom_page.og_audience.yml +++ b/web/modules/custom/custom_page/config/install/field.field.node.custom_page.og_audience.yml @@ -26,5 +26,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_communities/tallinn/config/install/field.field.node.tallinn_report.og_audience.yml b/web/modules/custom/joinup_communities/tallinn/config/install/field.field.node.tallinn_report.og_audience.yml index 7b6681b979..db6b26bd92 100644 --- a/web/modules/custom/joinup_communities/tallinn/config/install/field.field.node.tallinn_report.og_audience.yml +++ b/web/modules/custom/joinup_communities/tallinn/config/install/field.field.node.tallinn_report.og_audience.yml @@ -4,8 +4,8 @@ dependencies: config: - field.storage.node.og_audience - node.type.tallinn_report + - rdf_entity.rdfentity.collection module: - - joinup_core - og id: node.tallinn_report.og_audience field_name: og_audience @@ -24,5 +24,4 @@ settings: collection: collection sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_discussion/config/install/field.field.node.discussion.og_audience.yml b/web/modules/custom/joinup_discussion/config/install/field.field.node.discussion.og_audience.yml index 0119ceb405..e07c7d7a56 100644 --- a/web/modules/custom/joinup_discussion/config/install/field.field.node.discussion.og_audience.yml +++ b/web/modules/custom/joinup_discussion/config/install/field.field.node.discussion.og_audience.yml @@ -26,5 +26,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_document/config/install/field.field.node.document.og_audience.yml b/web/modules/custom/joinup_document/config/install/field.field.node.document.og_audience.yml index e3ef06396f..f2da526d3e 100644 --- a/web/modules/custom/joinup_document/config/install/field.field.node.document.og_audience.yml +++ b/web/modules/custom/joinup_document/config/install/field.field.node.document.og_audience.yml @@ -24,5 +24,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_event/config/install/field.field.node.event.og_audience.yml b/web/modules/custom/joinup_event/config/install/field.field.node.event.og_audience.yml index 9c9ba440f1..b175419a4a 100644 --- a/web/modules/custom/joinup_event/config/install/field.field.node.event.og_audience.yml +++ b/web/modules/custom/joinup_event/config/install/field.field.node.event.og_audience.yml @@ -24,5 +24,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_news/config/install/field.field.node.news.og_audience.yml b/web/modules/custom/joinup_news/config/install/field.field.node.news.og_audience.yml index 9359a9a208..08f2568d06 100644 --- a/web/modules/custom/joinup_news/config/install/field.field.node.news.og_audience.yml +++ b/web/modules/custom/joinup_news/config/install/field.field.node.news.og_audience.yml @@ -26,5 +26,4 @@ settings: solution: solution sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_newsletter/config/install/field.field.node.newsletter.og_audience.yml b/web/modules/custom/joinup_newsletter/config/install/field.field.node.newsletter.og_audience.yml index 5d6ef9163a..56d81a6dcf 100644 --- a/web/modules/custom/joinup_newsletter/config/install/field.field.node.newsletter.og_audience.yml +++ b/web/modules/custom/joinup_newsletter/config/install/field.field.node.newsletter.og_audience.yml @@ -24,5 +24,4 @@ settings: collection: collection sort: field: _none - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/joinup_video/config/install/field.field.node.video.og_audience.yml b/web/modules/custom/joinup_video/config/install/field.field.node.video.og_audience.yml index c9434f0688..da61edfe76 100644 --- a/web/modules/custom/joinup_video/config/install/field.field.node.video.og_audience.yml +++ b/web/modules/custom/joinup_video/config/install/field.field.node.video.og_audience.yml @@ -24,5 +24,4 @@ settings: target_bundles: collection: collection solution: solution - access_override: false field_type: og_standard_reference diff --git a/web/modules/custom/stats/tests/modules/stats_test/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml b/web/modules/custom/stats/tests/modules/stats_test/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml index c875f8fab2..18c527468d 100644 --- a/web/modules/custom/stats/tests/modules/stats_test/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml +++ b/web/modules/custom/stats/tests/modules/stats_test/config/install/field.field.rdf_entity.asset_distribution.og_audience.yml @@ -13,5 +13,4 @@ settings: handler_settings: target_bundles: solution: solution - access_override: false field_type: og_standard_reference diff --git a/web/profiles/joinup/config/install/field.field.ogmenu_instance.navigation.og_audience.yml b/web/profiles/joinup/config/install/field.field.ogmenu_instance.navigation.og_audience.yml index a2e49d1c90..723453fd81 100644 --- a/web/profiles/joinup/config/install/field.field.ogmenu_instance.navigation.og_audience.yml +++ b/web/profiles/joinup/config/install/field.field.ogmenu_instance.navigation.og_audience.yml @@ -26,5 +26,4 @@ settings: field: _none auto_create: false auto_create_bundle: '' - access_override: false field_type: og_standard_reference From d48a13f142c0bebfffd2b9c5cad23ef2f1584da1 Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 2 Apr 2020 11:20:15 +0300 Subject: [PATCH 487/957] ISAICP-5891: New config_devel version is breaking the site. --- composer.json | 5 +++-- composer.lock | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 7ec138ce85..aec45084ce 100644 --- a/composer.json +++ b/composer.json @@ -109,7 +109,7 @@ "drupal/admin_toolbar": "^1.27", "drupal/cas_mock_server": "^1.0", "drupal/coder": "^8.3.6", - "drupal/config_devel": "~1.4", + "drupal/config_devel": "~1.5", "drupal/config_inspector": "^1.0", "drupal/default_content": "^1.0-alpha8", "drupal/devel": "~2.1", @@ -244,7 +244,8 @@ "Allow a pre-login subscriber to set the reason for cancelling the login @see https://www.drupal.org/project/cas/issues/3111073": "https://www.drupal.org/files/issues/2020-02-04/3111073-2.patch" }, "drupal/config_devel": { - "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch" + "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch", + "Error after updating to 1.5.0 @see https://www.drupal.org/project/config_devel/issues/3124261": "https://www.drupal.org/files/issues/2020-04-02/3124261-2.patch" }, "drupal/core": { "Use email verification when changing user email addresses @see https://www.drupal.org/project/drupal/issues/85494": "https://www.drupal.org/files/issues/2019-12-03/85494-287-8.8.x.patch", diff --git a/composer.lock b/composer.lock index dd3afb2d51..3276b83839 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": "2b9ea4dff8d15ac32929841943979a34", + "content-hash": "9411ba37d360e3ba6b14d1cba62de536", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -13846,7 +13846,8 @@ } }, "patches_applied": { - "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch" + "Add a tool for manipulating module info files @see https://www.drupal.org/project/config_devel/issues/2392929": "https://www.drupal.org/files/issues/2019-12-17/2392929-2.patch", + "Error after updating to 1.5.0 @see https://www.drupal.org/project/config_devel/issues/3124261": "https://www.drupal.org/files/issues/2020-04-02/3124261-2.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", From a0b2da558c28f454dd6b772b66562c2f1f9fbb2c Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 2 Apr 2020 21:23:06 +0300 Subject: [PATCH 488/957] ISAICP-5785: Disable AJAX refreshing of site alerts. --- config/sync/block.block.site_alerts.yml | 1 + web/profiles/joinup/config/install/block.block.site_alerts.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/config/sync/block.block.site_alerts.yml b/config/sync/block.block.site_alerts.yml index be689ebe2c..92b0e9814b 100644 --- a/config/sync/block.block.site_alerts.yml +++ b/config/sync/block.block.site_alerts.yml @@ -17,4 +17,5 @@ settings: label: 'Site alerts' provider: site_alert label_display: '0' + timeout: 0 visibility: { } diff --git a/web/profiles/joinup/config/install/block.block.site_alerts.yml b/web/profiles/joinup/config/install/block.block.site_alerts.yml index 6b83a1a0a2..4e39566c19 100644 --- a/web/profiles/joinup/config/install/block.block.site_alerts.yml +++ b/web/profiles/joinup/config/install/block.block.site_alerts.yml @@ -16,4 +16,5 @@ settings: label: 'Site alerts' provider: site_alert label_display: '0' + timeout: 0 visibility: { } From 392eaa10a5a3d389b13edfea4b25f7fed63ea45a Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Thu, 2 Apr 2020 23:23:47 +0300 Subject: [PATCH 489/957] ISAICP-5785: Alter the site alert form and list builder to hide the scheduling options. --- .../custom/joinup_core/joinup_core.module | 21 +++++++ .../src/JoinupSiteAlertListBuilder.php | 59 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 web/modules/custom/joinup_core/src/JoinupSiteAlertListBuilder.php diff --git a/web/modules/custom/joinup_core/joinup_core.module b/web/modules/custom/joinup_core/joinup_core.module index 4ee24d9721..a5db21ec0e 100644 --- a/web/modules/custom/joinup_core/joinup_core.module +++ b/web/modules/custom/joinup_core/joinup_core.module @@ -20,6 +20,7 @@ use Drupal\Core\StreamWrapper\StreamWrapperManager; use Drupal\Core\Template\Attribute; use Drupal\joinup_core\Element\Datetime; use Drupal\joinup_core\Entity\Controller\JoinupRdfListBuilder; +use Drupal\joinup_core\JoinupSiteAlertListBuilder; use Drupal\node\NodeInterface; use Drupal\og\OgMembershipInterface; use Drupal\search_api\IndexInterface; @@ -131,6 +132,18 @@ function joinup_core_form_rdf_entity_form_alter(&$form, FormStateInterface $form } } +/** + * Implements hook_form_BASE_FORM_ID_alter(). + * + * Alters the Site Alert entity form to hide the scheduling of the alerts. Due + * to a bug in the core page cache module the scheduling can only work using an + * additional AJAX call which is undesirable in our case. By disabling the + * scheduling the alerts are managed manually and the page cache works normally. + */ +function joinup_core_form_site_alert_form_alter(&$form, FormStateInterface $form_state, $form_id) { + $form['scheduling']['#access'] = FALSE; +} + /** * Implements hook_entity_base_field_info(). * @@ -178,6 +191,14 @@ function joinup_core_entity_base_field_info(EntityTypeInterface $entity_type) { * Implements hook_entity_type_alter(). */ function joinup_core_entity_type_alter(array &$entity_types) { + // Check that the Site Alert entity type is defined, so we can avoid depending + // on the Site Alert module. + if (isset($entity_types['site_alert'])) { + // Override the list builder with a version which omits the unused 'Start + // time' and 'End time' columns. + $entity_types['site_alert']->setListBuilderClass(JoinupSiteAlertListBuilder::class); + } + if (!isset($entity_types['rdf_entity'])) { return; } diff --git a/web/modules/custom/joinup_core/src/JoinupSiteAlertListBuilder.php b/web/modules/custom/joinup_core/src/JoinupSiteAlertListBuilder.php new file mode 100644 index 0000000000..11e03cd156 --- /dev/null +++ b/web/modules/custom/joinup_core/src/JoinupSiteAlertListBuilder.php @@ -0,0 +1,59 @@ + [ + 'data' => $this->t('Active'), + 'field' => 'active', + 'specifier' => 'active', + 'class' => [RESPONSIVE_PRIORITY_LOW], + ], + 'label' => [ + 'data' => $this->t('Label'), + 'field' => 'label', + 'specifier' => 'label', + 'class' => [RESPONSIVE_PRIORITY_LOW], + ], + 'message' => [ + 'data' => $this->t('Message'), + 'field' => 'message', + 'specifier' => 'message', + 'class' => [RESPONSIVE_PRIORITY_LOW], + ], + ]; + return $header + parent::buildHeader(); + } + + /** + * {@inheritdoc} + */ + public function buildRow(EntityInterface $entity) { + $row = [ + 'active' => ($entity->getActive()) ? $this->t('Active') : $this->t('Not Active'), + 'label' => $entity->label(), + 'message' => check_markup($entity->get('message')->value, $entity->get('message')->format), + ]; + return $row + parent::buildRow($entity); + } + +} From f1731e0201e043e079067ffcded66f7dca47ddf6 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 3 Apr 2020 10:39:26 +0300 Subject: [PATCH 490/957] ISAICP-5785: Add a basic scenario to show how moderators can manage site alerts. --- tests/features/moderator/site_alerts.feature | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/features/moderator/site_alerts.feature diff --git a/tests/features/moderator/site_alerts.feature b/tests/features/moderator/site_alerts.feature new file mode 100644 index 0000000000..35db186de9 --- /dev/null +++ b/tests/features/moderator/site_alerts.feature @@ -0,0 +1,58 @@ +@api +Feature: Site alerts + In order to announce scheduled downtime + As a moderator + I want to be able to display a site wide alert + + Scenario: Show a site wide alert and hide it again + # Create a site wide alert as a moderator. + Given I am logged in as a moderator + When I click "Site alerts" in the "Administration toolbar" region + Then I should see the text "There are no site alerts yet." + + When I click "Add Site Alert" + And I fill in "Label" with "Site maintenance 18:00-20:00" + And I select "Medium" from "Severity" + And I enter "Between 18:00 and 20:00 the site will be temporarily unavailable due to scheduled maintenance" in the "Message" wysiwyg editor + And I press "Save" + + # Anonymous users should see the alert. + Given I am not logged in + And I am on the homepage + Then I should see the text "Between 18:00 and 20:00 the site will be temporarily unavailable due to scheduled maintenance" + + # Deactivate the alert without deleting it, so it can be used again later. + Given I am logged in as a moderator + When I click "Site alerts" in the "Administration toolbar" region + And I click "Edit" + And I uncheck "Active" + And I press "Save" + Then I should see the text "Not Active" + + Then I break + # The alert should no longer be shown. + Given I am not logged in + And I am on the homepage + Then I should not see the text "Between 18:00 and 20:00 the site will be temporarily unavailable due to scheduled maintenance" + + # Re-enable the alert, it should appear again. + Given I am logged in as a moderator + When I click "Site alerts" in the "Administration toolbar" region + And I click "Edit" + And I check "Active" + And I press "Save" + + Given I am not logged in + And I am on the homepage + Then I should see the text "Between 18:00 and 20:00 the site will be temporarily unavailable due to scheduled maintenance" + + # An alert can also be removed entirely, if it does not need to be reused. + Given I am logged in as a moderator + When I click "Site alerts" in the "Administration toolbar" region + And I click "Delete" + And I press "Delete" + Then I should see the message " The Site Alert Site maintenance 18:00-20:00 has been deleted." + + Given I am not logged in + And I am on the homepage + Then I should not see the text "Between 18:00 and 20:00 the site will be temporarily unavailable due to scheduled maintenance" From c7d9f8a5ebbce5bdc4d3af639f702769f05f1a8f Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 3 Apr 2020 11:30:27 +0300 Subject: [PATCH 491/957] ISAICP-5785: Move the test into the quickest group to better balance test suites. --- tests/features/moderator/site_alerts.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/features/moderator/site_alerts.feature b/tests/features/moderator/site_alerts.feature index 35db186de9..af1587103d 100644 --- a/tests/features/moderator/site_alerts.feature +++ b/tests/features/moderator/site_alerts.feature @@ -1,4 +1,4 @@ -@api +@api @group-b Feature: Site alerts In order to announce scheduled downtime As a moderator From 99ceade73294286187ac41034af527afba9acf66 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 3 Apr 2020 11:46:20 +0300 Subject: [PATCH 492/957] ISAICP-5258: Unlock Facets and update it to the latest version. --- composer.json | 2 +- composer.lock | 78 +++++++++++++++++---------------------------------- 2 files changed, 26 insertions(+), 54 deletions(-) diff --git a/composer.json b/composer.json index aec45084ce..7d9670620b 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "drupal/embed_block": "^1.0", "drupal/entity_legal": "^2", "drupal/error_page": "^1.0", - "drupal/facets": "1.3", + "drupal/facets": "^1.4", "drupal/field_group": "^1.0", "drupal/file_url": "^1.0-alpha7", "drupal/flag": "^4.0", diff --git a/composer.lock b/composer.lock index 3276b83839..7aecd378ca 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": "9411ba37d360e3ba6b14d1cba62de536", + "content-hash": "c49c1806531f0b9efffadb9fe7a7721b", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -71,16 +71,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.134.1", + "version": "3.134.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "aefab57896b558634d24342bdc3c6814e8e533f6" + "reference": "4fe0b03a2eefb677ce4ca47b7e3c3705f04516c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/aefab57896b558634d24342bdc3c6814e8e533f6", - "reference": "aefab57896b558634d24342bdc3c6814e8e533f6", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4fe0b03a2eefb677ce4ca47b7e3c3705f04516c8", + "reference": "4fe0b03a2eefb677ce4ca47b7e3c3705f04516c8", "shasum": "" }, "require": { @@ -151,7 +151,7 @@ "s3", "sdk" ], - "time": "2020-04-01T18:14:23+00:00" + "time": "2020-04-02T18:13:41+00:00" }, { "name": "caxy/php-htmldiff", @@ -440,16 +440,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-03-13T19:34:27+00:00" }, { @@ -739,12 +729,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -1811,16 +1795,16 @@ }, { "name": "doctrine/annotations", - "version": "1.10.0", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "233e36632422cfc5cc499f14ad6c1476b50cb7b1" + "reference": "5eb79f3dbdffed6544e1fc287572c0f462bd29bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/233e36632422cfc5cc499f14ad6c1476b50cb7b1", - "reference": "233e36632422cfc5cc499f14ad6c1476b50cb7b1", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5eb79f3dbdffed6544e1fc287572c0f462bd29bb", + "reference": "5eb79f3dbdffed6544e1fc287572c0f462bd29bb", "shasum": "" }, "require": { @@ -1876,7 +1860,7 @@ "docblock", "parser" ], - "time": "2020-04-02T08:15:55+00:00" + "time": "2020-04-02T12:33:25+00:00" }, { "name": "doctrine/cache", @@ -3191,16 +3175,16 @@ }, { "name": "drupal/core", - "version": "8.8.4", + "version": "8.8.5", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8" + "reference": "e22cfc3adf1dac7a92452287a7d8602f3c27b68f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", - "reference": "34e59fcf702c1b3c497bbd6e92e68e546c5d15b8", + "url": "https://api.github.com/repos/drupal/core/zipball/e22cfc3adf1dac7a92452287a7d8602f3c27b68f", + "reference": "e22cfc3adf1dac7a92452287a7d8602f3c27b68f", "shasum": "" }, "require": { @@ -3436,11 +3420,11 @@ "GPL-2.0-or-later" ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", - "time": "2020-03-18T16:26:33+00:00" + "time": "2020-04-02T19:01:19+00:00" }, { "name": "drupal/core-composer-scaffold", - "version": "8.8.4", + "version": "8.8.5", "source": { "type": "git", "url": "https://github.com/drupal/core-composer-scaffold.git", @@ -3787,7 +3771,7 @@ "shasum": "109047e07a7e77528747d41044b6cf13f2671ac7" }, "require": { - "drupal/core": "*" + "drupal/core": "^8 || ^9" }, "type": "drupal-module", "extra": { @@ -4203,17 +4187,17 @@ }, { "name": "drupal/facets", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/facets.git", - "reference": "8.x-1.3" + "reference": "8.x-1.4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/facets-8.x-1.3.zip", - "reference": "8.x-1.3", - "shasum": "2ca517094a34112e8168746123d337a25da6a227" + "url": "https://ftp.drupal.org/files/projects/facets-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "ee2d584b8a225ab981e313f6050e13bc9c98e40b" }, "require": { "drupal/core": "~8.0" @@ -4227,7 +4211,7 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.3", + "version": "8.x-1.4", "datestamp": "1556645881", "security-coverage": { "status": "covered", @@ -7014,22 +6998,10 @@ "GPL-2.0+" ], "authors": [ - { - "name": "AdamPS", - "homepage": "https://www.drupal.org/user/2650563" - }, - { - "name": "Anybody", - "homepage": "https://www.drupal.org/user/291091" - }, { "name": "B-Prod", "homepage": "https://www.drupal.org/user/407852" }, - { - "name": "geek-merlin", - "homepage": "https://www.drupal.org/user/229048" - }, { "name": "sbrattla", "homepage": "https://www.drupal.org/user/53422" @@ -10409,7 +10381,7 @@ "reference": "master" }, "type": "library", - "time": "2019-03-13T23:53:42+00:00" + "time": "2020-02-13T14:54:04+00:00" }, { "name": "stack/builder", From 1d6af89316e9c9bea82a11953491d3bbf2f6c164 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 3 Apr 2020 11:56:59 +0300 Subject: [PATCH 493/957] ISAICP-5258: Update Facets to the latest development version. There have been a number of bug fixes since the latest release which at first glance could be relevant to the unexpected "All events" facet which is now appearing. Let's see if the bug has been fixed in the meantime. --- composer.json | 2 +- composer.lock | 29 +++++++++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index 7d9670620b..d91f879af0 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "drupal/embed_block": "^1.0", "drupal/entity_legal": "^2", "drupal/error_page": "^1.0", - "drupal/facets": "^1.4", + "drupal/facets": "dev-1.x", "drupal/field_group": "^1.0", "drupal/file_url": "^1.0-alpha7", "drupal/flag": "^4.0", diff --git a/composer.lock b/composer.lock index 7aecd378ca..e1ed7e3b13 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": "c49c1806531f0b9efffadb9fe7a7721b", + "content-hash": "2ce71c7aaa19b7c004a26ee6808753bb", "packages": [ { "name": "SEMICeu/adms-ap_validator", @@ -4187,20 +4187,14 @@ }, { "name": "drupal/facets", - "version": "1.4.0", + "version": "dev-1.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/facets.git", - "reference": "8.x-1.4" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/facets-8.x-1.4.zip", - "reference": "8.x-1.4", - "shasum": "ee2d584b8a225ab981e313f6050e13bc9c98e40b" + "reference": "4f3e10bdb21c6480be05f1f7df3da5d77d106351" }, "require": { - "drupal/core": "~8.0" + "drupal/core": "^8.8 || ^9" }, "require-dev": { "drupal/search_api": "~1.5" @@ -4208,14 +4202,15 @@ "type": "drupal-module", "extra": { "branch-alias": { - "dev-1.x": "1.x-dev" + "dev-1.x": "1.x-dev", + "dev-8.x-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.4", - "datestamp": "1556645881", + "version": "8.x-1.4+27-dev", + "datestamp": "1572429486", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Dev releases are not covered by Drupal security advisories." } }, "patches_applied": { @@ -4246,7 +4241,8 @@ "source": "git://git.drupal.org/project/facets.git", "issues": "https://www.drupal.org/project/issues/facets", "irc": "irc://irc.freenode.org/drupal-search-api" - } + }, + "time": "2020-04-01T05:58:15+00:00" }, { "name": "drupal/field_group", @@ -17360,6 +17356,7 @@ "drupal/config_exclude": 20, "drupal/config_ignore": 20, "drupal/config_update": 20, + "drupal/facets": 20, "drupal/matomo_reporting_api": 20, "drupal/phingdrushtask": 20, "drupal/swiftmailer": 20, From 71ebcf38031bb37ef51f28f780b3e47e7381ab79 Mon Sep 17 00:00:00 2001 From: Pieter Frenssen Date: Fri, 3 Apr 2020 12:04:06 +0300 Subject: [PATCH 494/957] ISAICP-5785: Oops :sweat-smile: --- tests/features/moderator/site_alerts.feature | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/features/moderator/site_alerts.feature b/tests/features/moderator/site_alerts.feature index af1587103d..2db80318a0 100644 --- a/tests/features/moderator/site_alerts.feature +++ b/tests/features/moderator/site_alerts.feature @@ -29,7 +29,6 @@ Feature: Site alerts And I press "Save" Then I should see the text "Not Active" - Then I break # The alert should no longer be shown. Given I am not logged in And I am on the homepage From cfe14791bb5c4a281ddcb24b1ad890dde42ea289 Mon Sep 17 00:00:00 2001 From: Alexis Gaillard Date: Fri, 3 Apr 2020 11:23:13 +0200 Subject: [PATCH 495/957] ISAICP-5568: Improve user profile layout v2. --- .../custom/joinup_user/joinup_user.behat.inc | 8 +- web/themes/joinup/joinup_theme.theme | 3 + .../prototype/scss/components/_featured.scss | 99 +++++++++++++++++++ .../user/user--group-header.html.twig | 94 +++++++++++------- 4 files changed, 164 insertions(+), 40 deletions(-) diff --git a/web/modules/custom/joinup_user/joinup_user.behat.inc b/web/modules/custom/joinup_user/joinup_user.behat.inc index 34faf97529..8979c356ad 100644 --- a/web/modules/custom/joinup_user/joinup_user.behat.inc +++ b/web/modules/custom/joinup_user/joinup_user.behat.inc @@ -117,11 +117,13 @@ class JoinupUserSubContext extends DrupalSubContextBase implements DrupalSubCont public function assertImagePresent(string $filename): void { // Drupal appends an underscore and a number to the filename when duplicate // files are uploaded, for example when a test is run more than once. - // We split up the filename and extension and match for both. + // 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); - $extension = $parts['extension']; + $host = \Drupal::request()->getSchemeAndHttpHost(); $filename = $parts['filename']; - $this->assertSession()->elementExists('css', "[src*='$filename.$extension']"); + $xpath = "//div[contains(@class, 'featured__logo') and contains(@style, 'background-image: url({$host}/sites/default/files/{$filename}')]"; + $this->assertSession()->elementExists('xpath', $xpath); } /** diff --git a/web/themes/joinup/joinup_theme.theme b/web/themes/joinup/joinup_theme.theme index ef8786ea44..9b937d22d8 100644 --- a/web/themes/joinup/joinup_theme.theme +++ b/web/themes/joinup/joinup_theme.theme @@ -1172,6 +1172,9 @@ function joinup_theme_preprocess_user__group_header(&$variables) { // It creates a timespan without label and with lower granularity. $variables['member_for'] = \Drupal::service('date.formatter')->formatTimeDiffSince($variables['user']->getCreatedTime(), ['granularity' => 1]); $variables['full_name'] = $variables['user']->get('full_name')->value; + $variables['field_user_photo_url'] = !empty($variables['content']['field_user_photo'][0]['#item']->entity->uri->value) ? + file_create_url($variables['content']['field_user_photo'][0]['#item']->entity->uri->value) + : ''; } /** diff --git a/web/themes/joinup/prototype/scss/components/_featured.scss b/web/themes/joinup/prototype/scss/components/_featured.scss index baf6bf13aa..ddc20af5cd 100644 --- a/web/themes/joinup/prototype/scss/components/_featured.scss +++ b/web/themes/joinup/prototype/scss/components/_featured.scss @@ -307,3 +307,102 @@ @include centered; } } + +// User Profile top banner +// -------------------------------------------------- +.featured__outer-wrapper--user { + .featured__inner-wrapper { + width: 100%; + max-width: 1600px; + margin: 0 auto; + padding-bottom: 20px 16px 10px 16px; + text-align: left; + + .mdl-cell { + @include breakpoint(xxs, xs) { + width: 100%; + } + } + + .featured__logo-wrapper { + position: relative; + display: block; + width: 100%; + margin: 0 auto; + max-width: 170px; + + @include breakpoint(xxs, xs) { + max-width: 140px; + } + + &:before { + content: ""; + display: block; + padding-top: 100%; + } + + .featured__logo { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + background-size: cover; + @include border-radius(50%); + } + } + + .featured__text--double { + margin: -8px 0 10px 0; + text-align: center; + @include breakpoint(tablet) { + text-align: left; + } + } + + .inline-social-media { + text-align: center; + margin-top: 20px; + } + + .stats__wrapper { + color: white; + margin-bottom: 10px; + + &.stats__wrapper-domain, + &.stats__wrapper-organisation { + @include breakpoint(xxs, xs) { + text-align: left; + } + + .stats__text.bold { + display: block; + margin: 20px 0 7px 0; + } + } + + &.stats__wrapper-domain { + @include breakpoint(lg-desktop) { + padding-left: 5px; + } + } + + .stats__col--double > div { + @include breakpoint(lg-desktop) { + -webkit-columns: 2; + -moz-columns: 2; + columns: 2; + column-gap: 20px; + } + @include breakpoint(xxs, desktop) { + > div { + &:nth-of-type(1n+6) { + display: none; + } + } + } + } + + } + } +} diff --git a/web/themes/joinup/templates/user/user--group-header.html.twig b/web/themes/joinup/templates/user/user--group-header.html.twig index 9670168313..198a6a96ce 100644 --- a/web/themes/joinup/templates/user/user--group-header.html.twig +++ b/web/themes/joinup/templates/user/user--group-header.html.twig @@ -26,49 +26,69 @@ * - member_for: A custom variable, which contains a 'member for' timespan. */ #} -