UNPKG

@strapi/utils

Version:

Shared utilities for the Strapi packages

1 lines 5.19 kB
{"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;;;;"}