UNPKG

@wordpress/data

Version:
266 lines (264 loc) 8.39 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // packages/data/src/registry.js var registry_exports = {}; __export(registry_exports, { createRegistry: () => createRegistry }); module.exports = __toCommonJS(registry_exports); var import_deprecated = __toESM(require("@wordpress/deprecated")); var import_redux_store = __toESM(require("./redux-store")); var import_store = __toESM(require("./store")); var import_emitter = require("./utils/emitter"); var import_lock_unlock = require("./lock-unlock"); function getStoreName(storeNameOrDescriptor) { return typeof storeNameOrDescriptor === "string" ? storeNameOrDescriptor : storeNameOrDescriptor.name; } function createRegistry(storeConfigs = {}, parent = null) { const stores = {}; const emitter = (0, import_emitter.createEmitter)(); let listeningStores = null; function globalListener() { emitter.emit(); } const subscribe = (listener, storeNameOrDescriptor) => { if (!storeNameOrDescriptor) { return emitter.subscribe(listener); } const storeName = getStoreName(storeNameOrDescriptor); const store = stores[storeName]; if (store) { return store.subscribe(listener); } if (!parent) { return emitter.subscribe(listener); } return parent.subscribe(listener, storeNameOrDescriptor); }; function select(storeNameOrDescriptor) { const storeName = getStoreName(storeNameOrDescriptor); listeningStores?.add(storeName); const store = stores[storeName]; if (store) { return store.getSelectors(); } return parent?.select(storeName); } function __unstableMarkListeningStores(callback, ref) { listeningStores = /* @__PURE__ */ new Set(); try { return callback.call(this); } finally { ref.current = Array.from(listeningStores); listeningStores = null; } } function resolveSelect(storeNameOrDescriptor) { const storeName = getStoreName(storeNameOrDescriptor); listeningStores?.add(storeName); const store = stores[storeName]; if (store) { return store.getResolveSelectors(); } return parent && parent.resolveSelect(storeName); } function suspendSelect(storeNameOrDescriptor) { const storeName = getStoreName(storeNameOrDescriptor); listeningStores?.add(storeName); const store = stores[storeName]; if (store) { return store.getSuspendSelectors(); } return parent && parent.suspendSelect(storeName); } function dispatch(storeNameOrDescriptor) { const storeName = getStoreName(storeNameOrDescriptor); const store = stores[storeName]; if (store) { return store.getActions(); } return parent && parent.dispatch(storeName); } function withPlugins(attributes) { return Object.fromEntries( Object.entries(attributes).map(([key, attribute]) => { if (typeof attribute !== "function") { return [key, attribute]; } return [ key, function() { return registry[key].apply(null, arguments); } ]; }) ); } function registerStoreInstance(name, createStore) { if (stores[name]) { console.error('Store "' + name + '" is already registered.'); return stores[name]; } const store = createStore(); if (typeof store.getSelectors !== "function") { throw new TypeError("store.getSelectors must be a function"); } if (typeof store.getActions !== "function") { throw new TypeError("store.getActions must be a function"); } if (typeof store.subscribe !== "function") { throw new TypeError("store.subscribe must be a function"); } store.emitter = (0, import_emitter.createEmitter)(); const currentSubscribe = store.subscribe; store.subscribe = (listener) => { const unsubscribeFromEmitter = store.emitter.subscribe(listener); const unsubscribeFromStore = currentSubscribe(() => { if (store.emitter.isPaused) { store.emitter.emit(); return; } listener(); }); return () => { unsubscribeFromStore?.(); unsubscribeFromEmitter?.(); }; }; stores[name] = store; store.subscribe(globalListener); if (parent) { try { (0, import_lock_unlock.unlock)(store.store).registerPrivateActions( (0, import_lock_unlock.unlock)(parent).privateActionsOf(name) ); (0, import_lock_unlock.unlock)(store.store).registerPrivateSelectors( (0, import_lock_unlock.unlock)(parent).privateSelectorsOf(name) ); } catch (e) { } } return store; } function register(store) { registerStoreInstance( store.name, () => store.instantiate(registry) ); } function registerGenericStore(name, store) { (0, import_deprecated.default)("wp.data.registerGenericStore", { since: "5.9", alternative: "wp.data.register( storeDescriptor )" }); registerStoreInstance(name, () => store); } function registerStore(storeName, options) { if (!options.reducer) { throw new TypeError("Must specify store reducer"); } const store = registerStoreInstance( storeName, () => (0, import_redux_store.default)(storeName, options).instantiate(registry) ); return store.store; } function batch(callback) { if (emitter.isPaused) { callback(); return; } emitter.pause(); Object.values(stores).forEach((store) => store.emitter.pause()); try { callback(); } finally { emitter.resume(); Object.values(stores).forEach( (store) => store.emitter.resume() ); } } let registry = { batch, stores, namespaces: stores, // TODO: Deprecate/remove this. subscribe, select, resolveSelect, suspendSelect, dispatch, use, register, registerGenericStore, registerStore, __unstableMarkListeningStores }; function use(plugin, options) { if (!plugin) { return; } registry = { ...registry, ...plugin(registry, options) }; return registry; } registry.register(import_store.default); for (const [name, config] of Object.entries(storeConfigs)) { registry.register((0, import_redux_store.default)(name, config)); } if (parent) { parent.subscribe(globalListener); } const registryWithPlugins = withPlugins(registry); (0, import_lock_unlock.lock)(registryWithPlugins, { privateActionsOf: (name) => { try { return (0, import_lock_unlock.unlock)(stores[name].store).privateActions; } catch (e) { return {}; } }, privateSelectorsOf: (name) => { try { return (0, import_lock_unlock.unlock)(stores[name].store).privateSelectors; } catch (e) { return {}; } } }); return registryWithPlugins; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createRegistry }); //# sourceMappingURL=registry.js.map