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,320 @@
1
+ "use strict";
2
+ /**
3
+ * 多端平台适配 Scanner
4
+ * 迁移自 scan-platform.sh,检测多端项目的平台适配问题
5
+ *
6
+ * 规则列表:
7
+ * 1. platform-mp-size — 小程序包体积检查
8
+ * 2. platform-mp-base64 — base64 图片检查
9
+ * 3. platform-mp-http — HTTP 协议检查
10
+ * 4. platform-mobile-safearea — 安全区域适配
11
+ * 5. platform-harmony — 鸿蒙 ArkTS 规范
12
+ * 6. platform-responsive — 响应式断点配置
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.platformRules = void 0;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ exports.platformRules = [
19
+ {
20
+ id: "platform-mp-size",
21
+ name: "小程序包体积检查",
22
+ description: "小程序主包体积不应超过 2MB",
23
+ severity: "critical",
24
+ category: "platform",
25
+ defaultEnabled: true,
26
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-mp-size.md",
27
+ platforms: ["wechat-mp", "alipay-mp", "douyin-mp"],
28
+ execute(context) {
29
+ const issues = [];
30
+ // 检查构建输出目录
31
+ const buildDirs = ["dist/build/mp-weixin", "unpackage/dist/build/mp-weixin", "dist", "build/mp-weixin"];
32
+ for (const dir of buildDirs) {
33
+ const fullPath = (0, node_path_1.resolve)((0, node_path_1.dirname)(context.filePath), dir);
34
+ if (!(0, node_fs_1.existsSync)(fullPath))
35
+ continue;
36
+ try {
37
+ const stats = (0, node_fs_1.statSync)(fullPath);
38
+ if (!stats.isDirectory())
39
+ continue;
40
+ // 粗略计算目录大小
41
+ let totalSize = 0;
42
+ const calcSize = (d) => {
43
+ const entries = (0, node_fs_1.readdirSync)(d, { withFileTypes: true });
44
+ for (const entry of entries) {
45
+ const entryPath = (0, node_path_1.resolve)(d, entry.name);
46
+ if (entry.isDirectory()) {
47
+ calcSize(entryPath);
48
+ }
49
+ else {
50
+ totalSize += (0, node_fs_1.statSync)(entryPath).size;
51
+ }
52
+ }
53
+ };
54
+ calcSize(fullPath);
55
+ const sizeKB = Math.round(totalSize / 1024);
56
+ if (sizeKB > 2048) {
57
+ issues.push({
58
+ ruleId: "platform-mp-size",
59
+ title: `小程序包体积过大: ${sizeKB}KB`,
60
+ description: `小程序主包体积 ${sizeKB}KB 超过 2MB 限制,建议启用分包加载、压缩图片、移除未使用代码`,
61
+ severity: "critical",
62
+ file: context.filePath,
63
+ line: 1,
64
+ column: 1,
65
+ source: `${dir}: ${sizeKB}KB`,
66
+ });
67
+ }
68
+ else if (sizeKB > 1800) {
69
+ issues.push({
70
+ ruleId: "platform-mp-size",
71
+ title: `小程序包体积接近上限: ${sizeKB}KB`,
72
+ description: `小程序主包体积 ${sizeKB}KB 接近 2MB 限制,建议优化`,
73
+ severity: "warning",
74
+ file: context.filePath,
75
+ line: 1,
76
+ column: 1,
77
+ source: `${dir}: ${sizeKB}KB`,
78
+ });
79
+ }
80
+ // 只检查第一个存在的目录
81
+ break;
82
+ }
83
+ catch {
84
+ // 跳过
85
+ }
86
+ }
87
+ return issues;
88
+ },
89
+ },
90
+ {
91
+ id: "platform-mp-base64",
92
+ name: "小程序 base64 图片检查",
93
+ description: "小程序中不应内联大图 base64",
94
+ severity: "warning",
95
+ category: "platform",
96
+ defaultEnabled: true,
97
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-mp-base64.md",
98
+ platforms: ["wechat-mp", "alipay-mp", "douyin-mp"],
99
+ execute(context) {
100
+ const issues = [];
101
+ const source = context.source;
102
+ // 检测 base64 图片(较长的 base64 字符串暗示大图)
103
+ const base64Regex = /data:image\/[^;]+;base64,[A-Za-z0-9+/]{1000,}/g;
104
+ let match;
105
+ while ((match = base64Regex.exec(source)) !== null) {
106
+ const line = source.slice(0, match.index).split("\n").length;
107
+ issues.push({
108
+ ruleId: "platform-mp-base64",
109
+ title: "包含大图 base64 编码",
110
+ description: "检测到较大的 base64 图片内联,会增加包体积。建议改为网络图片或放到 static 目录",
111
+ severity: "warning",
112
+ file: context.filePath,
113
+ line,
114
+ column: 1,
115
+ source: match[0].slice(0, 50) + "...",
116
+ });
117
+ }
118
+ return issues;
119
+ },
120
+ },
121
+ {
122
+ id: "platform-mp-http",
123
+ name: "应使用 HTTPS",
124
+ description: "小程序中不应使用 HTTP 协议",
125
+ severity: "critical",
126
+ category: "platform",
127
+ defaultEnabled: true,
128
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-mp-http.md",
129
+ platforms: ["wechat-mp", "alipay-mp", "douyin-mp", "app"],
130
+ execute(context) {
131
+ const issues = [];
132
+ const lines = context.source.split("\n");
133
+ for (let i = 0; i < lines.length; i++) {
134
+ const line = lines[i];
135
+ // 检测 http://(排除 localhost 和注释)
136
+ const match = line.match(/http:\/\/[^\s"'`]+/);
137
+ if (match) {
138
+ const url = match[0];
139
+ if (url.includes("localhost") || url.includes("127.0.0.1"))
140
+ continue;
141
+ if (line.trim().startsWith("//"))
142
+ continue;
143
+ issues.push({
144
+ ruleId: "platform-mp-http",
145
+ title: "使用 HTTP 协议",
146
+ description: `检测到 HTTP 请求地址 ${url},小程序和移动端要求使用 HTTPS`,
147
+ severity: "critical",
148
+ file: context.filePath,
149
+ line: i + 1,
150
+ column: (match.index || 0) + 1,
151
+ source: line.trim(),
152
+ });
153
+ }
154
+ }
155
+ return issues;
156
+ },
157
+ },
158
+ {
159
+ id: "platform-mobile-safearea",
160
+ name: "移动端安全区域适配",
161
+ description: "固定定位元素应适配安全区域",
162
+ severity: "warning",
163
+ category: "platform",
164
+ defaultEnabled: true,
165
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-mobile-safearea.md",
166
+ platforms: ["h5", "app", "react-native", "flutter"],
167
+ execute(context) {
168
+ const issues = [];
169
+ const ext = (0, node_path_1.extname)(context.filePath).toLowerCase();
170
+ // CSS 文件检测
171
+ if ([".css", ".scss", ".less"].includes(ext)) {
172
+ const source = context.source;
173
+ // 检测固定定位但未适配安全区域
174
+ if (/position\s*:\s*fixed|fixed\s*:\s*bottom/i.test(source)) {
175
+ if (!/safe-area-inset|env\(/i.test(source)) {
176
+ issues.push({
177
+ ruleId: "platform-mobile-safearea",
178
+ title: "固定定位元素缺少安全区域适配",
179
+ description: "检测到 position: fixed 布局,建议添加 safe-area-inset-bottom 适配刘海屏/全面屏",
180
+ severity: "warning",
181
+ file: context.filePath,
182
+ line: 1,
183
+ column: 1,
184
+ source: "position: fixed",
185
+ });
186
+ }
187
+ }
188
+ // 检测点击区域过小
189
+ const sizeRegex = /width\s*:\s*(\d+)px.*height\s*:\s*(\d+)px/gi;
190
+ let match;
191
+ while ((match = sizeRegex.exec(source)) !== null) {
192
+ const w = parseInt(match[1], 10);
193
+ const h = parseInt(match[2], 10);
194
+ if (w < 44 || h < 44) {
195
+ const line = source.slice(0, match.index).split("\n").length;
196
+ issues.push({
197
+ ruleId: "platform-mobile-safearea",
198
+ title: "点击区域可能小于 44x44px",
199
+ description: `检测到元素尺寸 ${w}x${h}px,移动端点击区域建议不小于 44x44px(WCAG 推荐)`,
200
+ severity: "suggestion",
201
+ file: context.filePath,
202
+ line,
203
+ column: (match.index || 0) + 1,
204
+ source: match[0],
205
+ });
206
+ }
207
+ }
208
+ }
209
+ return issues;
210
+ },
211
+ },
212
+ {
213
+ id: "platform-harmony",
214
+ name: "鸿蒙 ArkTS 规范",
215
+ description: "鸿蒙项目应遵循 ArkTS 编码规范",
216
+ severity: "warning",
217
+ category: "platform",
218
+ defaultEnabled: true,
219
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-harmony.md",
220
+ platforms: ["harmony"],
221
+ execute(context) {
222
+ const issues = [];
223
+ const ext = (0, node_path_1.extname)(context.filePath).toLowerCase();
224
+ if (ext !== ".ets")
225
+ return issues;
226
+ const source = context.source;
227
+ const lines = source.split("\n");
228
+ // 检测 struct 缺少装饰器
229
+ for (let i = 0; i < lines.length; i++) {
230
+ const line = lines[i];
231
+ if (/\bstruct\s+\w+/.test(line)) {
232
+ // 检查前面几行是否有 @Component 或 @Entry
233
+ const prevLines = lines.slice(Math.max(0, i - 5), i).join("\n");
234
+ if (!/@Component|@Entry|@Preview|@Builder/i.test(prevLines)) {
235
+ issues.push({
236
+ ruleId: "platform-harmony",
237
+ title: "ArkTS struct 缺少装饰器",
238
+ description: "ArkTS struct 应使用 @Component、@Entry 或 @Preview 装饰器声明",
239
+ severity: "warning",
240
+ file: context.filePath,
241
+ line: i + 1,
242
+ column: 1,
243
+ source: line.trim(),
244
+ });
245
+ }
246
+ }
247
+ }
248
+ // 检测 let 声明的状态未使用装饰器
249
+ const letRegex = /\blet\s+(\w+)\s*:\s*\w+/g;
250
+ let match;
251
+ while ((match = letRegex.exec(source)) !== null) {
252
+ const nearby = source.slice(Math.max(0, match.index - 100), match.index);
253
+ if (!/@State|@Prop|@Link|@Provide|@Consume|@ObjectLink|@StorageLink/i.test(nearby)) {
254
+ const line = source.slice(0, match.index).split("\n").length;
255
+ issues.push({
256
+ ruleId: "platform-harmony",
257
+ title: `状态变量 '${match[1]}' 未使用装饰器管理`,
258
+ description: "ArkTS 中可变状态应使用 @State/@Prop/@Link 等装饰器管理,确保 UI 正确更新",
259
+ severity: "warning",
260
+ file: context.filePath,
261
+ line,
262
+ column: (match.index || 0) + 1,
263
+ source: match[0],
264
+ });
265
+ }
266
+ }
267
+ return issues;
268
+ },
269
+ },
270
+ {
271
+ id: "platform-responsive",
272
+ name: "响应式断点配置",
273
+ description: "PC/H5 项目应配置响应式断点",
274
+ severity: "suggestion",
275
+ category: "platform",
276
+ defaultEnabled: true,
277
+ docsUrl: "https://github.com/wzm111/frontend-guardian/blob/main/docs/rules/platform-responsive.md",
278
+ platforms: ["pc", "h5"],
279
+ execute(context) {
280
+ const issues = [];
281
+ const ext = (0, node_path_1.extname)(context.filePath).toLowerCase();
282
+ // CSS 文件检测媒体查询
283
+ if ([".css", ".scss", ".less"].includes(ext)) {
284
+ if (/@media\s*\(/.test(context.source)) {
285
+ // 有媒体查询,通过
286
+ return [];
287
+ }
288
+ }
289
+ // JS/TS 文件检测响应式 hook
290
+ if ([".js", ".ts", ".jsx", ".tsx", ".vue"].includes(ext)) {
291
+ if (/innerWidth|matchMedia|useBreakpoint|breakpoints/i.test(context.source)) {
292
+ return [];
293
+ }
294
+ }
295
+ // 如果不是样式文件或 JS 文件,不检查
296
+ if (![".css", ".scss", ".less", ".js", ".ts", ".jsx", ".tsx", ".vue"].includes(ext)) {
297
+ return [];
298
+ }
299
+ // 只在入口文件或全局样式文件中提示
300
+ const fileName = context.filePath.toLowerCase();
301
+ if (fileName.includes("global") ||
302
+ fileName.includes("index") ||
303
+ fileName.includes("app") ||
304
+ fileName.includes("main")) {
305
+ issues.push({
306
+ ruleId: "platform-responsive",
307
+ title: "未检测到响应式断点配置",
308
+ description: "PC/H5 项目建议配置响应式断点(@media query 或 JS hook),以适配不同屏幕尺寸",
309
+ severity: "suggestion",
310
+ file: context.filePath,
311
+ line: 1,
312
+ column: 1,
313
+ source: "无响应式配置",
314
+ });
315
+ }
316
+ return issues;
317
+ },
318
+ },
319
+ ];
320
+ //# sourceMappingURL=platform-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-scanner.js","sourceRoot":"","sources":["../../src/scanners/platform-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 安全规则 Scanner
3
+ * 参考 OWASP Top 10、SonarQube 安全规则和 CWE 漏洞分类
4
+ */
5
+ import type { Rule } from "../types.js";
6
+ export declare const securityRules: Rule[];
7
+ //# sourceMappingURL=security-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/security-scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAC;AAsB3D,eAAO,MAAM,aAAa,EAAE,IAAI,EAmW/B,CAAC"}