Mailspring/src/extension-registry.es6

66 lines
1.8 KiB
Plaintext
Raw Normal View History

import _ from 'underscore';
import {Listener, Publisher} from './flux/modules/reflux-coffee';
import {includeModule} from './flux/coffee-helpers';
import composerExtAdapter from './extensions/composer-extension-adapter';
import messageViewExtAdapter from './extensions/message-view-extension-adapter';
export class Registry {
static include = includeModule;
constructor(name, deprecationAdapter = (ext)=> ext) {
this.name = name;
this._deprecationAdapter = deprecationAdapter;
this._registry = new Map();
}
register(extension) {
this.validateExtension(extension, 'register');
this._registry.set(extension.name, this._deprecationAdapter(extension));
this.triggerDebounced();
return this;
}
unregister(extension) {
this.validateExtension(extension, 'unregister');
this._registry.delete(extension.name);
this.triggerDebounced();
}
extensions() {
return Array.from(this._registry.values());
}
clear() {
this._registry = new Map();
}
triggerDebounced() {
_.debounce(()=> this.trigger(), 1);
}
validateExtension(extension, method) {
if (!extension || Array.isArray(extension) || !_.isObject(extension)) {
throw new Error(`ExtensionRegistry.${this.name}.${method} requires a valid \\
extension object that implements one of the functions defined by ${this.name}Extension`);
}
if (!extension.name) {
throw new Error(`ExtensionRegistry.${this.name}.${method} requires a \\
\`name\` property defined on the extension object`);
}
}
}
Registry.include(Publisher);
Registry.include(Listener);
export const Composer = new Registry(
'Composer',
composerExtAdapter
);
export const MessageView = new Registry(
'MessageView',
messageViewExtAdapter
);