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

CustomSelectControl: Privatise __experimentalShowSelectedHint using @wordpress/experiments #47229

Merged
merged 5 commits into from
Feb 6, 2023

Conversation

noisysocks
Copy link
Member

What?

Part of #47196. Uses @wordpress/experiments (#46131) to make __experimentalShowSelectedHint in CustomSelectControl private.

Why?

We don't want to add any new experimental APIs to 6.2 as part of an effort to no longer expose experimental APIs in Core.

How?

https://github.com/WordPress/gutenberg/blob/trunk/docs/contributors/code/coding-guidelines.md#experimental-react-component-properties

Testing Instructions

  1. Use a block theme with more than 5 font sizes or manually edit theme.json to contain more than 5 font sizes in settings.typography.fontSizes.
  2. Open the site editor. Appearance → Editor → Edit.
  3. Go to Styles → Typography → Headings.
  4. Select a heading level.
  5. Toggle off the custom font size picker.
  6. You should see a hint alongside the selected font size preset.

@noisysocks noisysocks added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components labels Jan 18, 2023
@noisysocks noisysocks requested review from adamziel and ciampo January 18, 2023 04:37
// 'without a warning. If you ignore this error and depend on unstable features, ' +
// 'your product will inevitably break on one of the next WordPress releases.'
// );
// }
Copy link
Member Author

Choose a reason for hiding this comment

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

This check doesn't play well with Story Book. There, __dangerousOptInToUnstableAPIsOnlyForCoreModules is called multiple times assumedly due to hot module loading. This causes an error when navigating to a different component.

image

I'm not sure what to do to get around this. Thoughts @adamziel?

Copy link
Contributor

Choose a reason for hiding this comment

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

Could this be unrelated to HMR? I wonder if the storybook is loading the same file twice.

If this is indeed a hot reloading issue:

Ideally __dangerousOptInToUnstableAPIsOnlyForCoreModules wouldn't be called for the second time on hot reload. The module has already opted-in and the global state knows it, there's no need to go through the motions all over again. The easiest solution would be:

try {
    __dangerousOptInToUnstableAPIsOnlyForCoreModules()
} catch(e) {
    // .. ignore
}

However, this would obscure genuine errors.

I have two ideas:

  1. Do not re-evaluate experiments.js during HMR
  2. Detect we're inside HMR and bale out

Copy link
Contributor

@adamziel adamziel Jan 18, 2023

Choose a reason for hiding this comment

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

That check matters mostly in the WordPress build. We can build the Gutenberg plugin without that error:

	if ( ! IS_GUTENBERG_PLUGIN ) {
		// This check doesn't play well with Hot Module Reloading and isn't included in
		// the Gutenberg plugin. It only matters in the WordPress core release.
		if ( registeredExperiments.includes( moduleName ) ) {
			throw new Error(
				`You tried to opt-in to unstable APIs as module "${ moduleName }" which is already registered. ` +
					'This feature is only for JavaScript modules shipped with WordPress core. ' +
					'Please do not use it in plugins and themes as the unstable APIs will be removed ' +
					'without a warning. If you ignore this error and depend on unstable features, ' +
					'your product will inevitably break on one of the next WordPress releases.'
			);
		}
	}

Copy link
Member Author

Choose a reason for hiding this comment

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

Will defer to you on this 😅 I'm not really sure what's going on. I'll update the PR with your ! IS_GUTENBERG_PLUGIN suggestion.

Copy link
Member Author

@noisysocks noisysocks Jan 19, 2023

Choose a reason for hiding this comment

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

Oh, that doesn't fix this because IS_GUTENBERG_PLUGIN is not set when running the story book (npm run storybook:dev).

@ciampo: Is it safe to set process.env.IS_GUTENBERG_PLUGIN = true in storybook/main.js?

Copy link
Member Author

Choose a reason for hiding this comment

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

It feels overkill to me that there should be a global env variable for this one specific thing. Can we kill the reregistration check altogether? In my mind the only check that matters is the consent string.

Copy link
Contributor

Choose a reason for hiding this comment

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

It feels overkill to me that there should be a global env variable for this one specific thing.

