frontend-guardian-core 3.6.0 → 3.7.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.
@@ -0,0 +1,588 @@
1
+ "use strict";
2
+ /**
3
+ * ProjectIndexer — 项目级增量索引系统(v3.7.0)
4
+ *
5
+ * 设计目标:
6
+ * 1. 预索引项目文件结构(符号、import、路由),加速后续扫描
7
+ * 2. 基于文件哈希快速检测变更,只重新索引变更文件
8
+ * 3. 反向依赖图:快速定位"修改文件会影响谁"
9
+ * 4. 框架路由自动解析:React Router / Vue Router / Next.js / Nuxt / UniApp
10
+ * 5. 持久化到 `.frontend-guardian/index/index.json`,跨会话复用
11
+ *
12
+ * 与 SmartCache 的区别:
13
+ * - SmartCache 缓存扫描结果(Issue[]),按规则版本失效
14
+ * - ProjectIndexer 缓存文件结构(符号、import、路由),按文件内容哈希失效
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ProjectIndexer = void 0;
18
+ const node_crypto_1 = require("node:crypto");
19
+ const node_fs_1 = require("node:fs");
20
+ const node_path_1 = require("node:path");
21
+ const ast_parser_js_1 = require("../utils/ast-parser.js");
22
+ // ── 常量 ───────────────────────────────────────────────────────────────────
23
+ /** 索引版本,索引结构变更时递增 */
24
+ const INDEX_VERSION = "3.7.0";
25
+ /** 索引目录名 */
26
+ const INDEX_DIR = ".frontend-guardian/index";
27
+ /** 索引文件名 */
28
+ const INDEX_FILE = "index.json";
29
+ // ── 核心类 ─────────────────────────────────────────────────────────────────
30
+ class ProjectIndexer {
31
+ index;
32
+ indexDir;
33
+ indexFilePath;
34
+ projectDir;
35
+ constructor(projectDir) {
36
+ this.projectDir = (0, node_path_1.resolve)(projectDir);
37
+ this.indexDir = (0, node_path_1.resolve)(this.projectDir, INDEX_DIR);
38
+ this.indexFilePath = (0, node_path_1.resolve)(this.indexDir, INDEX_FILE);
39
+ this.index = this.loadIndex();
40
+ }
41
+ // ── 状态查询 ──────────────────────────────────────────────────────────
42
+ /** 索引是否有效(版本匹配且有数据) */
43
+ isValid() {
44
+ return (this.index.version === INDEX_VERSION &&
45
+ this.index.projectDir === this.projectDir &&
46
+ Object.keys(this.index.files).length > 0);
47
+ }
48
+ /** 获取索引统计 */
49
+ getStats() {
50
+ let symbolCount = 0;
51
+ for (const file of Object.values(this.index.files)) {
52
+ symbolCount += file.symbols.length;
53
+ }
54
+ return {
55
+ files: Object.keys(this.index.files).length,
56
+ routes: this.index.routes.length,
57
+ symbols: symbolCount,
58
+ };
59
+ }
60
+ // ── 变更检测 ──────────────────────────────────────────────────────────
61
+ /**
62
+ * 对比当前文件系统与索引,返回变更文件列表
63
+ * @param files 当前项目中的文件列表(绝对路径)
64
+ * @returns 变更/新增/删除的文件列表(绝对路径)
65
+ */
66
+ getChangedFiles(files) {
67
+ const indexedPaths = new Set(Object.keys(this.index.files));
68
+ const currentPaths = new Set();
69
+ const changed = [];
70
+ for (const file of files) {
71
+ const relPath = (0, node_path_1.relative)(this.projectDir, file);
72
+ currentPaths.add(relPath);
73
+ const fileIndex = this.index.files[relPath];
74
+ try {
75
+ const content = (0, node_fs_1.readFileSync)(file, "utf-8");
76
+ const hash = this.computeHash(content);
77
+ if (!fileIndex || fileIndex.hash !== hash) {
78
+ changed.push(file);
79
+ }
80
+ }
81
+ catch {
82
+ // 读取失败视为变更
83
+ changed.push(file);
84
+ }
85
+ }
86
+ // 检测已删除的文件
87
+ const deleted = [];
88
+ for (const relPath of indexedPaths) {
89
+ if (!currentPaths.has(relPath)) {
90
+ deleted.push((0, node_path_1.resolve)(this.projectDir, relPath));
91
+ }
92
+ }
93
+ return { changed, deleted };
94
+ }
95
+ // ── 索引构建 ──────────────────────────────────────────────────────────
96
+ /**
97
+ * 全量建立索引
98
+ * @param files 项目源文件列表(绝对路径)
99
+ */
100
+ async buildIndex(files) {
101
+ this.index = {
102
+ version: INDEX_VERSION,
103
+ projectDir: this.projectDir,
104
+ createdAt: Date.now(),
105
+ updatedAt: Date.now(),
106
+ files: {},
107
+ reverseImports: {},
108
+ routes: [],
109
+ };
110
+ // 批量索引文件
111
+ for (const file of files) {
112
+ await this._indexSingleFile(file);
113
+ }
114
+ this.buildReverseImports();
115
+ this.save();
116
+ }
117
+ /**
118
+ * 增量更新索引
119
+ * @param changedFiles 变更文件列表(绝对路径)
120
+ * @param deletedFiles 已删除文件列表(绝对路径)
121
+ */
122
+ async updateIndex(changedFiles, deletedFiles = []) {
123
+ // 移除已删除的文件
124
+ for (const file of deletedFiles) {
125
+ const relPath = (0, node_path_1.relative)(this.projectDir, file);
126
+ const fileIndex = this.index.files[relPath];
127
+ delete this.index.files[relPath];
128
+ // 同时从路由表中移除
129
+ if (fileIndex?.route) {
130
+ this.index.routes = this.index.routes.filter((r) => r.file !== relPath);
131
+ }
132
+ }
133
+ // 更新变更文件
134
+ for (const file of changedFiles) {
135
+ // 如果旧索引中有路由,先从路由表中移除
136
+ const oldRelPath = (0, node_path_1.relative)(this.projectDir, file);
137
+ if (this.index.files[oldRelPath]?.route) {
138
+ this.index.routes = this.index.routes.filter((r) => r.file !== oldRelPath);
139
+ }
140
+ await this._indexSingleFile(file);
141
+ }
142
+ this.buildReverseImports();
143
+ this.index.updatedAt = Date.now();
144
+ this.save();
145
+ }
146
+ // ── 依赖图查询 ────────────────────────────────────────────────────────
147
+ /**
148
+ * 获取导入某个文件的所有文件(上游依赖方)
149
+ * @param filePath 文件绝对路径
150
+ * @returns 导入该文件的文件列表(绝对路径)
151
+ */
152
+ getImporters(filePath) {
153
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
154
+ const importers = this.index.reverseImports[relPath] || [];
155
+ return importers.map((p) => (0, node_path_1.resolve)(this.projectDir, p));
156
+ }
157
+ /**
158
+ * 获取文件的直接依赖(下游)
159
+ * @param filePath 文件绝对路径
160
+ * @returns 该文件导入的文件列表(绝对路径)
161
+ */
162
+ getDependencies(filePath) {
163
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
164
+ const fileIndex = this.index.files[relPath];
165
+ if (!fileIndex)
166
+ return [];
167
+ return fileIndex.imports.map((p) => (0, node_path_1.resolve)(this.projectDir, p));
168
+ }
169
+ /**
170
+ * 获取文件的完整依赖链(递归上游)
171
+ * @param filePath 文件绝对路径
172
+ * @returns 所有导入该文件的文件(包括间接导入)
173
+ */
174
+ getTransitiveImporters(filePath) {
175
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
176
+ const result = new Set();
177
+ const queue = [relPath];
178
+ const visited = new Set();
179
+ while (queue.length > 0) {
180
+ const current = queue.shift();
181
+ if (visited.has(current))
182
+ continue;
183
+ visited.add(current);
184
+ const importers = this.index.reverseImports[current] || [];
185
+ for (const importer of importers) {
186
+ result.add(importer);
187
+ queue.push(importer);
188
+ }
189
+ }
190
+ return Array.from(result).map((p) => (0, node_path_1.resolve)(this.projectDir, p));
191
+ }
192
+ // ── 路由查询 ──────────────────────────────────────────────────────────
193
+ /** 获取项目路由表 */
194
+ getRoutes() {
195
+ return [...this.index.routes];
196
+ }
197
+ /** 按路径查找路由 */
198
+ findRouteByPath(path) {
199
+ return this.index.routes.find((r) => r.path === path);
200
+ }
201
+ /** 按组件名查找路由 */
202
+ findRouteByComponent(component) {
203
+ return this.index.routes.find((r) => r.component === component);
204
+ }
205
+ // ── 符号查询 ──────────────────────────────────────────────────────────
206
+ /** 获取文件中的符号列表 */
207
+ getSymbols(filePath) {
208
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
209
+ return this.index.files[relPath]?.symbols || [];
210
+ }
211
+ /** 搜索项目中定义的符号 */
212
+ findSymbol(name) {
213
+ const results = [];
214
+ for (const [relPath, fileIndex] of Object.entries(this.index.files)) {
215
+ for (const symbol of fileIndex.symbols) {
216
+ if (symbol.name === name) {
217
+ results.push({ file: (0, node_path_1.resolve)(this.projectDir, relPath), symbol });
218
+ }
219
+ }
220
+ }
221
+ return results;
222
+ }
223
+ /** 获取文件的导出列表 */
224
+ getExports(filePath) {
225
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
226
+ return this.index.files[relPath]?.exports || [];
227
+ }
228
+ // ── 索引持久化 ────────────────────────────────────────────────────────
229
+ /** 保存索引到磁盘 */
230
+ save() {
231
+ try {
232
+ if (!(0, node_fs_1.existsSync)(this.indexDir)) {
233
+ (0, node_fs_1.mkdirSync)(this.indexDir, { recursive: true });
234
+ }
235
+ (0, node_fs_1.writeFileSync)(this.indexFilePath, JSON.stringify(this.index, null, 2), "utf-8");
236
+ }
237
+ catch {
238
+ // 保存失败静默处理
239
+ }
240
+ }
241
+ /** 清理索引(删除所有索引数据) */
242
+ clean() {
243
+ this.index = {
244
+ version: INDEX_VERSION,
245
+ projectDir: this.projectDir,
246
+ createdAt: 0,
247
+ updatedAt: 0,
248
+ files: {},
249
+ reverseImports: {},
250
+ routes: [],
251
+ };
252
+ this.save();
253
+ }
254
+ // ── 私有方法 ──────────────────────────────────────────────────────────
255
+ /** 索引单个文件 */
256
+ async _indexSingleFile(filePath) {
257
+ try {
258
+ const content = (0, node_fs_1.readFileSync)(filePath, "utf-8");
259
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
260
+ const hash = this.computeHash(content);
261
+ const ext = (0, node_path_1.extname)(filePath);
262
+ // 解析 AST
263
+ const ast = (0, ast_parser_js_1.parseAST)(content, { ext });
264
+ // 提取 imports
265
+ const importInfos = ast ? (0, ast_parser_js_1.getImports)(ast) : [];
266
+ const imports = this.resolveImports(filePath, importInfos);
267
+ // 提取 exports 和 symbols
268
+ const { exports, symbols } = this.extractSymbols(ast, content);
269
+ // 检测路由
270
+ const route = this.detectRoute(filePath, content);
271
+ this.index.files[relPath] = {
272
+ path: relPath,
273
+ hash,
274
+ indexedAt: Date.now(),
275
+ imports,
276
+ exports,
277
+ symbols,
278
+ route,
279
+ };
280
+ // 如果是路由,加入路由表
281
+ if (route) {
282
+ const existingIndex = this.index.routes.findIndex((r) => r.file === relPath);
283
+ if (existingIndex >= 0) {
284
+ this.index.routes[existingIndex] = route;
285
+ }
286
+ else {
287
+ this.index.routes.push(route);
288
+ }
289
+ }
290
+ }
291
+ catch {
292
+ // 索引失败静默处理
293
+ }
294
+ }
295
+ /** 解析 import 路径为相对路径 */
296
+ resolveImports(filePath, imports) {
297
+ const resolved = [];
298
+ const baseDir = (0, node_path_1.dirname)(filePath);
299
+ for (const imp of imports) {
300
+ if (imp.source.startsWith(".")) {
301
+ const resolvedPath = this.resolveImportPath(baseDir, imp.source);
302
+ if (resolvedPath) {
303
+ const relPath = (0, node_path_1.relative)(this.projectDir, resolvedPath);
304
+ resolved.push(relPath);
305
+ }
306
+ }
307
+ }
308
+ return resolved;
309
+ }
310
+ /** 解析 import 源路径为绝对路径 */
311
+ resolveImportPath(baseDir, source) {
312
+ const exts = [".ts", ".tsx", ".js", ".jsx", ".vue"];
313
+ // 直接尝试(含扩展名)
314
+ for (const ext of exts) {
315
+ const path = (0, node_path_1.resolve)(baseDir, source + ext);
316
+ if ((0, node_fs_1.existsSync)(path))
317
+ return path;
318
+ }
319
+ // 尝试 index 文件
320
+ for (const ext of exts) {
321
+ const path = (0, node_path_1.resolve)(baseDir, source, "index" + ext);
322
+ if ((0, node_fs_1.existsSync)(path))
323
+ return path;
324
+ }
325
+ return undefined;
326
+ }
327
+ /** 从 AST 提取符号信息 */
328
+ extractSymbols(ast, content) {
329
+ const exports = [];
330
+ const symbols = [];
331
+ if (!ast)
332
+ return { exports, symbols };
333
+ // 导出声明
334
+ (0, ast_parser_js_1.walkAST)(ast, "ExportNamedDeclaration", (node) => {
335
+ if (node.declaration) {
336
+ if (node.declaration.id?.name) {
337
+ // FunctionDeclaration / ClassDeclaration
338
+ const name = node.declaration.id.name;
339
+ exports.push(name);
340
+ symbols.push({
341
+ name,
342
+ kind: this.inferSymbolKind(node.declaration),
343
+ line: node.loc?.start?.line || 0,
344
+ column: node.loc?.start?.column || 0,
345
+ });
346
+ }
347
+ else if (node.declaration.declarations) {
348
+ // VariableDeclaration: export const x = 1, y = 2
349
+ for (const decl of node.declaration.declarations) {
350
+ if (decl.id?.name) {
351
+ const name = decl.id.name;
352
+ exports.push(name);
353
+ symbols.push({
354
+ name,
355
+ kind: "variable",
356
+ line: decl.loc?.start?.line || node.loc?.start?.line || 0,
357
+ column: decl.loc?.start?.column || node.loc?.start?.column || 0,
358
+ });
359
+ }
360
+ }
361
+ }
362
+ }
363
+ for (const spec of node.specifiers || []) {
364
+ if (spec.exported?.name) {
365
+ exports.push(spec.exported.name);
366
+ }
367
+ }
368
+ });
369
+ // 默认导出
370
+ (0, ast_parser_js_1.walkAST)(ast, "ExportDefaultDeclaration", (node) => {
371
+ if (node.declaration?.id?.name) {
372
+ exports.push(node.declaration.id.name);
373
+ }
374
+ else {
375
+ exports.push("default");
376
+ }
377
+ });
378
+ // 检测 hooks(useXxx 命名约定)
379
+ const hookPattern = /(?:^|\s)(use[A-Z][a-zA-Z0-9]*)\s*\(/g;
380
+ let match;
381
+ while ((match = hookPattern.exec(content)) !== null) {
382
+ const name = match[1];
383
+ if (!symbols.find((s) => s.name === name)) {
384
+ const before = content.slice(0, match.index);
385
+ const line = before.split("\n").length;
386
+ const lastNewline = before.lastIndexOf("\n");
387
+ const column = lastNewline >= 0 ? match.index - lastNewline : match.index + 1;
388
+ symbols.push({
389
+ name,
390
+ kind: "hook",
391
+ line,
392
+ column,
393
+ });
394
+ }
395
+ }
396
+ // 检测组件(大写开头的函数声明)
397
+ (0, ast_parser_js_1.walkAST)(ast, "FunctionDeclaration", (node) => {
398
+ const name = node.id?.name;
399
+ if (name && /^[A-Z]/.test(name) && !symbols.find((s) => s.name === name)) {
400
+ symbols.push({
401
+ name,
402
+ kind: "component",
403
+ line: node.loc?.start?.line || 0,
404
+ column: node.loc?.start?.column || 0,
405
+ });
406
+ }
407
+ });
408
+ // 检测组件(大写开头的箭头函数变量)
409
+ (0, ast_parser_js_1.walkAST)(ast, "VariableDeclarator", (node) => {
410
+ const name = node.id?.name;
411
+ if (name && /^[A-Z]/.test(name) && node.init?.type === "ArrowFunctionExpression") {
412
+ if (!symbols.find((s) => s.name === name)) {
413
+ symbols.push({
414
+ name,
415
+ kind: "component",
416
+ line: node.loc?.start?.line || 0,
417
+ column: node.loc?.start?.column || 0,
418
+ });
419
+ }
420
+ }
421
+ });
422
+ return { exports, symbols };
423
+ }
424
+ /** 推断符号类型 */
425
+ inferSymbolKind(node) {
426
+ switch (node.type) {
427
+ case "FunctionDeclaration":
428
+ case "ArrowFunctionExpression":
429
+ return "function";
430
+ case "ClassDeclaration":
431
+ return "class";
432
+ default:
433
+ return "variable";
434
+ }
435
+ }
436
+ // ── 路由检测 ──────────────────────────────────────────────────────────
437
+ /** 检测文件是否包含路由定义 */
438
+ detectRoute(filePath, content) {
439
+ const relPath = (0, node_path_1.relative)(this.projectDir, filePath);
440
+ const baseName = (0, node_path_1.basename)(filePath);
441
+ // Next.js: pages/ 或 app/ 目录
442
+ if (relPath.startsWith("pages/") || relPath.startsWith("app/")) {
443
+ return this.parseNextJsRoute(relPath);
444
+ }
445
+ // Nuxt: pages/ 目录
446
+ if (relPath.startsWith("pages/") && (baseName.endsWith(".vue") || baseName.endsWith(".ts"))) {
447
+ return this.parseNuxtRoute(relPath);
448
+ }
449
+ // UniApp: pages.json
450
+ if (baseName === "pages.json") {
451
+ return this.parseUniAppRoutes(content, relPath);
452
+ }
453
+ // React Router 配置
454
+ if (content.includes("react-router") || content.includes("createBrowserRouter")) {
455
+ return this.parseReactRouterConfig(content, relPath);
456
+ }
457
+ // Vue Router 配置
458
+ if (content.includes("vue-router") || content.includes("createRouter")) {
459
+ return this.parseVueRouterConfig(content, relPath);
460
+ }
461
+ return undefined;
462
+ }
463
+ parseNextJsRoute(relPath) {
464
+ let routePath = relPath
465
+ .replace(/^pages\//, "")
466
+ .replace(/^app\//, "")
467
+ .replace(/\/page\.(tsx|jsx|ts|js)$/, "")
468
+ .replace(/\.(tsx|jsx|ts|js|vue)$/, "")
469
+ .replace(/\[([^\]]+)\]/g, ":$1")
470
+ .replace(/index$/, "");
471
+ if (!routePath.startsWith("/"))
472
+ routePath = "/" + routePath;
473
+ if (routePath === "/" || routePath === "")
474
+ routePath = "/";
475
+ return {
476
+ path: routePath,
477
+ file: relPath,
478
+ framework: "nextjs",
479
+ };
480
+ }
481
+ parseNuxtRoute(relPath) {
482
+ let routePath = relPath
483
+ .replace(/^pages\//, "")
484
+ .replace(/\.(vue|ts|js)$/, "")
485
+ .replace(/\[([^\]]+)\]/g, ":$1")
486
+ .replace(/index$/, "");
487
+ if (!routePath.startsWith("/"))
488
+ routePath = "/" + routePath;
489
+ return {
490
+ path: routePath,
491
+ file: relPath,
492
+ framework: "nuxt",
493
+ };
494
+ }
495
+ parseUniAppRoutes(content, relPath) {
496
+ try {
497
+ const config = JSON.parse(content);
498
+ if (config.pages && Array.isArray(config.pages)) {
499
+ // 返回第一个页面作为代表,详细路由在路由表中展开
500
+ const firstPage = config.pages[0];
501
+ if (firstPage?.path) {
502
+ return {
503
+ path: "/" + firstPage.path,
504
+ file: relPath,
505
+ framework: "uniapp",
506
+ };
507
+ }
508
+ }
509
+ }
510
+ catch {
511
+ // JSON 解析失败
512
+ }
513
+ return undefined;
514
+ }
515
+ parseReactRouterConfig(content, relPath) {
516
+ // 简化:检测 Route 组件或 createBrowserRouter
517
+ const pathMatch = content.match(/path\s*:\s*["']([^"']+)["']/);
518
+ if (pathMatch) {
519
+ const componentMatch = content.match(/element\s*:\s*<?\s*([A-Z][a-zA-Z0-9]*)/);
520
+ return {
521
+ path: pathMatch[1],
522
+ component: componentMatch?.[1],
523
+ file: relPath,
524
+ framework: "react-router",
525
+ };
526
+ }
527
+ return undefined;
528
+ }
529
+ parseVueRouterConfig(content, relPath) {
530
+ const pathMatch = content.match(/path\s*:\s*["']([^"']+)["']/);
531
+ if (pathMatch) {
532
+ const componentMatch = content.match(/component\s*:\s*['"]?([^'"]+)['"]?/);
533
+ return {
534
+ path: pathMatch[1],
535
+ component: componentMatch?.[1],
536
+ file: relPath,
537
+ framework: "vue-router",
538
+ };
539
+ }
540
+ return undefined;
541
+ }
542
+ // ── 依赖图构建 ────────────────────────────────────────────────────────
543
+ /** 构建反向依赖图(文件 → 导入它的文件) */
544
+ buildReverseImports() {
545
+ this.index.reverseImports = {};
546
+ for (const [filePath, fileIndex] of Object.entries(this.index.files)) {
547
+ for (const imp of fileIndex.imports) {
548
+ if (!this.index.reverseImports[imp]) {
549
+ this.index.reverseImports[imp] = [];
550
+ }
551
+ if (!this.index.reverseImports[imp].includes(filePath)) {
552
+ this.index.reverseImports[imp].push(filePath);
553
+ }
554
+ }
555
+ }
556
+ }
557
+ // ── 工具方法 ──────────────────────────────────────────────────────────
558
+ /** 计算文件内容 SHA-256 哈希(取前 16 位) */
559
+ computeHash(content) {
560
+ return (0, node_crypto_1.createHash)("sha256").update(content).digest("hex").slice(0, 16);
561
+ }
562
+ /** 加载索引 */
563
+ loadIndex() {
564
+ try {
565
+ if ((0, node_fs_1.existsSync)(this.indexFilePath)) {
566
+ const raw = (0, node_fs_1.readFileSync)(this.indexFilePath, "utf-8");
567
+ const index = JSON.parse(raw);
568
+ if (index.version === INDEX_VERSION && index.projectDir === this.projectDir) {
569
+ return index;
570
+ }
571
+ }
572
+ }
573
+ catch {
574
+ // 加载失败
575
+ }
576
+ return {
577
+ version: INDEX_VERSION,
578
+ projectDir: this.projectDir,
579
+ createdAt: 0,
580
+ updatedAt: 0,
581
+ files: {},
582
+ reverseImports: {},
583
+ routes: [],
584
+ };
585
+ }
586
+ }
587
+ exports.ProjectIndexer = ProjectIndexer;
588
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/engine/indexer.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ export type { EngineOptions } from "./engine/rule-engine.js";
7
7
  export { SmartCache } from "./engine/cache.js";
8
8
  export type { CacheEntry, CacheManifest } from "./engine/cache.js";
9
9
  export { RuleRegistry, createRegistry } from "./rules/registry.js";
10
- export type { Rule, RuleContext, RuleConfig, CustomRuleConfig, Issue, Severity, ScanResult, ProjectConfig, ProjectMeta, RuleUtils, Fix, Position, ImportInfo, ParseOptions, Framework, Platform, ComponentLib, RuleCategory, } from "./types.js";
10
+ export type { Rule, RuleContext, RuleConfig, CustomRuleConfig, Issue, Severity, ScanResult, ProjectConfig, ProjectMeta, RuleUtils, Fix, Position, ImportInfo, ParseOptions, Framework as BaseFramework, Platform, ComponentLib, RuleCategory, } from "./types.js";
11
11
  export { parseAST, getImports, hasImport, walkAST } from "./utils/ast-parser.js";
12
12
  export { getAdaptiveConcurrency } from "./utils/concurrent.js";
13
13
  export { detectProjectMeta } from "./utils/project-detector.js";
@@ -41,7 +41,7 @@ export { generatePRComment, generatePRCommentSummary, COMMENT_MARKER, isGuardian
41
41
  export type { CommentMeta } from "./formatters/pr-comment.js";
42
42
  export { GitHubPRPublisher, GitLabMRPublisher, detectPublisherConfig, createPublisher, autoPublishComment, } from "./utils/pr-publisher.js";
43
43
  export type { PublishResult, PublisherConfig, PRPublisher } from "./utils/pr-publisher.js";
44
- export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, runAllExternalTools, } from "./integrations/index.js";
44
+ export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, playwrightIntegration, runAllExternalTools, } from "./integrations/index.js";
45
45
  export type { ExternalTool, ExternalToolResult } from "./integrations/index.js";
46
46
  export { i18nRules } from "./scanners/i18n-scanner.js";
47
47
  export { performanceRules } from "./scanners/performance-scanner.js";
@@ -73,4 +73,10 @@ export type { DashboardProject, DashboardReport, DashboardServerOptions, ReportP
73
73
  export { generateDashboardHtml } from "./server/dashboard-html.js";
74
74
  export { uploadToDashboardServer, detectDashboardConfig, } from "./utils/dashboard-client.js";
75
75
  export type { DashboardClientConfig, DashboardUploadResult, DashboardReportPayload, } from "./utils/dashboard-client.js";
76
+ export { ProjectIndexer } from "./engine/indexer.js";
77
+ export type { SymbolInfo, RouteInfo, FileIndex, ProjectIndex, } from "./engine/indexer.js";
78
+ export { FileWatcher, watchProject } from "./utils/file-watcher.js";
79
+ export type { WatchOptions } from "./utils/file-watcher.js";
80
+ export { parseRoutes, parseAllRoutes, findRouteFiles, parseNextJsRoutes, parseNuxtRoutes, parseUniAppRoutes, parseTaroRoutes, parseReactRouterConfig, parseVueRouterConfig, detectRouteFramework, } from "./utils/route-parser.js";
81
+ export type { Framework, ParsedRoutes } from "./utils/route-parser.js";
76
82
  //# sourceMappingURL=index.d.ts.map