{"version":3,"file":"hooks.mjs","sources":["../../src/registries/hooks.ts"],"sourcesContent":["import { pickBy } from 'lodash/fp';\nimport { addNamespace, hasNamespace } from './namespace';\n\ntype Handler = (context: any) => any;\n\ntype AsyncHook = {\n  handlers: Handler[];\n  register(handler: Handler): AsyncHook;\n  delete(handler: Handler): AsyncHook;\n  call(): Promise<void>;\n};\n\ntype SyncHook = {\n  get handlers(): Handler[];\n  register(handler: Handler): SyncHook;\n  delete(handler: Handler): SyncHook;\n  call(): void;\n};\n\nexport type Hook = AsyncHook | SyncHook;\n\ntype HookExtendFn = (hook: Hook) => Hook;\n\nconst hooksRegistry = () => {\n  const hooks: Record<string, Hook> = {};\n\n  return {\n    /**\n     * Returns this list of registered hooks uids\n     */\n    keys() {\n      return Object.keys(hooks);\n    },\n\n    /**\n     * Returns the instance of a hook.\n     */\n    get(uid: string) {\n      return hooks[uid];\n    },\n\n    /**\n     * Returns a map with all the hooks in a namespace\n     */\n    getAll(namespace: string) {\n      return pickBy((_, uid) => hasNamespace(uid, namespace))(hooks);\n    },\n\n    /**\n     * Registers a hook\n     */\n    set(uid: string, hook: Hook) {\n      hooks[uid] = hook;\n      return this;\n    },\n\n    /**\n     * Registers a map of hooks for a specific namespace\n     */\n    add(namespace: string, hooks: Record<string, Hook>) {\n      for (const hookName of Object.keys(hooks)) {\n        const hook = hooks[hookName];\n        const uid = addNamespace(hookName, namespace);\n\n        this.set(uid, hook);\n      }\n\n      return this;\n    },\n\n    /**\n     * Wraps a hook to extend it\n     */\n    extend(uid: string, extendFn: HookExtendFn) {\n      const currentHook = this.get(uid);\n\n      if (!currentHook) {\n        throw new Error(`Hook ${uid} doesn't exist`);\n      }\n\n      const newHook = extendFn(currentHook);\n      hooks[uid] = newHook;\n\n      return this;\n    },\n  };\n};\n\nexport default hooksRegistry;\n"],"names":["hooks"],"mappings":";;AAuBA,MAAM,gBAAgB,MAAM;AAC1B,QAAM,QAA8B,CAAA;AAE7B,SAAA;AAAA;AAAA;AAAA;AAAA,IAIL,OAAO;AACE,aAAA,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,KAAa;AACf,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,WAAmB;AACjB,aAAA,OAAO,CAAC,GAAG,QAAQ,aAAa,KAAK,SAAS,CAAC,EAAE,KAAK;AAAA,IAC/D;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,KAAa,MAAY;AAC3B,YAAM,GAAG,IAAI;AACN,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,IAAI,WAAmBA,QAA6B;AAClD,iBAAW,YAAY,OAAO,KAAKA,MAAK,GAAG;AACnC,cAAA,OAAOA,OAAM,QAAQ;AACrB,cAAA,MAAM,aAAa,UAAU,SAAS;AAEvC,aAAA,IAAI,KAAK,IAAI;AAAA,MACpB;AAEO,aAAA;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,KAAa,UAAwB;AACpC,YAAA,cAAc,KAAK,IAAI,GAAG;AAEhC,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,QAAQ,GAAG,gBAAgB;AAAA,MAC7C;AAEM,YAAA,UAAU,SAAS,WAAW;AACpC,YAAM,GAAG,IAAI;AAEN,aAAA;AAAA,IACT;AAAA,EAAA;AAEJ;"}