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

Introduce PluginManager class #19485

Open
wants to merge 4 commits into
base: trunk
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 22 additions & 15 deletions packages/plugins/src/api/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
/* eslint no-console: [ 'error', { allow: [ 'error' ] } ] */

/**
* External dependencies
*/
import { isFunction } from 'lodash';

/**
* WordPress dependencies
*/
import { applyFilters, doAction } from '@wordpress/hooks';

/**
* External dependencies
* Internal dependencies
*/
import { isFunction } from 'lodash';
import PluginManager from '../api/plugin-manager';

/**
* Defined behavior of a plugin type.
Expand All @@ -27,11 +32,11 @@ import { isFunction } from 'lodash';
*/

/**
* Plugin definitions keyed by plugin name.
* Plugin manager class
*
* @type {Object.<string,WPPlugin>}
* @typedef {Object} PluginManager
*/
const plugins = {};
const pluginManager = PluginManager();

/**
* Registers a plugin to the editor.
Expand Down Expand Up @@ -125,7 +130,7 @@ export function registerPlugin( name, settings ) {
);
return null;
}
if ( plugins[ name ] ) {
if ( pluginManager.getPlugin( name ) ) {
console.error(
`Plugin "${ name }" is already registered.`
);
Expand All @@ -140,11 +145,13 @@ export function registerPlugin( name, settings ) {
return null;
}

plugins[ name ] = {
pluginManager.addPlugin(
name,
icon: 'admin-plugins',
...settings,
};
{
icon: 'admin-plugins',
...settings,
}
);

doAction( 'plugins.pluginRegistered', settings, name );

Expand Down Expand Up @@ -176,14 +183,14 @@ export function registerPlugin( name, settings ) {
* successfully unregistered; otherwise `undefined`.
*/
export function unregisterPlugin( name ) {
if ( ! plugins[ name ] ) {
if ( ! pluginManager.getPlugin( name ) ) {
console.error(
'Plugin "' + name + '" is not registered.'
);
return;
}
const oldPlugin = plugins[ name ];
delete plugins[ name ];
const oldPlugin = pluginManager.getPlugin( name );
pluginManager.removePlugin( name );

doAction( 'plugins.pluginUnregistered', oldPlugin, name );

Expand All @@ -198,7 +205,7 @@ export function unregisterPlugin( name ) {
* @return {?WPPlugin} Plugin setting.
*/
export function getPlugin( name ) {
return plugins[ name ];
return pluginManager.getPlugin( name );
}

/**
Expand All @@ -207,5 +214,5 @@ export function getPlugin( name ) {
* @return {WPPlugin[]} Plugin settings.
*/
export function getPlugins() {
return Object.values( plugins );
return Object.values( pluginManager.getPlugins() );
}
50 changes: 50 additions & 0 deletions packages/plugins/src/api/plugin-manager/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
export default class PluginManager {
/**
* Create a PluginManager
*/
constructor() {
this.plugins = {};
}

/**
* Adds a new plugin.
*
* @param {string} name Plugin name.
* @param {Object} settings The settings for this plugin.
*/
addPlugin( name, settings ) {
this.plugins[ name ] = {
name,
...settings,
};
}

/**
* Removes a plugin
*
* @param {string} name Plugin name.
*/
removePlugin( name ) {
delete this.plugins[ name ];
}

/**
* Return settings for a single plugin.
*
* @param {string} name Plugin name.
*
* @return {Object} The plugin settings
*/
getPlugin( name ) {
return this.plugins[ name ];
}

/**
* Returns settings for all registered plugins
*
* @return {Array} All registered plugin settings.
*/
getPlugins() {
return this.plugins;
}
}