Skip to content

Commit

Permalink
支持 TS & 链式操作
Browse files Browse the repository at this point in the history
  • Loading branch information
章显雷 committed Jun 22, 2019
1 parent 1e0909a commit bb7166f
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 18 deletions.
21 changes: 16 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,11 @@ module.exports = app => {

router.group({ name: 'home::', prefix: '/pre', middlewares: [ m1, m2 ] }, router => {
// router-path: /pre/test, middlewares: m1, m2
router.get('/get', controller.home.get);
// router-path: /pre/test2, middlewares: m1, m2
router.get('/test', controller.home.test).get('/test2', controller.home.test);
// router-name: home::post, router-path: /pre/post, middlewares: m1, m2, m3
router.post('post', '/post', m3, controller.home.post);

// others
router.all('/test', controller.home.all1);
router.all('testname', '/test2', controller.home.all2);
Expand All @@ -85,10 +86,18 @@ module.exports = app => {
// 设置单个属性
router.group({ name: 'home::' }, router => {
// router-path: /test
router.get('/get', controller.home.get);
router.get('/test', controller.home.test);
// router-name: home::post, router-path: /post
router.post('post', '/post', controller.home.post);
});

// group 同样支持链式操作
router.group({ name: 'home::', prefix: '/pre', middlewares: [ m1, m2 ] }, router => {
// router-path: /pre/test, middlewares: m1, m2
// router-path: /pre/test2, middlewares: m1, m2 ⚠️这里🈶️group 设置的属性哦
router.get('/test', controller.home.test).get('/test2', controller.home.test);
})
.get('/test3', controller.home.test); // router-path: /test3 ⚠️这里🈚group 设置的属性哦
};
```

Expand Down Expand Up @@ -152,14 +161,16 @@ module.exports = app => {
router.get('/test_g3', m2, controller.group.g1);

// router-path: /pre1/pre2/test_g4/:id, middlewares: m1, m2
router.post('/test_g4/:id', controller.group.g2);
// router-path: /pre1/pre2/test_g4_1/:id, middlewares: m1, m2
router.post('/test_g4/:id', controller.group.g2).get('/test_g4_1', controller.group.g2);

router.group({ name: 'home2::' }, router => {
// router-name: home1::home2::name_g6, router-path: /pre1/pre2/test_g6/:id, middlewares: m1, m2
router.post('name_g6', '/test_g6/:id', controller.group.g2);
// ...
});
});
})
.get('/test_g2_1', controller.group.g1); // router-path: /pre1/test_g2_1, middlewares: m1
});
```

Expand Down
20 changes: 20 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Router, Context } from 'egg';
import { IMiddleware } from 'koa-router'

interface RouterGroupOptions {
name?: string;
prefix?: string;
middlewares?: IMiddleware<any, Context> | IMiddleware<any, Context>[];
}

type groupFunction = (router: RouterGroup) => void;

interface RouterGroup extends Router {
group(options: RouterGroupOptions, cb: groupFunction): RouterGroup;
}

declare module 'egg' {
interface Application {
router: RouterGroup;
}
}
18 changes: 12 additions & 6 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,20 @@ class Router {
const funcTarget = target[property];
// group 递归
if (property === 'group') {
return groupProxy(funcTarget, name, prefix, middlewares);
return groupProxy(funcTarget, name, prefix, middlewares, proxy);
}

if (!methods.includes(property) || (name === '' && prefix === '' && middlewares.length === 0)) {
return funcTarget;
}

return funcProxy(funcTarget, name, prefix, middlewares);
return funcProxy(funcTarget, name, prefix, middlewares, proxy);
},
});

cb(proxy);

return this.app.router;
}
}

