fg-tracker-mcp 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +14 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/docs.js +2 -0
- package/dist/docs.js.map +1 -1
- package/dist/infra/tools.js +10 -1
- package/dist/infra/tools.js.map +1 -1
- package/dist/loadtest/routes.d.ts +52 -0
- package/dist/loadtest/routes.js +370 -0
- package/dist/loadtest/routes.js.map +1 -0
- package/dist/loadtest/scenario.d.ts +334 -0
- package/dist/loadtest/scenario.js +501 -0
- package/dist/loadtest/scenario.js.map +1 -0
- package/dist/loadtest/tools.d.ts +128 -0
- package/dist/loadtest/tools.js +378 -0
- package/dist/loadtest/tools.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +32 -6
- package/dist/server.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Varredura estática (somente leitura, regex) de rotas HTTP do repositório para montar roteiros de
|
|
3
|
+
* carga (CONTRATO.md §28.8): controllers NestJS, Express/Fastify/Router, Next.js (app router e
|
|
4
|
+
* pages/api) e pistas de autenticação (login/refresh, JWT, cookie, provedores externos).
|
|
5
|
+
*/
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { isSourceFile, isTestFile, lineOf, matchParen, readText, walkFiles } from '../infra/files.js';
|
|
8
|
+
import { EXTERNAL_EFFECT_RE } from './scenario.js';
|
|
9
|
+
const NEST_METHODS = { Get: 'GET', Post: 'POST', Put: 'PUT', Patch: 'PATCH', Delete: 'DELETE', Head: 'HEAD', Options: 'OPTIONS', All: 'ALL' };
|
|
10
|
+
const EXPRESS_RECEIVER = /^(app|router|api|server|fastify|routes?|\w+Router|\w+Routes|\w+App)$/;
|
|
11
|
+
const GUARD_WORDS = /auth|jwt|protect|requireUser|requireLogin|ensureLogged|isLogged|passport\.authenticate|verifyToken|session|guard/i;
|
|
12
|
+
const NEXT_GUARD = /getServerSession|\bauth\(\)|getToken\(|currentUser\(|clerk|verify(Jwt|Token)|jwtVerify|cookies\(\)\.get\(|headers\(\)\.get\(\s*['"]authorization/i;
|
|
13
|
+
function normalizePath(...parts) {
|
|
14
|
+
const joined = parts
|
|
15
|
+
.filter((p) => Boolean(p))
|
|
16
|
+
.flatMap((p) => p.split('/'))
|
|
17
|
+
.filter(Boolean)
|
|
18
|
+
.join('/');
|
|
19
|
+
return `/${joined}`;
|
|
20
|
+
}
|
|
21
|
+
function stringLiteral(src) {
|
|
22
|
+
const m = src.trim().match(/^(['"`])([^'"`]*)\1/);
|
|
23
|
+
return m ? (m[2] ?? '') : null;
|
|
24
|
+
}
|
|
25
|
+
/** Argumento de `@Controller(...)`: string, `{ path: 'x' }` ou vazio. */
|
|
26
|
+
function controllerPath(args) {
|
|
27
|
+
const lit = stringLiteral(args);
|
|
28
|
+
if (lit !== null)
|
|
29
|
+
return lit;
|
|
30
|
+
const obj = args.match(/path\s*:\s*(['"`])([^'"`]*)\1/);
|
|
31
|
+
if (obj)
|
|
32
|
+
return obj[2] ?? '';
|
|
33
|
+
const arr = args.match(/^\s*\[\s*(['"`])([^'"`]*)\1/);
|
|
34
|
+
return arr ? (arr[2] ?? '') : '';
|
|
35
|
+
}
|
|
36
|
+
function isExternal(path) {
|
|
37
|
+
return EXTERNAL_EFFECT_RE.test(path);
|
|
38
|
+
}
|
|
39
|
+
function skipDecorators(content, pos) {
|
|
40
|
+
const names = [];
|
|
41
|
+
let i = pos;
|
|
42
|
+
for (;;) {
|
|
43
|
+
const ws = content.slice(i).match(/^\s*/);
|
|
44
|
+
i += ws ? ws[0].length : 0;
|
|
45
|
+
const dec = content.slice(i).match(/^@([\w.]+)/);
|
|
46
|
+
if (!dec)
|
|
47
|
+
break;
|
|
48
|
+
names.push(dec[1] ?? '');
|
|
49
|
+
i += dec[0].length;
|
|
50
|
+
if (content[i] === '(') {
|
|
51
|
+
const close = matchParen(content, i);
|
|
52
|
+
if (close < 0)
|
|
53
|
+
break;
|
|
54
|
+
i = close + 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { pos: i, names };
|
|
58
|
+
}
|
|
59
|
+
function scanNest(file, content, globalPrefix, out) {
|
|
60
|
+
const ctrlRe = /@Controller\s*\(/g;
|
|
61
|
+
const controllers = [];
|
|
62
|
+
for (let m = ctrlRe.exec(content); m; m = ctrlRe.exec(content)) {
|
|
63
|
+
const open = m.index + m[0].length - 1;
|
|
64
|
+
const close = matchParen(content, open);
|
|
65
|
+
if (close < 0)
|
|
66
|
+
continue;
|
|
67
|
+
const after = skipDecorators(content, close + 1);
|
|
68
|
+
const cls = content.slice(after.pos).match(/^(?:export\s+)?(?:default\s+)?(?:abstract\s+)?class\s+(\w+)/);
|
|
69
|
+
// decorators antes de @Controller (até o fim do statement anterior)
|
|
70
|
+
const before = content.slice(Math.max(0, content.lastIndexOf(';', m.index) + 1, content.lastIndexOf('}', m.index) + 1), m.index);
|
|
71
|
+
const decos = [...before.matchAll(/@([\w.]+)/g)].map((d) => d[1] ?? '').concat(after.names);
|
|
72
|
+
const guarded = decos.some((d) => /^Public$|^SkipAuth$|^AllowAnonymous$/i.test(d)) ? false : decos.some((d) => /UseGuards|^Auth$|Authenticated|Roles|ApiBearerAuth/.test(d)) ? true : null;
|
|
73
|
+
controllers.push({ index: m.index, path: controllerPath(content.slice(open + 1, close)), className: cls?.[1] ?? null, guarded, bodyStart: after.pos });
|
|
74
|
+
}
|
|
75
|
+
controllers.forEach((ctrl, ci) => {
|
|
76
|
+
const end = controllers[ci + 1]?.index ?? content.length;
|
|
77
|
+
const region = content.slice(ctrl.bodyStart, end);
|
|
78
|
+
const methodRe = /@(Get|Post|Put|Patch|Delete|Head|Options|All)\s*\(/g;
|
|
79
|
+
let lastEnd = 0;
|
|
80
|
+
for (let m = methodRe.exec(region); m; m = methodRe.exec(region)) {
|
|
81
|
+
const absOpen = ctrl.bodyStart + m.index + m[0].length - 1;
|
|
82
|
+
const absClose = matchParen(content, absOpen);
|
|
83
|
+
if (absClose < 0)
|
|
84
|
+
continue;
|
|
85
|
+
const routePath = stringLiteral(content.slice(absOpen + 1, absClose)) ?? '';
|
|
86
|
+
const after = skipDecorators(content, absClose + 1);
|
|
87
|
+
const sig = content.slice(after.pos).match(/^(?:(?:public|private|protected|static|async|override)\s+)*(\w+)\s*(?:<[^>]*>)?\s*\(/);
|
|
88
|
+
let handler = null;
|
|
89
|
+
let dto = null;
|
|
90
|
+
let paramsEnd = absClose;
|
|
91
|
+
if (sig) {
|
|
92
|
+
handler = sig[1] ?? null;
|
|
93
|
+
const pOpen = after.pos + sig[0].length - 1;
|
|
94
|
+
const pClose = matchParen(content, pOpen);
|
|
95
|
+
if (pClose > 0) {
|
|
96
|
+
paramsEnd = pClose;
|
|
97
|
+
const params = content.slice(pOpen + 1, pClose);
|
|
98
|
+
const body = params.match(/@Body\s*\([^)]*\)\s*(?:\w+)\s*[?]?\s*:\s*([A-Z][\w]*)/);
|
|
99
|
+
const query = params.match(/@Query\s*\(\s*\)\s*(?:\w+)\s*[?]?\s*:\s*([A-Z][\w]*)/);
|
|
100
|
+
dto = body?.[1] ?? query?.[1] ?? null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const window = region.slice(lastEnd, m.index) + content.slice(absClose + 1, after.pos);
|
|
104
|
+
lastEnd = paramsEnd - ctrl.bodyStart;
|
|
105
|
+
let guarded = ctrl.guarded;
|
|
106
|
+
if (/@(Public|SkipAuth|AllowAnonymous)\b/.test(window))
|
|
107
|
+
guarded = false;
|
|
108
|
+
else if (/@(UseGuards|Auth|Roles|ApiBearerAuth)\b/.test(window))
|
|
109
|
+
guarded = true;
|
|
110
|
+
const path = normalizePath(globalPrefix, ctrl.path, routePath);
|
|
111
|
+
out.push({
|
|
112
|
+
method: NEST_METHODS[m[1] ?? ''] ?? 'GET',
|
|
113
|
+
path,
|
|
114
|
+
file,
|
|
115
|
+
line: lineOf(content, ctrl.bodyStart + m.index),
|
|
116
|
+
framework: 'nestjs',
|
|
117
|
+
controller: ctrl.className,
|
|
118
|
+
handler,
|
|
119
|
+
dto,
|
|
120
|
+
guarded,
|
|
121
|
+
externalEffect: isExternal(path),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function scanExpress(file, content, out) {
|
|
127
|
+
const re = /\b([A-Za-z_$][\w$]*)\s*\.\s*(get|post|put|patch|delete|all|head|options)\s*\(\s*(['"`])(\/[^'"`]*)\3/g;
|
|
128
|
+
for (let m = re.exec(content); m; m = re.exec(content)) {
|
|
129
|
+
if (!EXPRESS_RECEIVER.test(m[1] ?? ''))
|
|
130
|
+
continue;
|
|
131
|
+
const open = content.indexOf('(', m.index + (m[1] ?? '').length);
|
|
132
|
+
const close = matchParen(content, open);
|
|
133
|
+
const args = close > 0 ? content.slice(open + 1, close) : '';
|
|
134
|
+
const rest = args.slice(args.indexOf(m[4] ?? '') + (m[4] ?? '').length + 1);
|
|
135
|
+
const middlewares = rest.split(/=>|function\s*\(|async\s*\(/)[0] ?? '';
|
|
136
|
+
const path = m[4] ?? '/';
|
|
137
|
+
out.push({ method: (m[2] ?? 'get').toUpperCase(), path, file, line: lineOf(content, m.index), framework: 'express', controller: null, handler: null, dto: null, guarded: GUARD_WORDS.test(middlewares) ? true : null, externalEffect: isExternal(path) });
|
|
138
|
+
}
|
|
139
|
+
// router.route('/x').get(...).post(...)
|
|
140
|
+
const routeRe = /\b([A-Za-z_$][\w$]*)\s*\.\s*route\s*\(\s*(['"`])(\/[^'"`]*)\2\s*\)/g;
|
|
141
|
+
for (let m = routeRe.exec(content); m; m = routeRe.exec(content)) {
|
|
142
|
+
if (!EXPRESS_RECEIVER.test(m[1] ?? ''))
|
|
143
|
+
continue;
|
|
144
|
+
let i = m.index + m[0].length;
|
|
145
|
+
for (;;) {
|
|
146
|
+
const chained = content.slice(i).match(/^\s*\.\s*(get|post|put|patch|delete|all)\s*\(/);
|
|
147
|
+
if (!chained)
|
|
148
|
+
break;
|
|
149
|
+
const open = i + chained[0].length - 1;
|
|
150
|
+
const close = matchParen(content, open);
|
|
151
|
+
const path = m[3] ?? '/';
|
|
152
|
+
const args = close > 0 ? content.slice(open + 1, close) : '';
|
|
153
|
+
out.push({ method: (chained[1] ?? 'get').toUpperCase(), path, file, line: lineOf(content, i), framework: 'express', controller: null, handler: null, dto: null, guarded: GUARD_WORDS.test(args.split(/=>|function\s*\(/)[0] ?? '') ? true : null, externalEffect: isExternal(path) });
|
|
154
|
+
if (close < 0)
|
|
155
|
+
break;
|
|
156
|
+
i = close + 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function nextSegments(rel) {
|
|
161
|
+
return rel
|
|
162
|
+
.split('/')
|
|
163
|
+
.filter((seg) => seg && !/^\(.*\)$/.test(seg) && !seg.startsWith('@'))
|
|
164
|
+
.map((seg) => seg.replace(/^\[\[\.\.\.(\w+)\]\]$/, ':$1*?').replace(/^\[\.\.\.(\w+)\]$/, ':$1*').replace(/^\[(\w+)\]$/, ':$1'))
|
|
165
|
+
.join('/');
|
|
166
|
+
}
|
|
167
|
+
function scanNextApp(file, content, out) {
|
|
168
|
+
const m = file.match(/(?:^|\/)app\/(.*?)\/?route\.(?:ts|js|mjs|tsx|jsx)$/);
|
|
169
|
+
if (!m)
|
|
170
|
+
return;
|
|
171
|
+
const path = normalizePath(nextSegments(m[1] ?? ''));
|
|
172
|
+
const guarded = NEXT_GUARD.test(content) ? true : null;
|
|
173
|
+
const re = /export\s+(?:async\s+)?function\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\b|export\s+const\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s*=|\bas\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\b/g;
|
|
174
|
+
for (let x = re.exec(content); x; x = re.exec(content)) {
|
|
175
|
+
const method = x[1] ?? x[2] ?? x[3] ?? 'GET';
|
|
176
|
+
out.push({ method, path, file, line: lineOf(content, x.index), framework: 'nextjs-app', controller: null, handler: method, dto: null, guarded, externalEffect: isExternal(path) });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function scanNextPages(file, content, out) {
|
|
180
|
+
const m = file.match(/(?:^|\/)pages\/(api\/.*?)(?:\/index)?\.(?:ts|js|mjs|tsx|jsx)$/);
|
|
181
|
+
if (!m || !/export\s+default/.test(content))
|
|
182
|
+
return;
|
|
183
|
+
const path = normalizePath(nextSegments(m[1] ?? ''));
|
|
184
|
+
const methods = [...new Set([...content.matchAll(/method\s*===?\s*['"](GET|POST|PUT|PATCH|DELETE)['"]/g)].map((x) => x[1] ?? 'GET'))];
|
|
185
|
+
const guarded = NEXT_GUARD.test(content) ? true : null;
|
|
186
|
+
for (const method of methods.length ? methods : ['ALL']) {
|
|
187
|
+
out.push({ method, path, file, line: 1, framework: 'nextjs-pages', controller: null, handler: 'default', dto: null, guarded, externalEffect: isExternal(path) });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function matchBrace(content, openIndex) {
|
|
191
|
+
let depth = 0;
|
|
192
|
+
for (let i = openIndex; i < content.length; i++) {
|
|
193
|
+
const c = content[i];
|
|
194
|
+
if (c === '{')
|
|
195
|
+
depth++;
|
|
196
|
+
else if (c === '}') {
|
|
197
|
+
depth--;
|
|
198
|
+
if (depth === 0)
|
|
199
|
+
return i;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return -1;
|
|
203
|
+
}
|
|
204
|
+
function scanDtos(file, content, out) {
|
|
205
|
+
const re = /(?:export\s+)?class\s+(\w+(?:Dto|DTO|Input|Request|Body|Payload))\b[^{]*\{/g;
|
|
206
|
+
for (let m = re.exec(content); m; m = re.exec(content)) {
|
|
207
|
+
const open = m.index + m[0].length - 1;
|
|
208
|
+
const close = matchBrace(content, open);
|
|
209
|
+
if (close < 0)
|
|
210
|
+
continue;
|
|
211
|
+
const body = content.slice(open + 1, close);
|
|
212
|
+
const fields = [...new Set([...body.matchAll(/^\s*(?:readonly\s+|public\s+)?(\w+)\s*[?!]?\s*:\s*[^;\n(]+[;\n]/gm)].map((f) => f[1] ?? '').filter(Boolean))];
|
|
213
|
+
out.push({ name: m[1] ?? '', file, line: lineOf(content, m.index), fields: fields.slice(0, 40) });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const LOGIN_RE = /(^|\/)(login|signin|sign-in|log-in|authenticate|sessions?|oauth\/token|auth\/token|token)(\/|$)/i;
|
|
217
|
+
const REFRESH_RE = /refresh/i;
|
|
218
|
+
const SIGNUP_RE = /(^|\/)(register|signup|sign-up)(\/|$)/i;
|
|
219
|
+
const LOGOUT_RE = /(^|\/)(logout|signout|sign-out|log-out)(\/|$)/i;
|
|
220
|
+
const MECHANISMS = [
|
|
221
|
+
['jwt', /jsonwebtoken|@nestjs\/jwt|passport-jwt|\bjose\b|jwtVerify|JwtService|Bearer\s/],
|
|
222
|
+
['cookie', /cookie-parser|res\.cookie\(|cookies\(\)\.set|set-cookie|httpOnly\s*:/i],
|
|
223
|
+
['session', /express-session|@fastify\/session|iron-session|req\.session\b/],
|
|
224
|
+
['api-key', /x-api-key|apiKey\s*header|ApiKeyGuard/i],
|
|
225
|
+
];
|
|
226
|
+
const PROVIDERS = [
|
|
227
|
+
['next-auth', /from\s+['"](next-auth|@auth\/)/],
|
|
228
|
+
['clerk', /from\s+['"]@clerk\//],
|
|
229
|
+
['cognito', /amazon-cognito|@aws-sdk\/client-cognito|aws-amplify/],
|
|
230
|
+
['supabase', /from\s+['"]@supabase\//],
|
|
231
|
+
['firebase', /firebase-admin|firebase\/auth/],
|
|
232
|
+
['auth0', /auth0/i],
|
|
233
|
+
['better-auth', /better-auth/],
|
|
234
|
+
['lucia', /from\s+['"]lucia['"]/],
|
|
235
|
+
];
|
|
236
|
+
export async function scanRoutes(root, options = {}) {
|
|
237
|
+
const { files, truncated } = await walkFiles(root, { maxFiles: options.maxFiles ?? 8000 });
|
|
238
|
+
const sources = files.filter((f) => isSourceFile(f) && !isTestFile(f));
|
|
239
|
+
const routes = [];
|
|
240
|
+
const dtos = [];
|
|
241
|
+
const warnings = [];
|
|
242
|
+
const mechanisms = new Set();
|
|
243
|
+
const providers = new Set();
|
|
244
|
+
const tokenFields = new Set();
|
|
245
|
+
const evidence = [];
|
|
246
|
+
let globalGuard = false;
|
|
247
|
+
let globalPrefix = null;
|
|
248
|
+
const contents = new Map();
|
|
249
|
+
for (const file of sources) {
|
|
250
|
+
const content = await readText(join(root, file));
|
|
251
|
+
if (content === null)
|
|
252
|
+
continue;
|
|
253
|
+
contents.set(file, content);
|
|
254
|
+
const prefix = content.match(/setGlobalPrefix\s*\(\s*(['"`])([^'"`]+)\1/);
|
|
255
|
+
if (prefix && globalPrefix === null) {
|
|
256
|
+
globalPrefix = prefix[2] ?? null;
|
|
257
|
+
evidence.push(`${file}:${lineOf(content, prefix.index ?? 0)} setGlobalPrefix('${globalPrefix}')`);
|
|
258
|
+
}
|
|
259
|
+
if (/provide\s*:\s*APP_GUARD/.test(content)) {
|
|
260
|
+
globalGuard = true;
|
|
261
|
+
evidence.push(`${file}:${lineOf(content, content.search(/provide\s*:\s*APP_GUARD/))} guard global (APP_GUARD)`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
for (const [file, content] of contents) {
|
|
265
|
+
if (/@Controller\s*\(/.test(content))
|
|
266
|
+
scanNest(file, content, globalPrefix, routes);
|
|
267
|
+
if (/\.\s*(get|post|put|patch|delete|all|route)\s*\(/.test(content))
|
|
268
|
+
scanExpress(file, content, routes);
|
|
269
|
+
if (/(?:^|\/)route\.(?:ts|js|mjs|tsx|jsx)$/.test(file))
|
|
270
|
+
scanNextApp(file, content, routes);
|
|
271
|
+
if (/(?:^|\/)pages\/api\//.test(file))
|
|
272
|
+
scanNextPages(file, content, routes);
|
|
273
|
+
if (/class\s+\w+(Dto|DTO|Input|Request|Body|Payload)\b/.test(content))
|
|
274
|
+
scanDtos(file, content, dtos);
|
|
275
|
+
for (const [name, re] of MECHANISMS)
|
|
276
|
+
if (re.test(content))
|
|
277
|
+
mechanisms.add(name);
|
|
278
|
+
for (const [name, re] of PROVIDERS)
|
|
279
|
+
if (re.test(content))
|
|
280
|
+
providers.add(name);
|
|
281
|
+
}
|
|
282
|
+
// Guard global: rotas Nest sem marcação explícita provavelmente exigem auth.
|
|
283
|
+
if (globalGuard)
|
|
284
|
+
for (const r of routes)
|
|
285
|
+
if (r.framework === 'nestjs' && r.guarded === null)
|
|
286
|
+
r.guarded = true;
|
|
287
|
+
const seen = new Set();
|
|
288
|
+
const unique = routes.filter((r) => {
|
|
289
|
+
const key = `${r.method} ${r.path} ${r.file}:${r.line}`;
|
|
290
|
+
if (seen.has(key))
|
|
291
|
+
return false;
|
|
292
|
+
seen.add(key);
|
|
293
|
+
return true;
|
|
294
|
+
});
|
|
295
|
+
const describe = (r) => `${r.method} ${r.path} (${r.file}:${r.line}${r.dto ? `, ${r.dto}` : ''})`;
|
|
296
|
+
const loginRoutes = unique.filter((r) => r.method !== 'GET' && LOGIN_RE.test(r.path) && !REFRESH_RE.test(r.path) && !LOGOUT_RE.test(r.path));
|
|
297
|
+
for (const r of loginRoutes) {
|
|
298
|
+
const content = contents.get(r.file) ?? '';
|
|
299
|
+
for (const f of content.matchAll(/\b(accessToken|access_token|refreshToken|refresh_token|idToken|id_token|token|jwt|sessionToken)\s*[:,]/g))
|
|
300
|
+
tokenFields.add(f[1] ?? '');
|
|
301
|
+
}
|
|
302
|
+
if (loginRoutes.length === 0 && unique.length > 0)
|
|
303
|
+
warnings.push('Nenhuma rota de login encontrada: a aplicação pode usar provedor externo (veja providers) ou login fora deste repositório.');
|
|
304
|
+
if (providers.size)
|
|
305
|
+
warnings.push(`Autenticação por provedor externo (${[...providers].join(', ')}): o login pode não ser um POST simples — prefira um endpoint de token de teste ou credenciais de API do provedor em modo de teste.`);
|
|
306
|
+
if (truncated)
|
|
307
|
+
warnings.push('Varredura truncada (muitos arquivos): passe `path` apontando para o app/serviço.');
|
|
308
|
+
unique.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
|
|
309
|
+
return {
|
|
310
|
+
root,
|
|
311
|
+
filesScanned: sources.length,
|
|
312
|
+
truncated,
|
|
313
|
+
routes: unique,
|
|
314
|
+
dtos,
|
|
315
|
+
auth: {
|
|
316
|
+
loginEndpoints: loginRoutes.map(describe),
|
|
317
|
+
refreshEndpoints: unique.filter((r) => REFRESH_RE.test(r.path)).map(describe),
|
|
318
|
+
signupEndpoints: unique.filter((r) => SIGNUP_RE.test(r.path)).map(describe),
|
|
319
|
+
logoutEndpoints: unique.filter((r) => LOGOUT_RE.test(r.path)).map(describe),
|
|
320
|
+
mechanisms: [...mechanisms],
|
|
321
|
+
providers: [...providers],
|
|
322
|
+
tokenFields: [...tokenFields],
|
|
323
|
+
globalGuard,
|
|
324
|
+
globalPrefix,
|
|
325
|
+
evidence,
|
|
326
|
+
},
|
|
327
|
+
warnings,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/** Texto compacto para o agente (rotas agrupadas por arquivo, DTOs referenciados e auth). */
|
|
331
|
+
export function formatRouteScan(scan, maxRoutes = 150) {
|
|
332
|
+
const lines = [`${scan.routes.length} rota(s) em ${scan.filesScanned} arquivo(s) de código (${scan.root}).`];
|
|
333
|
+
const shown = scan.routes.slice(0, maxRoutes);
|
|
334
|
+
for (const r of shown) {
|
|
335
|
+
const flags = [r.guarded === true ? 'auth' : r.guarded === false ? 'pública' : null, r.externalEffect ? '⚠ efeito externo' : null].filter(Boolean).join(', ');
|
|
336
|
+
const where = [r.controller && r.handler ? `${r.controller}.${r.handler}` : r.handler, r.dto ? `dto ${r.dto}` : null].filter(Boolean).join(' · ');
|
|
337
|
+
lines.push(`- ${r.method.padEnd(6)} ${r.path} ${r.file}:${r.line}${where ? ` ${where}` : ''}${flags ? ` [${flags}]` : ''}`);
|
|
338
|
+
}
|
|
339
|
+
if (scan.routes.length > shown.length)
|
|
340
|
+
lines.push(`- … +${scan.routes.length - shown.length} rotas (passe \`path\` de um app específico)`);
|
|
341
|
+
const referenced = new Set(scan.routes.map((r) => r.dto).filter(Boolean));
|
|
342
|
+
const dtos = scan.dtos.filter((d) => referenced.has(d.name)).slice(0, 40);
|
|
343
|
+
if (dtos.length) {
|
|
344
|
+
lines.push('', 'DTOs usados pelas rotas:');
|
|
345
|
+
for (const d of dtos)
|
|
346
|
+
lines.push(`- ${d.name} (${d.file}:${d.line}): ${d.fields.join(', ') || '—'}`);
|
|
347
|
+
}
|
|
348
|
+
const a = scan.auth;
|
|
349
|
+
lines.push('', 'Autenticação:');
|
|
350
|
+
lines.push(`- login: ${a.loginEndpoints.join('; ') || '—'}`);
|
|
351
|
+
if (a.refreshEndpoints.length)
|
|
352
|
+
lines.push(`- refresh: ${a.refreshEndpoints.join('; ')}`);
|
|
353
|
+
if (a.signupEndpoints.length)
|
|
354
|
+
lines.push(`- cadastro: ${a.signupEndpoints.join('; ')}`);
|
|
355
|
+
if (a.logoutEndpoints.length)
|
|
356
|
+
lines.push(`- logout: ${a.logoutEndpoints.join('; ')}`);
|
|
357
|
+
lines.push(`- mecanismos: ${a.mechanisms.join(', ') || '—'}${a.tokenFields.length ? ` · campos de token: ${a.tokenFields.join(', ')}` : ''}`);
|
|
358
|
+
if (a.providers.length)
|
|
359
|
+
lines.push(`- provedores externos: ${a.providers.join(', ')}`);
|
|
360
|
+
if (a.globalPrefix)
|
|
361
|
+
lines.push(`- prefixo global: /${a.globalPrefix} (já aplicado às rotas NestJS)`);
|
|
362
|
+
if (a.globalGuard)
|
|
363
|
+
lines.push('- guard global (APP_GUARD): rotas NestJS sem @Public() exigem auth');
|
|
364
|
+
if (a.evidence.length)
|
|
365
|
+
lines.push(...a.evidence.map((e) => ` · ${e}`));
|
|
366
|
+
if (scan.warnings.length)
|
|
367
|
+
lines.push('', 'Avisos:', ...scan.warnings.map((w) => `- ${w}`));
|
|
368
|
+
return lines.join('\n');
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/loadtest/routes.ts"],"names":[],"mappings":"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"}
|