To me it's the opposite – removing that check just for this one specific thing feels like overkill.

The consent string is a carrot and this checks is a stick, I think it's important to have both. A global variable is just a feature flag – they are commonly used in similar scenarios. Why would it be overkill? I could prepare the necessary commit if you wish.

Copy link
Member

Choose a reason for hiding this comment

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

@adamziel I'm coming late to this discussion so I don't have all the context -- but it seems to me that allowing double registration of the same module is just fine. We check if the moduleName is one of the core modules, and if it is, return the { lock, unlock } pair. We can do the same on the second or the 100th call, there's no reason to allow just a single call.

The registeredExperiments array could be removed completely. It's used only to check for these repeated registrations and nothing else. And we could get rid of resetRegisteredExperiments, too, making the experiments module stateless.

Copy link
Member Author

Choose a reason for hiding this comment

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

The consent string is a carrot and this checks is a stick, I think it's important to have both. A global variable is just a feature flag – they are commonly used in similar scenarios. Why would it be overkill? I could prepare the necessary commit if you wish.

Hmmm ok I suppose. I just dislike global config 😅

The registeredExperiments array could be removed completely. It's used only to check for these repeated registrations and nothing else. And we could get rid of resetRegisteredExperiments, too, making the experiments module stateless.

Making experiments stateless is appealing to me. I imagine we'll face this exact problem again in a different context that requires loading modules multiple times e.g. adding HMR, adding lazy loading, turning WP Admin into more of a SPA.

Up to you @adamziel, it's your baby 😀

Copy link
Contributor

@adamziel adamziel Feb 2, 2023

Choose a reason for hiding this comment

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

@adamziel I'm coming late to this discussion so I don't have all the context -- but it seems to me that allowing double registration of the same module is just fine.

@jsnajdr The double registration protection is to prevent developers from opting-in to experiments by pretending to be one of the core packages. Everything would still work without it, but the private APIs would be less protected.

I imagine we'll face this exact problem again (...) adding HMR, adding lazy loading, turning WP Admin into more of a SPA.

@noisysocks IMHO Including strict checks in the initial launch will discourage tampering more effectively than not including them. Of course – the time may come when they have to be removed. That's fine. It's not like we'll advertise the adjustment anywhere. I'll update this PR to include the additional feature flag.

Edit: See b2585fc

@noisysocks
Copy link
Member Author

An alternative to this would be to stabilise __experimentalHint and __experimentalShowSelectedHint which, to be honest, I'd be fine with, since it seems to work fine and I doubt it would add that much extra burden to any rewrite of CustomSelectControl. Maybe @ciampo can weigh in there.

@ciampo ciampo requested a review from mirka January 24, 2023 10:11
@ciampo
Copy link
Contributor

ciampo commented Jan 24, 2023

Hey all! Trying to catch up on a long queue, I initially missed the pings in this PR.

An alternative to this would be to stabilise __experimentalHint and __experimentalShowSelectedHint which, to be honest, I'd be fine with, since it seems to work fine and I doubt it would add that much extra burden to any rewrite of CustomSelectControl. Maybe @ciampo can weigh in there.

We could, although my preference would be not to commit to those APIs just yet. I'd really love to finish the CustomSelectControl refactor before 6.2, but at this point in time I'm not in a position to guarantee that either.

Plus, most of the challenges that highlighted in this PR would apply to any other component — and therefore, we would need to overcome them anyways.

Related to the other conversations in this PR, I'll answer inline :)

@noisysocks
Copy link
Member Author

Think I've addressed all feedback. Can I get a final review?

@getdave getdave self-requested a review January 30, 2023 10:29
@ciampo
Copy link
Contributor

ciampo commented Jan 30, 2023

Thank you all for collaborating on this!

While reading through this PR I started reflecting about the lock/unlock approach with its pros and cons.

The APIs definitely do a good job at drawing a clear boundary and making it explicit that locked (experimental) APIs are not guaranteed to be backwards-compatible in future releases.

At the same time, as a core contributor, I see some potential drawbacks:

  • Given that we’re still experimenting with the lock/unlock APIs, will we be able to make (breaking) changes to them, including removing them from the experiments package, after the upcoming 6.2 release?
  • Using these APIs adds one more layer of complexity not only for the consumers of the experimental APIs but also for the authors who would need to prepare 2 different exports for each “API” (including types & docs)
  • As Lena mentioned above, removing type defs from experimental code could be a huge loss for devX and code quality.

I realise that this extra “friction” may be in place exactly to act as a deterrent against adding and consuming unstable/experimental APIs.

Zooming out a little bit and looking at the broader approach to compatibility, it’s important that we try to align the interests of both the core Gutenberg contributors and the broader WP community. In order to nurture a healthier developer ecosystem that is sustainable and modern, we need to allow the core Gutenberg contributors to be as effective as possible, trying to avoid technical debt having repercussions on the wider community.

@ciampo ciampo requested a review from jsnajdr January 30, 2023 21:18
@noisysocks
Copy link
Member Author

  • Using these APIs adds one more layer of complexity not only for the consumers of the experimental APIs but also for the authors who would need to prepare 2 different exports for each “API” (including types & docs)

Yes we'll be able to make changes to lock()ed APIs that are merge into WP 6.2 after 6.2 is released because they are not easily available to extenders. This is the motivation behind lock() and unlock(). If the __experimental API lands in WP 6.2 without being lock()ed then it is de facto stabilised because the __experimental prefix is a Gutenberg convention that essentially has no meaning in Core. Core maintains backwards compatibility for all publicly available APIs even if they have a _ prefix or @access private doc comment. See https://make.wordpress.org/core/2022/08/10/proposal-stop-merging-experimental-apis-from-gutenberg-to-wordpress-core/ for previous discussion on that.

  • As Lena mentioned above, removing type defs from experimental code could be a huge loss for devX and code quality.
  • I realise that this extra “friction” may be in place exactly to act as a deterrent against adding and consuming unstable/experimental APIs.

@adamziel can probably speak better to these points but I feel that they may be solvable with enhancements to @wordpress/experiments. I recall Adam intending to improve the TypeScript situation.

I might spin up a GitHub Discussion for the higher level discussion about lock() / unlock(), experimental APIs, DevX, and backwards compatibility. In this PR I'm aiming to make one experimental API not become a part of the WP 6.2 public API per #47196 using the tools we have available today as immature as they are.

@github-actions
Copy link

github-actions bot commented Jan 31, 2023

Size Change: +428 B (0%)

Total Size: 1.31 MB

Filename Size Change
build/block-editor/index.min.js 192 kB -518 B (0%)
build/block-editor/style-rtl.css 14.4 kB +60 B (0%)
build/block-editor/style.css 14.4 kB +58 B (0%)
build/block-library/index.min.js 199 kB -28 B (0%)
build/blocks/index.min.js 51 kB +608 B (+1%)
build/components/index.min.js 203 kB +266 B (0%)
build/edit-post/style-rtl.css 7.5 kB +44 B (+1%)
build/edit-post/style.css 7.5 kB +43 B (+1%)
build/edit-site/index.min.js 64.1 kB -292 B (0%)
build/edit-site/style-rtl.css 9.68 kB +24 B (0%)
build/edit-site/style.css 9.67 kB +23 B (0%)
build/edit-widgets/style-rtl.css 4.52 kB +31 B (+1%)
build/edit-widgets/style.css 4.52 kB +30 B (+1%)
build/editor/style-rtl.css 3.58 kB +3 B (0%)
build/editor/style.css 3.57 kB +2 B (0%)
build/experiments/index.min.js 938 B +33 B (+4%)
build/keycodes/index.min.js 1.92 kB +41 B (+2%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 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 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 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 199 B
build/block-library/blocks/comment-template/style.css 198 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 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 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 253 B
build/block-library/blocks/file/style.css 254 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 654 B
build/block-library/blocks/group/editor.css 654 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 829 B
build/block-library/blocks/image/editor.css 828 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 376 B
build/block-library/blocks/page-list/editor.css 376 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 458 B
build/block-library/blocks/query/editor.css 457 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 149 B
build/block-library/blocks/rss/editor.css 149 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 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 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 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 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 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.5 kB
build/block-library/editor.css 11.5 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.5 kB
build/block-library/style.css 12.5 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.8 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.06 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.5 kB
build/edit-widgets/index.min.js 16.9 kB
build/editor/index.min.js 45.5 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.23 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 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.79 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

I might spin up a GitHub Discussion for the higher level discussion about lock() / unlock(), experimental APIs, DevX, and backwards compatibility. In this PR I'm aiming to make one experimental API not become a part of the WP 6.2 public API

That makes sense, thank you for your patience here.

Overall code changes look good, and the PR is testing well in Storybook and in the editor.

I wonder if we should use the ALLOW_EXPERIMENTS_REREGISTRATION env variable as suggested by Adam before merging, though.

Also, could we get a CHANGELOG entry for the components package too?

Thank you!

packages/experiments/src/test/index.js Outdated Show resolved Hide resolved
@adamziel
Copy link
Contributor

adamziel commented Jan 31, 2023

Using these APIs adds one more layer of complexity not only for the consumers of the experimental APIs

@ciampo The only consumers are packages in the Gutenberg repository. The experimental APIs are private and should not be used anywhere outside.

but also for the authors who would need to prepare 2 different exports for each “API” (including types & docs)

The friction is in separating experimental components from stable components for WordPress core. lock()/unlock() is just a delivery mechanism.

  • As Lena mentioned above, removing type defs from experimental code could be a huge loss for devX and code quality.

We can retain type defs – it's just not implemented at the moment. I fleshed out the basic idea in one of the comments in this PR.

  • I realise that this extra “friction” may be in place exactly to act as a deterrent against adding and consuming unstable/experimental APIs.

Ideally consuming experimental APIs would be easy in core and impossible outside of core. If you have any suggestions how to reduce any internal friction without reducing the privacy, I'd love to discuss!

@ciampo
Copy link
Contributor

ciampo commented Feb 1, 2023

The only consumers are packages in the Gutenberg repository. The experimental APIs are private and should not be used anywhere outside.

Thank you for the clarification — what I meant is that even if the consumers of the APIs are other Gutenberg packages, this extra layer of complexity could make it harder for core contributors (especially new/less experienced members of the community) to learn the codebase.

But, as I mentioned before, this could also be "on purpose" — ie. discouraging folks from adding experimental APIs in the first place.

We can retain type defs – it's just not implemented at the moment. I fleshed out #47229 (comment) in one of the comments in this PR.

I saw that, and it definitely looks promising 😄

Ideally consuming experimental APIs would be easy in core and impossible outside of core. If you have any suggestions how to reduce any internal friction without reducing the privacy, I'd love to discuss!

Absolutely — and thank you again for the work you've been doing on this. I'll definitely make sure to share feedback / suggestions if I come up with anything.

@noisysocks
Copy link
Member Author

noisysocks commented Feb 3, 2023

Thanks @adamziel, appreciate you. I fixed the merge conflicts here. Should be ready again for final review.

@github-actions
Copy link

github-actions bot commented Feb 3, 2023

Flaky tests detected in e2b8e35.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4099603874
📝 Reported issues:

@adamziel adamziel force-pushed the update/privatise-__experimentalShowSelectedHint branch from 15c5915 to d1a795f Compare February 3, 2023 12:05
@adamziel
Copy link
Contributor

adamziel commented Feb 3, 2023

Just squashed, let's hope the checks work this time.

@adamziel adamziel force-pushed the update/privatise-__experimentalShowSelectedHint branch from d1a795f to 1709b42 Compare February 3, 2023 12:25
@adamziel
Copy link
Contributor

adamziel commented Feb 3, 2023

@ciampo The mobile tests are still failing, but it's no longer about the experimental check. The failures don't seem to be related at all so I rebased this one and pushed again.

@adamziel
Copy link
Contributor

adamziel commented Feb 3, 2023

@ciampo Mobile unit tests passed!

storybook/main.js Outdated Show resolved Hide resolved
@noisysocks
Copy link
Member Author

Thanks once again @adamziel! Pushed a fix for @ciampo's latest comment as well as a few minor things I noticed while reviewing the diff. It looks good to me.

@adamziel: Hopefully tests pass and we can merge but, if not, could you take over this PR? I'll be out on parental leave for 8 weeks as of tomorrow 👶

@adamziel
Copy link
Contributor

adamziel commented Feb 6, 2023

@noisysocks Native e2e tests failed, I just restarted them. Fingers crossed!

Also – that's awesome! 👶 Congratulations man!

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Awesome job, @noisysocks and @adamziel 🚀

✅ Component behaves as expected in Storybook, no errors are printed to console
✅ Hints keep showing as expected in the Site editor, as per testing instructions
✅ The experimental API is locked

Native tests failures don't seem related. I have re-started them again, let's 🤞

Following up, it would be great to see how we can improve the retention of type defs (draft idea in #47229 (comment) ).

@adamziel
Copy link
Contributor

adamziel commented Feb 6, 2023

@ciampo the bad news is that the same native test is failing for 5 restarts now. The good news is it also failed for the last 5 commits to trunk. Let's merge this PR!

@adamziel adamziel merged commit 312d524 into trunk Feb 6, 2023
@adamziel adamziel deleted the update/privatise-__experimentalShowSelectedHint branch February 6, 2023 10:48
@github-actions github-actions bot added this to the Gutenberg 15.2 milestone Feb 6, 2023
@jsnajdr
Copy link
Member

jsnajdr commented Feb 6, 2023

the bad news is that the same native test is failing for 5 restarts now. The good news is it also failed for the last 5 commits to trunk.

It's an error when installing Playwright, trying to download stuff:

E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/m/mpg123/libmpg123-0_1.29.3-1build1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]

@WunderBart Is this really an intermittent failure that eventually fixes itself, or maybe it's a sign that we have an outdated Ubuntu or something like that?

@geriux
Copy link
Member

geriux commented Feb 6, 2023

@ciampo the bad news is that the same native test is failing for 5 restarts now. The good news is it also failed for the last 5 commits to trunk. Let's merge this PR!

Heads up that this indeed broke the mobile editor, it looks like we have some flakiness there on the mobile E2E tests, we will check those but we are always happy to double-check any CI checks failing in any PRs before merging to avoid future failures in trunk.

ntsekouras pushed a commit that referenced this pull request Feb 7, 2023
…vigation_parse_blocks_from_menu_items (#47824)

Merging as these changes cannot cause any failure and the mobile test are failing in trunk from this PR: #47229, which is also not included in 6.2 yet.
ntsekouras pushed a commit that referenced this pull request Feb 7, 2023
…vigation_parse_blocks_from_menu_items (#47824)

Merging as these changes cannot cause any failure and the mobile test are failing in trunk from this PR: #47229, which is also not included in 6.2 yet.
@ntsekouras ntsekouras added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Feb 7, 2023
@adamziel
Copy link
Contributor

adamziel commented Feb 7, 2023

Oops, sorry about that @geriux – I'll let you know next time this happens!

ntsekouras pushed a commit that referenced this pull request Feb 9, 2023
…wordpress/experiments (#47229)

## What?
Part of #47196. Uses `@wordpress/experiments` (#46131) to make `__experimentalShowSelectedHint` in `CustomSelectControl` private.

## Why?
We don't want to add any new experimental APIs to 6.2 as part of an effort to no longer expose experimental APIs in Core.

## How?
https://github.com/WordPress/gutenberg/blob/trunk/docs/contributors/code/coding-guidelines.md#experimental-react-component-properties

## Testing Instructions
1. Use a block theme with more than 5 font sizes or manually edit `theme.json` to contain more than 5 font sizes in `settings.typography.fontSizes`.
2. Open the site editor. Appearance → Editor → Edit.
3. Go to Styles → Typography → Headings.
4. Select a heading level.
5. Toggle off the custom font size picker.
6. You should see a hint alongside the selected font size preset.


Co-authored-by: Adam Zieliński <[email protected]>
@ntsekouras
Copy link
Contributor

Cherry-picked this PR to the wp/6.2 branch.

@ntsekouras ntsekouras removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Feb 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants