====== Drupal 9 ====== ==== Fresh minimal Drupal 9 installation. ==== We need unzip. # apt install unzip Prepare folders and permissions (user = server manager; www-data = user nginx running as). # sudo chown user /var/www/ # mkdir /var/www/.cache # mkdir /var/www/html # sudo chown -R user:www-data /var/www/.cache /var/www/html Install Drupal 9 (currently 9.1.4 version) by composer (executed as user). $ composer create-project drupal/recommended-project /var/www/html Securing installation before continue to install by standard web interface. $ cd /var/www/html/web $ sudo chown -R user:www-data . $ find . -type d -exec chmod u=rwx,g=rx,o= '{}' \; $ find . -type f -exec chmod u=rw,g=r,o= '{}' \; $ sudo chgrp -R www-data /var/www/html/vendor $ sudo chgrp www-data /var/www/html $ sudo chmod 770 sites/default $ chmod -R 660 sites/default/* $ mkdir sites/default/files $ sudo chown -R user:www-data sites/default/files $ cp -a sites/default/default.settings.php sites/default/settings.php $ sudo chgrp www-data sites/default/settings.php Browse to https://dbopen.ba.cnr.it to complete installation. * Language: English * Select an installation profile: Minimal Build a custom site without pre-configured functionality. Suitable for advanced users. * Database configuration (all defaults) * Configure site * Site name: DBOpen * Site email address: dbopen@ba.cnr.it * Email address: dbopen@ba.cnr.it * Check for updates automatically: YES * Receive email notifications: NO Some more secure permissions. $ sudo chmod 750 sites/default $ sudo chmod 640 sites/default/*.php $ sudo chmod 640 sites/default/*.yml First useful UI settings: * BROWSE admin/appearance and install&set admin theme (Seven) and default theme (Bartik) and uninstall Stark * BROWSE admin/config/people/accounts and select the the "Only site administrators can create new user accounts" option Install Drush $ cd /var/www/html/ $ composer require drush/drush:^10 $ vendor/bin/drush --version Drush Commandline Tool 10.4.0 Composer.json at this step: { "name": "drupal/recommended-project", "description": "Project template for Drupal 9 projects with a relocated document root", "type": "project", "license": "GPL-2.0-or-later", "homepage": "https://www.drupal.org/project/drupal", "support": { "docs": "https://www.drupal.org/docs/user_guide/en/index.html", "chat": "https://www.drupal.org/node/314178" }, "repositories": [ { "type": "composer", "url": "https://packages.drupal.org/8" } ], "require": { "composer/installers": "^1.9", "drupal/core-composer-scaffold": "^9.1", "drupal/core-project-message": "^9.1", "drupal/core-recommended": "^9.1", "drush/drush": "^10" }, "conflict": { "drupal/drupal": "*" }, "minimum-stability": "stable", "prefer-stable": true, "config": { "sort-packages": true }, "extra": { "drupal-scaffold": { "locations": { "web-root": "web/" } }, "installer-paths": { "web/core": [ "type:drupal-core" ], "web/libraries/{$name}": [ "type:drupal-library" ], "web/modules/contrib/{$name}": [ "type:drupal-module" ], "web/profiles/contrib/{$name}": [ "type:drupal-profile" ], "web/themes/contrib/{$name}": [ "type:drupal-theme" ], "drush/Commands/contrib/{$name}": [ "type:drupal-drush" ], "web/modules/custom/{$name}": [ "type:drupal-custom-module" ], "web/profiles/custom/{$name}": [ "type:drupal-custom-profile" ], "web/themes/custom/{$name}": [ "type:drupal-custom-theme" ] }, "drupal-core-project-message": { "include-keys": [ "homepage", "support" ], "post-create-project-cmd-message": [ " ", " Congratulations, you’ve installed the Drupal codebase ", " from the drupal/recommended-project template! ", " ", "", "Next steps:", " * Install the site: https://www.drupal.org/docs/8/install", " * Read the user guide: https://www.drupal.org/docs/user_guide/en/index.html", " * Get support: https://www.drupal.org/support", " * Get involved with the Drupal community:", " https://www.drupal.org/getting-involved", " * Remove the plugin that prints this message:", " composer remove drupal/core-project-message" ] } } } Change composer.json to enable dev module version. nano -w composer.json "minimum-stability": "dev" ==== Basic configuration ==== === Trust host pattern === $ nano -w web/sites/default/settings.php $settings['trusted_host_patterns'] = [ '^dbopen\.ba\.cnr\.it$', ]; === Cron === $ sudo -u www-data crontab -e */15 * * * * wget -O - -q -t 1 https://dbopen.ba.cnr.it/cron/****************** === Import/export config === Enable import/export from UI $ vendor/bin/drush en config Or import/export configuration by drush config:export --destination=/home/user/backup config:import --partial --source=/home/user/upload === Enable composer patch === To be able to apply patch with composer we need: $ composer require cweagans/composer-patches - Installing cweagans/composer-patches (1.7.0): Extracting archive === Private filesystem === $ mkdir /var/www/html/private $ sudo chgrp -R www-data /var/www/html/private $ nano -w web/sites/default/settings.php $settings['file_private_path'] = '/var/www/html/private'; $ vendor/bin/drush cr === S3fs and connect to Minio === Your PHP must be configured with allow_url_fopen = On in your php.ini file. Otherwise, PHP will be unable to open files that are in your S3 bucket. $ grep -R allow_url_fopen /etc/php/* /etc/php/7.4/fpm/php.ini:allow_url_fopen = On /etc/php/7.4/cli/php.ini:allow_url_fopen = On In addition, you need the php5-curl library installed for the SDK to be able to communicate with S3. Most hosts will already have this library installed, but some don't. $ php -m |grep curl curl Install s3fs module $ cd /var/www/html $ composer require 'drupal/s3fs:3.x-dev@dev' - Installing mtdowling/jmespath.php (2.6.0): Extracting archive - Installing aws/aws-sdk-php (3.173.22): Extracting archive - Installing drupal/s3fs (dev-3.x 012cdc2): Cloning 012cdc22d5 from cache $ vendor/bin/drush en s3fs $ vendor/bin/drush cr Configure settings.php $ nano -w web/sites/default/settings.php /** * Minio S3 credentials */ $settings['s3fs.access_key'] = 'my_access_key'; $settings['s3fs.secret_key'] = 'my_secret_key'; $config['s3fs.settings']['bucket'] = 'archipelago'; Browse UI at admin/config/media/s3fs Custom Host Settings Hostname => localhost:9000 Use path-style endpoint => YES === Theme === Install Barrio with subtheme $ cd /var/www/html $ composer require drupal/bootstrap_barrio Using version ^5.1 for drupal/bootstrap_barrio Lock file operations: 2 installs, 0 updates, 0 removals - Locking drupal/bootstrap_barrio (5.1.4) - Locking twbs/bootstrap (v4.6.0) Package operations: 2 installs, 0 updates, 0 removals - Installing twbs/bootstrap (v4.6.0): Extracting archive - Installing drupal/bootstrap_barrio (5.1.4): Extracting archive cd web/themes/contrib/bootstrap_barrio/ chmod +x scripts/create_subtheme.sh ./scripts/create_subtheme.sh Browse UI at admin/appearance Install and set default Archipelago DBOpen theme (subtheme) For administration UI $ vendor/bin/drush en toolbar === Twig and Display suite modules === Install with composer and enable by drush. $ composer require 'drupal/twig_field:^1.1' 'drupal/bamboo_twig:^5.0@alpha' 'drupal/twig_tweak:^3.0' - Installing drupal/bamboo_twig (5.0.0-alpha1): Extracting archive - Installing drupal/codemirror_editor (1.7.0): Extracting archive - Installing drupal/twig_field (1.1.0): Extracting archive - Installing drupal/twig_tweak (3.0.0): Extracting archive $ vendor/bin/drush en twig_field The following module(s) will be enabled: twig_field, codemirror_editor, editor $ vendor/bin/drush en twig_tweak $ composer require 'drupal/ds:^3.10' - Installing drupal/ds (3.10.0): Extracting archive $ vendor/bin/drush en ds ds_extras ds_switch_view_mode The following module(s) will be enabled: ds, ds_extras, ds_switch_view_mode, layout_discovery $ composer require 'drupal/display_field_copy:^2.0' - Installing drupal/display_field_copy (2.0.0): Extracting archive $ vendor/bin/drush en display_field_copy === Search API and Search API Solr === Install modules. $ composer require 'drupal/search_api:^1.19' - Installing drupal/search_api (1.19.0): Extracting archive $ vendor/bin/drush en search_api $ composer require 'drupal/search_api_autocomplete:^1.4' 'drupal/search_api_attachments:^1.0@beta' - Installing drupal/search_api_attachments (1.0.0-beta17): Extracting archive - Installing drupal/search_api_autocomplete (1.4.0): Extracting archive $ vendor/bin/drush en search_api_autocomplete search_api_attachments $ composer require 'drupal/search_api_solr:^4.1' - Installing psr/http-client (1.0.1): Extracting archive - Installing psr/event-dispatcher (1.0.0): Extracting archive - Installing solarium/solarium (6.1.1): Extracting archive - Installing myclabs/php-enum (1.8.0): Extracting archive - Installing maennchen/zipstream-php (2.1.0): Extracting archive - Installing drupal/search_api_solr (4.1.11): Extracting archive $ vendor/bin/drush en search_api_solr The following module(s) will be enabled: search_api_solr, language Browse UI to admin/config/search/search-api/add-server to add and configure Solr server Solr Connector: Standard Advanced: Retrieve result data from Solr = YES Advanced: Retrieve highlighted snippets = YES Advanced: Fallback to multiValued field types = YES We have to add Language Undefined Text OCR Field with Coordinate highlight in Solr server Custom Field Type \\ Open https://github.com/esmero/archipelago-deployment/blob/1.0.0-RC2D9/config/sync/search_api_solr.solr_field_type.text_ocr_und_7_0_0.yml \\ Then browse UI at admin/config/development/configuration/single/import, select Solr Field type and paste yml above. \\ \\ Add index browsing UI at admin/config/search/search-api/add-index Name = [machine name] drupal_content_to_solr_8 Datasources Content = YES File = YES Server = Solr DBOpen Then SAVE (-> 1 doc on queue from datasource Content, so index, result = OK) \\ Set index Processors browsing UI at admin/config/search/search-api/index/drupal_content_to_solr_8/processors Enable: Content access, Entity status, Highlight, HTML filter, Reverse entity references Processor settings: Highlight and HTML filter [we need to come back here after Strawberryfield installed] Then Reindexing (browse UI at admin/config/search/search-api/index/drupal_content_to_solr_8) \\ Fields will be added after Srawberryfield installed (dmin/config/search/search-api/index/drupal_content_to_solr_8/fields) === Views === $ composer require 'drupal/views_bootstrap:^4.3' - Installing drupal/views_bootstrap (4.3.0): Extracting archive $ vendor/bin/drush en views views_ui views_bootstrap === Webform === $ composer require 'drupal/webform:^6' - Installing drupal/webform (6.0.2): Extracting archive $ vendor/bin/drush en webform webform_bootstrap webform_image_select webform_node webform_ui Successfully enabled: webform, webform_bootstrap, webform_image_select, webform_node, webform_ui, path $ composer require 'drupal/webformnavigation:^1.0@alpha' - Installing drupal/webform_submission_log (6.0.2) - Installing drupal/webformnavigation (1.0.0-alpha11): Extracting archive $ vendor/bin/drush en webformnavigation Successfully enabled: webformnavigation, webform_submission_log To avoid warnings in Status report $ composer require 'drupal/recaptcha_element' - Installing google/recaptcha (1.2.4): Extracting archive - Installing drupal/recaptcha_element (1.0.5): Extracting archive vendor/bin/drush en recaptcha_element Successfully enabled: recaptcha_element Libraries, see https://www.drupal.org/node/3003140 $ composer require wikimedia/composer-merge-plugin - Installing wikimedia/composer-merge-plugin (v2.0.1) $ nano -w composer.json "extra": { "merge-plugin": { "include": [ "web/modules/contrib/webform/composer.libraries.json" ] }, $ composer update drupal/webform - Installing algolia/places (1.19.0): Extracting archive - Installing choices/choices (9.0.1): Extracting archive - Installing ckeditor/autogrow (4.14.1): Extracting archive - Installing ckeditor/codemirror (v1.17.12): Extracting archive - Installing ckeditor/fakeobjects (4.14.1): Extracting archive - Installing ckeditor/image (4.14.1): Extracting archive - Installing ckeditor/link (4.14.1): Extracting archive - Installing codemirror/codemirror (5.53.2): Extracting archive - Installing jquery/chosen (1.8.7): Extracting archive - Installing jquery/geocomplete (1.7.0): Extracting archive - Installing jquery/hotkeys (0.2.0): Extracting archive - Installing jquery/icheck (1.0.2 ): Extracting archive - Installing jquery/image-picker (0.3.1): Extracting archive - Installing jquery/inputmask (5.0.5): Extracting archive - Installing jquery/intl-tel-input (16.1.0): Extracting archive - Installing jquery/rateit (1.1.3): Extracting archive - Installing jquery/select2 (4.0.13): Extracting archive - Installing jquery/textcounter (0.9.0): Extracting archive - Installing jquery/timepicker (1.13.14): Extracting archive - Installing jquery/toggles (4.0.0): Extracting archive - Installing progress-tracker/progress-tracker (2.0.6): Extracting archive - Installing signature_pad/signature_pad (2.3.0): Extracting archive - Installing svg-pan-zoom/svg-pan-zoom (3.6.1): Extracting archive - Installing tabby/tabby (12.0.3): Extracting archive - Installing tippyjs/5.x (5.2.1) - Installing tippyjs/6.x (6.2.6) === Form Mode Manager with patches === Partially follow this post https://www.computerminds.co.uk/articles/apply-drupal-9-compatibility-patches-composer \\ Add package source from git to avoid composer block to install $ nano -w composer.json }, "repositories": [ { "type": "package", "package": { "name": "drupal/form_mode_manager", "type": "drupal-module", "version": "dev-8.x-2.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/form_mode_manager.git", "reference": "bb634122" } } }, Add patch links to composer.json "web/themes/custom/{$name}": [ "type:drupal-custom-theme" ] }, "enable-patching": true, "patches": { "drupal/form_mode_manager": { "Fix Form Mode title": "https://www.drupal.org/files/issues/2019-12-10/form_mode_manager-bundle-label-in-title-3100112-2-D8.patch", "D9 readyness": "https://www.drupal.org/files/issues/2020-10-30/form_mode_manager-drupal-9-compatibility-3164478-6.patch" }, "drupal/role_theme_switcher": { "D9 readyness": "https://www.drupal.org/files/issues/2020-06-06/role_theme_switcher.1.x-dev.rector.patch" } } Then it can be installed and patches applied $ composer -v require drupal/form_mode_manager Using version dev-8.x-2.x for drupal/form_mode_manager ... - Installing drupal/form_mode_manager (dev-8.x-2.x bb634122): Cloning bb634122 from cache ... - Applying patches for drupal/form_mode_manager https://www.drupal.org/files/issues/2019-12-10/form_mode_manager-bundle-label-in-title-3100112-2-D8.patch (Fix Form Mode title) https://www.drupal.org/files/issues/2020-10-30/form_mode_manager-drupal-9-compatibility-3164478-6.patch (D9 readyness) $ vendor/bin/drush en form_mode_manager === Workflow === We need patch as stated here https://github.com/esmero/archipelago-deployment/issues/100 $ nano -w composer.json "patches": { "drupal/workflow": { "D9 readyness": "https://www.drupal.org/files/issues/2020-07-07/deprecated_entity_manager_workflowstorage_error-3157199-7.patch" }, $ composer require 'drupal/workflow' - Installing drupal/workflow (1.4.0): Extracting archive - Applying patches for drupal/workflow https://www.drupal.org/files/issues/2020-07-07/deprecated_entity_manager_workflowstorage_error-3157199-7.patch (D9 readyness) $ vendor/bin/drush en workflow Successfully enabled: workflow === Token UUID === $ composer require drupal/tokenuuid - Installing drupal/token (1.9.0): Extracting archive - Installing drupal/tokenuuid (1.4.0): Extracting archive $ vendor/bin/drush en tokenuuid Successfully enabled: tokenuuid, token === Web Services === $ vendor/bin/drush en hal jsonapi rest serialization $ composer require 'drupal/restui' - Installing drupal/restui (1.19.0) $ vendor/bin/drush en restui Successfully enabled: restui === File related modules === $ composer require 'drupal/fancy_file_delete:^2.0' - Installing drupal/views_bulk_operations (3.10.0): Extracting archive - Installing drupal/fancy_file_delete (2.0.3): Extracting archive $ vendor/bin/drush en fancy_file_delete Successfully enabled: fancy_file_delete, views_bulk_operations $ composer require 'drupal/file_mdm:^2' - Installing phenx/php-font-lib (0.5.2): Extracting archive - Installing lsolesen/pel (0.9.10): Extracting archive - Installing drupal/file_mdm (2.1.0): Extracting archive $ vendor/bin/drush en file_mdm file_mdm_exif Successfully enabled: file_mdm, file_mdm_exif $ composer require 'drupal/imagemagick:^3.1' - Installing fileeye/mimemap (1.1.4): Extracting archive - Installing drupal/sophron (1.1.0): Extracting archive - Installing drupal/imagemagick (3.1.0): Extracting archive $ sudo apt install imagemagick-6.q16 $ convert --version Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org Copyright: © 1999-2019 ImageMagick Studio LLC License: https://imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP Delegates (built-in): bzlib djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib $ vendor/bin/drush en imagemagick Successfully enabled: imagemagick, sophron $ composer require 'drupal/imce:^2.3' - Installing drupal/imce (2.3.0): Extracting archive $ vendor/bin/drush en imce Successfully enabled: imce === React-PHP === $ composer require react/child-process react/event-loop react/promise - Installing react/event-loop (v1.1.1): Extracting archive - Installing evenement/evenement (v3.0.1): Extracting archive - Installing react/stream (v1.1.1): Extracting archive - Installing react/child-process (v0.6.2): Extracting archive - Installing react/promise (v2.8.0): Extracting archive === More useful/required modules === **** facets $ composer require 'drupal/facets:1.x-dev@dev' - Installing drupal/facets (dev-1.x a941c92) $ vendor/bin/drush en facets Successfully enabled: facets **** field permissions $ composer require 'drupal/field_permissions' - Installing drupal/field_permissions (1.1.0) $ vendor/bin/drush en field_permissions Successfully enabled: field_permissions **** inline entity form $ composer require 'drupal/inline_entity_form:1.x-dev@dev' - Installing drupal/inline_entity_form (dev-1.x 52d28cc) $ vendor/bin/drush en inline_entity_form Successfully enabled: inline_entity_form **** pathauto $ composer require 'drupal/pathauto' - Installing drupal/ctools (3.4.0): Extracting archive - Installing drupal/pathauto (1.8.0): Extracting archive $ vendor/bin/drush en pathauto Successfully enabled: pathauto, ctools **** queue_ui $ composer require 'drupal/queue_ui' - Installing drupal/queue_ui (2.2.0) $ vendor/bin/drush en queue_ui Successfully enabled: queue_ui **** quick_node_clone $ composer require drupal/quick_node_clone - Installing drupal/quick_node_clone (1.13.0) $ vendor/bin/drush en quick_node_clone Successfully enabled: quick_node_clone **** schema metatag $ composer require 'drupal/schema_metatag' - Installing drupal/metatag (1.15.0): Extracting archive - Installing drupal/schema_metatag (2.1.0): Extracting archive $ vendor/bin/drush en schema_metatag Successfully enabled: schema_metatag, metatag **** Json-ld $ composer require 'ml/json-ld' - Installing ml/iri (1.1.4): Extracting archive - Installing ml/json-ld (1.2.0): Extracting archive **** ramsey uuid $ composer require ramsey/uuid - Installing ramsey/collection (1.1.3): Extracting archive - Installing brick/math (0.9.2): Extracting archive - Installing ramsey/uuid (4.1.1): Extracting archive **** swaggest json-schema $ composer require swaggest/json-schema - Installing swaggest/json-diff (v3.8.1): Extracting archive - Installing phplang/scope-exit (1.0.0): Extracting archive - Installing swaggest/json-schema (v0.12.31): Extracting archive **** drupal/google_api_client $ composer require drupal/google_api_client - Installing paragonie/random_compat (v9.99.100): Extracting archive - Installing paragonie/constant_time_encoding (v2.4.0): Extracting archive - Installing phpseclib/phpseclib (3.0.5): Extracting archive - Installing monolog/monolog (2.2.0): Extracting archive - Installing psr/cache (1.0.1): Extracting archive - Installing firebase/php-jwt (v5.2.1): Extracting archive - Installing google/auth (v1.15.0): Extracting archive - Installing google/apiclient-services (v0.163.0): Extracting archive - Installing google/apiclient (v2.9.1): Extracting archive - Installing drupal/google_api_client (3.0.0-rc5): Extracting archive $ vendor/bin/drush en google_api_client Successfully enabled: google_api_client **** mixnode/mixnode-warcreader-php $ composer require mixnode/mixnode-warcreader-php - Installing mixnode/mixnode-warcreader-php (0.0.6) **** config and context $ composer require drupal/config_inspector drupal/config_update drupal/config_update_ui drupal/context - Installing drupal/config_inspector (1.1.0): Extracting archive - Installing drupal/config_update (1.7.0): Extracting archive - Installing drupal/config_update_ui (1.7.0) - Installing drupal/context (4.0.0-beta5): Extracting archive $ vendor/bin/drush en config_inspector config_update config_update_ui context context_ui Successfully enabled: config_inspector, config_update, config_update_ui, context, context_ui **** drupal/moderated_content_bulk_publish $ composer require drupal/moderated_content_bulk_publish - Installing drupal/moderated_content_bulk_publish (2.0.2) $ vendor/bin/drush en moderated_content_bulk_publish Successfully enabled: moderated_content_bulk_publish ***** frictionlessdata/datapackage WAIT package update === composer.json at the end of these steps === { "name": "drupal/recommended-project", "description": "Project template for Drupal 9 projects with a relocated document root", "type": "project", "license": "GPL-2.0-or-later", "homepage": "https://www.drupal.org/project/drupal", "support": { "docs": "https://www.drupal.org/docs/user_guide/en/index.html", "chat": "https://www.drupal.org/node/314178" }, "repositories": [ { "type": "package", "package": { "name": "drupal/form_mode_manager", "type": "drupal-module", "version": "dev-8.x-2.x", "source": { "type": "git", "url": "https://git.drupalcode.org/project/form_mode_manager.git", "reference": "bb634122" } } }, { "type": "composer", "url": "https://packages.drupal.org/8" } ], "require": { "composer/installers": "^1.9", "cweagans/composer-patches": "^1.7", "drupal/bamboo_twig": "^5.0@alpha", "drupal/bootstrap_barrio": "^5.1", "drupal/config_inspector": "^1.1", "drupal/config_update": "^1.7", "drupal/config_update_ui": "^1.7", "drupal/context": "^4.0@beta", "drupal/core-composer-scaffold": "^9.1", "drupal/core-project-message": "^9.1", "drupal/core-recommended": "^9.1", "drupal/display_field_copy": "^2.0", "drupal/ds": "^3.10", "drupal/facets": "1.x-dev@dev", "drupal/fancy_file_delete": "^2.0", "drupal/field_permissions": "^1.1", "drupal/file_mdm": "^2", "drupal/form_mode_manager": "dev-8.x-2.x", "drupal/google_api_client": "^3.0@RC", "drupal/imagemagick": "^3.1", "drupal/imce": "^2.3", "drupal/inline_entity_form": "1.x-dev@dev", "drupal/moderated_content_bulk_publish": "^2.0", "drupal/pathauto": "^1.8", "drupal/queue_ui": "^2.2", "drupal/quick_node_clone": "^1.13", "drupal/recaptcha_element": "^1.0", "drupal/restui": "^1.19", "drupal/s3fs": "3.x-dev@dev", "drupal/schema_metatag": "^2.1", "drupal/search_api": "^1.19", "drupal/search_api_attachments": "^1.0@beta", "drupal/search_api_autocomplete": "^1.4", "drupal/search_api_solr": "^4.1", "drupal/tokenuuid": "^1.4", "drupal/twig_field": "^1.1", "drupal/twig_tweak": "^3.0", "drupal/views_bootstrap": "^4.3", "drupal/webform": "^6", "drupal/webformnavigation": "^1.0@alpha", "drupal/workflow": "^1.4", "drush/drush": "^10", "mixnode/mixnode-warcreader-php": "^0.0.6", "ml/json-ld": "^1.2", "ramsey/uuid": "^4.1", "react/child-process": "^0.6.2", "react/event-loop": "^1.1", "react/promise": "^2.8", "swaggest/json-schema": "^0.12.31", "wikimedia/composer-merge-plugin": "^2.0" }, "conflict": { "drupal/drupal": "*" }, "minimum-stability": "dev", "prefer-stable": true, "config": { "sort-packages": true }, "extra": { "merge-plugin": { "include": [ "web/modules/contrib/webform/composer.libraries.json" ] }, "drupal-scaffold": { "locations": { "web-root": "web/" } }, "installer-paths": { "web/core": [ "type:drupal-core" ], "web/libraries/{$name}": [ "type:drupal-library" ], "web/modules/contrib/{$name}": [ "type:drupal-module" ], "web/profiles/contrib/{$name}": [ "type:drupal-profile" ], "web/themes/contrib/{$name}": [ "type:drupal-theme" ], "drush/Commands/contrib/{$name}": [ "type:drupal-drush" ], "web/modules/custom/{$name}": [ "type:drupal-custom-module" ], "web/profiles/custom/{$name}": [ "type:drupal-custom-profile" ], "web/themes/custom/{$name}": [ "type:drupal-custom-theme" ] }, "enable-patching": true, "patches": { "drupal/workflow": { "D9 readyness": "https://www.drupal.org/files/issues/2020-07-07/deprecated_entity_manager_workflowstorage_error-3157199-7.patch" }, "drupal/form_mode_manager": { "Fix Form Mode title": "https://www.drupal.org/files/issues/2019-12-10/form_mode_manager-bundle-label-in-title-3100112-2-D8.patch", "D9 readyness": "https://www.drupal.org/files/issues/2020-10-30/form_mode_manager-drupal-9-compatibility-3164478-6.patch" }, "drupal/role_theme_switcher": { "D9 readyness": "https://www.drupal.org/files/issues/2020-06-06/role_theme_switcher.1.x-dev.rector.patch" } } } }