mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-02-24 16:14:01 +08:00
Summary: - Rewrites composer extension adpater to support all versions of the ComposerExtension API we've ever declared. This will allow old plugins (or plugins that haven't been reinstalled after update) to keep functioning without breaking N1 - Adds specs Test Plan: - Unit tests Reviewers: evan, bengotow Reviewed By: bengotow Differential Revision: https://phab.nylas.com/D2399
65 lines
1.8 KiB
JavaScript
65 lines
1.8 KiB
JavaScript
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
|
|
);
|