@skip-ai/scanner 0.2.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.
Files changed (58) hide show
  1. package/README.md +81 -0
  2. package/dist/cli.d.ts +11 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +21 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/detector.d.ts +14 -0
  7. package/dist/detector.d.ts.map +1 -0
  8. package/dist/detector.js +72 -0
  9. package/dist/detector.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +115 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/reporter.d.ts +55 -0
  15. package/dist/reporter.d.ts.map +1 -0
  16. package/dist/reporter.js +38 -0
  17. package/dist/reporter.js.map +1 -0
  18. package/dist/scanner/api-calls.d.ts +11 -0
  19. package/dist/scanner/api-calls.d.ts.map +1 -0
  20. package/dist/scanner/api-calls.js +45 -0
  21. package/dist/scanner/api-calls.js.map +1 -0
  22. package/dist/scanner/briefing.d.ts +7 -0
  23. package/dist/scanner/briefing.d.ts.map +1 -0
  24. package/dist/scanner/briefing.js +50 -0
  25. package/dist/scanner/briefing.js.map +1 -0
  26. package/dist/scanner/components.d.ts +24 -0
  27. package/dist/scanner/components.d.ts.map +1 -0
  28. package/dist/scanner/components.js +71 -0
  29. package/dist/scanner/components.js.map +1 -0
  30. package/dist/scanner/ignore.d.ts +13 -0
  31. package/dist/scanner/ignore.d.ts.map +1 -0
  32. package/dist/scanner/ignore.js +50 -0
  33. package/dist/scanner/ignore.js.map +1 -0
  34. package/dist/scanner/navigation.d.ts +50 -0
  35. package/dist/scanner/navigation.d.ts.map +1 -0
  36. package/dist/scanner/navigation.js +478 -0
  37. package/dist/scanner/navigation.js.map +1 -0
  38. package/dist/scanner/routes.d.ts +12 -0
  39. package/dist/scanner/routes.d.ts.map +1 -0
  40. package/dist/scanner/routes.js +74 -0
  41. package/dist/scanner/routes.js.map +1 -0
  42. package/dist/scanner/secrets.d.ts +18 -0
  43. package/dist/scanner/secrets.d.ts.map +1 -0
  44. package/dist/scanner/secrets.js +36 -0
  45. package/dist/scanner/secrets.js.map +1 -0
  46. package/dist/scanner/widget-snippet.d.ts +14 -0
  47. package/dist/scanner/widget-snippet.d.ts.map +1 -0
  48. package/dist/scanner/widget-snippet.js +114 -0
  49. package/dist/scanner/widget-snippet.js.map +1 -0
  50. package/dist/ui.d.ts +15 -0
  51. package/dist/ui.d.ts.map +1 -0
  52. package/dist/ui.js +32 -0
  53. package/dist/ui.js.map +1 -0
  54. package/dist/uploader.d.ts +27 -0
  55. package/dist/uploader.d.ts.map +1 -0
  56. package/dist/uploader.js +73 -0
  57. package/dist/uploader.js.map +1 -0
  58. package/package.json +51 -0
