UNPKG

surrogate

Version:

Object method hooks made easy

89 lines 3.6 kB
"use strict"; 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