extensioner
Version:
Extensioner is responsible for managing apps modules. Scalable apps become easy
107 lines (94 loc) • 3.39 kB
JavaScript
import Overload from "function-overloader";
import Extension from "./Extension";
import ExtensionJoint from "./ExtensionJoint";
import syncListCompose from "./compose/syncList";
export default class Manager {
constructor() {
this._extensionJoints = {};
}
registerExtension() {
Overload.set(...arguments)
.when(Overload.STRING, Overload.INSTANCE(Extension))
.do((extensionName, extension) => {
this._extensionJoints[extensionName] = new ExtensionJoint(
extensionName,
extension,
this
);
})
.when(Overload.STRING, Overload.OBJECT)
.do((extensionName, { properties, events }) => {
this._extensionJoints[extensionName] = new ExtensionJoint(
extensionName,
new Extension({
properties,
events
}),
this
);
});
return this;
}
getExtensionJoints(onlyActive = true) {
return Object.values(this._extensionJoints).filter(
extensionJoint => (onlyActive ? extensionJoint.isEnabled() : true)
);
}
getExtensionJointsWithProperty(propertyName, onlyActive = true) {
return this.getExtensionJoints(onlyActive).filter(extensionJoint =>
extensionJoint.getExtension().hasProperty(propertyName)
);
}
getExtensionJointsWithEventListener(eventName, onlyActive = true) {
return this.getExtensionJoints(onlyActive).filter(extensionJoint =>
extensionJoint.getExtension().hasEventListener(eventName)
);
}
getPropertyValues(propertyName, onlyActive = true) {
return this.getExtensionJointsWithProperty(propertyName, onlyActive).reduce(
(response, extensionJoint) =>
Object.assign(
{
[extensionJoint.getName()]: extensionJoint
.getExtension()
.getProperty(propertyName)
},
response
),
{}
);
}
isExtensionJointEnabled(extensionName) {
if (this.hasExtensionJoint(extensionName)) {
return this._extensionJoints[extensionName].isEnabled();
}
return false;
}
disableExtensionJoint(extensionName) {
if (this.hasExtensionJoint(extensionName)) {
this._extensionJoints[extensionName].disable();
return true;
}
return false;
}
enableExtensionJoint(extensionName) {
if (this.hasExtensionJoint(extensionName)) {
this._extensionJoints[extensionName].enable();
return true;
}
return false;
}
hasExtensionJoint(extensionName) {
return !!this._extensionJoints[extensionName];
}
getExtensionJoint(extensionName) {
if (this.hasExtensionJoint(extensionName)) {
return this._extensionJoints[extensionName];
}
return null;
}
createEvent(eventName, composeFunction = syncListCompose) {
return value =>
composeFunction(this.getExtensionJointsWithEventListener(eventName), eventName, value);
}
}