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

Decouple store definition from the registry object #26996

Merged
merged 5 commits into from
Nov 17, 2020

Conversation

youknowriad
Copy link
Contributor

Based on #26655

This takes the "store definition" further by decoupling the store creation from the registration.

Ultimately, this PR means we should deprecate both registerGenericStore and registerStore APIs in favor of a unique register API. We can't do that yet because of the two stores we have that rely on "effects middleware" (we need to move these to generators for async behavior to remove that middleware).

@github-actions
Copy link

github-actions bot commented Nov 16, 2020

Size Change: -155 B (0%)

Total Size: 1.19 MB

Filename Size Change
build/annotations/index.js 3.8 kB -10 B (0%)
build/block-directory/index.js 8.72 kB -15 B (0%)
build/block-editor/index.js 133 kB -12 B (0%)
build/blocks/index.js 48 kB -4 B (0%)
build/core-data/index.js 14.8 kB -27 B (0%)
build/data/index.js 8.8 kB +23 B (0%)
build/edit-navigation/index.js 11.2 kB -13 B (0%)
build/edit-post/index.js 306 kB -16 B (0%)
build/edit-site/index.js 23.3 kB -8 B (0%)
build/edit-widgets/index.js 26.4 kB -12 B (0%)
build/editor/index.js 42.5 kB -9 B (0%)
build/keyboard-shortcuts/index.js 2.54 kB -12 B (0%)
build/notices/index.js 1.81 kB -9 B (0%)
build/nux/index.js 3.42 kB -8 B (0%)
build/reusable-blocks/index.js 3.06 kB -12 B (0%)
build/rich-text/index.js 13.3 kB -4 B (0%)
build/viewport/index.js 1.86 kB -7 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/api-fetch/index.js 3.42 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/style-rtl.css 943 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-editor/style-rtl.css 11.3 kB 0 B
build/block-editor/style.css 11.3 kB 0 B
build/block-library/editor-rtl.css 8.91 kB 0 B
build/block-library/editor.css 8.92 kB 0 B
build/block-library/index.js 147 kB 0 B
build/block-library/style-rtl.css 8.1 kB 0 B
build/block-library/style.css 8.1 kB 0 B
build/block-library/theme-rtl.css 792 B 0 B
build/block-library/theme.css 793 B 0 B
build/block-serialization-default-parser/index.js 1.87 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/components/index.js 171 kB 0 B
build/components/style-rtl.css 15.3 kB 0 B
build/components/style.css 15.3 kB 0 B
build/compose/index.js 9.9 kB 0 B
build/data-controls/index.js 821 B 0 B
build/date/index.js 11.2 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 571 B 0 B
build/dom/index.js 4.92 kB 0 B
build/edit-navigation/style-rtl.css 881 B 0 B
build/edit-navigation/style.css 885 B 0 B
build/edit-post/style-rtl.css 6.51 kB 0 B
build/edit-post/style.css 6.49 kB 0 B
build/edit-site/style-rtl.css 3.98 kB 0 B
build/edit-site/style.css 3.98 kB 0 B
build/edit-widgets/style-rtl.css 3.16 kB 0 B
build/edit-widgets/style.css 3.16 kB 0 B
build/editor/editor-styles-rtl.css 476 B 0 B
build/editor/editor-styles.css 478 B 0 B
build/editor/style-rtl.css 3.85 kB 0 B
build/editor/style.css 3.85 kB 0 B
build/element/index.js 4.62 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.86 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.16 kB 0 B
build/html-entities/index.js 623 B 0 B
build/i18n/index.js 3.57 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.1 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.43 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.69 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4.05 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@gziolo
Copy link
Member

gziolo commented Nov 16, 2020

Should I merge #26655 or do you prefer to merge both PRs at the same time?

@gziolo gziolo added the [Package] Data /packages/data label Nov 16, 2020
@youknowriad
Copy link
Contributor Author

@gziolo whatever works for you. If your PR is ready, go for it.

@jsnajdr
Copy link
Member

