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

Fix private registry selectors #50985

Closed
wants to merge 2 commits into from
Closed

Conversation

noisysocks
Copy link
Member

What, why, how

Currently one gets an error if you call a private registry selector (created using createRegistrySelector) from a regular public selector.

This is happens because the mapValues that sets selector.registry happens lazily for private selectors.

lock(
selectors,
new Proxy( privateSelectors, {
get: ( target, prop ) => {
return (
mapSelectors(
mapValues( privateSelectors, ( selector ) => {
if ( selector.isRegistrySelector ) {
selector.registry = registry;
}
return ( state, ...args ) =>
selector( state.root, ...args );
} ),
store
)[ prop ] || selectors[ prop ]
);
},
} )
);

It needs to be eager (the same as public selectors) so that selectors can be composed.

I can't figure out a good way to fix this, so this PR just adds a failing test. @jsnajdr @adamziel: could you please help me? 😀

Testing Instructions

npm run test

@noisysocks noisysocks added [Type] Bug An existing feature does not function as intended [Package] Data /packages/data labels May 26, 2023
@noisysocks noisysocks requested a review from nerrad as a code owner May 26, 2023 01:43
@@ -164,6 +165,43 @@ describe( 'Private data APIs', () => {
);
expect( subPrivateSelectors.getSecretDiscount() ).toEqual( 800 );
} );

it( 'should support registry selectors', () => {
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 is a passing test for a fix I included in #50643.

expect( privateSelectors.getPrice() ).toEqual( 1000 );
} );

it( 'should support calling a private registry selector from a public selector', () => {
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 is the failing test that I can't figure out how to fix.

@github-actions
Copy link

github-actions bot commented May 26, 2023

Size Change: -17.9 kB (-1%)

Total Size: 1.39 MB

Filename Size Change
build/a11y/index.min.js 955 B -27 B (-3%)
build/annotations/index.min.js 2.69 kB -72 B (-3%)
build/api-fetch/index.min.js 2.28 kB -49 B (-2%)
build/autop/index.min.js 2.1 kB -38 B (-2%)
build/blob/index.min.js 451 B -21 B (-4%)
build/block-directory/index.min.js 7.05 kB -128 B (-2%)
build/block-editor/index.min.js 194 kB -5.18 kB (-3%)
build/block-editor/style-rtl.css 14.9 kB -206 B (-1%)
build/block-editor/style.css 14.9 kB -206 B (-1%)
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB -27 B (-1%)
build/block-library/blocks/navigation/view.min.js 438 B -5 B (-1%)
build/block-library/index.min.js 200 kB -4.32 kB (-2%)
build/block-library/interactivity/runtime.min.js 2.69 kB +4 B (0%)
build/block-serialization-spec-parser/index.min.js 2.87 kB +39 B (+1%)
build/blocks/index.min.js 50.3 kB -663 B (-1%)
build/commands/index.min.js 14.9 kB -59 B (0%)
build/components/index.min.js 230 kB -1.59 kB (-1%)
build/compose/index.min.js 12.1 kB -351 B (-3%)
build/core-commands/index.min.js 1.74 kB -66 B (-4%)
build/core-data/index.min.js 15.7 kB -879 B (-5%)
build/customize-widgets/index.min.js 12 kB -168 B (-1%)
build/data-controls/index.min.js 640 B -68 B (-10%) 👏
build/data/index.min.js 8.24 kB -441 B (-5%)
build/date/index.min.js 40.4 kB -32 B (0%)
build/deprecated/index.min.js 451 B -56 B (-11%) 👏
build/dom/index.min.js 4.63 kB -99 B (-2%)
build/edit-post/index.min.js 34.6 kB -634 B (-2%)
build/edit-site/index.min.js 64.6 kB +467 B (+1%)
build/edit-site/style-rtl.css 10.9 kB +377 B (+4%)
build/edit-site/style.css 10.9 kB +372 B (+4%)
build/edit-widgets/index.min.js 16.8 kB -444 B (-3%)
build/editor/index.min.js 44.6 kB -1.08 kB (-2%)
build/element/index.min.js 4.8 kB -89 B (-2%)
build/format-library/index.min.js 7.57 kB -202 B (-3%)
build/hooks/index.min.js 1.55 kB -90 B (-6%)
build/i18n/index.min.js 3.58 kB -149 B (-4%)
build/keyboard-shortcuts/index.min.js 1.71 kB -77 B (-4%)
build/keycodes/index.min.js 1.84 kB -68 B (-4%)
build/list-reusable-blocks/index.min.js 2.13 kB -12 B (-1%)
build/media-utils/index.min.js 2.9 kB -69 B (-2%)
build/notices/index.min.js 875 B -88 B (-9%)
build/plugins/index.min.js 1.84 kB -10 B (-1%)
build/preferences-persistence/index.min.js 1.84 kB -381 B (-17%) 👏
build/preferences/index.min.js 1.24 kB -90 B (-7%)
build/primitives/index.min.js 941 B -3 B (0%)
build/redux-routine/index.min.js 2.7 kB -39 B (-1%)
build/reusable-blocks/index.min.js 2.21 kB -44 B (-2%)
build/rich-text/index.min.js 10.7 kB -347 B (-3%)
build/router/index.min.js 1.77 kB -6 B (0%)
build/server-side-render/index.min.js 2.02 kB -50 B (-2%)
build/shortcode/index.min.js 1.39 kB -28 B (-2%)
build/style-engine/index.min.js 1.42 kB -105 B (-7%)
build/token-list/index.min.js 582 B -62 B (-10%) 👏
build/url/index.min.js 3.57 kB -80 B (-2%)
build/vendors/react-dom.min.js 41.8 kB -13 B (0%)
build/viewport/index.min.js 1.04 kB -42 B (-4%)
build/widgets/index.min.js 7.16 kB -123 B (-2%)
build/wordcount/index.min.js 1.02 kB -36 B (-3%)
ℹ️ View Unchanged
Filename Size
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.23 kB
build/block-editor/content.css 4.23 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 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 126 B
build/block-library/blocks/audio/theme.css 126 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 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 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 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 409 B
build/block-library/blocks/columns/style.css 409 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 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 159 B
build/block-library/blocks/details/style.css 159 B
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 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 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 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/interactivity.min.js 783 B
build/block-library/blocks/image/style-rtl.css 1.07 kB
build/block-library/blocks/image/style.css 1.07 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 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 712 B
build/block-library/blocks/navigation-link/editor.css 711 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 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 896 B
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
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 401 B
build/block-library/blocks/page-list/editor.css 401 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 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 281 B
build/block-library/blocks/post-template/style.css 281 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-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 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 335 B
build/block-library/blocks/pullquote/style.css 335 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 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 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 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 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 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 348 B
build/block-library/blocks/spacer/editor.css 348 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 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 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 403 B
build/block-library/blocks/template-part/editor.css 403 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 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/interactivity/vendors.min.js 8.2 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.1 kB
build/block-library/style.css 13.1 kB
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/dom-ready/index.min.js 324 B
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/style-rtl.css 7.76 kB
build/edit-post/style.css 7.75 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/html-entities/index.min.js 448 B
build/is-shallow-equal/index.min.js 527 B
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react.min.js 4.02 kB
build/warning/index.min.js 268 B
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB

compressed-size-action

@github-actions
Copy link

Flaky tests detected in 87a9833.
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/5086304201
📝 Reported issues:

@adamziel
Copy link
Contributor

No thoughts about eager assignment yet, but what if .registry was a getter that triggered the mapping and returned the registry?

@jsnajdr
Copy link
Member

jsnajdr commented May 26, 2023

This happens because the mapValues that sets selector.registry happens lazily for private selectors.

It's lazy because private selectors (and also actions) are not registered during store creation, but later, calling the registerPrivateSelectors API. Typically:

export const store = createReduxStore( STORE_NAME, storeConfig );
register( store );
unlock( store ).registerPrivateSelectors( privateSelectors );
unlock( store ).registerPrivateActions( privateActions );

In theory I can register new private selectors at any time. That's why each select call needs to construct the selector map from scratch, using the current internal privateSelectors value.

@adamziel
Copy link
Contributor

@jsnajdr perhaps it would make more sense to only allow the registration at the time the store is created - this would be more consistent and remove this problem entirely. I can’t quite recall if there is any reason not to do so.

const storeB = createReduxStore( 'b', {
reducer: ( state = {} ) => state,
selectors: {
getPrice: ( state ) => getPrice( state ),
Copy link
Member

Choose a reason for hiding this comment

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

This test it bad, you can't really expect that it will work.

  • a registry selector must be registered with a store to "activate" it, i.e., to set the selector.registry reference. Because in storeA it's only registered lazily, and never called, it's not activated yet.
  • in storeB you should register it directly, with selectors: { getPrice }. Then the test would work.
  • because the implemenation sets a .registry property on the getPrice object returned from createRegistrySelector, you should really use getPrice just once. And not register it in two stores. Otherwise both usages will be fighting for the selector.registry field and the results can in theory be unpredictable.

Where is the real-world situation where you're running into this kind of issue?

Copy link
Member Author

@noisysocks noisysocks May 29, 2023

Choose a reason for hiding this comment

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

  • a registry selector must be registered with a store to "activate" it

The private getPrice selector is associated with storeA.

Because in storeA it's only registered lazily, and never called, it's not activated yet.

That's the bug, isn't it? It shouldn't be lazy.

in storeB you should register it directly, with selectors: { getPrice }. Then the test would work.

But then it won't be private?

I shouldn't have named both selectors getPrice in the test. The intention is that they are two different selectors. Also it's not necessary (and confusing) that there are two stores. I'll update the test to fix this.

Where is the real-world situation where you're running into this kind of issue?

In #50857, select( blockEditorStore ).canInsertBlockTypeUnmemoized is using select( blockEditorStore ).getBlockEditingMode which is a^ private registry selector.

^ Well, was a private registry selector. I've added a workaround for now.

Copy link
Member

Choose a reason for hiding this comment

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

Thanks for clarifying the test. In the previous version, behavior of store B depended on what was registered in store A, and that was fishy 🙂

I cherry-picked the tests into #51051 and fixed it there by pre-binding private selectors on store instantiation.

I had to modify the test so that the private selector registration is done before the store is instantiated by registry.register. Otherwise we don't have a good opportunity to pre-bind selectors.

The registerPrivateSelectors API is weird in the sense that it allows registering selectors i) multiple times, and ii) after the store has been instantianted one or more times, and iii) the late registration affects also all the instances that already exist, it is retroactive!

That should probably also be eventually fixed. We'll get to that sooner or later.

@adamziel suggests this:

createReduxStore( 'a', {
  selectors: lock( { foo }, { privateFoo } )
} );

It's syntactically elegant, but semantically it's nonsense 🙂 To register a private selector, we need to unlock a private API of @wordpress/data, but here we're achieving that by locking.

What we'd like to do is:

  1. Register private selectors inside the createReduxStore call, so that the entire registration is atomic, and createReduxStore returns a store descriptor that is immutable.
  2. Expose private selectors registration only as a private API, and that means having to call unlock somewhere.

One way to satisfy that could be:

unlock( createReduxStore )( 'a', {
  selectors: { foo },
  privateSelectors: { privateFoo },
} );

Are there others?

Copy link
Contributor

@adamziel adamziel May 30, 2023

Choose a reason for hiding this comment

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

It's syntactically elegant, but semantically it's nonsense 🙂 To register a private selector, we need to unlock a private API of @wordpress/data, but here we're achieving that by locking.

This is just a way of passing the information into createReduxStore. It would have to unlock the selectors object and then process the private selectors.

Exposing a privateSelectors options on an unlocked version of createReduxStore indeed sounds much better. This is exactly the way in which using private arguments with lock()/unlock() is documented 👍 I can't think there are many other ways, too, or at least I couldn't come up with any when I was updating the contributing guidelines.

Copy link
Member Author

Choose a reason for hiding this comment

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

A private privateSelectors option makes complete sense to me.

@jsnajdr
Copy link
Member

jsnajdr commented May 26, 2023

perhaps it would make more sense to only allow the registration at the time the store is created

Then we would need to add new options to createReduxStore, like:

createReduxStore( 'a', {
  selectors: { foo },
  privateSelectors: { privateFoo },
} );

Or to allow calling registerPrivateSelectors only once. Then we'd have to call mapSelectors also only once.

@adamziel
Copy link
Contributor

perhaps it would make more sense to only allow the registration at the time the store is created

Then we would need to add new options to createReduxStore, like:

createReduxStore( 'a', {
  selectors: { foo },
  privateSelectors: { privateFoo },
} );

Or to allow calling registerPrivateSelectors only once. Then we'd have to call mapSelectors also only once.

Or do this:

createReduxStore( 'a', {
  selectors: lock( { foo }, { privateFoo } )
} );

@noisysocks
Copy link
Member Author

Closing this in favour of #51051.

@noisysocks noisysocks closed this Jun 8, 2023
@noisysocks noisysocks deleted the fix/private-registry-selectors branch June 8, 2023 00:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Data /packages/data [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants