{"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":["hooksRegistry","hooks","keys","Object","get","uid","getAll","namespace","pickBy","_","hasNamespace","set","hook","add","hookName","addNamespace","extend","extendFn","currentHook","Error","newHook"],"mappings":";;;AAuBA,MAAMA,aAAAA,GAAgB,IAAA;AACpB,IAAA,MAAMC,QAA8B,EAAC;IAErC,OAAO;AACL;;QAGAC,IAAAA,CAAAA,GAAAA;YACE,OAAOC,MAAAA,CAAOD,IAAI,CAACD,KAAAA,CAAAA;AACrB,QAAA,CAAA;AAEA;;AAEC,QACDG,KAAIC,GAAW,EAAA;YACb,OAAOJ,KAAK,CAACI,GAAAA,CAAI;AACnB,QAAA,CAAA;AAEA;;AAEC,QACDC,QAAOC,SAAiB,EAAA;AACtB,YAAA,OAAOC,OAAO,CAACC,CAAAA,EAAGJ,GAAAA,GAAQK,YAAAA,CAAaL,KAAKE,SAAAA,CAAAA,CAAAA,CAAYN,KAAAA,CAAAA;AAC1D,QAAA,CAAA;AAEA;;QAGAU,GAAAA,CAAAA,CAAIN,GAAW,EAAEO,IAAU,EAAA;YACzBX,KAAK,CAACI,IAAI,GAAGO,IAAAA;AACb,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAC,GAAAA,CAAAA,CAAIN,SAAiB,EAAEN,KAA2B,EAAA;AAChD,YAAA,KAAK,MAAMa,QAAAA,IAAYX,MAAAA,CAAOD,IAAI,CAACD,KAAAA,CAAAA,CAAQ;gBACzC,MAAMW,IAAAA,GAAOX,KAAK,CAACa,QAAAA,CAAS;gBAC5B,MAAMT,GAAAA,GAAMU,aAAaD,QAAAA,EAAUP,SAAAA,CAAAA;gBAEnC,IAAI,CAACI,GAAG,CAACN,GAAAA,EAAKO,IAAAA,CAAAA;AAChB,YAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAI,MAAAA,CAAAA,CAAOX,GAAW,EAAEY,QAAsB,EAAA;AACxC,YAAA,MAAMC,WAAAA,GAAc,IAAI,CAACd,GAAG,CAACC,GAAAA,CAAAA;AAE7B,YAAA,IAAI,CAACa,WAAAA,EAAa;AAChB,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,KAAK,EAAEd,GAAAA,CAAI,cAAc,CAAC,CAAA;AAC7C,YAAA;AAEA,YAAA,MAAMe,UAAUH,QAAAA,CAASC,WAAAA,CAAAA;YACzBjB,KAAK,CAACI,IAAI,GAAGe,OAAAA;AAEb,YAAA,OAAO,IAAI;AACb,QAAA;AACF,KAAA;AACF;;;;"}