jsnajdr commented Nov 16, 2020

Ultimately, this PR means we should deprecate both registerGenericStore and registerStore APIs in favor of a unique register API. We can't do that yet because of the two stores we have that rely on "effects middleware"

That's because register doesn't expose the private Redux store so that I can add middlewares to it?

A related question: once there is only registry.register( definition ), can I create and register a completely custom store? I.e., something that implements the specified interface and its contract, but otherwise is implemented independently? Is implementing my own __internalAttach the way to go?

#26866 adds its own registry.registerAtomicStore() method. Is that going to become a generic registry.register( createAtomicStoreDefinition( ... )?

@youknowriad
Copy link
Contributor Author

youknowriad commented Nov 16, 2020

That's because register doesn't expose the private Redux store so that I can add middlewares to it?

yes, and we don't want to expose the redux stores in the public APIs.

once there is only registry.register( definition ), can I create and register a completely custom store? I.e., something that implements the specified interface and its contract, but otherwise is implemented independently? Is implementing my own __internalAttach the way to go?

yes, this is already supported with registerGenericStore (at least it's the intent of that API already)

#26866 adds its own registry.registerAtomicStore() method. Is that going to become a generic registry.register( createAtomicStoreDefinition( ... )?

yes.

@youknowriad
Copy link
Contributor Author

yes, this is already supported with registerGenericStore (at least it's the intent of that API already)

I should precise: the contract with the registry is that it provides the following interface: { subscribe, getSelectors, getActions }

@jsnajdr
Copy link
Member

jsnajdr commented Nov 16, 2020

About naming: What if "store definition" was called just "store"? Just like we don't have "atom definitions", but only "atoms" and "atom states/values". Then there is a nice symmetry between registries, stores, and atoms:

const dataStore = createStore( storeDefinition );
dataRegistry.register( dataStore );

dataRegistry.select( dataStore ).mySelector();
dataRegistry.dispatch( dataStore ).myAction();

vs

const atom = createAtom( atomDefinition );

atomStore.get( atom );
atomStore.set( atom, value );

The create* functions create atoms and data stores, and their state is instantiated in and accessed through registries and atom stores.

Auto-registering stores: In the example above, I have to register a data store manually, but an atom is registered automatically, on first use.

Similarly, we could completely remove registry.register, too. Just like an atom store calls getAtomState() whenever it needs it, creating the state just in time, so could the data registry instantiate the data store state in registry.select, .dispatch and .subscribe.

Or is this forever blocked by the backward compatible API that still supports registry.select( 'core/block-editor' ) with a string ID instead of store object?

@jsnajdr
Copy link
Member

jsnajdr commented Nov 16, 2020

yes, this is already supported with registerGenericStore (at least it's the intent of that API already)

That makes __internalAttach a public API. And it should have a nicer name like store.instantiate( registry ). That still hides the implementation and internal state from unauthorized access.

@youknowriad
Copy link
Contributor Author

The renaming makes sense to me.

Or is this forever blocked by the backward compatible API that still supports registry.select( 'core/block-editor' ) with a string ID instead of store object?

Good find :) the parallel is very interesting. I believe there's a lot of history here, so we should move with a lot of care but auto-registering stores sound very interesting to me. I'm not sure yet whether we can do it without breaking changes yet.

Let's keep this PR at the current stage though of abstraction and consider separately.

Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I've left a few notes focused only on the types. I'll also cite the @dsifford's work that might serve as inspiration: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/wordpress__data/index.d.ts

packages/data/src/types.d.ts Outdated Show resolved Hide resolved
packages/data/src/types.d.ts Outdated Show resolved Hide resolved
@youknowriad
Copy link
Contributor Author

I'm merging this into its parent PR and we'll see there whether we're ready to ship.

@youknowriad youknowriad merged commit b1c6411 into try/data-store-as-param Nov 17, 2020
@youknowriad youknowriad deleted the update/decouple-store-registry branch November 17, 2020 13:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Data /packages/data [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants