Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Declare blocks as __experimental in block.json to automate syncing Gutenberg packages to WordPress #40655

Merged
merged 9 commits into from
May 7, 2022

Conversation

adamziel
Copy link
Contributor

@adamziel adamziel commented Apr 27, 2022

What problem is this PR trying to solve?

I'd like to automate syncing Gutenberg changes to the WordPress repository.

Currently it requires manually checking which blocks were:

  • Added or marked as stable
  • Removed or marked as experimental

There is no easy way to extract the information about stable/experimental blocks from the block library in the CLI environment.

How does this PR proposes to solve it?

There are two parts:

A new __experimental flag in the block.json:

  • To make it easy for the wordpress-develop build tools to extract the this information.
  • To ease the process of stabilizing the blocks in the gutenberg repository. A block.json flag is clearer than moving variable names between the lists.

For example:

post-author-name/block.json:

{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 2,
	
	// boolean true means it's always available in the plugin
	"__experimental": true,
	// ...
}

post-comment/block.json:

{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 2,
	// A string value indicates a specific experiment name – a feature flag essentially.
	"__experimental": "fse",	
	
}

A babel plugin:

One downside of introducing getAllBlocks() is that it breaks dead code elimination.

Through static analysis, Webpack knows to remove blocks like if( process.env.IS_GUTENBERG_PLUGIN === true) { when IS_GUTENBERG_PLUGIN is known to be false. This PR, however, moves the experimental blocks from inside of that if statement to the same list where stable blocks reside. As a result, the unused experimental blocks are bundled in the built assets.

This can be fixed via a babel plugin as follows (thanks @gziolo @jsnajdr!):

  1. Statically analyze the following code:
import * as archives from './archives';
import * as postAuthorName from './post-author-name';
const getAllBlocks = () => [
	archives,
	postAuthorName
];
  1. Find out which ones are experimental by peeking into their related block.json metadata.
  2. Transform the above code into:
import * as archives from './archives';
const postAuthorName = null;
const getAllBlocks = () => [
	archives,
	postAuthorName
];

So that on build, Webpack can remove the post-author-name block from the bundle.

Other notes

I considered updating the block.json API reference, but it doesn't seem right – this is a private property that makes sense only for core blocks in the Gutenberg repository. I documented it inside of block-library/README.md instead.

Test plan

The development build:

  1. Confirm the CI checks work
  2. Run npm run dev and confirm the site editor works in the browser and the experimental blocks are available in the inserter.
  3. Run npm run build i and confirm that build/block-library/index.js still contains the experimental blocks like postAuthorName.

The production build:

(for the WordPress core merge scenario, it won't be ever a case in the plugin)

  1. Edit package.json and set IS_GUTENBERG_PLUGIN to false
  2. Run npm run build i and confirm that build/block-library/index.js does not contain the experimental blocks like postAuthorName. Note that the build/block-library/blocks/post-author-name still exists, this is expected and how it works even without this PR.
  3. Run build:plugin-zip, install the built gutenberg.zip plugin on a clean WordPress install, confirm it works and does not offer any experimental blocks such as list-item or post-author-name in the site editor.

cc @gziolo

@gziolo gziolo added [Package] Block library /packages/block-library [Type] Technical Prototype Offers a technical exploration into an idea as an example of what's possible [Status] In Progress Tracking issues with work in progress labels Apr 27, 2022
@github-actions
Copy link

github-actions bot commented Apr 28, 2022

Size Change: +148 B (0%)

Total Size: 1.24 MB

Filename Size Change
build/block-library/index.min.js 178 kB +163 B (0%)
build/edit-site/index.min.js 47.4 kB -15 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 150 kB
build/block-editor/style-rtl.css 15 kB
build/block-editor/style.css 15 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.53 kB
build/block-library/blocks/cover/style.css 1.53 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.95 kB
build/block-library/blocks/navigation/style.css 1.94 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 521 B
build/block-library/blocks/post-comments-form/style.css 521 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 527 B
build/block-library/blocks/post-comments/style.css 527 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.3 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/components/index.min.js 227 kB
build/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.4 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.66 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.1 kB
build/edit-post/style-rtl.css 7.02 kB
build/edit-post/style.css 7.02 kB
build/edit-site/style-rtl.css 7.95 kB
build/edit-site/style.css 7.93 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.41 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.67 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.16 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@adamziel adamziel changed the title Explore babel plugin that automatically removes experimental blocks Declare blocks as __experimental in block.json to automate Gutenberg changes to the WordPress repository Apr 28, 2022
@adamziel adamziel changed the title Declare blocks as __experimental in block.json to automate Gutenberg changes to the WordPress repository Declare blocks as __experimental in block.json to automate syncing Gutenberg packages to WordPress Apr 28, 2022
@adamziel adamziel force-pushed the try/block-library-babel-plugin branch from db90945 to 9cb8fb8 Compare April 28, 2022 11:17
@adamziel adamziel self-assigned this Apr 28, 2022
packages/block-library/src/index.js Outdated Show resolved Hide resolved
test/unit/config/is-gutenberg-plugin.js Outdated Show resolved Hide resolved
Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great. We are almost there. Excellent work. I left a couple of nitpicks to process. I still need to look at the Babel plugin part which is the most complex one (or seems so when you don't write plugins too often).

By the way, the test plan for the production build where IS_GUTENBERG_PLUGIN is set to false is only a test for the WordPress core because it won't be ever a case in the plugin. Just noting in case it confused anyone. We could update webpack now to read block.json and optimize the output but it would never be useful in the plugin. However, it's exactly what we plan to do in the WordPress core next 🎉

packages/babel-preset-default/index.js Outdated Show resolved Hide resolved
packages/block-library/src/index.js Outdated Show resolved Hide resolved
schemas/json/block.json Show resolved Hide resolved
packages/block-library/babel-plugin.js Outdated Show resolved Hide resolved
@gziolo gziolo requested a review from a team April 29, 2022 05:26
@adamziel
Copy link
Contributor Author

@gziolo I addressed all your comments, this one is good for a re-review now.

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything looks good. I would appreciate some help with checking Babel code from other contributors 🙏🏻

@adamziel
Copy link
Contributor Author

adamziel commented May 4, 2022

Copy link
Member

@jsnajdr jsnajdr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One downside of adding new Babel plugins is that it makes it harder to migrate to another transpiler like swc.

Maybe a webpack plugin could do the same job. We are inspecting import statements, and that's close to webpack competencies. If a block import is experimental, replace the import with null, and filter the getAllBlocks array with _.compact or .filter( Boolean )? Sounds doable to me.

packages/block-library/babel-plugin.js Outdated Show resolved Hide resolved
@gziolo
Copy link
Member

gziolo commented May 5, 2022

One downside of adding new Babel plugins is that it makes it harder to migrate to another transpiler like swc.
Maybe a webpack plugin could do the same job.

Isn't it the same issue if we use webpack like when using Babel but for a different part of the build process? We would have to run the plugin that removes code with experimental blocks in the WordPress core instead. I guess the other difference would be that we would publish to npm all blocks without the feature flag guard. By the way, swc supports plugins so we could also write one if really necessary.

@jsnajdr
Copy link
Member

jsnajdr commented May 5, 2022

Isn't it the same issue if we use webpack like when using Babel but for a different part of the build process?

Yes, it's just that short-term, replacing Babel with swc is more likely than replacing webpack with another bundler.

We would have to run the plugin that removes code with experimental blocks in the WordPress core instead.

That's true, I forgot that the files we publish in NPM are not processed by webpack at all. That makes the webpack option much less attractive.

My thinking was that the Babel plugin looks at import statements, then actually resolves the imports to actual modules and inspects these modules. And if they are experimental, eliminates the import. That's a very bundler-ish kind of work, it doesn't really transform any syntax or something like that.

@gziolo
Copy link
Member

gziolo commented May 5, 2022

Yes, it's just that short-term, replacing Babel with swc is more likely than replacing webpack with another bundler.

Agreed 😄

My thinking was that the Babel plugin looks at import statements, then actually resolves the imports to actual modules and inspects these modules. And if they are experimental, eliminates the import. That's a very bundler-ish kind of work, it doesn't really transform any syntax or something like that.

That's a fair point. It's also the question whether we find an alternative way for exposing blocks from the library for 3rd party projects. It's a separate issue though. I don't mind we treat the Babel approach a temporary measure until we come up with a more flexible approach where you can import individual blocks (or block presets) and they get registered without too much boilerplate.

@adamziel
Copy link
Contributor Author

adamziel commented May 5, 2022

My thinking was that the Babel plugin looks at import statements, then actually resolves the imports to actual modules and inspects these modules. And if they are experimental, eliminates the import. That's a very bundler-ish kind of work, it doesn't really transform any syntax or something like that.

This sounds nice as a next step. There's a bunch of conceptual problems to consider, such as how to treat the statements and expressions where these imports are used. Perhaps that wouldn't be too different from what this PR is doing, but I can see it turning into a larger discussion.

Which is to say – let's start with the Babel plugin for now.

@adamziel adamziel force-pushed the try/block-library-babel-plugin branch from 0581f21 to bae9eb4 Compare May 5, 2022 13:56
babel.config.js Outdated Show resolved Hide resolved
@jsnajdr
Copy link
Member

jsnajdr commented May 6, 2022

how to treat the statements and expressions where these imports are used.

My hypothetical webpack plugin would resolve the imports as null, and the code must take that into account by checking for null values explicitly. Like using _.compact on the all blocks array.

The Babel plugin modifies the code where the imported identifier is used, i.e., modifies syntax, which I think would be over the line for a webpack plugin.

Which is to say – let's start with the Babel plugin for now.

Agreed, I'm totally not demanding that you rewrite the entire PR, just thinking about it loud 🙂

@gziolo
Copy link
Member

gziolo commented May 6, 2022

Which is to say – let's start with the Babel plugin for now.

Agreed, I'm totally not demanding that you rewrite the entire PR, just thinking about it loud 🙂

Good thinking. I appreciate your feedback here. It only assures me that we need to seek for more granular structure for consuming core blocks from the package so we can't get rid of the Babel plugin just introduced 👍🏻

@gziolo
Copy link
Member

gziolo commented May 6, 2022

Tested with:

Screenshot 2022-05-06 at 10 19 09

I executed npm run build and I see the following errors:

SyntaxError: Unexpected token (1:1)
    at Object.pp$4.raise (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:3434:15)
    at Object.pp$9.unexpected (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:749:10)
    at Object.pp$5.parseParenAndDistinguishExpression (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2919:51)
    at Object.pp$5.parseExprAtom (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2768:43)
    at Object.pp$5.parseExprSubscripts (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2601:21)
    at Object.pp$5.parseMaybeUnary (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2567:19)
    at Object.pp$5.parseExprOps (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2494:21)
    at Object.pp$5.parseMaybeConditional (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2477:21)
    at Object.pp$5.parseMaybeAssign (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2444:21)
    at Object.pp$5.parseExpression (/Users/gziolo/Projects/gutenberg/node_modules/webpack/node_modules/acorn/dist/acorn.js:2407:21) {
  pos: 1,
  loc: Position { line: 1, column: 1 },
  raisedAt: 2
}

and later

  ERROR in ./packages/block-library/build-module/index.js + 632 modules
  Unexpected token (30:6)
  |   // Only run the Gallery version compat check if the plugin is running, otherwise
  |   // assume we are in 5.9 core and enable by default.
  |   if () {
  |     // We want to fail early here, at least during beta testing phase, to ensure
  |     // there aren't instances where undefined values cause false negatives.
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/block-library/build-module/gallery/shared.js for concatenation

  ERROR in ./packages/customize-widgets/build-module/index.js + 70 modules
  Unexpected token (47:6)
  |   __WEBPACK_MODULE_REFERENCE__2_5b2272656769737465724c6567616379576964676574426c6f636b225d_call_directImport_asiSafe1__._();
  | 
  |   if () {
  |     __WEBPACK_MODULE_REFERENCE__1_5b225f5f6578706572696d656e74616c52656769737465724578706572696d656e74616c436f7265426c6f636b73225d_call_directImport_asiSafe1__._({
  |       enableFSEBlocks: ENABLE_EXPERIMENTAL_FSE_BLOCKS
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/customize-widgets/build-module/index.js for concatenation

  ERROR in ./packages/edit-navigation/build-module/index.js + 105 modules
  Unexpected token (75:6)
  |   __WEBPACK_MODULE_REFERENCE__2_5b227265676973746572436f7265426c6f636b73225d_call_directImport_asiSafe1__._();
  | 
  |   if () {
  |     __WEBPACK_MODULE_REFERENCE__2_5b225f5f6578706572696d656e74616c52656769737465724578706572696d656e74616c436f7265426c6f636b73225d_call_directImport_asiSafe1__._();
  |   }
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/edit-navigation/build-module/index.js for concatenation

  ERROR in ./packages/edit-post/build-module/index.js + 157 modules
  Unexpected token (90:6)
  |   __WEBPACK_MODULE_REFERENCE__2_5b227265676973746572436f7265426c6f636b73225d_call_directImport_asiSafe1__._();
  | 
  |   if () {
  |     __WEBPACK_MODULE_REFERENCE__2_5b225f5f6578706572696d656e74616c52656769737465724578706572696d656e74616c436f7265426c6f636b73225d_call_directImport_asiSafe1__._({
  |       enableFSEBlocks: settings.__unstableEnableFullSiteEditingBlocks
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/edit-post/build-module/index.js for concatenation

  ERROR in ./packages/edit-site/build-module/index.js + 218 modules
  Unexpected token (68:6)
  |   let MaybeNavigationMenuSidebar = __WEBPACK_MODULE_REFERENCE__0_5b22467261676d656e74225d_directImport_asiSafe1__._;
  | 
  |   if () {
  |     MaybeNavigationMenuSidebar = __WEBPACK_MODULE_REFERENCE__144_5b2264656661756c74225d_directImport_asiSafe1__._;
  |   }
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/edit-site/build-module/components/sidebar/index.js for concatenation

  ERROR in ./packages/edit-widgets/build-module/index.js + 96 modules
  Unexpected token (67:6)
  |   __WEBPACK_MODULE_REFERENCE__5_5b2272656769737465724c6567616379576964676574426c6f636b225d_call_directImport_asiSafe1__._();
  | 
  |   if () {
  |     __WEBPACK_MODULE_REFERENCE__3_5b225f5f6578706572696d656e74616c52656769737465724578706572696d656e74616c436f7265426c6f636b73225d_call_directImport_asiSafe1__._({
  |       enableFSEBlocks: __WEBPACK_MODULE_REFERENCE__62_5b22454e41424c455f4558504552494d454e54414c5f4653455f424c4f434b53225d_directImport_asiSafe1__._
  while analysing module /Users/gziolo/Projects/gutenberg/node_modules/source-map-loader/dist/cjs.js!/Users/gziolo/Projects/gutenberg/packages/edit-widgets/build-module/index.js for concatenation

  6 errors have detailed information that is not shown.
  Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it.

  packages (webpack 5.65.0) compiled with 6 errors in 15821 ms

@adamziel
Copy link
Contributor Author

adamziel commented May 6, 2022

Which is to say – let's start with the Babel plugin for now.

Agreed, I'm totally not demanding that you rewrite the entire PR, just thinking about it loud 🙂

@jsnajdr – thank you for that, you are on to something here. I like the idea of resolving all such imports to null, it would keep the existing code structure intact while effectively doing the same thing as the babel plugin.

@gziolo it looks like it completely removed what's between the parentheses here:

if ( process.env.IS_GUTENBERG_PLUGIN ) {

if ( process.env.IS_GUTENBERG_PLUGIN ) {

etc

That's weird and completely unexpected. Also, it doesn't happen on my end! Just to confirm, do you have the latest npm dependencies installed?

@adamziel
Copy link
Contributor Author

adamziel commented May 6, 2022

I've just implemented the import * as experimentalBlock -> const experimentalBlock = null; approach suggested by @jsnajdr. It's still a babel plugin, but the code is much simpler this way. Let's see if the tests pass.

@gziolo gziolo added [Type] Code Quality Issues or PRs that relate to code quality Gutenberg Plugin Issues or PRs related to Gutenberg Plugin management related efforts and removed [Type] Technical Prototype Offers a technical exploration into an idea as an example of what's possible [Status] In Progress Tracking issues with work in progress labels May 6, 2022
@gziolo
Copy link
Member

gziolo commented May 6, 2022

With

"config": {
	"IS_GUTENBERG_PLUGIN": false
},

Screenshot 2022-05-06 at 16 24 30

With

"config": {
	"IS_GUTENBERG_PLUGIN": true
},

Screenshot 2022-05-06 at 16 26 20

Screenshot 2022-05-06 at 16 27 40

Everything works as expected after I removed node_modules. It was probably an issue with the Babel cache.

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is going to be a great improvement in the backporting workflow for WordPress major releases 🎉

Edit: there are some small issues with CI checks. They should be easy to fix.

adamziel and others added 3 commits May 6, 2022 17:18
Co-authored-by: Greg Ziółkowski <grzegorz@gziolo.pl>
…/gutenberg into try/block-library-babel-plugin
@gziolo
Copy link
Member

gziolo commented May 7, 2022

All green 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Gutenberg Plugin Issues or PRs related to Gutenberg Plugin management related efforts [Package] Block library /packages/block-library [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants