{"version":3,"file":"hooks.mjs","sources":["../src/hooks.ts"],"sourcesContent":["import { eq, remove, cloneDeep } from 'lodash/fp';\n\nexport type Handler = (...args: any[]) => any;\n\nexport interface Hook<T extends Handler = Handler> {\n  getHandlers(): Handler[];\n  register(handler: T): Hook<T>;\n  delete(handler: T): Hook<T>;\n  call(...args: any[]): void;\n}\n\nexport interface AsyncSeriesHook extends Hook {\n  call(...args: any[]): Promise<void>;\n}\nexport interface AsyncSeriesWaterfallHook extends Hook {\n  call(...args: any[]): Promise<any>;\n}\n\nexport interface AsyncParallelHook extends Hook {\n  call(...args: any[]): Promise<any[]>;\n}\n\nexport interface AsyncBailHook extends Hook {\n  call(...args: any[]): Promise<any>;\n}\n\n/**\n * Create a default Strapi hook\n */\nconst createHook = <T extends Handler = Handler>(): Hook<T> => {\n  type State = {\n    handlers: T[];\n  };\n\n  const state: State = {\n    handlers: [],\n  };\n\n  return {\n    getHandlers() {\n      return state.handlers;\n    },\n\n    register(handler: T) {\n      state.handlers.push(handler);\n\n      return this;\n    },\n\n    delete(handler: T) {\n      state.handlers = remove(eq(handler), state.handlers);\n\n      return this;\n    },\n\n    call() {\n      throw new Error('Method not implemented');\n    },\n  };\n};\n\n/**\n * Create an async series hook.\n * Upon execution, it will execute every handler in order with the same context\n */\nconst createAsyncSeriesHook = <T extends Handler = Handler>() => ({\n  ...createHook<T>(),\n\n  async call(context: unknown) {\n    for (const handler of this.getHandlers()) {\n      await handler(context);\n    }\n  },\n});\n\n/**\n * Create an async series waterfall hook.\n * Upon execution, it will execute every handler in order and pass the return value of the last handler to the next one\n */\nconst createAsyncSeriesWaterfallHook = <T extends Handler = Handler>() => ({\n  ...createHook<T>(),\n\n  async call(param: unknown) {\n    let res = param;\n\n    for (const handler of this.getHandlers()) {\n      res = await handler(res);\n    }\n\n    return res;\n  },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in band.\n */\nconst createAsyncParallelHook = <T extends Handler = Handler>() => ({\n  ...createHook<T>(),\n\n  async call(context: unknown) {\n    const promises = this.getHandlers().map((handler) => handler(cloneDeep(context)));\n\n    return Promise.all(promises);\n  },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in serie and return the first result found.\n */\nconst createAsyncBailHook = <T extends Handler = Handler>() => ({\n  ...createHook<T>(),\n\n  async call(context: unknown) {\n    for (const handler of this.getHandlers()) {\n      const result = await handler(context);\n\n      if (result !== undefined) {\n        return result;\n      }\n    }\n  },\n});\n\nexport const internals = {\n  // Internal utils\n  createHook,\n};\n\nexport {\n  createAsyncSeriesHook,\n  createAsyncSeriesWaterfallHook,\n  createAsyncParallelHook,\n  createAsyncBailHook,\n};\n"],"names":["createHook","state","handlers","getHandlers","register","handler","push","delete","remove","eq","call","Error","createAsyncSeriesHook","context","createAsyncSeriesWaterfallHook","param","res","createAsyncParallelHook","promises","map","cloneDeep","Promise","all","createAsyncBailHook","result","undefined","internals"],"mappings":";;AA0BA;;AAEC,IACD,MAAMA,UAAa,GAAA,IAAA;AAKjB,IAAA,MAAMC,KAAe,GAAA;AACnBC,QAAAA,QAAAA,EAAU;AACZ,KAAA;IAEA,OAAO;AACLC,QAAAA,WAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOF,MAAMC,QAAQ;AACvB,SAAA;AAEAE,QAAAA,QAAAA,CAAAA,CAASC,OAAU,EAAA;YACjBJ,KAAMC,CAAAA,QAAQ,CAACI,IAAI,CAACD,OAAAA,CAAAA;AAEpB,YAAA,OAAO,IAAI;AACb,SAAA;AAEAE,QAAAA,MAAAA,CAAAA,CAAOF,OAAU,EAAA;AACfJ,YAAAA,KAAAA,CAAMC,QAAQ,GAAGM,MAAAA,CAAOC,EAAGJ,CAAAA,OAAAA,CAAAA,EAAUJ,MAAMC,QAAQ,CAAA;AAEnD,YAAA,OAAO,IAAI;AACb,SAAA;AAEAQ,QAAAA,IAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,IAAIC,KAAM,CAAA,wBAAA,CAAA;AAClB;AACF,KAAA;AACF,CAAA;AAEA;;;IAIA,MAAMC,qBAAwB,GAAA,KAAoC;AAChE,QAAA,GAAGZ,UAAe,EAAA;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAI,CAAA;AACxC,gBAAA,MAAME,OAAQQ,CAAAA,OAAAA,CAAAA;AAChB;AACF;KACF;AAEA;;;IAIA,MAAMC,8BAAiC,GAAA,KAAoC;AACzE,QAAA,GAAGd,UAAe,EAAA;AAElB,QAAA,MAAMU,MAAKK,KAAc,EAAA;AACvB,YAAA,IAAIC,GAAMD,GAAAA,KAAAA;AAEV,YAAA,KAAK,MAAMV,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAI,CAAA;AACxCa,gBAAAA,GAAAA,GAAM,MAAMX,OAAQW,CAAAA,GAAAA,CAAAA;AACtB;YAEA,OAAOA,GAAAA;AACT;KACF;AAEA;;;IAIA,MAAMC,uBAA0B,GAAA,KAAoC;AAClE,QAAA,GAAGjB,UAAe,EAAA;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;YACzB,MAAMK,QAAAA,GAAW,IAAI,CAACf,WAAW,EAAA,CAAGgB,GAAG,CAAC,CAACd,OAAYA,GAAAA,OAAAA,CAAQe,SAAUP,CAAAA,OAAAA,CAAAA,CAAAA,CAAAA;YAEvE,OAAOQ,OAAAA,CAAQC,GAAG,CAACJ,QAAAA,CAAAA;AACrB;KACF;AAEA;;;IAIA,MAAMK,mBAAsB,GAAA,KAAoC;AAC9D,QAAA,GAAGvB,UAAe,EAAA;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAI,CAAA;gBACxC,MAAMqB,MAAAA,GAAS,MAAMnB,OAAQQ,CAAAA,OAAAA,CAAAA;AAE7B,gBAAA,IAAIW,WAAWC,SAAW,EAAA;oBACxB,OAAOD,MAAAA;AACT;AACF;AACF;KACF;MAEaE,SAAY,GAAA;;AAEvB1B,IAAAA;AACF;;;;"}