/
index.js
115 lines (96 loc) · 2.93 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const allMethodsList = require('methods');
module.exports = express=>{
express.application.info = info;
express.application.getInfo = getInfo;
express.Router.info = info;
express.Router.getInfo = getInfo;
};
function info(path, info){
if(this.lazyrouter){
this.lazyrouter();
this._router.info(path, info);
return;
}
this.methodsInfo = this.methodsInfo || [];
this.methodsInfo.push({path: path, info: info});
}
function getInfo(onlyThisLevel){
let router = this;
if(this._router){
router = this._router;
}
let mapStack = (router, fullpath)=>{
let methods = [];
let methodsInfo = [];
let stackInfo = [];
router.stack.forEach(stack=>{
let stackPath = stack.regexp.toString().replace('\\/?', '').replace('(?=\\/|$)', '$').match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//)[1].replace(/\\(.)/g, '$1');
if(stackPath == '' && router.path){
stackPath = router.path;
}
let path = fullpath.concat(stackPath.split('/'));
if(!onlyThisLevel && stack.name == 'router' && stack.handle && stack.handle.stack){
stackInfo = stackInfo.concat(mapStack(stack.handle, path));
}
else if(!onlyThisLevel && stack.route){
methods = methods.concat(mapStack(stack.route, fullpath).map(method=>{
return (method.info && method.info.method ? method.info.method + '||>>>' : '') + method.path;
}));
}
else{
if(stackPath != ''){
methods.push((stack.method ? stack.method + '||>>>' : '') + path.join('/').replace(/\/\//g, '/'));
}
}
});
(router.methodsInfo || []).map(method=>{
let infoPath = fullpath.concat(method.path.split('/')).join('/').replace(/\/\//g, '/');
let path = infoPath;
let match = false;
if(method.info && method.info.method){
path = method.info.method + '||>>>' + path;
if(method.info.method == 'all'){
allMethodsList.map(m=>{
let index = methods.indexOf(m + '||>>>' + infoPath);
if(index > -1){
match = true;
methods.splice(index, 1);
}
});
}
}
let index = methods.indexOf(path);
if(index > -1){
match = true;
methods.splice(index, 1);
}
methodsInfo.push({
path: infoPath,
type: 'info',
methodMatch: match,
info: method.info
});
});
if(methods.length){
methods.forEach(path=>{
let method = null;
if(path.indexOf('||>>>') > -1){
[method, path] = path.split('||>>>');
}
let info = {
path: path,
type: 'method'
}
if(method){
info.info = {
method: method
};
}
methodsInfo.push(info);
});
}
methodsInfo = methodsInfo.concat(stackInfo);
return methodsInfo;
};
return mapStack(router, [])
}