Expand All @@ -60,9 +62,10 @@ module.exports = Router;
* @param {String} name 路由别名前缀
* @param {String} prefix 路由前缀
* @param {Function/Array} middlewares 中间件
* @param {Object} proxy 路由
* @return {Object} return router.verb Proxy
*/
function funcProxy(funcTarget, name, prefix, middlewares) {
function funcProxy(funcTarget, name, prefix, middlewares, proxy) {
return new Proxy(funcTarget, {
apply(target, ctx, args) {
// egg-core\lib\utils\router.js#spliteAndResolveRouterParams()
Expand All @@ -83,7 +86,8 @@ function funcProxy(funcTarget, name, prefix, middlewares) {

// return target.apply(ctx, args);
// es6 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
return Reflect.apply(target, ctx, args);
Reflect.apply(target, ctx, args);
return proxy;
},
});
}
Expand All @@ -94,9 +98,10 @@ function funcProxy(funcTarget, name, prefix, middlewares) {
* @param {String} name 路由别名前缀
* @param {String} prefix 路由前缀
* @param {Function/Array} middlewares 中间件
* @param {Object} proxy 路由
* @return {Object} return router.verb Proxy
*/
function groupProxy(funcTarget, name, prefix, middlewares) {
function groupProxy(funcTarget, name, prefix, middlewares, proxy) {
return new Proxy(funcTarget, {
apply(target, ctx, args) {
if ('name' in args[0]) {
Expand All @@ -120,7 +125,8 @@ function groupProxy(funcTarget, name, prefix, middlewares) {
prefix,
middlewares,
};
return Reflect.apply(target, ctx, args);
Reflect.apply(target, ctx, args);
return proxy;
},
});
}
Expand Down
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "egg-router-group",
"version": "1.0.4",
"version": "1.1.0",
"description": "have the ability to route group operations for eggjs (使eggjs具有路由群组操作的能力)",
"eggPlugin": {
"name": "routerGroup"
Expand Down Expand Up @@ -41,7 +41,8 @@
"files": [
"config",
"app.js",
"lib"
"lib",
"index.d.ts"
],
"ci": {
"version": "8, 9"
Expand All @@ -55,5 +56,6 @@
},
"homepage": "https://github.com/zzzs/egg-router-group#readme",
"author": "xl",
"license": "MIT"
"license": "MIT",
"types": "index.d.ts"
}
9 changes: 5 additions & 4 deletions test/fixtures/apps/router-group-test/app/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ module.exports = app => {
router.group({ name: 'home::', prefix: '/pre', middlewares: m1 }, router => {
router.all('/test', controller.home.all1);
router.all('testname', '/test2', controller.home.all2);
router.get('/get', controller.home.get);
router.get('/get', controller.home.get).get('/get2', controller.home.get);
router.post('/post', controller.home.post);
router.put('/put', controller.home.put);
router.delete('/delete', controller.home.delete);
Expand All @@ -20,7 +20,7 @@ module.exports = app => {
router.patch('/patch', controller.home.patch);
router.redirect('/redirect', '/');
router.redirect('/redirect2', 'home::testname', 302);
});
}).get('/get3', m2, controller.home.get);

// resources
// https://eggjs.org/zh-cn/basics/router.html
Expand Down Expand Up @@ -60,10 +60,11 @@ module.exports = app => {
router.post('/test_g4/:id', controller.group.g2);

router.group({ name: 'home2::' }, router => {
router.get('/test_g5', m2, controller.group.g1);
router.get('/test_g5', m2, controller.group.g1).get('/test_g5_1', controller.group.g1);
router.post('name_g6', '/test_g6/:id', controller.group.g2);
});
});
})
.get('/test_g2_1', controller.group.g1);
});

router.group({ name: 'home1::', prefix: '/pre1' }, router => {
Expand Down
33 changes: 33 additions & 0 deletions test/router-group.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,22 @@ describe('test/router-group.test.js', () => {
.expect(200);
});

it('should GET /pre/get2', () => {
return app.httpRequest()
.get('/pre/get2')
.expect('h-m1', 'h-m1-value')
.expect('body: get')
.expect(200);
});

it('should GET /get3', () => {
return app.httpRequest()
.get('/get3')
.expect('h-m2', 'h-m2-value')
.expect('body: get')
.expect(200);
});

it('should POST /pre/post', () => {
return app.httpRequest()
.post('/pre/post')
Expand Down Expand Up @@ -398,6 +414,14 @@ describe('test/router-group.test.js', () => {
.expect(200);
});

it('should GET /pre1/test_g2_1', () => {
return app.httpRequest()
.get('/pre1/test_g2_1')
.expect('h-m1', 'h-m1-value')
.expect('h-key', 'value')
.expect(200);
});

it('should POST /pre1/pre2/test_g4', () => {
return app.httpRequest()
.post('/pre1/pre2/test_g4/123')
Expand All @@ -417,6 +441,15 @@ describe('test/router-group.test.js', () => {
.expect(200);
});

it('should GET /pre1/pre2/test_g5_1', () => {
return app.httpRequest()
.get('/pre1/pre2/test_g5_1')
.expect('h-m1', 'h-m1-value')
.expect('h-m2', 'h-m2-value')
.expect('h-key', 'value')
.expect(200);
});

it('should POST /pre1/pre2/test_g6', () => {
return app.httpRequest()
.post('/pre1/pre2/test_g6/123')
Expand Down

0 comments on commit bb7166f

Please sign in to comment.