From 4c2c13099878c4a5ee41fbfbc92dbb37c04a7df4 Mon Sep 17 00:00:00 2001 From: Andrew Serong <14988353+andrewserong@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:22:13 +1000 Subject: [PATCH] Perform transformation a second time after applying filters --- .../blocks/src/store/process-block-type.js | 44 +++--- .../src/store/test/process-block-type.js | 137 ++++++++++++++++++ 2 files changed, 164 insertions(+), 17 deletions(-) diff --git a/packages/blocks/src/store/process-block-type.js b/packages/blocks/src/store/process-block-type.js index f5503e4c597ca..0d2586e877130 100644 --- a/packages/blocks/src/store/process-block-type.js +++ b/packages/blocks/src/store/process-block-type.js @@ -134,6 +134,10 @@ export const processBlockType = null ); + // Re-stabilize any experimental supports after applying filters. + // This ensures that any supports updated by filters are also stabilized. + blockType.supports = stabilizeSupports( blockType.supports ); + if ( settings.description && typeof settings.description !== 'string' @@ -145,27 +149,33 @@ export const processBlockType = if ( settings.deprecated ) { settings.deprecated = settings.deprecated.map( ( deprecation ) => { + // Stabilize any experimental supports before applying filters. deprecation.supports = stabilizeSupports( deprecation.supports ); + const filteredDeprecation = // Only keep valid deprecation keys. + applyFilters( + 'blocks.registerBlockType', + // Merge deprecation keys with pre-filter settings + // so that filters that depend on specific keys being + // present don't fail. + { + // Omit deprecation keys here so that deprecations + // can opt out of specific keys like "supports". + ...omit( blockType, DEPRECATED_ENTRY_KEYS ), + ...deprecation, + }, + blockType.name, + deprecation + ); + // Re-stabilize any experimental supports after applying filters. + // This ensures that any supports updated by filters are also stabilized. + filteredDeprecation.supports = stabilizeSupports( + filteredDeprecation.supports + ); + return Object.fromEntries( - Object.entries( - // Only keep valid deprecation keys. - applyFilters( - 'blocks.registerBlockType', - // Merge deprecation keys with pre-filter settings - // so that filters that depend on specific keys being - // present don't fail. - { - // Omit deprecation keys here so that deprecations - // can opt out of specific keys like "supports". - ...omit( blockType, DEPRECATED_ENTRY_KEYS ), - ...deprecation, - }, - blockType.name, - deprecation - ) - ).filter( ( [ key ] ) => + Object.entries( filteredDeprecation ).filter( ( [ key ] ) => DEPRECATED_ENTRY_KEYS.includes( key ) ) ); diff --git a/packages/blocks/src/store/test/process-block-type.js b/packages/blocks/src/store/test/process-block-type.js index adc0ed8c9f27a..3c6838e311f77 100644 --- a/packages/blocks/src/store/test/process-block-type.js +++ b/packages/blocks/src/store/test/process-block-type.js @@ -1,3 +1,8 @@ +/** + * WordPress dependencies + */ +import { addFilter, removeFilter } from '@wordpress/hooks'; + /** * Internal dependencies */ @@ -17,6 +22,10 @@ describe( 'processBlockType', () => { getBootstrappedBlockType: () => null, }; + afterEach( () => { + removeFilter( 'blocks.registerBlockType', 'test/filterSupports' ); + } ); + it( 'should return the block type with stabilized typography supports', () => { const blockSettings = { ...baseBlockSettings, @@ -109,6 +118,65 @@ describe( 'processBlockType', () => { } ); } ); + it( 'should reapply transformations after supports are filtered', () => { + const blockSettings = { + ...baseBlockSettings, + supports: { + typography: { + fontSize: true, + lineHeight: true, + __experimentalFontFamily: true, + __experimentalFontStyle: true, + __experimentalFontWeight: true, + __experimentalLetterSpacing: true, + __experimentalTextTransform: true, + __experimentalTextDecoration: true, + __experimentalWritingMode: true, + __experimentalDefaultControls: { + fontSize: true, + fontAppearance: true, + textTransform: true, + }, + }, + }, + }; + + addFilter( + 'blocks.registerBlockType', + 'test/filterSupports', + ( settings, name ) => { + if ( name === 'test/block' && settings.supports.typography ) { + settings.supports.typography.__experimentalFontFamily = false; + settings.supports.typography.__experimentalFontStyle = false; + settings.supports.typography.__experimentalFontWeight = false; + } + return settings; + } + ); + + const processedBlockType = processBlockType( + 'test/block', + blockSettings + )( { select } ); + + expect( processedBlockType.supports.typography ).toEqual( { + fontSize: true, + lineHeight: true, + fontFamily: false, + fontStyle: false, + fontWeight: false, + letterSpacing: true, + textTransform: true, + textDecoration: true, + __experimentalWritingMode: true, + __experimentalDefaultControls: { + fontSize: true, + fontAppearance: true, + textTransform: true, + }, + } ); + } ); + it( 'should stabilize experimental typography supports within block deprecations', () => { const blockSettings = { ...baseBlockSettings, @@ -164,4 +232,73 @@ describe( 'processBlockType', () => { __experimentalWritingMode: true, } ); } ); + + it( 'should reapply transformations after supports are filtered within block deprecations', () => { + const blockSettings = { + ...baseBlockSettings, + supports: { + typography: { + fontSize: true, + lineHeight: true, + fontFamily: true, + fontStyle: true, + fontWeight: true, + letterSpacing: true, + textTransform: true, + textDecoration: true, + __experimentalWritingMode: true, + __experimentalDefaultControls: { + fontSize: true, + fontAppearance: true, + textTransform: true, + }, + }, + }, + deprecated: [ + { + supports: { + typography: { + __experimentalFontFamily: true, + __experimentalFontStyle: true, + __experimentalFontWeight: true, + __experimentalLetterSpacing: true, + __experimentalTextTransform: true, + __experimentalTextDecoration: true, + __experimentalWritingMode: true, + }, + }, + }, + ], + }; + + addFilter( + 'blocks.registerBlockType', + 'test/filterSupports', + ( settings, name ) => { + if ( name === 'test/block' && settings.supports.typography ) { + settings.supports.typography.__experimentalFontFamily = false; + settings.supports.typography.__experimentalFontStyle = false; + settings.supports.typography.__experimentalFontWeight = false; + } + return settings; + } + ); + + const processedBlockType = processBlockType( + 'test/block', + blockSettings + )( { select } ); + + expect( + processedBlockType.deprecated[ 0 ].supports.typography + ).toEqual( { + fontFamily: false, + fontStyle: false, + fontWeight: false, + letterSpacing: true, + textTransform: true, + textDecoration: true, + __experimentalWritingMode: true, + } ); + } ); } );