frontend-guardian-core 2.6.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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/bin/fg-core.js +1238 -0
  3. package/bin/watch-mode.js +123 -0
  4. package/dist/engine/cache.d.ts +68 -0
  5. package/dist/engine/cache.d.ts.map +1 -0
  6. package/dist/engine/cache.js +164 -0
  7. package/dist/engine/cache.js.map +1 -0
  8. package/dist/engine/rule-engine.d.ts +135 -0
  9. package/dist/engine/rule-engine.d.ts.map +1 -0
  10. package/dist/engine/rule-engine.js +716 -0
  11. package/dist/engine/rule-engine.js.map +1 -0
  12. package/dist/formatters/github-annotation.d.ts +36 -0
  13. package/dist/formatters/github-annotation.d.ts.map +1 -0
  14. package/dist/formatters/github-annotation.js +122 -0
  15. package/dist/formatters/github-annotation.js.map +1 -0
  16. package/dist/formatters/pr-comment.d.ts +43 -0
  17. package/dist/formatters/pr-comment.d.ts.map +1 -0
  18. package/dist/formatters/pr-comment.js +171 -0
  19. package/dist/formatters/pr-comment.js.map +1 -0
  20. package/dist/formatters/sarif.d.ts +104 -0
  21. package/dist/formatters/sarif.d.ts.map +1 -0
  22. package/dist/formatters/sarif.js +130 -0
  23. package/dist/formatters/sarif.js.map +1 -0
  24. package/dist/index.d.ts +46 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +108 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/integrations/base.d.ts +44 -0
  29. package/dist/integrations/base.d.ts.map +1 -0
  30. package/dist/integrations/base.js +104 -0
  31. package/dist/integrations/base.js.map +1 -0
  32. package/dist/integrations/eslint.d.ts +8 -0
  33. package/dist/integrations/eslint.d.ts.map +1 -0
  34. package/dist/integrations/eslint.js +67 -0
  35. package/dist/integrations/eslint.js.map +1 -0
  36. package/dist/integrations/formatter.d.ts +35 -0
  37. package/dist/integrations/formatter.d.ts.map +1 -0
  38. package/dist/integrations/formatter.js +182 -0
  39. package/dist/integrations/formatter.js.map +1 -0
  40. package/dist/integrations/index.d.ts +17 -0
  41. package/dist/integrations/index.d.ts.map +1 -0
  42. package/dist/integrations/index.js +25 -0
  43. package/dist/integrations/index.js.map +1 -0
  44. package/dist/integrations/stylelint.d.ts +8 -0
  45. package/dist/integrations/stylelint.d.ts.map +1 -0
  46. package/dist/integrations/stylelint.js +59 -0
  47. package/dist/integrations/stylelint.js.map +1 -0
  48. package/dist/integrations/typescript.d.ts +8 -0
  49. package/dist/integrations/typescript.d.ts.map +1 -0
  50. package/dist/integrations/typescript.js +92 -0
  51. package/dist/integrations/typescript.js.map +1 -0
  52. package/dist/rules/registry.d.ts +83 -0
  53. package/dist/rules/registry.d.ts.map +1 -0
  54. package/dist/rules/registry.js +205 -0
  55. package/dist/rules/registry.js.map +1 -0
  56. package/dist/scanners/a11y-scanner.d.ts +14 -0
  57. package/dist/scanners/a11y-scanner.d.ts.map +1 -0
  58. package/dist/scanners/a11y-scanner.js +781 -0
  59. package/dist/scanners/a11y-scanner.js.map +1 -0
  60. package/dist/scanners/component-scanner.d.ts +12 -0
  61. package/dist/scanners/component-scanner.d.ts.map +1 -0
  62. package/dist/scanners/component-scanner.js +304 -0
  63. package/dist/scanners/component-scanner.js.map +1 -0
  64. package/dist/scanners/cross-file-scanner.d.ts +18 -0
  65. package/dist/scanners/cross-file-scanner.d.ts.map +1 -0
  66. package/dist/scanners/cross-file-scanner.js +684 -0
  67. package/dist/scanners/cross-file-scanner.js.map +1 -0
  68. package/dist/scanners/hooks-scanner.d.ts +15 -0
  69. package/dist/scanners/hooks-scanner.d.ts.map +1 -0
  70. package/dist/scanners/hooks-scanner.js +670 -0
  71. package/dist/scanners/hooks-scanner.js.map +1 -0
  72. package/dist/scanners/i18n-scanner.d.ts +13 -0
  73. package/dist/scanners/i18n-scanner.d.ts.map +1 -0
  74. package/dist/scanners/i18n-scanner.js +535 -0
  75. package/dist/scanners/i18n-scanner.js.map +1 -0
  76. package/dist/scanners/naming-scanner.d.ts +19 -0
  77. package/dist/scanners/naming-scanner.d.ts.map +1 -0
  78. package/dist/scanners/naming-scanner.js +746 -0
  79. package/dist/scanners/naming-scanner.js.map +1 -0
  80. package/dist/scanners/performance-scanner.d.ts +7 -0
  81. package/dist/scanners/performance-scanner.d.ts.map +1 -0
  82. package/dist/scanners/performance-scanner.js +402 -0
  83. package/dist/scanners/performance-scanner.js.map +1 -0
  84. package/dist/scanners/platform-scanner.d.ts +15 -0
  85. package/dist/scanners/platform-scanner.d.ts.map +1 -0
  86. package/dist/scanners/platform-scanner.js +320 -0
  87. package/dist/scanners/platform-scanner.js.map +1 -0
  88. package/dist/scanners/security-scanner.d.ts +7 -0
  89. package/dist/scanners/security-scanner.d.ts.map +1 -0
  90. package/dist/scanners/security-scanner.js +349 -0
  91. package/dist/scanners/security-scanner.js.map +1 -0
  92. package/dist/scanners/svelte-scanner.d.ts +14 -0
  93. package/dist/scanners/svelte-scanner.d.ts.map +1 -0
  94. package/dist/scanners/svelte-scanner.js +228 -0
  95. package/dist/scanners/svelte-scanner.js.map +1 -0
  96. package/dist/types.d.ts +343 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +6 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utils/ast-parser.d.ts +21 -0
  101. package/dist/utils/ast-parser.d.ts.map +1 -0
  102. package/dist/utils/ast-parser.js +119 -0
  103. package/dist/utils/ast-parser.js.map +1 -0
  104. package/dist/utils/baseline.d.ts +89 -0
  105. package/dist/utils/baseline.d.ts.map +1 -0
  106. package/dist/utils/baseline.js +156 -0
  107. package/dist/utils/baseline.js.map +1 -0
  108. package/dist/utils/ci-generator.d.ts +34 -0
  109. package/dist/utils/ci-generator.d.ts.map +1 -0
  110. package/dist/utils/ci-generator.js +194 -0
  111. package/dist/utils/ci-generator.js.map +1 -0
  112. package/dist/utils/common.d.ts +8 -0
  113. package/dist/utils/common.d.ts.map +1 -0
  114. package/dist/utils/common.js +38 -0
  115. package/dist/utils/common.js.map +1 -0
  116. package/dist/utils/concurrent.d.ts +16 -0
  117. package/dist/utils/concurrent.d.ts.map +1 -0
  118. package/dist/utils/concurrent.js +49 -0
  119. package/dist/utils/concurrent.js.map +1 -0
  120. package/dist/utils/config-loader.d.ts +8 -0
  121. package/dist/utils/config-loader.d.ts.map +1 -0
  122. package/dist/utils/config-loader.js +154 -0
  123. package/dist/utils/config-loader.js.map +1 -0
  124. package/dist/utils/fix-bot.d.ts +36 -0
  125. package/dist/utils/fix-bot.d.ts.map +1 -0
  126. package/dist/utils/fix-bot.js +274 -0
  127. package/dist/utils/fix-bot.js.map +1 -0
  128. package/dist/utils/git-hooks.d.ts +55 -0
  129. package/dist/utils/git-hooks.d.ts.map +1 -0
  130. package/dist/utils/git-hooks.js +318 -0
  131. package/dist/utils/git-hooks.js.map +1 -0
  132. package/dist/utils/history-report.d.ts +72 -0
  133. package/dist/utils/history-report.d.ts.map +1 -0
  134. package/dist/utils/history-report.js +144 -0
  135. package/dist/utils/history-report.js.map +1 -0
  136. package/dist/utils/init-config.d.ts +23 -0
  137. package/dist/utils/init-config.d.ts.map +1 -0
  138. package/dist/utils/init-config.js +146 -0
  139. package/dist/utils/init-config.js.map +1 -0
  140. package/dist/utils/pr-publisher.d.ts +64 -0
  141. package/dist/utils/pr-publisher.d.ts.map +1 -0
  142. package/dist/utils/pr-publisher.js +265 -0
  143. package/dist/utils/pr-publisher.js.map +1 -0
  144. package/dist/utils/project-detector.d.ts +20 -0
  145. package/dist/utils/project-detector.d.ts.map +1 -0
  146. package/dist/utils/project-detector.js +342 -0
  147. package/dist/utils/project-detector.js.map +1 -0
  148. package/dist/utils/report-uploader.d.ts +35 -0
  149. package/dist/utils/report-uploader.d.ts.map +1 -0
  150. package/dist/utils/report-uploader.js +106 -0
  151. package/dist/utils/report-uploader.js.map +1 -0
  152. package/package.json +78 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Core type definitions for frontend-guardian rule engine
