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,205 @@
1
+ "use strict";
2
+ /**
3
+ * RuleRegistry — 规则注册中心
4
+ *
5
+ * Phase 3 核心组件:
6
+ * 1. 统一管理内置规则 + 自定义规则
7
+ * 2. 支持配置驱动(启用/禁用/调整 severity/参数化)
8
+ * 3. 支持热加载用户自定义 JS 规则文件
9
+ * 4. 框架抽象:规则按 category 分组,引擎按需取用
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RuleRegistry = void 0;
16
+ exports.createRegistry = createRegistry;
17
+ const node_fs_1 = require("node:fs");
18
+ const node_path_1 = require("node:path");
19
+ const picocolors_1 = __importDefault(require("picocolors"));
20
+ /** 规则注册中心 */
21
+ class RuleRegistry {
22
+ /** 内置规则(原始定义,不可变) */
23
+ builtInRules = new Map();
24
+ /** 自定义规则(从外部 JS 文件加载) */
25
+ customRules = new Map();
26
+ /** 配置覆盖(id → RuleConfig) */
27
+ configOverrides = new Map();
28
+ /** 注册单条规则 */
29
+ register(rule) {
30
+ this.builtInRules.set(rule.id, rule);
31
+ return this;
32
+ }
33
+ /** 批量注册规则 */
34
+ registerAll(rules) {
35
+ for (const rule of rules) {
36
+ this.register(rule);
37
+ }
38
+ return this;
39
+ }
40
+ /** 注销规则(仅对自定义规则有效,内置规则不可注销) */
41
+ unregister(ruleId) {
42
+ this.customRules.delete(ruleId);
43
+ return this;
44
+ }
45
+ /** 获取单条规则(原始定义,未应用配置) */
46
+ getRaw(ruleId) {
47
+ return this.customRules.get(ruleId) || this.builtInRules.get(ruleId);
48
+ }
49
+ /** 获取所有已注册规则 ID */
50
+ getRuleIds() {
51
+ const ids = new Set();
52
+ for (const id of this.builtInRules.keys())
53
+ ids.add(id);
54
+ for (const id of this.customRules.keys())
55
+ ids.add(id);
56
+ return Array.from(ids);
57
+ }
58
+ /** ───────────────────────────────────────────────────────────────────────── */
59
+ /** 配置驱动 */
60
+ /** ───────────────────────────────────────────────────────────────────────── */
61
+ /**
62
+ * 从配置加载规则覆盖
63
+ * @param configs 规则配置列表(来自 .frontend-guardian.yml 的 rules: 节点)
64
+ */
65
+ loadFromConfig(configs) {
66
+ for (const cfg of configs) {
67
+ if (!cfg.id) {
68
+ console.warn(picocolors_1.default.yellow(`⚠️ RuleRegistry: 规则配置缺少 id,已跳过`));
69
+ continue;
70
+ }
71
+ this.configOverrides.set(cfg.id, cfg);
72
+ }
73
+ }
74
+ /**
75
+ * 加载自定义规则文件
76
+ * @param filePath 规则文件路径(相对或绝对)
77
+ * @param projectDir 项目根目录(用于解析相对路径)
78
+ */
79
+ loadCustomRule(filePath, projectDir) {
80
+ const absolutePath = projectDir ? (0, node_path_1.resolve)(projectDir, filePath) : (0, node_path_1.resolve)(filePath);
81
+ if (!(0, node_fs_1.existsSync)(absolutePath)) {
82
+ console.warn(picocolors_1.default.yellow(`⚠️ RuleRegistry: 自定义规则文件不存在: ${absolutePath}`));
83
+ return false;
84
+ }
85
+ try {
86
+ // 清除 require 缓存,支持热重载
87
+ delete require.cache[require.resolve(absolutePath)];
88
+ const mod = require(absolutePath);
89
+ const rule = mod.default || mod;
90
+ if (!rule || !rule.id || typeof rule.execute !== "function") {
91
+ console.warn(picocolors_1.default.yellow(`⚠️ RuleRegistry: 自定义规则文件格式不正确(需导出 Rule 对象): ${absolutePath}`));
92
+ return false;
93
+ }
94
+ this.customRules.set(rule.id, rule);
95
+ return true;
96
+ }
97
+ catch (err) {
98
+ console.warn(picocolors_1.default.yellow(`⚠️ RuleRegistry: 加载自定义规则失败: ${absolutePath}`), err);
99
+ return false;
100
+ }
101
+ }
102
+ /** 加载多个自定义规则文件 */
103
+ loadCustomRules(paths, projectDir) {
104
+ const loaded = [];
105
+ const failed = [];
106
+ for (const p of paths) {
107
+ if (this.loadCustomRule(p, projectDir)) {
108
+ loaded.push(p);
109
+ }
110
+ else {
111
+ failed.push(p);
112
+ }
113
+ }
114
+ return { loaded, failed };
115
+ }
116
+ /** ───────────────────────────────────────────────────────────────────────── */
117
+ /** 规则取用 */
118
+ /** ───────────────────────────────────────────────────────────────────────── */
119
+ /**
120
+ * 获取应用了配置覆盖后的规则
121
+ * @returns 规则副本(severity/params 已按配置调整)
122
+ */
123
+ getRule(ruleId) {
124
+ const raw = this.getRaw(ruleId);
125
+ if (!raw)
126
+ return undefined;
127
+ const override = this.configOverrides.get(ruleId);
128
+ if (!override)
129
+ return raw;
130
+ return this.applyOverride(raw, override);
131
+ }
132
+ /**
133
+ * 获取所有启用的规则
134
+ * @param category 可选:按分类过滤
135
+ */
136
+ getActiveRules(category) {
137
+ const allIds = this.getRuleIds();
138
+ const result = [];
139
+ for (const id of allIds) {
140
+ const override = this.configOverrides.get(id);
141
+ // 被配置显式禁用的规则跳过
142
+ if (override?.enabled === false)
143
+ continue;
144
+ const rule = this.getRule(id);
145
+ if (!rule)
146
+ continue;
147
+ if (category && rule.category !== category)
148
+ continue;
149
+ result.push(rule);
150
+ }
151
+ return result;
152
+ }
153
+ /**
154
+ * 按条件过滤规则(框架/平台/组件库)
155
+ * 与 RuleEngine.filterRules 保持一致
156
+ */
157
+ filterRules(options) {
158
+ return this.getActiveRules().filter((rule) => {
159
+ if (options?.category && rule.category !== options.category)
160
+ return false;
161
+ if (options?.framework && rule.frameworks && !rule.frameworks.includes(options.framework))
162
+ return false;
163
+ if (options?.platform && rule.platforms && !rule.platforms.includes(options.platform))
164
+ return false;
165
+ if (options?.componentLib &&
166
+ rule.componentLibs &&
167
+ !rule.componentLibs.includes(options.componentLib))
168
+ return false;
169
+ return true;
170
+ });
171
+ }
172
+ /** 清除所有配置覆盖(重置为默认状态) */
173
+ clearOverrides() {
174
+ this.configOverrides.clear();
175
+ }
176
+ /** 清除所有自定义规则 */
177
+ clearCustomRules() {
178
+ this.customRules.clear();
179
+ }
180
+ /** ───────────────────────────────────────────────────────────────────────── */
181
+ /** 内部工具 */
182
+ /** ───────────────────────────────────────────────────────────────────────── */
183
+ /** 将配置覆盖应用到规则,返回新副本 */
184
+ applyOverride(rule, override) {
185
+ const cloned = { ...rule };
186
+ if (override.severity) {
187
+ cloned.severity = override.severity;
188
+ }
189
+ // 将 params 存入 meta,规则 execute 可通过 context.config 读取
190
+ if (override.params && Object.keys(override.params).length > 0) {
191
+ cloned.meta = {
192
+ ...rule.meta,
193
+ ...override.params,
194
+ _paramsOverride: override.params,
195
+ };
196
+ }
197
+ return cloned;
198
+ }
199
+ }
200
+ exports.RuleRegistry = RuleRegistry;
201
+ /** 创建空的规则注册中心 */
202
+ function createRegistry() {
203
+ return new RuleRegistry();
204
+ }
205
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rules/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 可访问性规则 Scanner
3
+ * 参考 WCAG 2.1 标准和 Vercel Web Design Guidelines
4
+ *
5
+ * 规则列表:
6
+ * 1. a11y-img-alt — 图片必须有 alt 属性
7
+ * 2. a11y-form-label — 表单元素必须有 label
8
+ * 3. a11y-button-role — 可点击元素语义化
9
+ * 4. a11y-contrast — 颜色对比度 WCAG AA
10
+ * 5. a11y-aria-valid — ARIA 属性合法性
11
+ */
12
+ import type { Rule } from "../types.js";
13
+ export declare const a11yRules: Rule[];
14
+ //# sourceMappingURL=a11y-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/a11y-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAC;AAiO3D,eAAO,MAAM,SAAS,EAAE,IAAI,EAoU3B,CAAC"}