frontend-guardian-core 3.5.2 → 3.6.1
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.
- package/bin/fg-core.js +78 -2
- package/bin/fg-lsp.js +1 -1
- package/bin/fg-server.js +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/index.d.ts +2 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +10 -2
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/playwright.d.ts +12 -0
- package/dist/integrations/playwright.d.ts.map +1 -0
- package/dist/integrations/playwright.js +170 -0
- package/dist/integrations/playwright.js.map +1 -0
- package/dist/scanners/e2e-scanner.d.ts +16 -0
- package/dist/scanners/e2e-scanner.d.ts.map +1 -0
- package/dist/scanners/e2e-scanner.js +277 -0
- package/dist/scanners/e2e-scanner.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/e2e-gap-detector.d.ts +60 -0
- package/dist/utils/e2e-gap-detector.d.ts.map +1 -0
- package/dist/utils/e2e-gap-detector.js +294 -0
- package/dist/utils/e2e-gap-detector.js.map +1 -0
- package/package.json +1 -1
package/bin/fg-core.js
CHANGED
|
@@ -18,6 +18,10 @@ import {
|
|
|
18
18
|
hooksRules,
|
|
19
19
|
platformRules,
|
|
20
20
|
svelteRules,
|
|
21
|
+
e2eRules,
|
|
22
|
+
detectE2EGaps,
|
|
23
|
+
formatE2EGapReport,
|
|
24
|
+
formatE2EGapJson,
|
|
21
25
|
installGitHooks,
|
|
22
26
|
uninstallGitHooks,
|
|
23
27
|
hasGitHook,
|
|
@@ -58,6 +62,7 @@ import {
|
|
|
58
62
|
saveComplianceReport,
|
|
59
63
|
uploadToDashboardServer,
|
|
60
64
|
detectDashboardConfig,
|
|
65
|
+
playwrightIntegration,
|
|
61
66
|
} from "../dist/index.js";
|
|
62
67
|
import pc from "picocolors";
|
|
63
68
|
import { runWatchMode } from "./watch-mode.js";
|
|
@@ -73,6 +78,7 @@ const MODULES = [
|
|
|
73
78
|
"hooks",
|
|
74
79
|
"platform",
|
|
75
80
|
"svelte",
|
|
81
|
+
"e2e",
|
|
76
82
|
];
|
|
77
83
|
|
|
78
84
|
const MODULE_RULES = {
|
|
@@ -86,18 +92,19 @@ const MODULE_RULES = {
|
|
|
86
92
|
hooks: hooksRules,
|
|
87
93
|
platform: platformRules,
|
|
88
94
|
svelte: svelteRules,
|
|
95
|
+
e2e: e2eRules,
|
|
89
96
|
};
|
|
90
97
|
|
|
91
98
|
function showHelp() {
|
|
92
99
|
console.log(`
|
|
93
|
-
Frontend Guardian Core v3.
|
|
100
|
+
Frontend Guardian Core v3.6.1
|
|
94
101
|
|
|
95
102
|
Usage:
|
|
96
103
|
fg-core <project-dir> [options]
|
|
97
104
|
|
|
98
105
|
Options:
|
|
99
106
|
--scan 全量扫描(等价于 --module all)
|
|
100
|
-
--module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | all
|
|
107
|
+
--module <name> 扫描模块: i18n | performance | a11y | security | naming | cross-file | component | hooks | platform | svelte | e2e | all
|
|
101
108
|
--severity <level> 最低严重级别: critical | warning | suggestion (默认: suggestion)
|
|
102
109
|
--files <pattern> 仅扫描匹配的文件
|
|
103
110
|
--exclude <pattern> 排除匹配的文件
|
|
@@ -148,6 +155,8 @@ Options:
|
|
|
148
155
|
--compliance <file> 生成 SOC2/ISO27001 合规报告到指定文件
|
|
149
156
|
--server <url> 扫描后上报到治理看板服务器
|
|
150
157
|
--serve 扫描前启动本地看板服务(扫描完成后停止)
|
|
158
|
+
--e2e-detect-gaps 检测 E2E 测试覆盖缺口(页面 + 接口)
|
|
159
|
+
--e2e-run 运行 Playwright E2E 测试并输出治理报告
|
|
151
160
|
--help, -h 显示帮助
|
|
152
161
|
|
|
153
162
|
Examples:
|
|
@@ -222,6 +231,8 @@ async function main() {
|
|
|
222
231
|
compliance: undefined,
|
|
223
232
|
server: undefined,
|
|
224
233
|
serve: false,
|
|
234
|
+
e2eDetectGaps: false,
|
|
235
|
+
e2eRun: false,
|
|
225
236
|
};
|
|
226
237
|
|
|
227
238
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -389,6 +400,12 @@ async function main() {
|
|
|
389
400
|
case "--serve":
|
|
390
401
|
options.serve = true;
|
|
391
402
|
break;
|
|
403
|
+
case "--e2e-detect-gaps":
|
|
404
|
+
options.e2eDetectGaps = true;
|
|
405
|
+
break;
|
|
406
|
+
case "--e2e-run":
|
|
407
|
+
options.e2eRun = true;
|
|
408
|
+
break;
|
|
392
409
|
case "--help":
|
|
393
410
|
case "-h":
|
|
394
411
|
showHelp();
|
|
@@ -396,6 +413,65 @@ async function main() {
|
|
|
396
413
|
}
|
|
397
414
|
}
|
|
398
415
|
|
|
416
|
+
// v3.6.0: E2E 测试覆盖缺口检测
|
|
417
|
+
if (options.e2eDetectGaps) {
|
|
418
|
+
const gapResult = detectE2EGaps({ projectDir: options.projectDir });
|
|
419
|
+
if (options.json) {
|
|
420
|
+
console.log(JSON.stringify(formatE2EGapJson(gapResult), null, 2));
|
|
421
|
+
} else {
|
|
422
|
+
console.log(formatE2EGapReport(gapResult));
|
|
423
|
+
}
|
|
424
|
+
process.exit(gapResult.uncoveredPages.length + gapResult.uncoveredApis.length > 0 ? 1 : 0);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// v3.6.1: 运行 Playwright E2E 测试
|
|
428
|
+
if (options.e2eRun) {
|
|
429
|
+
if (!playwrightIntegration.isAvailable(options.projectDir)) {
|
|
430
|
+
console.log(pc.yellow("⚠️ 未检测到 Playwright 配置(playwright.config.ts/js)或 playwright 包未安装"));
|
|
431
|
+
console.log(pc.gray(" 请先安装 Playwright: npm install -D @playwright/test"));
|
|
432
|
+
console.log(pc.gray(" 或初始化配置: npx playwright init"));
|
|
433
|
+
process.exit(1);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
console.log(pc.cyan("🎭 正在运行 Playwright E2E 测试..."));
|
|
437
|
+
console.log(pc.gray(" 这可能需要几分钟(取决于测试数量和浏览器启动时间)"));
|
|
438
|
+
console.log("");
|
|
439
|
+
|
|
440
|
+
const start = Date.now();
|
|
441
|
+
const issues = playwrightIntegration.run(options.projectDir);
|
|
442
|
+
const duration = Date.now() - start;
|
|
443
|
+
|
|
444
|
+
if (options.json) {
|
|
445
|
+
console.log(JSON.stringify({
|
|
446
|
+
tool: "Playwright",
|
|
447
|
+
total: issues.length,
|
|
448
|
+
duration,
|
|
449
|
+
issues,
|
|
450
|
+
}, null, 2));
|
|
451
|
+
} else {
|
|
452
|
+
console.log(pc.cyan(`📊 Playwright 测试结果`));
|
|
453
|
+
console.log(pc.gray(` 耗时: ${duration}ms`));
|
|
454
|
+
if (issues.length === 0) {
|
|
455
|
+
console.log(pc.green(` ✅ 所有测试通过`));
|
|
456
|
+
} else {
|
|
457
|
+
console.log(pc.red(` ❌ ${issues.length} 个测试失败`));
|
|
458
|
+
for (const issue of issues) {
|
|
459
|
+
const severityColor = issue.severity === "critical" ? pc.red : pc.yellow;
|
|
460
|
+
console.log(severityColor(` [${issue.severity.toUpperCase()}] ${issue.title}`));
|
|
461
|
+
console.log(pc.gray(` ${issue.file}:${issue.line}`));
|
|
462
|
+
if (issue.description) {
|
|
463
|
+
const descLines = issue.description.split("\n").slice(0, 3);
|
|
464
|
+
for (const dl of descLines) {
|
|
465
|
+
console.log(pc.gray(` ${dl}`));
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
process.exit(issues.length > 0 ? 1 : 0);
|
|
473
|
+
}
|
|
474
|
+
|
|
399
475
|
// Phase 6: 特殊命令处理
|
|
400
476
|
if (options.installHooks) {
|
|
401
477
|
const hookType = ["pre-commit", "pre-push", "commit-msg", "both", "all"].includes(options.installHooksType)
|
package/bin/fg-lsp.js
CHANGED
|
@@ -26,7 +26,7 @@ for (let i = 0; i < args.length; i++) {
|
|
|
26
26
|
} else if (arg === "--severity" || arg === "-s") {
|
|
27
27
|
minSeverity = args[++i] ?? "suggestion";
|
|
28
28
|
} else if (arg === "--help" || arg === "-h") {
|
|
29
|
-
console.log(`Frontend Guardian LSP Server v3.
|
|
29
|
+
console.log(`Frontend Guardian LSP Server v3.6.1
|
|
30
30
|
|
|
31
31
|
Usage: fg-lsp [options]
|
|
32
32
|
|
package/bin/fg-server.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ export { generatePRComment, generatePRCommentSummary, COMMENT_MARKER, isGuardian
|
|
|
41
41
|
export type { CommentMeta } from "./formatters/pr-comment.js";
|
|
42
42
|
export { GitHubPRPublisher, GitLabMRPublisher, detectPublisherConfig, createPublisher, autoPublishComment, } from "./utils/pr-publisher.js";
|
|
43
43
|
export type { PublishResult, PublisherConfig, PRPublisher } from "./utils/pr-publisher.js";
|
|
44
|
-
export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, runAllExternalTools, } from "./integrations/index.js";
|
|
44
|
+
export { allExternalTools, eslintIntegration, typescriptIntegration, stylelintIntegration, playwrightIntegration, runAllExternalTools, } from "./integrations/index.js";
|
|
45
45
|
export type { ExternalTool, ExternalToolResult } from "./integrations/index.js";
|
|
46
46
|
export { i18nRules } from "./scanners/i18n-scanner.js";
|
|
47
47
|
export { performanceRules } from "./scanners/performance-scanner.js";
|
|
@@ -53,6 +53,9 @@ export { componentRules } from "./scanners/component-scanner.js";
|
|
|
53
53
|
export { hooksRules } from "./scanners/hooks-scanner.js";
|
|
54
54
|
export { platformRules } from "./scanners/platform-scanner.js";
|
|
55
55
|
export { svelteRules } from "./scanners/svelte-scanner.js";
|
|
56
|
+
export { e2eRules } from "./scanners/e2e-scanner.js";
|
|
57
|
+
export { detectE2EGaps, formatE2EGapReport, formatE2EGapJson, } from "./utils/e2e-gap-detector.js";
|
|
58
|
+
export type { E2EGapResult, E2EGapOptions, UncoveredPage, UncoveredApi, TestSuggestion, } from "./utils/e2e-gap-detector.js";
|
|
56
59
|
export { IncrementalDiagnostic, createIncrementalDiagnostic } from "./ide/incremental-diagnostic.js";
|
|
57
60
|
export type { DiagnosticResult, IncrementalDiagnosticOptions } from "./ide/incremental-diagnostic.js";
|
|
58
61
|
export { runLSPServer } from "./ide/lsp-server.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.writeJobSummary = exports.isGitHubActions = exports.formatAllAnnotations = exports.formatIssuesAnnotations = exports.formatIssueAnnotation = exports.formatSarif = exports.generateSarif = exports.toBaselineIssue = exports.saveBaseline = exports.loadBaseline = exports.generateBaseline = exports.compareWithBaseline = exports.BaselineManager = exports.detectFixBotConfig = exports.runFixBot = exports.detectUploadConfig = exports.uploadReport = exports.formatHistoryCompareJson = exports.formatHistoryCompare = exports.compareHistoryReports = exports.generateAIFixSuggestions = exports.detectAIConfig = exports.AIFixSuggester = exports.formatWorkspaceJson = exports.formatWorkspaceReport = exports.scanWorkspace = exports.analyzeCrossPackageDeps = exports.detectMonorepo = exports.generateDashboard = exports.HistoryReport = exports.detectCIProvider = exports.generateCIConfig = exports.detectHusky = exports.hasGitHook = exports.uninstallGitHooks = exports.installGitHooks = exports.generateDefaultConfig = exports.initConfig = exports.loadConfig = exports.detectProjectMeta = exports.getAdaptiveConcurrency = exports.walkAST = exports.hasImport = exports.getImports = exports.parseAST = exports.createRegistry = exports.RuleRegistry = exports.SmartCache = exports.createEngine = exports.RuleEngine = void 0;
|
|
8
|
-
exports.
|
|
8
|
+
exports.DashboardServer = exports.getJSXTagName = exports.getFileExt = exports.registerComplianceMapping = exports.getComplianceMapping = exports.saveComplianceReport = exports.complianceReportToMarkdown = exports.generateComplianceReport = exports.loadBaselineAsync = exports.downloadBaseline = exports.buildNotificationPayload = exports.detectNotificationConfig = exports.sendNotifications = exports.matchOwner = exports.loadCodeowners = exports.parseCodeowners = exports.findCodeowners = exports.CodeownersParser = exports.runLSPServer = exports.createIncrementalDiagnostic = exports.IncrementalDiagnostic = exports.formatE2EGapJson = exports.formatE2EGapReport = exports.detectE2EGaps = exports.e2eRules = exports.svelteRules = exports.platformRules = exports.hooksRules = exports.componentRules = exports.crossFileRules = exports.namingRules = exports.securityRules = exports.a11yRules = exports.performanceRules = exports.i18nRules = exports.runAllExternalTools = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.allExternalTools = exports.autoPublishComment = exports.createPublisher = exports.detectPublisherConfig = exports.GitLabMRPublisher = exports.GitHubPRPublisher = exports.isGuardianComment = exports.COMMENT_MARKER = exports.generatePRCommentSummary = exports.generatePRComment = void 0;
|
|
9
|
+
exports.detectDashboardConfig = exports.uploadToDashboardServer = exports.generateDashboardHtml = void 0;
|
|
9
10
|
var rule_engine_js_1 = require("./engine/rule-engine.js");
|
|
10
11
|
Object.defineProperty(exports, "RuleEngine", { enumerable: true, get: function () { return rule_engine_js_1.RuleEngine; } });
|
|
11
12
|
Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return rule_engine_js_1.createEngine; } });
|
|
@@ -104,6 +105,7 @@ Object.defineProperty(exports, "allExternalTools", { enumerable: true, get: func
|
|
|
104
105
|
Object.defineProperty(exports, "eslintIntegration", { enumerable: true, get: function () { return index_js_1.eslintIntegration; } });
|
|
105
106
|
Object.defineProperty(exports, "typescriptIntegration", { enumerable: true, get: function () { return index_js_1.typescriptIntegration; } });
|
|
106
107
|
Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get: function () { return index_js_1.stylelintIntegration; } });
|
|
108
|
+
Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return index_js_1.playwrightIntegration; } });
|
|
107
109
|
Object.defineProperty(exports, "runAllExternalTools", { enumerable: true, get: function () { return index_js_1.runAllExternalTools; } });
|
|
108
110
|
var i18n_scanner_js_1 = require("./scanners/i18n-scanner.js");
|
|
109
111
|
Object.defineProperty(exports, "i18nRules", { enumerable: true, get: function () { return i18n_scanner_js_1.i18nRules; } });
|
|
@@ -125,6 +127,13 @@ var platform_scanner_js_1 = require("./scanners/platform-scanner.js");
|
|
|
125
127
|
Object.defineProperty(exports, "platformRules", { enumerable: true, get: function () { return platform_scanner_js_1.platformRules; } });
|
|
126
128
|
var svelte_scanner_js_1 = require("./scanners/svelte-scanner.js");
|
|
127
129
|
Object.defineProperty(exports, "svelteRules", { enumerable: true, get: function () { return svelte_scanner_js_1.svelteRules; } });
|
|
130
|
+
// v3.6.0: E2E 测试治理
|
|
131
|
+
var e2e_scanner_js_1 = require("./scanners/e2e-scanner.js");
|
|
132
|
+
Object.defineProperty(exports, "e2eRules", { enumerable: true, get: function () { return e2e_scanner_js_1.e2eRules; } });
|
|
133
|
+
var e2e_gap_detector_js_1 = require("./utils/e2e-gap-detector.js");
|
|
134
|
+
Object.defineProperty(exports, "detectE2EGaps", { enumerable: true, get: function () { return e2e_gap_detector_js_1.detectE2EGaps; } });
|
|
135
|
+
Object.defineProperty(exports, "formatE2EGapReport", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapReport; } });
|
|
136
|
+
Object.defineProperty(exports, "formatE2EGapJson", { enumerable: true, get: function () { return e2e_gap_detector_js_1.formatE2EGapJson; } });
|
|
128
137
|
// v3.3.0: IDE 集成
|
|
129
138
|
var incremental_diagnostic_js_1 = require("./ide/incremental-diagnostic.js");
|
|
130
139
|
Object.defineProperty(exports, "IncrementalDiagnostic", { enumerable: true, get: function () { return incremental_diagnostic_js_1.IncrementalDiagnostic; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ import { stylelintIntegration as _stylelintIntegration } from "./stylelint.js";
|
|
|
10
10
|
export { _eslintIntegration as eslintIntegration };
|
|
11
11
|
export { _typescriptIntegration as typescriptIntegration };
|
|
12
12
|
export { _stylelintIntegration as stylelintIntegration };
|
|
13
|
+
import { playwrightIntegration as _playwrightIntegration } from "./playwright.js";
|
|
14
|
+
export { _playwrightIntegration as playwrightIntegration };
|
|
13
15
|
/** 所有可用的外部工具列表 */
|
|
14
16
|
export declare const allExternalTools: import("./base.js").ExternalTool[];
|
|
15
17
|
export { detectFormatter, runFormat } from "./formatter.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;AACnD,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAC3D,OAAO,EAAE,qBAAqB,IAAI,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5F,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,oBAAoB,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;AACnD,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAC3D,OAAO,EAAE,qBAAqB,IAAI,oBAAoB,EAAE,CAAC;AAGzD,OAAO,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,CAAC;AAE3D,kBAAkB;AAClB,eAAO,MAAM,gBAAgB,oCAK5B,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Phase 4: 覆盖全面化 — 集成 ESLint / TypeScript / Stylelint
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.runFormat = exports.detectFormatter = exports.allExternalTools = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.hasPackage = exports.eslintSeverityToFg = exports.runCommand = exports.runAllExternalTools = void 0;
|
|
7
|
+
exports.runFormat = exports.detectFormatter = exports.allExternalTools = exports.playwrightIntegration = exports.stylelintIntegration = exports.typescriptIntegration = exports.eslintIntegration = exports.hasPackage = exports.eslintSeverityToFg = exports.runCommand = exports.runAllExternalTools = void 0;
|
|
8
8
|
var base_js_1 = require("./base.js");
|
|
9
9
|
Object.defineProperty(exports, "runAllExternalTools", { enumerable: true, get: function () { return base_js_1.runAllExternalTools; } });
|
|
10
10
|
Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return base_js_1.runCommand; } });
|
|
@@ -16,8 +16,16 @@ const typescript_js_1 = require("./typescript.js");
|
|
|
16
16
|
Object.defineProperty(exports, "typescriptIntegration", { enumerable: true, get: function () { return typescript_js_1.typescriptIntegration; } });
|
|
17
17
|
const stylelint_js_1 = require("./stylelint.js");
|
|
18
18
|
Object.defineProperty(exports, "stylelintIntegration", { enumerable: true, get: function () { return stylelint_js_1.stylelintIntegration; } });
|
|
19
|
+
// v3.6.1: Playwright E2E 测试集成
|
|
20
|
+
const playwright_js_1 = require("./playwright.js");
|
|
21
|
+
Object.defineProperty(exports, "playwrightIntegration", { enumerable: true, get: function () { return playwright_js_1.playwrightIntegration; } });
|
|
19
22
|
/** 所有可用的外部工具列表 */
|
|
20
|
-
exports.allExternalTools = [
|
|
23
|
+
exports.allExternalTools = [
|
|
24
|
+
eslint_js_1.eslintIntegration,
|
|
25
|
+
typescript_js_1.typescriptIntegration,
|
|
26
|
+
stylelint_js_1.stylelintIntegration,
|
|
27
|
+
playwright_js_1.playwrightIntegration,
|
|
28
|
+
];
|
|
21
29
|
// Phase 5+6: 格式化器集成
|
|
22
30
|
var formatter_js_1 = require("./formatter.js");
|
|
23
31
|
Object.defineProperty(exports, "detectFormatter", { enumerable: true, get: function () { return formatter_js_1.detectFormatter; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAA4F;AAAnF,8GAAA,mBAAmB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAExE,2CAAsE;AAIvC,kGAJD,6BAAkB,OAIA;AAHhD,mDAAkF;AAI/C,sGAJD,qCAAsB,OAIA;AAHxD,iDAA+E;AAI7C,qGAJD,mCAAqB,OAIA;AAEtD,kBAAkB;AACL,QAAA,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qCAA4F;AAAnF,8GAAA,mBAAmB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,qGAAA,UAAU,OAAA;AAExE,2CAAsE;AAIvC,kGAJD,6BAAkB,OAIA;AAHhD,mDAAkF;AAI/C,sGAJD,qCAAsB,OAIA;AAHxD,iDAA+E;AAI7C,qGAJD,mCAAqB,OAIA;AAEtD,8BAA8B;AAC9B,mDAAkF;AAC/C,sGADD,qCAAsB,OACA;AAExD,kBAAkB;AACL,QAAA,gBAAgB,GAAG;IAC5B,6BAAkB;IAClB,qCAAsB;IACtB,mCAAqB;IACrB,qCAAsB;CACzB,CAAC;AAEF,oBAAoB;AACpB,+CAA4D;AAAnD,+GAAA,eAAe,OAAA;AAAE,yGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright 外部工具集成(v3.6.1)
|
|
3
|
+
*
|
|
4
|
+
* 调用 `npx playwright test --reporter=json` 执行 E2E 测试,
|
|
5
|
+
* 解析 JSON 报告并将失败的测试用例转换为 frontend-guardian Issue 格式。
|
|
6
|
+
*
|
|
7
|
+
* 设计理念:skill 作为统一入口,用户无需记忆多个命令。
|
|
8
|
+
* `fg-core . --external` 自动触发 Playwright 测试并聚合结果。
|
|
9
|
+
*/
|
|
10
|
+
import type { ExternalTool } from "./base.js";
|
|
11
|
+
export declare const playwrightIntegration: ExternalTool;
|
|
12
|
+
//# sourceMappingURL=playwright.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/integrations/playwright.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAgG9C,eAAO,MAAM,qBAAqB,EAAE,YAkHnC,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Playwright 外部工具集成(v3.6.1)
|
|
4
|
+
*
|
|
5
|
+
* 调用 `npx playwright test --reporter=json` 执行 E2E 测试,
|
|
6
|
+
* 解析 JSON 报告并将失败的测试用例转换为 frontend-guardian Issue 格式。
|
|
7
|
+
*
|
|
8
|
+
* 设计理念:skill 作为统一入口,用户无需记忆多个命令。
|
|
9
|
+
* `fg-core . --external` 自动触发 Playwright 测试并聚合结果。
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.playwrightIntegration = void 0;
|
|
13
|
+
const base_js_1 = require("./base.js");
|
|
14
|
+
const node_fs_1 = require("node:fs");
|
|
15
|
+
const node_path_1 = require("node:path");
|
|
16
|
+
/** 检测项目是否配置了 Playwright */
|
|
17
|
+
function hasPlaywrightConfig(projectDir) {
|
|
18
|
+
const configNames = [
|
|
19
|
+
"playwright.config.ts",
|
|
20
|
+
"playwright.config.js",
|
|
21
|
+
"playwright.config.mjs",
|
|
22
|
+
"playwright.config.cjs",
|
|
23
|
+
];
|
|
24
|
+
for (const name of configNames) {
|
|
25
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.join)(projectDir, name))) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/** 从错误堆栈中提取文件路径和行号 */
|
|
32
|
+
function extractLocationFromStack(stack) {
|
|
33
|
+
if (!stack)
|
|
34
|
+
return {};
|
|
35
|
+
// 匹配堆栈中的文件路径和行号
|
|
36
|
+
// 例如:at /project/tests/login.spec.ts:15:23
|
|
37
|
+
const match = stack.match(/at\s+(?:.*\s+\()?(.+?):(\d+):(\d+)\)?/);
|
|
38
|
+
if (match) {
|
|
39
|
+
return {
|
|
40
|
+
file: match[1],
|
|
41
|
+
line: parseInt(match[2], 10),
|
|
42
|
+
column: parseInt(match[3], 10),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
exports.playwrightIntegration = {
|
|
48
|
+
name: "Playwright",
|
|
49
|
+
isAvailable(projectDir) {
|
|
50
|
+
// 优先检查配置文件,避免全局安装的 playwright 包导致误判
|
|
51
|
+
if (hasPlaywrightConfig(projectDir)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
// 检查 package.json 中是否有 @playwright/test 依赖
|
|
55
|
+
try {
|
|
56
|
+
const pkgPath = (0, node_path_1.join)(projectDir, "package.json");
|
|
57
|
+
if ((0, node_fs_1.existsSync)(pkgPath)) {
|
|
58
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf-8"));
|
|
59
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
60
|
+
if (deps["@playwright/test"] || deps["playwright"]) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// ignore
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
},
|
|
70
|
+
run(projectDir, _files) {
|
|
71
|
+
// 执行 Playwright 测试,输出 JSON 报告
|
|
72
|
+
// --reporter=json 输出到 stdout
|
|
73
|
+
// --quiet 减少噪音输出
|
|
74
|
+
const stdout = (0, base_js_1.runCommand)("npx playwright test --reporter=json --quiet", projectDir, 300000 // 5 分钟超时,E2E 测试可能较慢
|
|
75
|
+
);
|
|
76
|
+
if (!stdout) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
let report;
|
|
80
|
+
try {
|
|
81
|
+
report = JSON.parse(stdout);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// JSON 解析失败,可能是 Playwright 未安装或配置错误
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const issues = [];
|
|
88
|
+
// 解析 suites 中的失败测试
|
|
89
|
+
if (report.suites) {
|
|
90
|
+
for (const suite of report.suites) {
|
|
91
|
+
for (const spec of suite.specs) {
|
|
92
|
+
if (spec.ok)
|
|
93
|
+
continue; // 跳过通过的测试
|
|
94
|
+
for (const test of spec.tests) {
|
|
95
|
+
for (const result of test.results) {
|
|
96
|
+
if (result.status === "passed" || result.status === "skipped")
|
|
97
|
+
continue;
|
|
98
|
+
const errorMsg = result.error?.message || "测试失败";
|
|
99
|
+
const stack = result.error?.stack || "";
|
|
100
|
+
const location = result.error?.location || extractLocationFromStack(stack);
|
|
101
|
+
// 从错误堆栈中提取文件和行号
|
|
102
|
+
const loc = location || extractLocationFromStack(stack);
|
|
103
|
+
issues.push({
|
|
104
|
+
ruleId: "playwright-test-failed",
|
|
105
|
+
title: `${spec.title} (${test.projectName})`,
|
|
106
|
+
description: formatErrorDescription(errorMsg, stack, result.steps),
|
|
107
|
+
severity: "critical",
|
|
108
|
+
file: loc.file || suite.file,
|
|
109
|
+
line: loc.line || 1,
|
|
110
|
+
column: loc.column || 1,
|
|
111
|
+
source: errorMsg,
|
|
112
|
+
meta: {
|
|
113
|
+
tool: "playwright",
|
|
114
|
+
testTitle: spec.title,
|
|
115
|
+
suiteTitle: suite.title,
|
|
116
|
+
projectName: test.projectName,
|
|
117
|
+
status: result.status,
|
|
118
|
+
duration: result.duration,
|
|
119
|
+
retry: result.retry,
|
|
120
|
+
file: suite.file,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// 解析全局 errors(如 beforeAll/afterAll 钩子失败)
|
|
129
|
+
if (report.errors) {
|
|
130
|
+
for (const error of report.errors) {
|
|
131
|
+
const loc = error.location || extractLocationFromStack(error.stack);
|
|
132
|
+
issues.push({
|
|
133
|
+
ruleId: "playwright-setup-error",
|
|
134
|
+
title: "Playwright 全局错误",
|
|
135
|
+
description: error.message || "未知错误",
|
|
136
|
+
severity: "critical",
|
|
137
|
+
file: loc.file || "",
|
|
138
|
+
line: loc.line || 1,
|
|
139
|
+
column: loc.column || 1,
|
|
140
|
+
source: error.stack || error.message,
|
|
141
|
+
meta: {
|
|
142
|
+
tool: "playwright",
|
|
143
|
+
stack: error.stack,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return issues;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
/** 格式化错误描述,包含堆栈和步骤信息 */
|
|
152
|
+
function formatErrorDescription(message, stack, steps) {
|
|
153
|
+
const parts = [message];
|
|
154
|
+
if (steps && steps.length > 0) {
|
|
155
|
+
const failedStep = steps.find((s) => s.error);
|
|
156
|
+
if (failedStep) {
|
|
157
|
+
parts.push(`\n失败步骤: ${failedStep.title} (${failedStep.duration}ms)`);
|
|
158
|
+
if (failedStep.error?.message) {
|
|
159
|
+
parts.push(` 错误: ${failedStep.error.message}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 只保留堆栈的前 5 行,避免过长
|
|
164
|
+
if (stack) {
|
|
165
|
+
const stackLines = stack.split("\n").slice(0, 5);
|
|
166
|
+
parts.push(`\n堆栈:\n${stackLines.join("\n")}`);
|
|
167
|
+
}
|
|
168
|
+
return parts.join("");
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=playwright.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playwright.js","sourceRoot":"","sources":["../../src/integrations/playwright.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E 测试代码治理 Scanner(v3.6.0)
|
|
3
|
+
*
|
|
4
|
+
* 检测 Playwright / Cypress 测试代码中的反模式和质量问题:
|
|
5
|
+
* 1. 硬编码 CSS 选择器(推荐 data-testid)
|
|
6
|
+
* 2. 固定时长等待(page.waitForTimeout)
|
|
7
|
+
* 3. UI 操作后缺少接口断言(waitForResponse)
|
|
8
|
+
* 4. 测试用例缺少错误处理
|
|
9
|
+
* 5. 测试文件命名不规范
|
|
10
|
+
* 6. 选择器过度依赖类名(.class 而非 role/data-testid)
|
|
11
|
+
*
|
|
12
|
+
* 不依赖 Playwright 运行时,纯文本/AST 扫描。
|
|
13
|
+
*/
|
|
14
|
+
import type { Rule } from "../types.js";
|
|
15
|
+
export declare const e2eRules: Rule[];
|
|
16
|
+
//# sourceMappingURL=e2e-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-scanner.d.ts","sourceRoot":"","sources":["../../src/scanners/e2e-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAC;AAgB3D,eAAO,MAAM,QAAQ,EAAE,IAAI,EAoQ1B,CAAC"}
|