@@ -0,0 +1,478 @@
1
+ import { glob } from 'glob';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { DEFAULT_IGNORE_PATTERNS, toRelative } from './ignore.js';
5
+ /** Encontra o fim da tag de abertura começando em `lt` (índice do '<'). */
6
+ function scanOpeningTag(content, lt) {
7
+ let i = lt + 1;
8
+ const tagMatch = content.substring(i).match(/^([a-zA-Z][a-zA-Z0-9.]*)/);
9
+ if (!tagMatch)
10
+ return null;
11
+ const tag = tagMatch[1];
12
+ i += tag.length;
13
+ let brace = 0;
14
+ let quote = null;
15
+ while (i < content.length) {
16
+ const ch = content[i];
17
+ if (quote) {
18
+ if (ch === quote)
19
+ quote = null;
20
+ i++;
21
+ continue;
22
+ }
23
+ if (ch === '"' || ch === "'") {
24
+ quote = ch;
25
+ i++;
26
+ continue;
27
+ }
28
+ if (ch === '{') {
29
+ brace++;
30
+ i++;
31
+ continue;
32
+ }
33
+ if (ch === '}') {
34
+ brace--;
35
+ i++;
36
+ continue;
37
+ }
38
+ if (brace === 0) {
39
+ if (ch === '>') {
40
+ const full = content.substring(lt, i + 1);
41
+ const inner = content.substring(lt + 1 + tag.length, i).trim();
42
+ return { full, tag, attrs: inner, contentStart: i + 1 };
43
+ }
44
+ if (ch === '/' && content[i + 1] === '>') {
45
+ const full = content.substring(lt, i + 2);
46
+ const inner = content.substring(lt + 1 + tag.length, i).trim();
47
+ return { full, tag, attrs: inner, contentStart: -1 }; // self-closing
48
+ }
49
+ }
50
+ i++;
51
+ }
52
+ return null;
53
+ }
54
+ /** Extrai um atributo com valor entre aspas. */
55
+ function attrString(attrs, name) {
56
+ const m = attrs.match(new RegExp(`\\b${name}\\s*=\\s*["']([^"']*)["']`, 'i'));
57
+ return m ? m[1] : null;
58
+ }
59
+ /** Extrai o conteúdo de uma expressão JSX (entre {}), com balanceamento de chaves. */
60
+ function attrExpr(content, attrsStart, name) {
61
+ const re = new RegExp(`\\b${name}\\s*=\\s*\\{`, 'i');
62
+ const m = re.exec(content.substring(attrsStart));
63
+ if (!m)
64
+ return null;
65
+ const openBrace = attrsStart + m.index + m[0].length - 1;
66
+ let depth = 1;
67
+ let i = openBrace + 1;
68
+ let quote = null;
69
+ while (i < content.length && depth > 0) {
70
+ const ch = content[i];
71
+ if (quote) {
72
+ if (ch === quote)
73
+ quote = null;
74
+ }
75
+ else if (ch === '"' || ch === "'") {
76
+ quote = ch;
77
+ }
78
+ else if (ch === '{')
79
+ depth++;
80
+ else if (ch === '}')
81
+ depth--;
82
+ i++;
83
+ }
84
+ return content.substring(openBrace + 1, i - 1);
85
+ }
86
+ /** Extrai texto visível depois da tag de abertura até o próximo '<'. */
87
+ function visibleText(content, from) {
88
+ if (from < 0)
89
+ return '';
90
+ const slice = content.substring(from, from + 200);
91
+ const m = slice.match(/^\s*([^<{]+)/);
92
+ return m ? m[1].trim().replace(/\s+/g, ' ').slice(0, 80) : '';
93
+ }
94
+ // ---- Helpers de rótulo/intent/seletor ----
95
+ function escapeCssIdent(id) {
96
+ return id.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, '\\$1');
97
+ }
98
+ function slugify(s) {
99
+ return (s
100
+ .toLowerCase()
101
+ .normalize('NFD')
102
+ .replace(/[\u0300-\u036f]/g, '')
103
+ .replace(/[^a-z0-9]+/g, '-')
104
+ .replace(/^-+|-+$/g, '')
105
+ .slice(0, 40) || 'item');
106
+ }
107
+ function labelFromAttrs(attrs, content, contentStart) {
108
+ const aria = attrString(attrs, 'aria-label');
109
+ if (aria)
110
+ return aria;
111
+ const title = attrString(attrs, 'title');
112
+ if (title)
113
+ return title;
114
+ const placeholder = attrString(attrs, 'placeholder');
115
+ if (placeholder)
116
+ return placeholder;
117
+ const text = visibleText(content, contentStart);
118
+ if (text)
119
+ return text;
120
+ return '';
121
+ }
122
+ function inferIntent(label) {
123
+ const l = label.toLowerCase();
124
+ if (/(entrar|logar|login|sign in|acessar)/.test(l))
125
+ return 'login';
126
+ if (/(sair|logout|sign out|log out)/.test(l))
127
+ return 'logout';
128
+ if (/(voltar|back|return)/.test(l))
129
+ return 'back';
130
+ if (/(cancel)/.test(l))
131
+ return 'cancel';
132
+ if (/(salvar|save)/.test(l))
133
+ return 'save';
134
+ if (/(deletar|excluir|remover|delete|remove)/.test(l))
135
+ return 'delete';
136
+ if (/(buscar|pesquisar|search|find)/.test(l))
137
+ return 'search';
138
+ if (/(enviar|submit)/.test(l))
139
+ return 'submit';
140
+ return 'click';
141
+ }
142
+ function buildSelector(attrs, tag, label, inputName) {
143
+ const id = attrString(attrs, 'id');
144
+ if (id) {
145
+ return { selector: `#${escapeCssIdent(id)}`, anchorId: id, confidence: 'high', warning: null };
146
+ }
147
+ const anchor = attrString(attrs, 'data-skip-anchor');
148
+ if (anchor) {
149
+ return { selector: `[data-skip-anchor='${anchor}']`, anchorId: anchor, confidence: 'high', warning: null };
150
+ }
151
+ if (inputName) {
152
+ return { selector: `${tag}[name='${inputName}']`, anchorId: null, confidence: 'medium', warning: null };
153
+ }
154
+ if (label) {
155
+ const escaped = label.replace(/['"\\]/g, '\\$&').slice(0, 40);
156
+ return { selector: `${tag}:has-text('${escaped}')`, anchorId: null, confidence: 'medium', warning: null };
157
+ }
158
+ return {
159
+ selector: tag,
160
+ anchorId: null,
161
+ confidence: 'low',
162
+ warning: "Elemento sem id/aria-label/name estável. Adicione data-skip-anchor='<id>' ou id para confiabilidade total.",
163
+ };
164
+ }
165
+ /** Extrai todos os router.push/replace/redirect com o nome da função que os contém. */
166
+ function extractHandlerNavMap(content) {
167
+ const result = new Map();
168
+ // Detecta corpos de funções (declarações e arrows)
169
+ const funcStarts = [];
170
+ const declRe = /(?:function\s+(\w+)\s*\([^)]*\)\s*\{)|(?:const\s+(\w+)\s*=\s*(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*\{?)/g;
171
+ let dm;
172
+ while ((dm = declRe.exec(content)) !== null) {
173
+ const name = dm[1] || dm[2];
174
+ const braceIdx = content.indexOf('{', dm.index);
175
+ if (name && braceIdx !== -1)
176
+ funcStarts.push({ name, bodyStart: braceIdx });
177
+ }
178
+ for (const { name, bodyStart } of funcStarts) {
179
+ // Casa chaves para achar o fim do corpo
180
+ let depth = 0;
181
+ let i = bodyStart;
182
+ let quote = null;
183
+ let end = content.length;
184
+ while (i < content.length) {
185
+ const ch = content[i];
186
+ if (quote) {
187
+ if (ch === quote)
188
+ quote = null;
189
+ }
190
+ else if (ch === '"' || ch === "'") {
191
+ quote = ch;
192
+ }
193
+ else if (ch === '{')
194
+ depth++;
195
+ else if (ch === '}') {
196
+ depth--;
197
+ if (depth === 0) {
198
+ end = i;
199
+ break;
200
+ }
201
+ }
202
+ i++;
203
+ }
204
+ const body = content.substring(bodyStart, end);
205
+ const routes = [];
206
+ const navRe = /(?:router\.(?:push|replace)|redirect)\s*\(\s*['"`]([^'"`]+)['"`]/g;
207
+ let nm;
208
+ while ((nm = navRe.exec(body)) !== null)
209
+ routes.push(nm[1]);
210
+ if (routes.length)
211
+ result.set(name, routes);
212
+ }
213
+ return result;
214
+ }
215
+ /** Normaliza destino de navegação. */
216
+ function normalizeRoute(raw) {
217
+ return raw.replace(/['"`]/g, '').trim();
218
+ }
219
+ /** Indica se um destino é uma rota de tela navegável (não /api/ nem externo). */
220
+ function isNavigableRoute(route) {
221
+ return route.startsWith('/') && !route.startsWith('/api/');
222
+ }
223
+ // ---- Extração por arquivo ----
224
+ const FALLBACK_LABEL = 'Botão sem rótulo';
225
+ function extractActionsFromFile(content, filePath) {
226
+ const actions = [];
227
+ const navEdges = [];
228
+ let counter = 0;
229
+ const screenId = slugify(path.basename(filePath).replace(/\.(tsx|jsx)$/, ''));
230
+ const nextId = (kind) => `act-${screenId}-${kind}-${++counter}`;
231
+ const nameMatch = content.match(/export\s+(?:default\s+)?(?:async\s+)?(?:function|const)\s+(\w+)/);
232
+ const componentName = nameMatch?.[1] ?? screenId;
233
+ const handlerNav = extractHandlerNavMap(content);
234
+ const attrsStartBase = 0;
235
+ // Rotas de navegação acionadas por submit handlers (onSubmit/onAction) neste arquivo.
236
+ // Botões type=submit herdam essas rotas quando não têm destino próprio.
237
+ const submitHandlerRoutes = [];
238
+ const submitAttrRe = /(?:onSubmit|onAction|action)\s*=\s*\{?\s*([A-Za-z_$][\w$]*)?/g;
239
+ let sam;
240
+ while ((sam = submitAttrRe.exec(content)) !== null) {
241
+ const ref = sam[1];
242
+ if (ref && handlerNav.has(ref)) {
243
+ for (const r of handlerNav.get(ref) ?? [])
244
+ submitHandlerRoutes.push(normalizeRoute(r));
245
+ }
246
+ }
247
+ const pushEdge = (label, to) => navEdges.push({ label, to });
248
+ // --- 1. Tags navegáveis e botões: <a>, <Link>, <button>, <input>, <textarea>, <select>
249
+ const tagRe = /<(a|Link|button|input|textarea|select)\b/gi;
250
+ let tm;
251
+ while ((tm = tagRe.exec(content)) !== null) {
252
+ const lt = tm.index;
253
+ const open = scanOpeningTag(content, lt);
254
+ if (!open)
255
+ continue;
256
+ const tagLower = open.tag.toLowerCase();
257
+ // Atributos como substring absoluta para attrExpr funcionar
258
+ const attrsAbsoluteStart = lt + 1 + open.tag.length;
259
+ const label = labelFromAttrs(open.attrs, content, open.contentStart) || '';
260
+ const inputName = attrString(open.attrs, 'name');
261
+ if (tagLower === 'a' || tagLower === 'link') {
262
+ const href = attrString(open.attrs, 'href');
263
+ // Ignora externos, âncoras e endpoints de API (não são telas)
264
+ if (!href || !href.startsWith('/') || href.startsWith('/api/'))
265
+ continue;
266
+ const domTag = tagLower === 'link' ? 'a' : 'a';
267
+ const sel = buildSelector(open.attrs, domTag, label, null);
268
+ const id = nextId('nav');
269
+ actions.push({
270
+ id,
271
+ label: label || 'Link',
272
+ kind: 'navigation',
273
+ intent: 'navigate',
274
+ targetRoute: href,
275
+ selector: sel.selector,
276
+ anchorId: sel.anchorId,
277
+ inputType: null,
278
+ inputName: null,
279
+ confidence: sel.confidence,
280
+ warning: sel.warning,
281
+ });
282
+ pushEdge(label || 'Link', href);
283
+ continue;
284
+ }
285
+ if (tagLower === 'button') {
286
+ const isSubmit = /\btype\s*=\s*["']submit["']/i.test(open.attrs);
287
+ // onClick inline: verifica router.push dentro da expressão
288
+ const onClickExpr = attrExpr(content, attrsAbsoluteStart, 'onClick') || '';
289
+ const inlinePush = onClickExpr.match(/(?:router\.(?:push|replace)|redirect)\s*\(\s*['"`]([^'"`]+)['"`]/);
290
+ // onClick por referência: onClick={handlerName}
291
+ const handlerRef = onClickExpr.trim().match(/^([A-Za-z_$][\w$]*)$/);
292
+ const handlerRoutes = handlerRef ? handlerNav.get(handlerRef[1]) : undefined;
293
+ let kind = 'click';
294
+ let targetRoute = null;
295
+ let intent = inferIntent(label);
296
+ if (inlinePush) {
297
+ kind = 'navigation';
298
+ targetRoute = normalizeRoute(inlinePush[1]);
299
+ intent = 'navigate';
300
+ pushEdge(label || 'Botão', targetRoute);
301
+ }
302
+ else if (handlerRoutes && handlerRoutes.length) {
303
+ kind = 'navigation';
304
+ targetRoute = normalizeRoute(handlerRoutes[0]);
305
+ intent = 'navigate';
306
+ for (const r of handlerRoutes)
307
+ pushEdge(label || 'Botão', normalizeRoute(r));
308
+ }
309
+ else if (isSubmit) {
310
+ kind = 'submit';
311
+ if (intent === 'click')
312
+ intent = 'submit';
313
+ // Botão submit herda rotas de onSubmit/onAction do próprio arquivo
314
+ if (submitHandlerRoutes.length) {
315
+ targetRoute = submitHandlerRoutes[0];
316
+ for (const r of submitHandlerRoutes)
317
+ pushEdge(label || 'Botão', r);
318
+ }
319
+ }
320
+ const sel = buildSelector(open.attrs, 'button', label, null);
321
+ const id = nextId(kind);
322
+ actions.push({
323
+ id,
324
+ label: label || FALLBACK_LABEL,
325
+ kind,
326
+ intent,
327
+ targetRoute,
328
+ selector: sel.selector,
329
+ anchorId: sel.anchorId,
330
+ inputType: null,
331
+ inputName: null,
332
+ confidence: sel.confidence,
333
+ warning: sel.warning,
334
+ });
335
+ continue;
336
+ }
337
+ // input / textarea / select
338
+ if (tagLower === 'input' || tagLower === 'textarea' || tagLower === 'select') {
339
+ const typeAttr = attrString(open.attrs, 'type');
340
+ const inputType = typeAttr ?? (tagLower === 'textarea' ? 'text' : 'text');
341
+ let fieldLabel = label;
342
+ if (!fieldLabel)
343
+ fieldLabel = inputName || `Campo ${inputType}`;
344
+ const sel = buildSelector(open.attrs, tagLower === 'textarea' ? 'textarea' : tagLower === 'select' ? 'select' : 'input', fieldLabel, inputName);
345
+ const id = nextId('fill');
346
+ actions.push({
347
+ id,
348
+ label: fieldLabel,
349
+ kind: 'fill',
350
+ intent: 'fill',
351
+ targetRoute: null,
352
+ selector: sel.selector,
353
+ anchorId: sel.anchorId,
354
+ inputType,
355
+ inputName,
356
+ confidence: sel.confidence,
357
+ warning: sel.warning,
358
+ });
359
+ continue;
360
+ }
361
+ }
362
+ // --- 2. Escape manual: data-skip-action="navigate:/x"
363
+ const manualRe = /data-skip-action\s*=\s*["'](navigate):([^"']+)["']/gi;
364
+ let mm;
365
+ while ((mm = manualRe.exec(content)) !== null) {
366
+ const to = normalizeRoute(mm[2]);
367
+ const lt = content.lastIndexOf('<', mm.index);
368
+ const open = scanOpeningTag(content, lt);
369
+ const label = open ? labelFromAttrs(open.attrs, content, open.contentStart) || 'Navegar' : 'Navegar';
370
+ const sel = open ? buildSelector(open.attrs, '*', label, null) : { selector: '*', anchorId: null, confidence: 'low', warning: 'fallback' };
371
+ const id = nextId('nav');
372
+ actions.push({
373
+ id,
374
+ label,
375
+ kind: 'navigation',
376
+ intent: 'navigate',
377
+ targetRoute: to,
378
+ selector: sel.selector,
379
+ anchorId: sel.anchorId,
380
+ inputType: null,
381
+ inputName: null,
382
+ confidence: sel.confidence,
383
+ warning: sel.warning,
384
+ });
385
+ pushEdge(label, to);
386
+ }
387
+ // evita warning de variável não usada
388
+ void attrsStartBase;
389
+ return { componentName, actions, navEdges };
390
+ }
391
+ /** Título humano da tela: <h1> > <title> > nome do componente. */
392
+ function extractTitle(content, componentName) {
393
+ const h1 = content.match(/<h1[^>]*>\s*([^<]+)/i);
394
+ if (h1)
395
+ return { title: h1[1].trim().slice(0, 80), description: h1[1].trim().slice(0, 120) };
396
+ const title = content.match(/<title[^>]*>\s*([^<]+)/i);
397
+ if (title)
398
+ return { title: title[1].trim(), description: null };
399
+ const human = componentName.replace(/([a-z])([A-Z])/g, '$1 $2');
400
+ return { title: human, description: null };
401
+ }
402
+ /**
403
+ * Extrai o mapa de navegação completo do projeto.
404
+ */
405
+ export async function extractNavigation(rootDir, ignorePatterns = [], options = {}) {
406
+ const pagesRoutes = options.pagesRoutes ?? [];
407
+ const routeByFile = new Map();
408
+ for (const r of pagesRoutes)
409
+ routeByFile.set(r.physicalPath, r.logicalRoute);
410
+ // Componentes compartilhados (navegação global)
411
+ const sharedFiles = await glob('src/**/{layout,Sidebar,Navbar,Header,Nav,Menu,Topbar,Drawer}*.{tsx,jsx}', { cwd: rootDir, absolute: true, ignore: [...DEFAULT_IGNORE_PATTERNS, ...ignorePatterns] });
412
+ const globalActions = [];
413
+ for (const file of sharedFiles) {
414
+ let content;
415
+ try {
416
+ content = fs.readFileSync(file, 'utf-8');
417
+ }
418
+ catch {
419
+ continue;
420
+ }
421
+ const source = path.basename(file, path.extname(file));
422
+ const { actions } = extractActionsFromFile(content, file);
423
+ for (const a of actions) {
424
+ if (a.kind === 'navigation' && a.targetRoute) {
425
+ globalActions.push({ label: a.label, targetRoute: a.targetRoute, source });
426
+ }
427
+ }
428
+ }
429
+ // Telas (arquivos page.)
430
+ const pageFiles = await glob('src/**/page.{tsx,jsx}', {
431
+ cwd: rootDir,
432
+ absolute: true,
433
+ ignore: [...DEFAULT_IGNORE_PATTERNS, ...ignorePatterns],
434
+ });
435
+ const screens = [];
436
+ const navGraph = [];
437
+ for (const file of pageFiles) {
438
+ let content;
439
+ try {
440
+ content = fs.readFileSync(file, 'utf-8');
441
+ }
442
+ catch {
443
+ continue;
444
+ }
445
+ const relative = toRelative(rootDir, file);
446
+ const route = routeByFile.get(relative) ?? '/';
447
+ const { componentName, actions, navEdges } = extractActionsFromFile(content, file);
448
+ const { title, description } = extractTitle(content, componentName);
449
+ const screenId = slugify(route) || 'root';
450
+ screens.push({
451
+ id: screenId,
452
+ title,
453
+ route,
454
+ filePath: relative,
455
+ description,
456
+ actions,
457
+ globalActions: globalActions.filter((g) => g.targetRoute !== route),
458
+ });
459
+ for (const edge of navEdges)
460
+ navGraph.push({ from: route, to: edge.to, label: edge.label });
461
+ }
462
+ // Arestas da navegação global
463
+ for (const screen of screens) {
464
+ for (const g of screen.globalActions) {
465
+ navGraph.push({ from: screen.route, to: g.targetRoute, label: g.label });
466
+ }
467
+ }
468
+ const seen = new Set();
469
+ const navigationGraph = navGraph.filter((e) => {
470
+ const key = `${e.from}|${e.to}|${e.label}`;
471
+ if (seen.has(key))
472
+ return false;
473
+ seen.add(key);
474
+ return true;
475
+ });
476
+ return { screens, navigationGraph };
477
+ }
478
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/scanner/navigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RouteEntry {
2
+ physicalPath: string;
3
+ logicalRoute: string;
4
+ exportedComponents: string[];
5
+ }
6
+ /**
7
+ * Extrai rotas do projeto.
8
+ * - Next.js App Router: arquivos `page.tsx|jsx` dentro de `src/app` ou `app`.
9
+ * - Next.js Pages Router: arquivos dentro de `src/pages` ou `pages`.
10
+ */
11
+ export declare function extractRoutes(rootDir: string, srcDir: string, ignorePatterns?: string[]): Promise<RouteEntry[]>;
12
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/scanner/routes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAM,EAAO,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC,CAoEvB"}
@@ -0,0 +1,74 @@
1
+ import { glob } from 'glob';
2
+ import fs from 'fs';
3
+ import { IGNORED_ROUTE_SEGMENTS, toRelative } from './ignore.js';
4
+ /**
5
+ * Extrai rotas do projeto.
6
+ * - Next.js App Router: arquivos `page.tsx|jsx` dentro de `src/app` ou `app`.
7
+ * - Next.js Pages Router: arquivos dentro de `src/pages` ou `pages`.
8
+ */
9
+ export async function extractRoutes(rootDir, srcDir, ignorePatterns = []) {
10
+ const isAppRouter = srcDir.endsWith('app') || srcDir === 'src/app' || srcDir === 'app';
11
+ const isPagesRouter = srcDir.endsWith('pages') || srcDir === 'src/pages' || srcDir === 'pages';
12
+ if (!isAppRouter && !isPagesRouter)
13
+ return [];
14
+ const entryFile = isAppRouter ? 'page' : '';
15
+ const exts = '{tsx,jsx,ts,js}';
16
+ const pattern = isAppRouter
17
+ ? `${srcDir}/**/page.${exts}`
18
+ : `${srcDir}/**/*.${exts}`;
19
+ const files = await glob(pattern, {
20
+ cwd: rootDir,
21
+ absolute: true,
22
+ ignore: ignorePatterns,
23
+ });
24
+ const routes = [];
25
+ for (const file of files) {
26
+ const relative = toRelative(rootDir, file);
27
+ let logicalRoute;
28
+ if (isAppRouter) {
29
+ // Remove prefixo do srcDir e sufixo /page.tsx
30
+ const relToSrc = relative.replace(new RegExp(`^${escapeRegExp(srcDir)}/?`), '');
31
+ logicalRoute =
32
+ '/' +
33
+ relToSrc
34
+ .replace(/\/?page\.(tsx|jsx|ts|js)$/, '')
35
+ .replace(/\([^/]+\)\//g, '') // remove route groups (dashboard)
36
+ .replace(/\([^/]+\)/g, '') // route group na ponta
37
+ .replace(/\[\.\.\.(\w+)\]/g, ':$1*') // catch-all [...slug] -> :slug*
38
+ .replace(/\[(\w+)\]/g, ':$1'); // [slug] -> :slug
39
+ if (logicalRoute === '/')
40
+ logicalRoute = '/';
41
+ // descarta segmentos especiais (não são páginas)
42
+ if (IGNORED_ROUTE_SEGMENTS.some((s) => relToSrc.startsWith(`${s}.`) || relToSrc.includes(`/${s}.`))) {
43
+ continue;
44
+ }
45
+ }
46
+ else {
47
+ // Pages router: cada arquivo vira rota
48
+ const relToSrc = relative.replace(new RegExp(`^${escapeRegExp(srcDir)}/?`), '');
49
+ logicalRoute =
50
+ '/' +
51
+ relToSrc
52
+ .replace(/^index\.(tsx|jsx|ts|js)$/, '')
53
+ .replace(/\.(tsx|jsx|ts|js)$/, '')
54
+ .replace(/\/index$/, '')
55
+ .replace(/\[\.\.\.(\w+)\]/g, ':$1*')
56
+ .replace(/\[(\w+)\]/g, ':$1');
57
+ }
58
+ let exportedComponents = [];
59
+ try {
60
+ const content = fs.readFileSync(file, 'utf-8');
61
+ const exportMatches = content.match(/export\s+(?:default\s+)?(?:async\s+)?(?:function|const|class)\s+(\w+)/g) || [];
62
+ exportedComponents = exportMatches.map((m) => m.split(/\s+/).pop()).filter(Boolean);
63
+ }
64
+ catch {
65
+ // ignora erro de leitura
66
+ }
67
+ routes.push({ physicalPath: relative, logicalRoute, exportedComponents });
68
+ }
69
+ return routes;
70
+ }
71
+ function escapeRegExp(s) {
72
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
73
+ }
74
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/scanner/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const MASKED_TOKEN = "[MASKED_SECRET]";
2
+ /**
3
+ * Mascara ocorrências de secrets em um conteúdo de texto e retorna
4
+ * o conteúdo mascarado + a contagem total de substituições.
5
+ */
6
+ export declare function countAndMaskSecrets(content: string): {
7
+ masked: string;
8
+ count: number;
9
+ };
10
+ /**
11
+ * Recebe um objeto arbitrário, serializa, mascara secrets e retorna
12
+ * o objeto novamente + a contagem de secrets encontrados.
13
+ */
14
+ export declare function maskObject<T>(obj: T): {
15
+ result: T;
16
+ count: number;
17
+ };
18
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/scanner/secrets.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAYtF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAIlE"}