surrogate
Version:
Object method hooks made easy
89 lines • 3.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventManager = void 0;
const containers_1 = require("../containers");
const defaults_1 = require("@status/defaults");
const options_1 = require("../options");
const which_1 = require("../which");
const asarray_1 = require("@jfrazx/asarray");
class EventManager {
constructor(globalOptions = {}) {
this.globalOptions = globalOptions;
this.events = (0, defaults_1.wrapDefaults)({
defaultValue: {
[which_1.HookType.POST]: [],
[which_1.HookType.PRE]: [],
},
setUndefined: true,
shallowCopy: false,
});
}
getEventMap() {
return this.events;
}
getEventHandlers(event) {
return this.events[event];
}
getPreEventHandlers(event) {
return this.getEventHandlersFor(event, which_1.HookType.PRE);
}
getPostEventHandlers(event) {
return this.getEventHandlersFor(event, which_1.HookType.POST);
}
eventIsHandled(event) {
const { pre, post } = this.getEventHandlers(event);
return Boolean((pre === null || pre === void 0 ? void 0 : pre.length) + (post === null || post === void 0 ? void 0 : post.length));
}
registerHook(event, type, handler, options) {
return this.setEventHandlers(event, type, (0, asarray_1.asArray)(handler), options);
}
registerPreHook(event, handler, options) {
return this.setEventHandlers(event, which_1.HookType.PRE, (0, asarray_1.asArray)(handler), options);
}
registerPostHook(event, handler, options) {
return this.setEventHandlers(event, which_1.HookType.POST, (0, asarray_1.asArray)(handler), options);
}
setEventHandlers(event, type, handlers, options = {}) {
const currentContainers = this.getEventHandlersFor(event, type);
const optionsHandler = new options_1.OptionsHandler({
handler: options,
global: this.globalOptions,
});
const containers = handlers.map((handler) => new containers_1.SurrogateHandlerContainer(handler, type, optionsHandler));
const combinedContainers = [...currentContainers, ...containers];
this.setEventHandlersFor(event, type, combinedContainers);
return this;
}
getEventHandlersFor(event, which) {
return this.getEventHandlers(event)[which];
}
setEventHandlersFor(event, type, containers = []) {
this.getEventHandlers(event)[type] = containers;
return this;
}
deregisterHooks() {
Object.keys(this.events).forEach((event) => this.deregisterHooksFor(event));
return this;
}
deregisterHooksFor(event) {
return this.deregisterPreHooks(event).deregisterPostHooks(event);
}
deregisterPreHook(event, handler) {
return this.deregisterHookType(event, which_1.HookType.PRE, handler);
}
deregisterPostHook(event, handler) {
return this.deregisterHookType(event, which_1.HookType.POST, handler);
}
deregisterHookType(event, which, handlerToRemove) {
const containers = this.getEventHandlersFor(event, which);
return this.setEventHandlersFor(event, which, containers.filter(({ handler }) => handler !== handlerToRemove));
}
deregisterPostHooks(event) {
return this.setEventHandlersFor(event, which_1.HookType.POST);
}
deregisterPreHooks(event) {
return this.setEventHandlersFor(event, which_1.HookType.PRE);
}
}
exports.EventManager = EventManager;
//# sourceMappingURL=index.js.map