-
-
Notifications
You must be signed in to change notification settings - Fork 4.9k
/
PluginManager.js
107 lines (85 loc) · 2.08 KB
/
PluginManager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
const { Logger } = require('lib/logger.js');
class PluginManager {
constructor() {
this.plugins_ = {};
this.logger_ = new Logger();
}
setLogger(l) {
this.logger_ = l;
}
logger() {
return this.logger_;
}
static instance() {
if (this.instance_) return this.instance_;
this.instance_ = new PluginManager();
return this.instance_;
}
register(classes) {
if (!Array.isArray(classes)) classes = [classes];
for (let i = 0; i < classes.length; i++) {
const PluginClass = classes[i];
if (this.plugins_[PluginClass.manifest.name]) throw new Error(`Already registered: ${PluginClass.manifest.name}`);
this.plugins_[PluginClass.manifest.name] = {
Class: PluginClass,
instance: null,
};
}
}
pluginInstance_(name) {
const p = this.plugins_[name];
if (p.instance) return p.instance;
p.instance = new p.Class();
p.instance.dispatch = action => this.dispatch_(action);
return p.instance;
}
pluginClass_(name) {
return this.plugins_[name].Class;
}
onPluginMenuItemTrigger_(event) {
const p = this.pluginInstance_(event.pluginName);
p.onTrigger({
itemName: event.itemName,
});
}
pluginDialogToShow(pluginStates) {
for (const name in pluginStates) {
const p = pluginStates[name];
if (!p.dialogOpen) continue;
const Class = this.pluginClass_(name);
if (!Class.Dialog) continue;
return {
Dialog: Class.Dialog,
props: this.dialogProps_(name),
};
}
return null;
}
dialogProps_(name) {
return {
dispatch: action => this.dispatch_(action),
plugin: this.pluginInstance_(name),
};
}
menuItems() {
let output = [];
for (const name in this.plugins_) {
const menuItems = this.plugins_[name].Class.manifest.menuItems;
if (!menuItems) continue;
for (const item of menuItems) {
item.click = () => {
this.onPluginMenuItemTrigger_({
pluginName: name,
itemName: item.name,
});
};
if (item.accelerator instanceof Function) {
item.accelerator = item.accelerator();
}
}
output = output.concat(menuItems);
}
return output;
}
}
module.exports = PluginManager;