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,342 @@
1
+ "use strict";
2
+ /**
3
+ * 项目元数据检测工具 (Phase 2: 智能化深度检测)
4
+ *
5
+ * 检测维度:
6
+ * 1. 框架 & 版本 (react@18.2, vue@3.3, nextjs, nuxt...)
7
+ * 2. 组件库 & 版本 (antd@5, element-plus, mui...)
8
+ * 3. 构建工具 / Bundler (vite, webpack, rsbuild, turbopack...)
9
+ * 4. 测试框架 (jest, vitest, cypress, playwright...)
10
+ * 5. 状态管理 (redux, zustand, pinia, jotai...)
11
+ * 6. 样式方案 (tailwind, styled-components, sass, less...)
12
+ * 7. 路由 (react-router, vue-router, tanstack-router...)
13
+ * 8. 包管理器 (npm/yarn/pnpm/bun — 通过 lockfile 推断)
14
+ * 9. Linter / Formatter (eslint, biome, prettier, stylelint...)
15
+ * 10. Monorepo 工具 (nx, turborepo, lerna, pnpm-workspace)
16
+ * 11. 平台 (pc, h5, 小程序, app, harmony...)
17
+ * 12. i18n (react-intl, vue-i18n, i18next...)
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.detectProjectMeta = detectProjectMeta;
21
+ const node_fs_1 = require("node:fs");
22
+ const node_path_1 = require("node:path");
23
+ function detectProjectMeta(projectDir, config) {
24
+ const pkgPath = (0, node_path_1.resolve)(projectDir, "package.json");
25
+ const pkg = (0, node_fs_1.existsSync)(pkgPath) ? JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf-8")) : {};
26
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
27
+ const scripts = pkg.scripts || {};
28
+ const frameworkInfo = detectFramework(projectDir, deps);
29
+ const componentLibInfo = detectComponentLib(deps);
30
+ const platforms = detectPlatforms(projectDir, frameworkInfo.framework, deps);
31
+ const i18nInfo = detectI18n(deps);
32
+ return {
33
+ framework: frameworkInfo.framework,
34
+ frameworkVersion: frameworkInfo.version,
35
+ componentLib: componentLibInfo.componentLib,
36
+ componentLibVersion: componentLibInfo.version,
37
+ platforms,
38
+ hasTypeScript: (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "tsconfig.json")) || deps["typescript"] !== undefined,
39
+ hasI18n: i18nInfo.hasI18n,
40
+ i18nLib: i18nInfo.i18nLib,
41
+ scripts,
42
+ // Phase 2: 深度检测
43
+ bundler: detectBundler(deps)?.bundler,
44
+ bundlerVersion: detectBundler(deps)?.version,
45
+ testFramework: detectTestFramework(deps)?.testFramework,
46
+ testFrameworkVersion: detectTestFramework(deps)?.version,
47
+ stateManager: detectStateManager(deps)?.stateManager,
48
+ stateManagerVersion: detectStateManager(deps)?.version,
49
+ styling: detectStyling(deps)?.styling,
50
+ stylingVersion: detectStyling(deps)?.version,
51
+ router: detectRouter(deps)?.router,
52
+ routerVersion: detectRouter(deps)?.version,
53
+ packageManager: detectPackageManager(projectDir),
54
+ linter: detectLinter(deps),
55
+ monorepoTool: detectMonorepo(projectDir, deps),
56
+ runtime: detectRuntime(projectDir, pkg),
57
+ };
58
+ }
59
+ // ─────────────────────────────────────────────────────────────────────────────
60
+ // 框架检测
61
+ // ─────────────────────────────────────────────────────────────────────────────
62
+ function detectFramework(projectDir, deps) {
63
+ const fwOrder = [
64
+ { key: "next", framework: "nextjs" },
65
+ { key: "nuxt", framework: "nuxt" },
66
+ { key: "@dcloudio/uni-app", framework: "uniapp" },
67
+ { key: "@tarojs/taro", framework: "taro" },
68
+ { key: "react-native", framework: "react-native" },
69
+ { key: "flutter", framework: "flutter" },
70
+ { key: "react", framework: "react" },
71
+ { key: "vue", framework: "vue" },
72
+ { key: "svelte", framework: "svelte" },
73
+ { key: "solid-js", framework: "solidjs" },
74
+ { key: "astro", framework: "astro" },
75
+ ];
76
+ for (const { key, framework } of fwOrder) {
77
+ if (deps[key]) {
78
+ return { framework, version: deps[key] };
79
+ }
80
+ }
81
+ // HarmonyOS (no typical npm dep, detect by file structure)
82
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "entry/src/main/ets")) || deps["@ohos/hvigor"]) {
83
+ return { framework: "harmony" };
84
+ }
85
+ return {};
86
+ }
87
+ // ─────────────────────────────────────────────────────────────────────────────
88
+ // 组件库检测
89
+ // ─────────────────────────────────────────────────────────────────────────────
90
+ function detectComponentLib(deps) {
91
+ const libMap = [
92
+ { key: "antd", lib: "antd" },
93
+ { key: "ant-design-vue", lib: "antd" },
94
+ { key: "@ant-design/react-native", lib: "antd" },
95
+ { key: "element-plus", lib: "element-plus" },
96
+ { key: "@mui/material", lib: "mui" },
97
+ { key: "vuetify", lib: "vuetify" },
98
+ { key: "@nutui/nutui-react", lib: "nutui" },
99
+ { key: "@nutui/nutui", lib: "nutui" },
100
+ { key: "tdesign-react", lib: "tdesign" },
101
+ { key: "tdesign-vue-next", lib: "tdesign" },
102
+ ];
103
+ for (const { key, lib } of libMap) {
104
+ if (deps[key]) {
105
+ return { componentLib: lib, version: deps[key] };
106
+ }
107
+ }
108
+ return {};
109
+ }
110
+ // ─────────────────────────────────────────────────────────────────────────────
111
+ // 平台检测
112
+ // ─────────────────────────────────────────────────────────────────────────────
113
+ function detectPlatforms(projectDir, framework, deps) {
114
+ const platforms = [];
115
+ // 小程序
116
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "manifest.json")) && (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "pages.json"))) {
117
+ platforms.push("wechat-mp", "h5", "app");
118
+ return platforms;
119
+ }
120
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "app.json")) && (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "project.config.json"))) {
121
+ platforms.push("wechat-mp");
122
+ return platforms;
123
+ }
124
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "mini.project.json"))) {
125
+ platforms.push("alipay-mp");
126
+ return platforms;
127
+ }
128
+ // 多端框架
129
+ if (framework === "uniapp") {
130
+ platforms.push("wechat-mp", "h5", "app");
131
+ return platforms;
132
+ }
133
+ if (framework === "taro") {
134
+ platforms.push("wechat-mp", "h5");
135
+ return platforms;
136
+ }
137
+ // PC / H5
138
+ if (framework === "react" || framework === "vue" || framework === "nextjs" || framework === "nuxt") {
139
+ platforms.push("pc", "h5");
140
+ }
141
+ // App
142
+ if (framework === "flutter" || framework === "react-native") {
143
+ platforms.push("app");
144
+ }
145
+ // HarmonyOS
146
+ if (framework === "harmony") {
147
+ platforms.push("harmony");
148
+ }
149
+ return platforms.length > 0 ? platforms : ["pc"];
150
+ }
151
+ // ─────────────────────────────────────────────────────────────────────────────
152
+ // i18n 检测
153
+ // ─────────────────────────────────────────────────────────────────────────────
154
+ function detectI18n(deps) {
155
+ const i18nDeps = ["react-intl", "react-i18next", "vue-i18n", "i18next", "@dcloudio/uni-i18n", "@formatjs/intl"];
156
+ const found = i18nDeps.find((d) => deps[d]);
157
+ return { hasI18n: !!found, i18nLib: found };
158
+ }
159
+ // ─────────────────────────────────────────────────────────────────────────────
160
+ // Bundler / Build Tool 检测
161
+ // ─────────────────────────────────────────────────────────────────────────────
162
+ function detectBundler(deps) {
163
+ const bundlerMap = [
164
+ { key: "vite", bundler: "vite" },
165
+ { key: "@rsbuild/core", bundler: "rsbuild" },
166
+ { key: "webpack", bundler: "webpack" },
167
+ { key: "@farmfe/core", bundler: "farm" },
168
+ { key: "@rspack/core", bundler: "rspack" },
169
+ { key: "parcel", bundler: "parcel" },
170
+ { key: "esbuild", bundler: "esbuild" },
171
+ { key: "rollup", bundler: "rollup" },
172
+ { key: "wmr", bundler: "wmr" },
173
+ ];
174
+ // Next.js / Nuxt 自带 bundler
175
+ if (deps["next"]) {
176
+ return { bundler: "turbopack", version: deps["next"] };
177
+ }
178
+ if (deps["nuxt"]) {
179
+ return { bundler: "vite", version: deps["nuxt"] };
180
+ }
181
+ for (const { key, bundler } of bundlerMap) {
182
+ if (deps[key]) {
183
+ return { bundler, version: deps[key] };
184
+ }
185
+ }
186
+ return undefined;
187
+ }
188
+ // ─────────────────────────────────────────────────────────────────────────────
189
+ // 测试框架检测
190
+ // ─────────────────────────────────────────────────────────────────────────────
191
+ function detectTestFramework(deps) {
192
+ const testMap = [
193
+ { key: "vitest", tf: "vitest" },
194
+ { key: "jest", tf: "jest" },
195
+ { key: "playwright", tf: "playwright" },
196
+ { key: "cypress", tf: "cypress" },
197
+ { key: "mocha", tf: "mocha" },
198
+ { key: "karma", tf: "karma" },
199
+ { key: "ava", tf: "ava" },
200
+ ];
201
+ for (const { key, tf } of testMap) {
202
+ if (deps[key]) {
203
+ return { testFramework: tf, version: deps[key] };
204
+ }
205
+ }
206
+ return undefined;
207
+ }
208
+ // ─────────────────────────────────────────────────────────────────────────────
209
+ // 状态管理检测
210
+ // ─────────────────────────────────────────────────────────────────────────────
211
+ function detectStateManager(deps) {
212
+ const smMap = [
213
+ { key: "zustand", sm: "zustand" },
214
+ { key: "jotai", sm: "jotai" },
215
+ { key: "recoil", sm: "recoil" },
216
+ { key: "valtio", sm: "valtio" },
217
+ { key: "mobx", sm: "mobx" },
218
+ { key: "redux", sm: "redux" },
219
+ { key: "pinia", sm: "pinia" },
220
+ { key: "vuex", sm: "vuex" },
221
+ ];
222
+ for (const { key, sm } of smMap) {
223
+ if (deps[key]) {
224
+ return { stateManager: sm, version: deps[key] };
225
+ }
226
+ }
227
+ return undefined;
228
+ }
229
+ // ─────────────────────────────────────────────────────────────────────────────
230
+ // 样式方案检测
231
+ // ─────────────────────────────────────────────────────────────────────────────
232
+ function detectStyling(deps) {
233
+ const styleMap = [
234
+ { key: "tailwindcss", style: "tailwindcss" },
235
+ { key: "styled-components", style: "styled-components" },
236
+ { key: "@emotion/react", style: "emotion" },
237
+ { key: "@emotion/styled", style: "emotion" },
238
+ { key: "sass", style: "sass" },
239
+ { key: "less", style: "less" },
240
+ { key: "postcss-modules", style: "css-modules" },
241
+ { key: "@vanilla-extract/css", style: "vanilla-extract" },
242
+ { key: "unocss", style: "unocss" },
243
+ { key: "windicss", style: "windicss" },
244
+ ];
245
+ for (const { key, style } of styleMap) {
246
+ if (deps[key]) {
247
+ return { styling: style, version: deps[key] };
248
+ }
249
+ }
250
+ return undefined;
251
+ }
252
+ // ─────────────────────────────────────────────────────────────────────────────
253
+ // 路由检测
254
+ // ─────────────────────────────────────────────────────────────────────────────
255
+ function detectRouter(deps) {
256
+ const routerMap = [
257
+ { key: "react-router-dom", router: "react-router" },
258
+ { key: "react-router", router: "react-router" },
259
+ { key: "vue-router", router: "vue-router" },
260
+ { key: "@tanstack/react-router", router: "tanstack-router" },
261
+ { key: "wouter", router: "wouter" },
262
+ ];
263
+ for (const { key, router } of routerMap) {
264
+ if (deps[key]) {
265
+ return { router, version: deps[key] };
266
+ }
267
+ }
268
+ return undefined;
269
+ }
270
+ // ─────────────────────────────────────────────────────────────────────────────
271
+ // 包管理器检测 (通过 lockfile)
272
+ // ─────────────────────────────────────────────────────────────────────────────
273
+ function detectPackageManager(projectDir) {
274
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "bun.lockb")) || (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "bun.lock"))) {
275
+ return "bun";
276
+ }
277
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "pnpm-lock.yaml"))) {
278
+ return "pnpm";
279
+ }
280
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "yarn.lock"))) {
281
+ return "yarn";
282
+ }
283
+ return "npm";
284
+ }
285
+ // ─────────────────────────────────────────────────────────────────────────────
286
+ // Linter / Formatter 检测
287
+ // ─────────────────────────────────────────────────────────────────────────────
288
+ function detectLinter(deps) {
289
+ const linterMap = [
290
+ { key: "eslint", linter: "eslint" },
291
+ { key: "@biomejs/biome", linter: "biome" },
292
+ { key: "oxlint", linter: "oxlint" },
293
+ { key: "prettier", linter: "prettier" },
294
+ { key: "stylelint", linter: "stylelint" },
295
+ ];
296
+ for (const { key, linter } of linterMap) {
297
+ if (deps[key]) {
298
+ return linter;
299
+ }
300
+ }
301
+ return undefined;
302
+ }
303
+ // ─────────────────────────────────────────────────────────────────────────────
304
+ // Monorepo 工具检测
305
+ // ─────────────────────────────────────────────────────────────────────────────
306
+ function detectMonorepo(projectDir, deps) {
307
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "pnpm-workspace.yaml"))) {
308
+ return "pnpm-workspace";
309
+ }
310
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "nx.json"))) {
311
+ return "nx";
312
+ }
313
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "turbo.json"))) {
314
+ return "turborepo";
315
+ }
316
+ if (deps["lerna"]) {
317
+ return "lerna";
318
+ }
319
+ if (deps["@rushstack/rush-sdk"]) {
320
+ return "rush";
321
+ }
322
+ return undefined;
323
+ }
324
+ // ─────────────────────────────────────────────────────────────────────────────
325
+ // Runtime 检测
326
+ // ─────────────────────────────────────────────────────────────────────────────
327
+ function detectRuntime(projectDir, pkg) {
328
+ const engines = pkg.engines || {};
329
+ if (pkg.packageManager) {
330
+ const pm = String(pkg.packageManager);
331
+ if (pm.startsWith("bun@"))
332
+ return "bun";
333
+ }
334
+ if (engines.bun)
335
+ return "bun";
336
+ // Deno projects often use deno.json
337
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "deno.json")) || (0, node_fs_1.existsSync)((0, node_path_1.resolve)(projectDir, "deno.jsonc"))) {
338
+ return "deno";
339
+ }
340
+ return "node";
341
+ }
342
+ //# sourceMappingURL=project-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../src/utils/project-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 报告上传工具
3
+ * 支持 HTTP webhook 和文件复制两种方式
4
+ */
5
+ /** 上传配置 */
6
+ export interface UploadConfig {
7
+ /** 上传方式 */
8
+ provider: "http" | "file";
9
+ /** HTTP webhook URL(provider=http) */
10
+ url?: string;
11
+ /** 额外请求头(provider=http) */
12
+ headers?: Record<string, string>;
13
+ /** 目标目录(provider=file) */
14
+ dir?: string;
15
+ /** 报告访问基础 URL(用于生成可访问链接) */
16
+ baseUrl?: string;
17
+ }
18
+ /** 上传结果 */
19
+ export interface UploadResult {
20
+ /** 是否成功 */
21
+ success: boolean;
22
+ /** 报告访问 URL */
23
+ reportUrl?: string;
24
+ /** 错误信息 */
25
+ error?: string;
26
+ }
27
+ /**
28
+ * 从环境变量自动检测上传配置
29
+ */
30
+ export declare function detectUploadConfig(): UploadConfig | null;
31
+ /**
32
+ * 上传报告文件
33
+ */
34
+ export declare function uploadReport(reportPath: string, config: UploadConfig): Promise<UploadResult>;
35
+ //# sourceMappingURL=report-uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-uploader.d.ts","sourceRoot":"","sources":["../../src/utils/report-uploader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,WAAW;AACX,MAAM,WAAW,YAAY;IACzB,WAAW;IACX,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,0BAA0B;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,WAAW;AACX,MAAM,WAAW,YAAY;IACzB,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAwBxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAQlG"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * 报告上传工具
4
+ * 支持 HTTP webhook 和文件复制两种方式
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.detectUploadConfig = detectUploadConfig;
8
+ exports.uploadReport = uploadReport;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ /**
12
+ * 从环境变量自动检测上传配置
13
+ */
14
+ function detectUploadConfig() {
15
+ const provider = process.env.FG_UPLOAD_PROVIDER;
16
+ if (provider === "http") {
17
+ const url = process.env.FG_UPLOAD_URL;
18
+ if (!url)
19
+ return null;
20
+ return {
21
+ provider: "http",
22
+ url,
23
+ baseUrl: process.env.FG_UPLOAD_BASE_URL,
24
+ };
25
+ }
26
+ if (provider === "file") {
27
+ const dir = process.env.FG_UPLOAD_DIR;
28
+ if (!dir)
29
+ return null;
30
+ return {
31
+ provider: "file",
32
+ dir,
33
+ baseUrl: process.env.FG_UPLOAD_BASE_URL,
34
+ };
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * 上传报告文件
40
+ */
41
+ async function uploadReport(reportPath, config) {
42
+ if (config.provider === "http") {
43
+ return uploadViaHttp(reportPath, config);
44
+ }
45
+ if (config.provider === "file") {
46
+ return uploadViaFile(reportPath, config);
47
+ }
48
+ return { success: false, error: `Unknown upload provider: ${config.provider}` };
49
+ }
50
+ /** 通过 HTTP POST 上传 */
51
+ async function uploadViaHttp(reportPath, config) {
52
+ try {
53
+ const content = (0, node_fs_1.readFileSync)(reportPath, "utf-8");
54
+ const filename = (0, node_path_1.basename)(reportPath);
55
+ const response = await fetch(config.url, {
56
+ method: "POST",
57
+ headers: {
58
+ "Content-Type": "application/json",
59
+ ...config.headers,
60
+ },
61
+ body: JSON.stringify({
62
+ filename,
63
+ content,
64
+ timestamp: new Date().toISOString(),
65
+ }),
66
+ });
67
+ if (!response.ok) {
68
+ const errText = await response.text().catch(() => "Unknown error");
69
+ return { success: false, error: `HTTP ${response.status}: ${errText}` };
70
+ }
71
+ // 尝试从响应中提取 URL
72
+ let reportUrl;
73
+ try {
74
+ const data = await response.json();
75
+ reportUrl = data.url || data.reportUrl;
76
+ }
77
+ catch {
78
+ // 响应不是 JSON,忽略
79
+ }
80
+ return { success: true, reportUrl };
81
+ }
82
+ catch (err) {
83
+ return { success: false, error: String(err) };
84
+ }
85
+ }
86
+ /** 通过文件复制上传 */
87
+ function uploadViaFile(reportPath, config) {
88
+ try {
89
+ const dir = config.dir;
90
+ if (!(0, node_fs_1.existsSync)(dir)) {
91
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
92
+ }
93
+ const filename = (0, node_path_1.basename)(reportPath);
94
+ const destPath = (0, node_path_1.resolve)(dir, filename);
95
+ (0, node_fs_1.copyFileSync)(reportPath, destPath);
96
+ // 生成访问 URL
97
+ const reportUrl = config.baseUrl
98
+ ? `${config.baseUrl.replace(/\/$/, "")}/${filename}`
99
+ : `file://${destPath}`;
100
+ return { success: true, reportUrl };
101
+ }
102
+ catch (err) {
103
+ return { success: false, error: String(err) };
104
+ }
105
+ }
106
+ //# sourceMappingURL=report-uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-uploader.js","sourceRoot":"","sources":["../../src/utils/report-uploader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "frontend-guardian-core",
3
+ "version": "2.6.0",
4
+ "description": "Core analysis engine for frontend-guardian — AST-based scanning and auto-fixing",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "fg-core": "./bin/fg-core.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "bin",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/wzm111/frontend-guardian.git",
26
+ "directory": "lib"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/wzm111/frontend-guardian/issues"
30
+ },
31
+ "homepage": "https://github.com/wzm111/frontend-guardian#readme",
32
+ "scripts": {
33
+ "build": "tsc && tsc-alias",
34
+ "dev": "tsc --watch",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "lint": "eslint src/**/*.ts",
38
+ "typecheck": "tsc --noEmit",
39
+ "format": "biome format --write .",
40
+ "format:check": "biome format .",
41
+ "check": "biome check --write .",
42
+ "prepublishOnly": "npm run build && npm test"
43
+ },
44
+ "keywords": [
45
+ "frontend",
46
+ "governance",
47
+ "i18n",
48
+ "lint",
49
+ "ast",
50
+ "codemod"
51
+ ],
52
+ "author": "wzm111",
53
+ "license": "MIT",
54
+ "engines": {
55
+ "node": ">=18.0.0"
56
+ },
57
+ "dependencies": {
58
+ "@babel/core": "^7.26.0",
59
+ "@babel/parser": "^7.26.0",
60
+ "@babel/traverse": "^7.26.0",
61
+ "@babel/types": "^7.26.0",
62
+ "globby": "^14.1.0",
63
+ "minimatch": "^10.0.1",
64
+ "picocolors": "^1.1.0",
65
+ "yaml": "^2.7.0"
66
+ },
67
+ "devDependencies": {
68
+ "@biomejs/biome": "^2.4.16",
69
+ "@types/babel__core": "^7.20.5",
70
+ "@types/babel__traverse": "^7.20.6",
71
+ "@types/node": "^22.13.0",
72
+ "@vitest/coverage-v8": "^3.2.6",
73
+ "eslint": "^9.20.0",
74
+ "tsc-alias": "^1.8.17",
75
+ "typescript": "^5.7.0",
76
+ "vitest": "^3.0.0"
77
+ }
78
+ }