UNPKG

@ark7/router

Version:
1 lines 5.94 kB
{"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"}