{"version":3,"sources":["../src/flows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AAKrC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,EAAE,CAChB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,QAAQ,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,EACnD,UAAU,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,wDAGvD;AAED,wBAAgB,GAAG,CACjB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,QAAQ,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,EACnD,UAAU,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,SAEnC,OAAO,cAAc,QAAQ,MAAM,GAAG,mBAY1D;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAClB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,UAAU,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,wDAGtD;AAED,wBAAgB,KAAK,CACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,UAAU,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,SAElC,OAAO,cAAc,QAAQ,MAAM,GAAG,mBAU1D;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wDAGtE;AAED,wBAAgB,MAAM,CACpB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAElD,OAAO,cAAc,QAAQ,MAAM,GAAG,mBAQ1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,cAAc,EACjD,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACrD,IAAI,GAAE,UAAe,wDAkBtB;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,cAAc,EACrD,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,wDAGtD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB","file":"flows.d.ts","sourcesContent":["import * as Router from 'koa-router';\n\nimport { Middleware } from './decorators';\nimport { compose, isPromise } from './utils';\n\n/**\n * A IF middleware that helps a branch checking.  Usage:\n *\n *     @If(predictor, ifClause)\n *     - execute ifClause when predictor returns true.\n *     - execute next middleware when predictor returns false.\n *\n *     @If(predictor, ifClause, elseClause)\n *     - execute ifClause when predictor returns true.\n *     - execute elseClause when predictor returns false.\n *\n * @param predictor - Predict which clause to execute.\n * @param ifClause - Execute when predictor returns true.\n * @param elseClause - Execute when predictor returns false. By default, execute\n *                     else clause.\n */\nexport function If(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n  ifClause: Router.IMiddleware | Router.IMiddleware[],\n  elseClause?: Router.IMiddleware | Router.IMiddleware[],\n) {\n  return Middleware(_if(predictor, ifClause, elseClause));\n}\n\nexport function _if(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n  ifClause: Router.IMiddleware | Router.IMiddleware[],\n  elseClause?: Router.IMiddleware | Router.IMiddleware[],\n) {\n  return async (ctx: Router.IRouterContext, next: () => any) => {\n    const value = predictor(ctx);\n    const boolValue = isPromise(value) ? await value : value;\n\n    if (boolValue) {\n      await compose(ifClause)(ctx, next);\n    } else if (elseClause) {\n      await compose(elseClause)(ctx, next);\n    } else {\n      await next();\n    }\n  };\n}\n\n/**\n * A WHEN middleware that helps a branch checking, next middleware will always\n * be executed regardless what predictor returns.\n *\n * @param predictor - Predict when the when clause will be executed.\n * @param whenClause - Execute when predictor returns true.\n */\nexport function When(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n  whenClause: Router.IMiddleware | Router.IMiddleware[],\n) {\n  return Middleware(_when(predictor, whenClause));\n}\n\nexport function _when(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n  whenClause: Router.IMiddleware | Router.IMiddleware[],\n) {\n  return async (ctx: Router.IRouterContext, next: () => any) => {\n    const value = predictor(ctx);\n    const boolValue = isPromise(value) ? await value : value;\n\n    if (boolValue && whenClause) {\n      await compose(whenClause)(ctx, () => Promise.resolve({}));\n    }\n\n    await next();\n  };\n}\n\n/**\n * A CHECK middleware that helps determines if to execute next middleware.\n * Usage:\n *\n *   @Check((ctx: Router.IRouterContext) => ctx.isAuthenticated())\n *\n * @param predictor - Returns true to execute next middleware.\n */\nexport function Check(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n) {\n  return Middleware(_check(predictor));\n}\n\nexport function _check(\n  predictor: (ctx: Router.IRouterContext) => boolean | Promise<boolean>,\n) {\n  return async (ctx: Router.IRouterContext, next: () => any) => {\n    const value = predictor(ctx);\n    const boolValue = isPromise(value) ? await value : value;\n\n    if (boolValue) {\n      await next();\n    }\n  };\n}\n\n/**\n * A Tee middleware that helps execute a side function.\n * Usage:\n *\n *   @Tee((ctx) => console.log(ctx.path))\n *\n * @param fn - The side function to execute.\n * @param opts.post - specifies run tee after returned.\n */\nexport function Tee<T extends Router.IRouterContext>(\n  fn: (ctx: T, next: () => any) => void | Promise<void>,\n  opts: TeeOptions = {},\n) {\n  async function process(ctx: T) {\n    const value = fn(ctx, () => {});\n    if (isPromise(value)) {\n      await value;\n    }\n  }\n\n  return Middleware(async (ctx: T, next: () => any) => {\n    if (!opts.post) {\n      await process(ctx);\n    }\n    await next();\n    if (opts.post) {\n      await process(ctx);\n    }\n  });\n}\n\nexport function TeePost<T extends Router.IRouterContext>(\n  fn: (ctx: T, next: () => any) => void | Promise<void>,\n) {\n  return Tee<T>(fn, { post: true });\n}\n\nexport interface TeeOptions {\n  post?: boolean;\n}\n"],"sourceRoot":"/Users/yz/workspace/router/src"}