3
+ */
4
+ export type Severity = "critical" | "warning" | "suggestion";
5
+ export type Platform = "pc" | "h5" | "wechat-mp" | "alipay-mp" | "douyin-mp" | "app" | "harmony" | "flutter" | "react-native";
6
+ export type Framework = "react" | "vue" | "nextjs" | "nuxt" | "uniapp" | "taro" | "flutter" | "react-native" | "harmony" | "svelte" | "solidjs" | "astro";
7
+ export type ComponentLib = "antd" | "element-plus" | "mui" | "vuetify" | "nutui" | "tdesign" | "shadcn" | "none";
8
+ export interface Issue {
9
+ /** Unique rule identifier */
10
+ ruleId: string;
11
+ /** Human-readable title */
12
+ title: string;
13
+ /** Detailed description */
14
+ description: string;
15
+ /** Severity level */
16
+ severity: Severity;
17
+ /** File path (relative to project root) */
18
+ file: string;
19
+ /** Line number (1-based) */
20
+ line: number;
21
+ /** Column number (1-based) */
22
+ column: number;
23
+ /** End line number */
24
+ endLine?: number;
25
+ /** End column number */
26
+ endColumn?: number;
27
+ /** Raw source code snippet */
28
+ source?: string;
29
+ /** Suggested fix */
30
+ fix?: Fix;
31
+ /** 规则文档链接(终端可点击跳转) */
32
+ docsUrl?: string;
33
+ /** Additional metadata */
34
+ meta?: Record<string, unknown>;
35
+ }
36
+ /** 修复置信度级别 */
37
+ export type FixConfidence = "high" | "medium" | "low";
38
+ export interface Fix {
39
+ /** Replacement text */
40
+ text: string;
41
+ /** Start position in file */
42
+ start: Position;
43
+ /** End position in file */
44
+ end: Position;
45
+ /** 修复置信度(默认 high) */
46
+ confidence?: FixConfidence;
47
+ /** 修复说明(交互式模式下展示给用户) */
48
+ description?: string;
49
+ }
50
+ /** Fix preview for dry-run mode */
51
+ export interface FixPreview {
52
+ /** File path */
53
+ file: string;
54
+ /** Rule ID */
55
+ ruleId: string;
56
+ /** Issue title */
57
+ title: string;
58
+ /** Diff preview */
59
+ diff: string;
60
+ }
61
+ export interface Position {
62
+ line: number;
63
+ column: number;
64
+ }
65
+ export interface ScanResult {
66
+ /** Module name */
67
+ module: string;
68
+ /** Total issues found */
69
+ total: number;
70
+ /** Issues grouped by severity */
71
+ issues: Record<Severity, Issue[]>;
72
+ /** Scan duration in ms */
73
+ duration: number;
74
+ /** Files scanned */
75
+ filesScanned: number;
76
+ /** Files with issues */
77
+ filesWithIssues: number;
78
+ }
79
+ export interface Rule {
80
+ /** Rule ID (kebab-case) */
81
+ id: string;
82
+ /** Rule name */
83
+ name: string;
84
+ /** Rule description */
85
+ description: string;
86
+ /** Default severity */
87
+ severity: Severity;
88
+ /** Category */
89
+ category: RuleCategory;
90
+ /** Whether rule is enabled by default */
91
+ defaultEnabled: boolean;
92
+ /** Frameworks this rule applies to */
93
+ frameworks?: Framework[];
94
+ /** Component libs this rule applies to */
95
+ componentLibs?: ComponentLib[];
96
+ /** Platforms this rule applies to */
97
+ platforms?: Platform[];
98
+ /** Rule metadata (params, notes, etc.) */
99
+ meta?: Record<string, unknown>;
100
+ /** 规则文档链接 */
101
+ docsUrl?: string;
102
+ /** Execute rule on a file */
103
+ execute(context: RuleContext): Issue[] | Promise<Issue[]>;
104
+ }
105
+ export type RuleCategory = "i18n" | "component" | "hooks" | "platform" | "performance" | "accessibility" | "security" | "style" | "architecture";
106
+ export interface RuleContext {
107
+ /** Absolute path to the file being analyzed */
108
+ filePath: string;
109
+ /** File content */
110
+ source: string;
111
+ /** Parsed AST (if applicable) */
112
+ ast?: unknown;
113
+ /** Project configuration */
114
+ config: ProjectConfig;
115
+ /** Detected project metadata */
116
+ projectMeta: ProjectMeta;
117
+ /** Utility helpers */
118
+ utils: RuleUtils;
119
+ /** v2.1.1: 单次扫描内规则间共享的缓存(按文件隔离) */
120
+ sharedCache?: Map<string, unknown>;
121
+ }
122
+ export interface RuleUtils {
123
+ /** Parse file to AST */
124
+ parseAST(source: string, options?: ParseOptions): unknown;
125
+ /** Get imported modules */
126
+ getImports(ast: unknown): ImportInfo[];
127
+ /** Report a position in source */
128
+ reportPosition(offset: number): Position;
129
+ /** Extract source snippet */
130
+ getSourceSnippet(start: number, end: number): string;
131
+ }
132
+ export interface ImportInfo {
133
+ source: string;
134
+ specifiers: string[];
135
+ defaultImport?: string;
136
+ namespaceImport?: string;
137
+ line: number;
138
+ column: number;
139
+ }
140
+ export interface ParseOptions {
141
+ /** File extension to determine parser */
142
+ ext?: string;
143
+ /** Source type: script | module */
144
+ sourceType?: "script" | "module";
145
+ /** Enable JSX/TSX */
146
+ jsx?: boolean;
147
+ }
148
+ export interface RuleConfig {
149
+ /** 规则 ID */
150
+ id: string;
151
+ /** 是否启用(默认 true) */
152
+ enabled?: boolean;
153
+ /** 覆盖严重级别 */
154
+ severity?: Severity;
155
+ /** 规则参数(覆盖默认值) */
156
+ params?: Record<string, unknown>;
157
+ }
158
+ export interface CustomRuleConfig {
159
+ /** 自定义规则文件路径(相对项目根目录或绝对路径) */
160
+ path: string;
161
+ }
162
+ export interface ProjectConfig {
163
+ /** Config file path */
164
+ configFile?: string;
165
+ /** 继承的组织级基线配置(URL 或本地路径) */
166
+ extends?: string;
167
+ /** i18n configuration */
168
+ i18n?: I18nConfig;
169
+ /** Component configuration */
170
+ component?: ComponentConfig;
171
+ /** Hooks configuration */
172
+ hooks?: HooksConfig;
173
+ /** Platform configuration */
174
+ platform?: PlatformConfig;
175
+ /** Gate configuration */
176
+ gate?: GateConfig;
177
+ /** AI context configuration */
178
+ aiContext?: AIContextConfig;
179
+ /** Scan scope */
180
+ scan?: ScanConfig;
181
+ /** Naming convention configuration */
182
+ naming?: NamingConfig;
183
+ /** ── Phase 3: 规则配置驱动 ── */
184
+ /** 规则开关/参数配置 */
185
+ rules?: RuleConfig[];
186
+ /** 自定义规则文件列表 */
187
+ customRules?: CustomRuleConfig[];
188
+ }
189
+ export interface I18nConfig {
190
+ sourceLocale: string;
191
+ targetLocales: string[];
192
+ format: "json" | "yaml" | "js" | "ts";
193
+ keyPattern: string;
194
+ extractPaths: string[];
195
+ ignorePaths: string[];
196
+ interpolationPattern: string;
197
+ translateProvider: string;
198
+ }
199
+ export interface ComponentConfig {
200
+ library: "auto" | ComponentLib;
201
+ themeTokenPrefix: string;
202
+ maxSelectOptions: number;
203
+ checkA11y: boolean;
204
+ checkPerf: boolean;
205
+ libraryVersion: string;
206
+ }
207
+ export interface HooksConfig {
208
+ maxEffectDeps: number;
209
+ checkClosure: boolean;
210
+ checkCustomHookNaming: boolean;
211
+ checkVueComposables: boolean;
212
+ }
213
+ export interface PlatformConfig {
214
+ targets: Platform[];
215
+ mp: MpConfig;
216
+ mobile: MobileConfig;
217
+ harmony: HarmonyConfig;
218
+ }
219
+ export interface MpConfig {
220
+ type: string;
221
+ maxMainPackageSize: number;
222
+ maxSubPackageSize: number;
223
+ maxBase64ImageSize: number;
224
+ maxPageStack: number;
225
+ }
226
+ export interface MobileConfig {
227
+ minTouchTarget: number;
228
+ checkSafeArea: boolean;
229
+ checkClickDelay: boolean;
230
+ checkKeyboard: boolean;
231
+ }
232
+ export interface HarmonyConfig {
233
+ strictTypeCheck: boolean;
234
+ arktsVersion: string;
235
+ }
236
+ export interface GateConfig {
237
+ enabled: boolean;
238
+ critical: {
239
+ max: number;
240
+ };
241
+ warning: {
242
+ max: number;
243
+ };
244
+ suggestion: {
245
+ max: number;
246
+ };
247
+ blockPipeline: boolean;
248
+ }
249
+ export interface AIContextConfig {
250
+ agent: "claude" | "cursor" | "copilot" | "all" | "generic";
251
+ includeFiles: string[];
252
+ autoUpdate: boolean;
253
+ excludeDirs: string[];
254
+ }
255
+ export interface ScanConfig {
256
+ includeExtensions: string[];
257
+ excludeDirs: string[];
258
+ excludePatterns: string[];
259
+ }
260
+ export interface NamingConfig {
261
+ /** 类名规范: PascalCase */
262
+ classCase: "PascalCase" | "camelCase";
263
+ /** 接口名规范 */
264
+ interfaceCase: "PascalCase" | "camelCase";
265
+ /** 类型别名规范 */
266
+ typeAliasCase: "PascalCase" | "camelCase";
267
+ /** 函数/方法规范 */
268
+ functionCase: "camelCase" | "PascalCase";
269
+ /** 变量规范 */
270
+ variableCase: "camelCase" | "snake_case";
271
+ /** 常量规范 (const 声明的字面量) */
272
+ constantCase: "UPPER_SNAKE_CASE" | "camelCase";
273
+ /** 枚举名规范 */
274
+ enumCase: "PascalCase" | "UPPER_SNAKE_CASE";
275
+ /** 枚举成员规范 */
276
+ enumMemberCase: "UPPER_SNAKE_CASE" | "PascalCase";
277
+ /** 私有成员前缀: underscore | hash | none */
278
+ privatePrefix: "underscore" | "hash" | "none";
279
+ /** 文件名规范 */
280
+ fileNameCase: "kebab-case" | "camelCase" | "PascalCase";
281
+ /** 文件夹名规范 */
282
+ folderNameCase: "kebab-case" | "camelCase" | "PascalCase";
283
+ /** 是否允许单字母变量 (i, j, k, x, y, z) */
284
+ allowSingleLetter: boolean;
285
+ /** 是否允许 React 组件使用 PascalCase 函数 */
286
+ allowPascalCaseComponents: boolean;
287
+ /** 忽略的命名模式 */
288
+ ignorePatterns: string[];
289
+ }
290
+ export interface ProjectMeta {
291
+ /** Detected framework */
292
+ framework?: Framework;
293
+ /** Detected component library */
294
+ componentLib?: ComponentLib;
295
+ /** Detected platforms */
296
+ platforms: Platform[];
297
+ /** Framework version */
298
+ frameworkVersion?: string;
299
+ /** Component lib version */
300
+ componentLibVersion?: string;
301
+ /** Has TypeScript */
302
+ hasTypeScript: boolean;
303
+ /** Has i18n */
304
+ hasI18n: boolean;
305
+ /** i18n library */
306
+ i18nLib?: string;
307
+ /** Package.json scripts */
308
+ scripts: Record<string, string>;
309
+ /** Detected bundler / build tool */
310
+ bundler?: Bundler;
311
+ bundlerVersion?: string;
312
+ /** Detected test framework */
313
+ testFramework?: TestFramework;
314
+ testFrameworkVersion?: string;
315
+ /** Detected state manager */
316
+ stateManager?: StateManager;
317
+ stateManagerVersion?: string;
318
+ /** Detected styling solution */
319
+ styling?: StylingSolution;
320
+ stylingVersion?: string;
321
+ /** Detected router */
322
+ router?: RouterLib;
323
+ routerVersion?: string;
324
+ /** Detected package manager */
325
+ packageManager: PackageManager;
326
+ /** Detected linter / formatter */
327
+ linter?: LinterTool;
328
+ /** Detected monorepo tool */
329
+ monorepoTool?: MonorepoTool;
330
+ /** Runtime (node / deno / bun) */
331
+ runtime: Runtime;
332
+ runtimeVersion?: string;
333
+ }
334
+ export type Bundler = "webpack" | "vite" | "rsbuild" | "parcel" | "esbuild" | "rollup" | "turbopack" | "farm" | "rspack" | "wmr";
335
+ export type TestFramework = "jest" | "vitest" | "cypress" | "playwright" | "mocha" | "karma" | "ava" | "node:test";
336
+ export type StateManager = "redux" | "mobx" | "zustand" | "recoil" | "jotai" | "pinia" | "vuex" | "valtio";
337
+ export type StylingSolution = "tailwindcss" | "styled-components" | "emotion" | "sass" | "less" | "css-modules" | "vanilla-extract" | "unocss" | "windicss";
338
+ export type RouterLib = "react-router" | "vue-router" | "tanstack-router" | "wouter" | "nextjs-router" | "nuxt-router";
339
+ export type PackageManager = "npm" | "yarn" | "pnpm" | "bun";
340
+ export type LinterTool = "eslint" | "biome" | "oxlint" | "prettier" | "stylelint";
341
+ export type MonorepoTool = "nx" | "turborepo" | "lerna" | "rush" | "pnpm-workspace";
342
+ export type Runtime = "node" | "deno" | "bun";
343
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Core type definitions for frontend-guardian rule engine
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * AST 解析工具
3
+ * 基于 @babel/parser,支持 JS/TS/JSX/TSX/Vue SFC
4
+ */
5
+ import type { ParseResult } from "@babel/parser";
6
+ import type { File, Node } from "@babel/types";
7
+ import type { ImportInfo } from "../types.js";
8
+ export interface ParseOptions {
9
+ ext?: string;
10
+ sourceType?: "script" | "module";
11
+ jsx?: boolean;
12
+ }
13
+ /** 解析源代码为 AST */
14
+ export declare function parseAST(source: string, options?: ParseOptions): ParseResult<File> | null;
15
+ /** 从 AST 提取 import 信息 */
16
+ export declare function getImports(ast: ParseResult<File> | null): ImportInfo[];
17
+ /** 检查 AST 是否包含特定 import */
18
+ export declare function hasImport(ast: ParseResult<File> | null, moduleName: string, importName?: string): boolean;
19
+ /** 遍历 AST 节点 */
20
+ export declare function walkAST<T extends Node>(ast: ParseResult<File> | null, nodeType: string, callback: (node: T, path: any) => void): void;
21
+ //# sourceMappingURL=ast-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAsCzF;AAED,yBAAyB;AACzB,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,UAAU,EAAE,CAmCtE;AAED,2BAA2B;AAC3B,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAazG;AAED,gBAAgB;AAChB,wBAAgB,OAAO,CAAC,CAAC,SAAS,IAAI,EAClC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,EAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GACvC,IAAI,CAQN"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * AST 解析工具
4
+ * 基于 @babel/parser,支持 JS/TS/JSX/TSX/Vue SFC
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseAST = parseAST;
11
+ exports.getImports = getImports;
12
+ exports.hasImport = hasImport;
13
+ exports.walkAST = walkAST;
14
+ const parser_1 = require("@babel/parser");
15
+ const traverse_1 = __importDefault(require("@babel/traverse"));
16
+ /** 解析源代码为 AST */
17
+ function parseAST(source, options) {
18
+ const ext = options?.ext || ".js";
19
+ const isTS = ext === ".ts" || ext === ".tsx" || ext === ".vue";
20
+ const isJSX = ext === ".jsx" || ext === ".tsx" || ext === ".vue" || options?.jsx;
21
+ // Vue SFC: 提取 <script> 内容
22
+ if (ext === ".vue") {
23
+ const scriptMatch = source.match(/<script[^>]*>([\s\S]*?)<\/script>/);
24
+ if (scriptMatch) {
25
+ source = scriptMatch[1].trim();
26
+ }
27
+ else {
28
+ return null;
29
+ }
30
+ }
31
+ const parserOpts = {
32
+ sourceType: options?.sourceType || "module",
33
+ allowImportExportEverywhere: true,
34
+ allowReturnOutsideFunction: true,
35
+ plugins: [
36
+ "decorators-legacy",
37
+ "classProperties",
38
+ "objectRestSpread",
39
+ "asyncGenerators",
40
+ "dynamicImport",
41
+ "optionalChaining",
42
+ "nullishCoalescingOperator",
43
+ ...(isTS ? ["typescript"] : []),
44
+ ...(isJSX ? ["jsx"] : []),
45
+ ],
46
+ };
47
+ try {
48
+ return (0, parser_1.parse)(source, parserOpts);
49
+ }
50
+ catch (err) {
51
+ // 解析失败,返回 null
52
+ return null;
53
+ }
54
+ }
55
+ /** 从 AST 提取 import 信息 */
56
+ function getImports(ast) {
57
+ if (!ast)
58
+ return [];
59
+ const imports = [];
60
+ (0, traverse_1.default)(ast, {
61
+ ImportDeclaration(path) {
62
+ const source = path.node.source.value;
63
+ const specifiers = [];
64
+ let defaultImport;
65
+ let namespaceImport;
66
+ const { line, column } = path.node.loc?.start || { line: 0, column: 0 };
67
+ for (const spec of path.node.specifiers) {
68
+ if (spec.type === "ImportDefaultSpecifier") {
69
+ defaultImport = spec.local.name;
70
+ }
71
+ else if (spec.type === "ImportNamespaceSpecifier") {
72
+ namespaceImport = spec.local.name;
73
+ }
74
+ else if (spec.type === "ImportSpecifier") {
75
+ specifiers.push(spec.local.name);
76
+ }
77
+ }
78
+ imports.push({
79
+ source,
80
+ specifiers,
81
+ defaultImport,
82
+ namespaceImport,
83
+ line,
84
+ column,
85
+ });
86
+ },
87
+ });
88
+ return imports;
89
+ }
90
+ /** 检查 AST 是否包含特定 import */
91
+ function hasImport(ast, moduleName, importName) {
92
+ if (!ast)
93
+ return false;
94
+ const imports = getImports(ast);
95
+ for (const imp of imports) {
96
+ if (imp.source === moduleName) {
97
+ if (!importName)
98
+ return true;
99
+ if (imp.defaultImport === importName)
100
+ return true;
101
+ if (imp.namespaceImport === importName)
102
+ return true;
103
+ if (imp.specifiers.includes(importName))
104
+ return true;
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ /** 遍历 AST 节点 */
110
+ function walkAST(ast, nodeType, callback) {
111
+ if (!ast)
112
+ return;
113
+ (0, traverse_1.default)(ast, {
114
+ [nodeType](path) {
115
+ callback(path.node, path);
116
+ },
117
+ });
118
+ }
119
+ //# sourceMappingURL=ast-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/utils/ast-parser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAeH,4BAsCC;AAGD,gCAmCC;AAGD,8BAaC;AAGD,0BAYC;AAxHD,0CAAoD;AAGpD,+DAAuC;AASvC,iBAAiB;AACjB,SAAgB,QAAQ,CAAC,MAAc,EAAE,OAAsB;IAC3D,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC;IAC/D,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,EAAE,GAAG,CAAC;IAEjF,0BAA0B;IAC1B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACtE,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAkB;QAC9B,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,QAAQ;QAC3C,2BAA2B,EAAE,IAAI;QACjC,0BAA0B,EAAE,IAAI;QAChC,OAAO,EAAE;YACL,mBAAmB;YACnB,iBAAiB;YACjB,kBAAkB;YAClB,iBAAiB;YACjB,eAAe;YACf,kBAAkB;YAClB,2BAA2B;YAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC;KACJ,CAAC;IAEF,IAAI,CAAC;QACD,OAAO,IAAA,cAAU,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,eAAe;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,yBAAyB;AACzB,SAAgB,UAAU,CAAC,GAA6B;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACV,iBAAiB,CAAC,IAAI;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACtC,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,IAAI,aAAiC,CAAC;YACtC,IAAI,eAAmC,CAAC;YACxC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAExE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;oBACzC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACpC,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;oBAClD,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtC,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBACzC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACT,MAAM;gBACN,UAAU;gBACV,aAAa;gBACb,eAAe;gBACf,IAAI;gBACJ,MAAM;aACT,CAAC,CAAC;QACP,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,2BAA2B;AAC3B,SAAgB,SAAS,CAAC,GAA6B,EAAE,UAAkB,EAAE,UAAmB;IAC5F,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC7B,IAAI,GAAG,CAAC,aAAa,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAClD,IAAI,GAAG,CAAC,eAAe,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YACpD,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;QACzD,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,gBAAgB;AAChB,SAAgB,OAAO,CACnB,GAA6B,EAC7B,QAAgB,EAChB,QAAsC;IAEtC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAA,kBAAQ,EAAC,GAAG,EAAE;QACV,CAAC,QAAQ,CAAC,CAAC,IAAS;YAChB,QAAQ,CAAC,IAAI,CAAC,IAAS,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Baseline 管理器
3
+ *
4
+ * 支持已有问题不阻塞,仅关注新增问题的渐进式治理模式。
5
+ * 适用于遗留项目首次接入 frontend-guardian。
6
+ *
7
+ * 使用方式:
8
+ * 1. 首次运行:fg-core --baseline .fg-baseline.json --module all
9
+ * → 扫描全部问题并保存为 baseline 文件
10
+ * 2. 后续运行:fg-core --baseline .fg-baseline.json --module all
11
+ * → 仅报告新增问题(与 baseline 对比)
12
+ * 3. 定期刷新:删除 baseline 重新生成(清理已修复的遗留问题)
13
+ */
14
+ import type { Issue } from "../types.js";
15
+ /** Baseline 文件格式 */
16
+ export interface BaselineFile {
17
+ /** 格式版本 */
18
+ version: string;
19
+ /** 生成时间戳 */
20
+ generatedAt: number;
21
+ /** 已知问题列表 */
22
+ issues: BaselineIssue[];
23
+ /** 元数据 */
24
+ meta?: {
25
+ projectDir?: string;
26
+ toolVersion?: string;
27
+ };
28
+ }
29
+ /** Baseline 中的单条问题(精简字段,用于匹配) */
30
+ export interface BaselineIssue {
31
+ file: string;
32
+ ruleId: string;
33
+ line: number;
34
+ column: number;
35
+ severity: Issue["severity"];
36
+ title: string;
37
+ }
38
+ /** Baseline 对比结果 */
39
+ export interface BaselineResult {
40
+ /** 新问题(不在 baseline 中) */
41
+ newIssues: Issue[];
42
+ /** 已知问题(在 baseline 中,本次仍出现) */
43
+ knownIssues: Issue[];
44
+ /** 已修复问题(在 baseline 中,本次未出现) */
45
+ fixedIssues: BaselineIssue[];
46
+ /** 总问题数 */
47
+ totalIssues: number;
48
+ /** 是否使用了 baseline */
49
+ baselineLoaded: boolean;
50
+ }
51
+ /** 将 Issue 精简为 BaselineIssue */
52
+ export declare function toBaselineIssue(issue: Issue): BaselineIssue;
53
+ /** 加载 baseline 文件 */
54
+ export declare function loadBaseline(filePath: string): BaselineFile | null;
55
+ /** 保存 baseline 文件 */
56
+ export declare function saveBaseline(filePath: string, issues: Issue[], meta?: BaselineFile["meta"]): void;
57
+ /**
58
+ * 将当前扫描结果与 baseline 对比
59
+ * @param issues 当前扫描出的所有问题
60
+ * @param baselinePath baseline 文件路径(绝对或相对)
61
+ * @param projectDir 项目根目录(用于解析相对路径)
62
+ * @returns BaselineResult 对比结果
63
+ */
64
+ export declare function compareWithBaseline(issues: Issue[], baselinePath: string, projectDir: string): BaselineResult;
65
+ /**
66
+ * 生成或更新 baseline 文件
67
+ * 如果文件已存在则覆盖
68
+ */
69
+ export declare function generateBaseline(issues: Issue[], baselinePath: string, projectDir: string, meta?: BaselineFile["meta"]): void;
70
+ /**
71
+ * BaselineManager — 面向对象的封装
72
+ */
73
+ export declare class BaselineManager {
74
+ private baselinePath;
75
+ private projectDir;
76
+ private baseline;
77
+ constructor(baselinePath: string, projectDir: string);
78
+ /** 是否已加载有效的 baseline */
79
+ isLoaded(): boolean;
80
+ /** 获取已加载的 baseline 内容 */
81
+ getBaseline(): BaselineFile | null;
82
+ /** 对比当前 issues,返回仅含新增问题的过滤结果 */
83
+ filterNewIssues(issues: Issue[]): BaselineResult;
84
+ /** 将当前 issues 保存为 baseline(覆盖) */
85
+ save(issues: Issue[], meta?: BaselineFile["meta"]): void;
86
+ /** 获取 baseline 文件路径 */
87
+ getPath(): string;
88
+ }
89
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/utils/baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,oBAAoB;AACpB,MAAM,WAAW,YAAY;IACzB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,UAAU;IACV,IAAI,CAAC,EAAE;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACL;AAED,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,oBAAoB;AACpB,MAAM,WAAW,cAAc;IAC3B,yBAAyB;IACzB,SAAS,EAAE,KAAK,EAAE,CAAC;IACnB,+BAA+B;IAC/B,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,gCAAgC;IAChC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,cAAc,EAAE,OAAO,CAAC;CAC3B;AASD,gCAAgC;AAChC,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAS3D;AAED,qBAAqB;AACrB,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAelE;AAED,qBAAqB;AACrB,wBAAgB,YAAY,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,IAAI,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAC5B,IAAI,CAWN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACnB,cAAc,CAsChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAC5B,IAAI,CAGN;AAED;;GAEG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMpD,wBAAwB;IACxB,QAAQ,IAAI,OAAO;IAInB,yBAAyB;IACzB,WAAW,IAAI,YAAY,GAAG,IAAI;IAIlC,gCAAgC;IAChC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc;IAIhD,kCAAkC;IAClC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IAKxD,uBAAuB;IACvB,OAAO,IAAI,MAAM;CAGpB"}