From d6ce025e5a6c0f09f6d5ca2f0413c595ad75ac75 Mon Sep 17 00:00:00 2001 From: Stuart Clark Date: Fri, 4 Sep 2026 02:17:11 +0000 Subject: [PATCH 1/7] fix(drupal): run namespaced drush commands through make --- drupal/Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drupal/Makefile b/drupal/Makefile index 952b28f..def45be 100644 --- a/drupal/Makefile +++ b/drupal/Makefile @@ -57,7 +57,16 @@ debug: # Allow running Drush commands with `make drush `. ifeq (drush,$(firstword $(MAKECMDGOALS))) DRUSH_RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) - $(eval $(DRUSH_RUN_ARGS):;@:) + # Swallow the trailing goals so make does not try to build them. This uses a + # match-anything rule rather than `$(eval $(DRUSH_RUN_ARGS):;@:)`, because + # almost every Drush command is namespaced with a colon and make reads + # `tome:export:` as a rule of its own, failing with "target pattern contains + # no '%'". The rule only exists when `drush` is the first goal. + # + # Flags still cannot be passed as goals, because make claims them for itself: + # use `make drush DRUSH_RUN_ARGS="tome:export --yes"` for those. + %: + @: endif drush: From 26d9e10918eae8e4d4ebb5f1c688fbc71f8bbdfe Mon Sep 17 00:00:00 2001 From: Stuart Clark Date: Fri, 4 Sep 2026 02:19:26 +0000 Subject: [PATCH 2/7] fix(drupal): patch tome to declare normalizer supported types --- drupal/composer.json | 3 +- drupal/composer.lock | 2 +- drupal/patches.lock.json | 12 +++- .../tome-normalizer-supported-types.patch | 67 +++++++++++++++++++ 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 drupal/patches/tome-normalizer-supported-types.patch diff --git a/drupal/composer.json b/drupal/composer.json index 67d1f2a..090532a 100644 --- a/drupal/composer.json +++ b/drupal/composer.json @@ -110,7 +110,8 @@ "Fix ViewsPathTranslatorSubscriber crash on views with no JSON:API route": "patches/druxt-views-path-translator-route-name.patch" }, "drupal/tome": { - "Fix subprocess commands built with a joined string, not an argv array": "patches/tome-process-array-not-string.patch" + "Fix subprocess commands built with a joined string, not an argv array": "patches/tome-process-array-not-string.patch", + "Declare normalizer supported types so entity-specific normalizers are used": "patches/tome-normalizer-supported-types.patch" } } } diff --git a/drupal/composer.lock b/drupal/composer.lock index 5740299..751269a 100644 --- a/drupal/composer.lock +++ b/drupal/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": "9171b1672f197bd6c82ccdaf6b4ce05a", + "content-hash": "53ffdf01cedb7a81cc8d63670754a710", "packages": [ { "name": "asm89/stack-cors", diff --git a/drupal/patches.lock.json b/drupal/patches.lock.json index 966d625..ec9627d 100644 --- a/drupal/patches.lock.json +++ b/drupal/patches.lock.json @@ -1,5 +1,5 @@ { - "_hash": "ab06c2732e6997777e25ed4b8b189fc9757e5273cbcbe8612e783f7a8d18ebdb", + "_hash": "1601ef66d5629423dcef9720ba0331a6a4dfb14b8be5c5bb2692a5a4d68b64bc", "patches": { "drupal/druxt": [ { @@ -23,6 +23,16 @@ "extra": { "provenance": "root" } + }, + { + "package": "drupal/tome", + "description": "Declare normalizer supported types so entity-specific normalizers are used", + "url": "patches/tome-normalizer-supported-types.patch", + "sha256": "c857235b91961a030bfb0d63673fd2756aca4d72025a3463ddd8445d3bae0b06", + "depth": 1, + "extra": { + "provenance": "root" + } } ] } diff --git a/drupal/patches/tome-normalizer-supported-types.patch b/drupal/patches/tome-normalizer-supported-types.patch new file mode 100644 index 0000000..8f6c50e --- /dev/null +++ b/drupal/patches/tome-normalizer-supported-types.patch @@ -0,0 +1,67 @@ +--- a/modules/tome_sync/src/Normalizer/ContentEntityNormalizer.php ++++ b/modules/tome_sync/src/Normalizer/ContentEntityNormalizer.php +@@ -2,6 +2,7 @@ + + namespace Drupal\tome_sync\Normalizer; + ++use Drupal\Core\Entity\ContentEntityInterface; + use Drupal\serialization\Normalizer\ContentEntityNormalizer as BaseContentEntityNormalizer; + + /** +@@ -67,4 +68,11 @@ + return $values; + } + ++ /** ++ * {@inheritdoc} ++ */ ++ public function getSupportedTypes(?string $format): array { ++ return [ContentEntityInterface::class => TRUE]; ++ } ++ + } +--- a/modules/tome_sync/src/Normalizer/UserEntityNormalizer.php ++++ b/modules/tome_sync/src/Normalizer/UserEntityNormalizer.php +@@ -2,6 +2,8 @@ + + namespace Drupal\tome_sync\Normalizer; + ++use Drupal\user\UserInterface; ++ + /** + * Normalizes/denormalizes Drupal user entities into an array structure. + * +@@ -28,4 +30,11 @@ + return $values; + } + ++ /** ++ * {@inheritdoc} ++ */ ++ public function getSupportedTypes(?string $format): array { ++ return [UserInterface::class => TRUE]; ++ } ++ + } +--- a/modules/tome_sync/src/Normalizer/PathAliasNormalizer.php ++++ b/modules/tome_sync/src/Normalizer/PathAliasNormalizer.php +@@ -7,6 +7,7 @@ + use Drupal\Core\Entity\EntityRepositoryInterface; + use Drupal\Core\Entity\EntityTypeManagerInterface; + use Drupal\Core\Entity\EntityTypeRepositoryInterface; ++use Drupal\path_alias\PathAliasInterface; + + /** + * Normalizer for Path alias entities. +@@ -100,4 +101,11 @@ + return $entity; + } + ++ /** ++ * {@inheritdoc} ++ */ ++ public function getSupportedTypes(?string $format): array { ++ return [PathAliasInterface::class => TRUE]; ++ } ++ + } From 67185c39b0feca294ee7f0974e97b79803fc07cf Mon Sep 17 00:00:00 2001 From: Stuart Clark Date: Fri, 4 Sep 2026 02:21:29 +0000 Subject: [PATCH 3/7] chore(drupal): re-baseline the tome export under drupal 11 --- drupal/config/block_content.type.basic.yml | 2 +- .../core.entity_form_mode.user.register.yml | 1 + ...re.entity_view_mode.block_content.full.yml | 1 + .../core.entity_view_mode.comment.full.yml | 1 + .../core.entity_view_mode.node.full.yml | 1 + .../config/core.entity_view_mode.node.rss.yml | 1 + ...ore.entity_view_mode.node.search_index.yml | 1 + ...re.entity_view_mode.node.search_result.yml | 1 + .../core.entity_view_mode.node.teaser.yml | 1 + ...re.entity_view_mode.taxonomy_term.full.yml | 1 + .../core.entity_view_mode.user.compact.yml | 1 + .../core.entity_view_mode.user.full.yml | 1 + drupal/config/core.extension.yml | 2 +- .../field.field.block_content.basic.body.yml | 1 + ...eld.field.comment.comment.comment_body.yml | 3 +- .../config/field.field.node.article.body.yml | 1 + drupal/config/field.field.node.page.body.yml | 1 + drupal/config/filter.format.basic_html.yml | 28 +++++++++---------- drupal/config/filter.format.full_html.yml | 12 ++++---- drupal/config/filter.format.plain_text.yml | 12 ++++---- .../config/filter.format.restricted_html.yml | 12 ++++---- drupal/config/node.type.page.yml | 2 +- drupal/config/system.cron.yml | 2 +- drupal/config/taxonomy.vocabulary.tags.yml | 1 + drupal/config/views.settings.yml | 4 +-- drupal/config/views.view.block_content.yml | 4 --- drupal/config/views.view.comment.yml | 12 -------- drupal/config/views.view.content.yml | 6 ---- drupal/config/views.view.files.yml | 8 +----- drupal/config/views.view.glossary.yml | 4 +-- drupal/config/views.view.taxonomy_term.yml | 2 +- .../config/views.view.user_admin_people.yml | 8 ------ drupal/config/views.view.watchdog.yml | 4 --- drupal/config/views.view.who_s_new.yml | 8 +++--- drupal/config/views.view.who_s_online.yml | 10 +++---- drupal/content/meta/index.json | 2 +- ....af1e6d83-49f9-4faa-a033-bf393079f2d9.json | 1 + ....c662dd6f-36f8-42c7-8fe8-8a1004369523.json | 1 + ....4cf17172-8f59-4b81-8a15-43daa951c8ae.json | 6 ++-- ....bc3d3925-9f4c-470f-af1e-44d3d15d2bda.json | 8 ++---- 40 files changed, 75 insertions(+), 103 deletions(-) diff --git a/drupal/config/block_content.type.basic.yml b/drupal/config/block_content.type.basic.yml index 0312915..dff30ec 100644 --- a/drupal/config/block_content.type.basic.yml +++ b/drupal/config/block_content.type.basic.yml @@ -6,5 +6,5 @@ _core: default_config_hash: zglzjmYxi0G0ag9MZ02y0LSJOdpWRwJxyP_OvFojFyo id: basic label: 'Basic block' -revision: 0 +revision: false description: 'A basic block contains a title and a body.' diff --git a/drupal/config/core.entity_form_mode.user.register.yml b/drupal/config/core.entity_form_mode.user.register.yml index 458c4fa..6dc7fc0 100644 --- a/drupal/config/core.entity_form_mode.user.register.yml +++ b/drupal/config/core.entity_form_mode.user.register.yml @@ -8,5 +8,6 @@ _core: default_config_hash: flXhTcp55yLcyy7ZLOhPGKGZobZQJdkAFVWV3LseiuI id: user.register label: Register +description: null targetEntityType: user cache: true diff --git a/drupal/config/core.entity_view_mode.block_content.full.yml b/drupal/config/core.entity_view_mode.block_content.full.yml index 4f4d35f..b054342 100644 --- a/drupal/config/core.entity_view_mode.block_content.full.yml +++ b/drupal/config/core.entity_view_mode.block_content.full.yml @@ -8,5 +8,6 @@ _core: default_config_hash: 4tedlMuvQjDOdvHdw86_e-2Rt78aR7TGFMfOK8Ejppg id: block_content.full label: Full +description: null targetEntityType: block_content cache: true diff --git a/drupal/config/core.entity_view_mode.comment.full.yml b/drupal/config/core.entity_view_mode.comment.full.yml index e84e4de..bee6ed4 100644 --- a/drupal/config/core.entity_view_mode.comment.full.yml +++ b/drupal/config/core.entity_view_mode.comment.full.yml @@ -8,5 +8,6 @@ _core: default_config_hash: K7eNlfU7NEUajz01wItywZklr2oaPgL6s1_97fmDXLA id: comment.full label: 'Full comment' +description: null targetEntityType: comment cache: true diff --git a/drupal/config/core.entity_view_mode.node.full.yml b/drupal/config/core.entity_view_mode.node.full.yml index 20a9f0d..818e238 100644 --- a/drupal/config/core.entity_view_mode.node.full.yml +++ b/drupal/config/core.entity_view_mode.node.full.yml @@ -8,5 +8,6 @@ _core: default_config_hash: ElrtInxGjZd7GaapJ5O9n-ugi2hG2IxFivtgn0tHOsk id: node.full label: 'Full content' +description: null targetEntityType: node cache: true diff --git a/drupal/config/core.entity_view_mode.node.rss.yml b/drupal/config/core.entity_view_mode.node.rss.yml index 2dd73d5..d760b2e 100644 --- a/drupal/config/core.entity_view_mode.node.rss.yml +++ b/drupal/config/core.entity_view_mode.node.rss.yml @@ -8,5 +8,6 @@ _core: default_config_hash: vlYzr-rp2f9NMp-Qlr4sFjlqRq-90mco5-afLNGwCrU id: node.rss label: RSS +description: null targetEntityType: node cache: true diff --git a/drupal/config/core.entity_view_mode.node.search_index.yml b/drupal/config/core.entity_view_mode.node.search_index.yml index 67c2314..716a633 100644 --- a/drupal/config/core.entity_view_mode.node.search_index.yml +++ b/drupal/config/core.entity_view_mode.node.search_index.yml @@ -8,5 +8,6 @@ _core: default_config_hash: fVFfJv_GzBRE-wpRHbfD5a3VjnhbEOXG6lvRd3uaccY id: node.search_index label: 'Search index' +description: null targetEntityType: node cache: true diff --git a/drupal/config/core.entity_view_mode.node.search_result.yml b/drupal/config/core.entity_view_mode.node.search_result.yml index 3789d54..e32ee69 100644 --- a/drupal/config/core.entity_view_mode.node.search_result.yml +++ b/drupal/config/core.entity_view_mode.node.search_result.yml @@ -8,5 +8,6 @@ _core: default_config_hash: 6GCOQ-jP2RbdbHA5YWQ6bT8CfGbqrBYKOSC_XY4E3ZM id: node.search_result label: 'Search result highlighting input' +description: null targetEntityType: node cache: true diff --git a/drupal/config/core.entity_view_mode.node.teaser.yml b/drupal/config/core.entity_view_mode.node.teaser.yml index 01b61b9..2ebd773 100644 --- a/drupal/config/core.entity_view_mode.node.teaser.yml +++ b/drupal/config/core.entity_view_mode.node.teaser.yml @@ -8,5 +8,6 @@ _core: default_config_hash: Mz9qWr1kUYK0mjRAGDsr5XS6PvtZ24en_7ndt-pyWe4 id: node.teaser label: Teaser +description: null targetEntityType: node cache: true diff --git a/drupal/config/core.entity_view_mode.taxonomy_term.full.yml b/drupal/config/core.entity_view_mode.taxonomy_term.full.yml index 4a47105..2613d5f 100644 --- a/drupal/config/core.entity_view_mode.taxonomy_term.full.yml +++ b/drupal/config/core.entity_view_mode.taxonomy_term.full.yml @@ -8,5 +8,6 @@ _core: default_config_hash: '-PPKjsNQPvoIDjOuUAvlLocYD976MNjb9Zpgyz5_BWE' id: taxonomy_term.full label: 'Taxonomy term page' +description: null targetEntityType: taxonomy_term cache: true diff --git a/drupal/config/core.entity_view_mode.user.compact.yml b/drupal/config/core.entity_view_mode.user.compact.yml index 779ae17..3fa1b67 100644 --- a/drupal/config/core.entity_view_mode.user.compact.yml +++ b/drupal/config/core.entity_view_mode.user.compact.yml @@ -8,5 +8,6 @@ _core: default_config_hash: 71CSAr_LNPcgu6D6jI4INl1KATkahmeyUFBETAWya8g id: user.compact label: Compact +description: null targetEntityType: user cache: true diff --git a/drupal/config/core.entity_view_mode.user.full.yml b/drupal/config/core.entity_view_mode.user.full.yml index 62ecb60..3921796 100644 --- a/drupal/config/core.entity_view_mode.user.full.yml +++ b/drupal/config/core.entity_view_mode.user.full.yml @@ -8,5 +8,6 @@ _core: default_config_hash: mQIF_foYjmnVSr9MpcD4CTaJE_FpO1AyDd_DskztGhM id: user.full label: 'User account' +description: null targetEntityType: user cache: true diff --git a/drupal/config/core.extension.yml b/drupal/config/core.extension.yml index c06a489..499b3e0 100644 --- a/drupal/config/core.extension.yml +++ b/drupal/config/core.extension.yml @@ -32,7 +32,6 @@ module: menu_link_content: 0 menu_ui: 0 mysql: 0 - sqlite: 0 node: 0 options: 0 page_cache: 0 @@ -41,6 +40,7 @@ module: search: 0 serialization: 0 shortcut: 0 + sqlite: 0 system: 0 taxonomy: 0 text: 0 diff --git a/drupal/config/field.field.block_content.basic.body.yml b/drupal/config/field.field.block_content.basic.body.yml index bbb851e..a2e0296 100644 --- a/drupal/config/field.field.block_content.basic.body.yml +++ b/drupal/config/field.field.block_content.basic.body.yml @@ -22,4 +22,5 @@ default_value_callback: '' settings: display_summary: false required_summary: false + allowed_formats: { } field_type: text_with_summary diff --git a/drupal/config/field.field.comment.comment.comment_body.yml b/drupal/config/field.field.comment.comment.comment_body.yml index 577b922..effaa10 100644 --- a/drupal/config/field.field.comment.comment.comment_body.yml +++ b/drupal/config/field.field.comment.comment.comment_body.yml @@ -19,5 +19,6 @@ required: true translatable: true default_value: { } default_value_callback: '' -settings: { } +settings: + allowed_formats: { } field_type: text_long diff --git a/drupal/config/field.field.node.article.body.yml b/drupal/config/field.field.node.article.body.yml index 3df86a9..6fd623b 100644 --- a/drupal/config/field.field.node.article.body.yml +++ b/drupal/config/field.field.node.article.body.yml @@ -22,4 +22,5 @@ default_value_callback: '' settings: display_summary: true required_summary: false + allowed_formats: { } field_type: text_with_summary diff --git a/drupal/config/field.field.node.page.body.yml b/drupal/config/field.field.node.page.body.yml index 7b953e1..7f04b54 100644 --- a/drupal/config/field.field.node.page.body.yml +++ b/drupal/config/field.field.node.page.body.yml @@ -22,4 +22,5 @@ default_value_callback: '' settings: display_summary: true required_summary: false + allowed_formats: { } field_type: text_with_summary diff --git a/drupal/config/filter.format.basic_html.yml b/drupal/config/filter.format.basic_html.yml index 671745f..827406c 100644 --- a/drupal/config/filter.format.basic_html.yml +++ b/drupal/config/filter.format.basic_html.yml @@ -10,15 +10,12 @@ name: 'Basic HTML' format: basic_html weight: 0 filters: - filter_html: - id: filter_html - provider: filter + editor_file_reference: + id: editor_file_reference + provider: editor status: true - weight: -10 - settings: - allowed_html: '