Skip to content

Commit 841bc91

Browse files
committed
feat: add new feature to match analyzed route in-property accessing of route properties
1 parent e1dabac commit 841bc91

File tree

4 files changed

+154
-6
lines changed

4 files changed

+154
-6
lines changed

src/extractors/scopes.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
export default (line: string): string[] => {
2+
const matches = [];
3+
const cases = {
4+
SCOPE: 0,
5+
CURVE_SCOPE: 0,
6+
QUOTE: 0,
7+
TRAILING: 0,
8+
ENDLINES: 0,
9+
DOTS: 0,
10+
COMMAS: 0
11+
};
12+
13+
let rebuild = '';
14+
for (const char of line) {
15+
switch (char) {
16+
case '(': {
17+
cases.SCOPE++;
18+
19+
rebuild += char;
20+
break;
21+
}
22+
case "'":
23+
case '"': {
24+
cases.QUOTE++;
25+
26+
rebuild += char;
27+
break;
28+
}
29+
case '{': {
30+
cases.CURVE_SCOPE++;
31+
32+
rebuild += char;
33+
break;
34+
}
35+
case ')': {
36+
if (cases.SCOPE > 0) {
37+
cases.SCOPE++;
38+
rebuild += char;
39+
} else {
40+
// rebuild = '';
41+
}
42+
break;
43+
}
44+
case '}': {
45+
if (cases.CURVE_SCOPE > 0) {
46+
cases.CURVE_SCOPE++;
47+
48+
if (rebuild.length > 0) {
49+
matches.push(rebuild);
50+
rebuild = '';
51+
}
52+
}
53+
break;
54+
}
55+
case ':':
56+
case '=': {
57+
cases.ENDLINES++;
58+
59+
if (rebuild.length > 0) {
60+
matches.push(rebuild);
61+
rebuild = '';
62+
}
63+
break;
64+
}
65+
case '.': {
66+
cases.DOTS++;
67+
68+
if (rebuild.length > 0) {
69+
matches.push(rebuild);
70+
rebuild = '';
71+
}
72+
break;
73+
}
74+
case ',': {
75+
cases.COMMAS++;
76+
77+
if (rebuild.length > 0) {
78+
matches.push(rebuild);
79+
rebuild = '';
80+
}
81+
break;
82+
}
83+
case ' ': {
84+
break;
85+
}
86+
case ';': {
87+
if (cases.ENDLINES > 0) {
88+
cases.ENDLINES++;
89+
90+
if (rebuild.length > 0) {
91+
matches.push(rebuild);
92+
rebuild = '';
93+
}
94+
}
95+
break;
96+
}
97+
default: {
98+
rebuild += char;
99+
100+
break;
101+
}
102+
}
103+
}
104+
if (rebuild.length > 0) {
105+
matches.push(rebuild);
106+
}
107+
108+
return matches;
109+
};

src/finders/request/index.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { IBlock } from '../../../types/interfaces';
2+
import scopeExtractor from '../../extractors/scopes';
23
import requestModeBodyFinder from './body';
34
import requestModeCookiesFinder from './cookies';
45
import requestModeHeadersFinder from './headers';
@@ -10,13 +11,29 @@ export default function caseRequestModeFinder(
1011
line: string,
1112
index: number
1213
): IBlock | null | undefined {
13-
const requestPropertyCaseFindMatch = line.match(/req.(.*)?(;|\.|\()/);
14+
const requestPropertyCaseFindMatch = line.match(
15+
/(request|req).(.*)?(;|\.|\()/
16+
);
17+
1418
let res = null;
19+
let input;
1520
let _;
1621
let _key;
22+
let _skey;
1723

1824
if (requestPropertyCaseFindMatch) {
19-
[_, _key] = requestPropertyCaseFindMatch;
25+
[input] = requestPropertyCaseFindMatch;
26+
[_, _key, _skey] = scopeExtractor(input);
27+
28+
if (_skey) {
29+
return {
30+
link: _skey,
31+
linked: false,
32+
line_index: index,
33+
key: _skey,
34+
mode: _key as any
35+
};
36+
}
2037

2138
// Headers matching
2239
res = requestModeHeadersFinder(_, _key, line, index);
@@ -38,6 +55,7 @@ export default function caseRequestModeFinder(
3855

3956
// Params matching
4057
res = requestModeParamsFinder(_, _key, line, index);
58+
4159
if (res !== undefined) {
4260
if (res !== null) {
4361
res.mode = 'params';
@@ -73,9 +91,11 @@ export default function caseRequestModeFinder(
7391
}
7492
} else {
7593
// Method matching
94+
const reqIndex = line.indexOf('req');
95+
const requestIndex = line.indexOf('request');
7696
res = requestMethodFinder(
7797
_ as unknown as string,
78-
line.substr(line.indexOf('req')),
98+
line.substr(requestIndex !== -1 ? requestIndex : reqIndex),
7999
line,
80100
index
81101
);

src/finders/request/property.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ export default function requestMethodFinder(
1515
return undefined;
1616
}
1717

18-
if (extracted[2].includes('req.') && !extracted[2].includes('()')) {
18+
if (
19+
(extracted[2].includes('req.') || extracted[2].includes('request.')) &&
20+
!extracted[2].includes('()')
21+
) {
1922
return {
2023
link: extracted[1],
2124
linked: false,
@@ -27,7 +30,10 @@ export default function requestMethodFinder(
2730
// uWebSockets.js has native `getMethod` and `getUrl` support
2831
return undefined;
2932
}
30-
if (_key === 'req;' && extracted[1].charAt(0) === '{') {
33+
if (
34+
(_key === 'req;' || _key === 'request;') &&
35+
extracted[1].charAt(0) === '{'
36+
) {
3137
key = extracted[1].substr(1);
3238
key = key.substr(0, key.length - 1).trim();
3339
link = key;
@@ -43,7 +49,7 @@ export default function requestMethodFinder(
4349
key
4450
};
4551
}
46-
if (_key.endsWith('req')) {
52+
if (_key.endsWith('req') || _key.endsWith('request')) {
4753
return {
4854
link: extracted[1],
4955
linked: false,

tests/analyze.spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,19 @@ describe('request property parse', () => {
260260
mode: 'params'
261261
}
262262
]);
263+
expect(
264+
analyze((request, response) => {
265+
response.end(request.params.id);
266+
})
267+
).toEqual([
268+
{
269+
key: 'id',
270+
line_index: 1,
271+
link: 'id',
272+
linked: false,
273+
mode: 'params'
274+
}
275+
]);
263276
});
264277
it('req.query', () => {
265278
expect(

0 commit comments

Comments
 (0)