frontend-guardian-core 3.5.0 → 3.5.2

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.
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ /**
3
+ * Compliance Report Generator -- v3.5.0
4
+ *
5
+ * Generates SOC2 / ISO27001 style code quality compliance reports.
6
+ * Maps scan results to specific compliance controls, outputs audit-friendly Markdown.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.generateComplianceReport = generateComplianceReport;
10
+ exports.complianceReportToMarkdown = complianceReportToMarkdown;
11
+ exports.saveComplianceReport = saveComplianceReport;
12
+ exports.getComplianceMapping = getComplianceMapping;
13
+ exports.registerComplianceMapping = registerComplianceMapping;
14
+ /** Predefined rule-compliance mapping table */
15
+ const DEFAULT_MAPPINGS = [
16
+ {
17
+ ruleId: "security-xss-vulnerable",
18
+ controls: [
19
+ { code: "SOC2-CC7.1", name: "System Operations Monitoring", standard: "SOC2", description: "Detect and log code defects that may affect system security" },
20
+ { code: "ISO27001-A.12.4", name: "Logging and Monitoring", standard: "ISO27001", description: "Ensure system activities are logged and monitored" },
21
+ ],
22
+ impact: "high",
23
+ },
24
+ {
25
+ ruleId: "security-eval-usage",
26
+ controls: [
27
+ { code: "SOC2-CC7.1", name: "System Operations Monitoring", standard: "SOC2", description: "Prohibit dangerous code execution methods" },
28
+ { code: "ISO27001-A.12.6", name: "Technical Vulnerability Management", standard: "ISO27001", description: "Timely fix known technical vulnerabilities" },
29
+ ],
30
+ impact: "high",
31
+ },
32
+ {
33
+ ruleId: "security-hardcoded-secret",
34
+ controls: [
35
+ { code: "SOC2-CC6.1", name: "Logical and Physical Access Controls", standard: "SOC2", description: "Credentials must not be hardcoded in source code" },
36
+ { code: "ISO27001-A.9.4.3", name: "Password Management", standard: "ISO27001", description: "Passwords must not be stored or hardcoded in plaintext" },
37
+ ],
38
+ impact: "high",
39
+ },
40
+ {
41
+ ruleId: "a11y-missing-alt",
42
+ controls: [
43
+ { code: "WCAG-2.1-1.1.1", name: "Non-text Content", standard: "WCAG", description: "All non-text content must have text alternatives" },
44
+ { code: "ISO27001-A.18.1", name: "Compliance", standard: "ISO27001", description: "Comply with applicable laws, regulations, and contractual requirements" },
45
+ ],
46
+ impact: "medium",
47
+ },
48
+ {
49
+ ruleId: "a11y-missing-label",
50
+ controls: [
51
+ { code: "WCAG-2.1-3.3.2", name: "Labels or Instructions", standard: "WCAG", description: "UI components must have clear labels" },
52
+ ],
53
+ impact: "medium",
54
+ },
55
+ {
56
+ ruleId: "a11y-clickable-no-keyboard",
57
+ controls: [
58
+ { code: "WCAG-2.1-2.1.1", name: "Keyboard", standard: "WCAG", description: "All functionality must be operable through a keyboard" },
59
+ ],
60
+ impact: "medium",
61
+ },
62
+ {
63
+ ruleId: "perf-large-bundle",
64
+ controls: [
65
+ { code: "INTERNAL-SLA-1", name: "Performance SLA", standard: "INTERNAL", description: "First screen load time must meet internal SLA requirements" },
66
+ ],
67
+ impact: "medium",
68
+ },
69
+ {
70
+ ruleId: "perf-usememo-missing",
71
+ controls: [
72
+ { code: "INTERNAL-SLA-1", name: "Performance SLA", standard: "INTERNAL", description: "Avoid unnecessary re-renders" },
73
+ ],
74
+ impact: "low",
75
+ },
76
+ {
77
+ ruleId: "i18n-hardcoded-chinese",
78
+ controls: [
79
+ { code: "INTERNAL-I18N-1", name: "Internationalization Compliance", standard: "INTERNAL", description: "All product copy must go through the i18n system" },
80
+ ],
81
+ impact: "medium",
82
+ },
83
+ {
84
+ ruleId: "i18n-missing-key",
85
+ controls: [
86
+ { code: "INTERNAL-I18N-1", name: "Internationalization Compliance", standard: "INTERNAL", description: "i18n keys must be fully defined" },
87
+ ],
88
+ impact: "medium",
89
+ },
90
+ {
91
+ ruleId: "cross-file-circular-dep",
92
+ controls: [
93
+ { code: "INTERNAL-ARCH-1", name: "Architecture Compliance", standard: "INTERNAL", description: "Modules must not have circular dependencies" },
94
+ ],
95
+ impact: "medium",
96
+ },
97
+ ];
98
+ /** Generate compliance report */
99
+ function generateComplianceReport(results, projectName, strategy = "standard", mappings = DEFAULT_MAPPINGS) {
100
+ const timestamp = new Date().toISOString();
101
+ const allIssues = results.flatMap((r) => [...r.issues.critical, ...r.issues.warning, ...r.issues.suggestion]);
102
+ const findingsMap = new Map();
103
+ const severityOrder = { critical: 3, warning: 2, suggestion: 1 };
104
+ for (const issue of allIssues) {
105
+ const mapping = mappings.find((m) => m.ruleId === issue.ruleId);
106
+ if (!mapping)
107
+ continue;
108
+ for (const control of mapping.controls) {
109
+ const key = control.code;
110
+ const existing = findingsMap.get(key);
111
+ if (existing) {
112
+ existing.issues.push(issue);
113
+ if (severityOrder[issue.severity] > severityOrder[existing.severity]) {
114
+ existing.severity = issue.severity;
115
+ }
116
+ }
117
+ else {
118
+ findingsMap.set(key, {
119
+ control,
120
+ issues: [issue],
121
+ severity: issue.severity,
122
+ });
123
+ }
124
+ }
125
+ }
126
+ const findings = Array.from(findingsMap.values()).sort((a, b) => severityOrder[b.severity] - severityOrder[a.severity]);
127
+ const criticalIssues = allIssues.filter((i) => i.severity === "critical").length;
128
+ const highImpactControls = findings.filter((f) => f.severity === "critical").length;
129
+ const scoreBase = criticalIssues * 10
130
+ + allIssues.filter((i) => i.severity === "warning").length * 3
131
+ + allIssues.filter((i) => i.severity === "suggestion").length;
132
+ const complianceScore = Math.max(0, Math.round(100 - scoreBase / Math.max(allIssues.length, 1) * 5));
133
+ const recommendations = findings.map((f) => {
134
+ const priority = f.severity === "critical" ? "immediate" : f.severity === "warning" ? "short-term" : "long-term";
135
+ const ruleIds = [...new Set(f.issues.map((i) => i.ruleId))].join(", ");
136
+ return {
137
+ control: f.control,
138
+ priority,
139
+ action: `Fix ${f.issues.length} issues related to "${f.control.name}", rules: ${ruleIds}`,
140
+ estimatedEffort: f.issues.length <= 3 ? "1-2 days" : f.issues.length <= 10 ? "3-5 days" : "1-2 weeks",
141
+ };
142
+ });
143
+ return {
144
+ timestamp,
145
+ project: projectName,
146
+ strategy,
147
+ summary: {
148
+ totalIssues: allIssues.length,
149
+ criticalIssues,
150
+ highImpactControls,
151
+ complianceScore,
152
+ },
153
+ findings,
154
+ recommendations,
155
+ };
156
+ }
157
+ /** Convert compliance report to Markdown */
158
+ function complianceReportToMarkdown(report) {
159
+ const lines = [];
160
+ lines.push("# Code Quality Compliance Report");
161
+ lines.push("");
162
+ lines.push(`**Project**: ${report.project}`);
163
+ lines.push(`**Generated**: ${report.timestamp}`);
164
+ lines.push(`**Strategy**: ${report.strategy}`);
165
+ lines.push("");
166
+ // Executive summary
167
+ lines.push("## Executive Summary");
168
+ lines.push("");
169
+ lines.push("| Metric | Value |");
170
+ lines.push("|--------|-------|");
171
+ lines.push(`| Total Issues | ${report.summary.totalIssues} |`);
172
+ lines.push(`| Critical | ${report.summary.criticalIssues} |`);
173
+ lines.push(`| High Impact Controls | ${report.summary.highImpactControls} |`);
174
+ lines.push(`| Compliance Score | ${report.summary.complianceScore}/100 |`);
175
+ lines.push("");
176
+ if (report.summary.complianceScore >= 90) {
177
+ lines.push("> PASS - Excellent: Code quality meets enterprise compliance requirements.");
178
+ }
179
+ else if (report.summary.complianceScore >= 70) {
180
+ lines.push("> WARNING - Good: Some improvements recommended, address warning issues in the short term.");
181
+ }
182
+ else if (report.summary.complianceScore >= 50) {
183
+ lines.push("> NEEDS IMPROVEMENT - Multiple non-compliances found, remediation plan recommended.");
184
+ }
185
+ else {
186
+ lines.push("> FAIL - Serious compliance risks detected, immediate remediation required.");
187
+ }
188
+ lines.push("");
189
+ // Findings
190
+ if (report.findings.length > 0) {
191
+ lines.push("## Non-Compliance Findings");
192
+ lines.push("");
193
+ for (const finding of report.findings) {
194
+ const icon = finding.severity === "critical" ? "🔴" : finding.severity === "warning" ? "🟡" : "💡";
195
+ lines.push(`### ${icon} ${finding.control.code} -- ${finding.control.name}`);
196
+ lines.push("");
197
+ lines.push(`- **Standard**: ${finding.control.standard}`);
198
+ lines.push(`- **Description**: ${finding.control.description}`);
199
+ lines.push(`- **Severity**: ${finding.severity}`);
200
+ lines.push(`- **Issues**: ${finding.issues.length}`);
201
+ lines.push("");
202
+ const topIssues = finding.issues.slice(0, 5);
203
+ for (const issue of topIssues) {
204
+ lines.push(` - \`${issue.file}:${issue.line}\` -- ${issue.title}`);
205
+ }
206
+ if (finding.issues.length > 5) {
207
+ lines.push(` - ... ${finding.issues.length - 5} more`);
208
+ }
209
+ lines.push("");
210
+ }
211
+ }
212
+ else {
213
+ lines.push("## Non-Compliance Findings");
214
+ lines.push("");
215
+ lines.push("No compliance-related issues found.");
216
+ lines.push("");
217
+ }
218
+ // Recommendations
219
+ if (report.recommendations.length > 0) {
220
+ lines.push("## Remediation Recommendations");
221
+ lines.push("");
222
+ lines.push("| Priority | Control | Action | Est. Effort |");
223
+ lines.push("|----------|---------|--------|-------------|");
224
+ const priorityIcon = { immediate: "🔴", "short-term": "🟡", "long-term": "💡" };
225
+ for (const rec of report.recommendations) {
226
+ lines.push(`| ${priorityIcon[rec.priority]} ${rec.priority} | ${rec.control.code} | ${rec.action} | ${rec.estimatedEffort} |`);
227
+ }
228
+ lines.push("");
229
+ }
230
+ // Control mapping reference
231
+ lines.push("## Control Mapping Reference");
232
+ lines.push("");
233
+ lines.push("| Standard | Control | Name |");
234
+ lines.push("|----------|---------|------|");
235
+ const seenControls = new Set();
236
+ for (const finding of report.findings) {
237
+ if (!seenControls.has(finding.control.code)) {
238
+ seenControls.add(finding.control.code);
239
+ lines.push(`| ${finding.control.standard} | ${finding.control.code} | ${finding.control.name} |`);
240
+ }
241
+ }
242
+ lines.push("");
243
+ lines.push("---");
244
+ lines.push("*Generated by frontend-guardian*");
245
+ return lines.join("\n");
246
+ }
247
+ /** Save compliance report to file */
248
+ function saveComplianceReport(report, outputPath) {
249
+ const { writeFileSync } = require("node:fs");
250
+ writeFileSync(outputPath, complianceReportToMarkdown(report), "utf-8");
251
+ }
252
+ /** Get compliance mapping for a rule (for extensions) */
253
+ function getComplianceMapping(ruleId) {
254
+ return DEFAULT_MAPPINGS.find((m) => m.ruleId === ruleId);
255
+ }
256
+ /** Register custom compliance mapping */
257
+ function registerComplianceMapping(mapping) {
258
+ const existing = DEFAULT_MAPPINGS.findIndex((m) => m.ruleId === mapping.ruleId);
259
+ if (existing >= 0) {
260
+ DEFAULT_MAPPINGS[existing] = mapping;
261
+ }
262
+ else {
263
+ DEFAULT_MAPPINGS.push(mapping);
264
+ }
265
+ }
266
+ //# sourceMappingURL=compliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.js","sourceRoot":"","sources":["../../src/utils/compliance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Dashboard Client
3
+ *
4
+ * Uploads scan results to a governance dashboard server.
5
+ *
6
+ * v3.5.2: CLI-side reporter for the central dashboard.
7
+ */
8
+ import type { ScanResult, Issue } from "../types.js";
9
+ /** Dashboard upload configuration */
10
+ export interface DashboardClientConfig {
11
+ /** Dashboard server URL (e.g. http://localhost:3456) */
12
+ serverUrl: string;
13
+ /** Optional auth token */
14
+ authToken?: string;
15
+ }
16
+ /** Upload result */
17
+ export interface DashboardUploadResult {
18
+ success: boolean;
19
+ reportId?: string;
20
+ projectId?: string;
21
+ error?: string;
22
+ }
23
+ /** Report payload sent to the server */
24
+ export interface DashboardReportPayload {
25
+ projectName: string;
26
+ projectPath: string;
27
+ module: string;
28
+ result: ScanResult;
29
+ issues: Issue[];
30
+ git?: {
31
+ commit?: string;
32
+ branch?: string;
33
+ };
34
+ meta?: {
35
+ strategy?: string;
36
+ duration?: number;
37
+ filesScanned?: number;
38
+ };
39
+ }
40
+ /**
41
+ * Upload a scan report to the dashboard server.
42
+ *
43
+ * @param payload Report data
44
+ * @param config Server configuration
45
+ * @returns Upload result
46
+ */
47
+ export declare function uploadToDashboardServer(payload: DashboardReportPayload, config: DashboardClientConfig): Promise<DashboardUploadResult>;
48
+ /**
49
+ * Detect dashboard server config from environment variables.
50
+ *
51
+ * Environment variables:
52
+ * - FG_DASHBOARD_SERVER: server URL
53
+ * - FG_DASHBOARD_TOKEN: optional auth token
54
+ *
55
+ * @returns Config if FG_DASHBOARD_SERVER is set, null otherwise
56
+ */
57
+ export declare function detectDashboardConfig(): DashboardClientConfig | null;
58
+ //# sourceMappingURL=dashboard-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-client.d.ts","sourceRoot":"","sources":["../../src/utils/dashboard-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEpD,qCAAqC;AACrC,MAAM,WAAW,qBAAqB;IAClC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,oBAAoB;AACpB,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1E;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,qBAAqB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA2ChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,GAAG,IAAI,CAQpE"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * Dashboard Client
4
+ *
5
+ * Uploads scan results to a governance dashboard server.
6
+ *
7
+ * v3.5.2: CLI-side reporter for the central dashboard.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.uploadToDashboardServer = uploadToDashboardServer;
11
+ exports.detectDashboardConfig = detectDashboardConfig;
12
+ /**
13
+ * Upload a scan report to the dashboard server.
14
+ *
15
+ * @param payload Report data
16
+ * @param config Server configuration
17
+ * @returns Upload result
18
+ */
19
+ async function uploadToDashboardServer(payload, config) {
20
+ const url = config.serverUrl.replace(/\/$/, "") + "/api/reports";
21
+ const headers = {
22
+ "Content-Type": "application/json",
23
+ };
24
+ if (config.authToken) {
25
+ headers["Authorization"] = `Bearer ${config.authToken}`;
26
+ }
27
+ try {
28
+ const response = await fetch(url, {
29
+ method: "POST",
30
+ headers,
31
+ body: JSON.stringify(payload),
32
+ });
33
+ if (!response.ok) {
34
+ const text = await response.text().catch(() => "Unknown error");
35
+ return {
36
+ success: false,
37
+ error: `HTTP ${response.status}: ${text}`,
38
+ };
39
+ }
40
+ const data = (await response.json());
41
+ return {
42
+ success: data.success ?? true,
43
+ reportId: data.reportId,
44
+ projectId: data.projectId,
45
+ };
46
+ }
47
+ catch (err) {
48
+ return {
49
+ success: false,
50
+ error: String(err),
51
+ };
52
+ }
53
+ }
54
+ /**
55
+ * Detect dashboard server config from environment variables.
56
+ *
57
+ * Environment variables:
58
+ * - FG_DASHBOARD_SERVER: server URL
59
+ * - FG_DASHBOARD_TOKEN: optional auth token
60
+ *
61
+ * @returns Config if FG_DASHBOARD_SERVER is set, null otherwise
62
+ */
63
+ function detectDashboardConfig() {
64
+ const serverUrl = process.env.FG_DASHBOARD_SERVER;
65
+ if (!serverUrl)
66
+ return null;
67
+ return {
68
+ serverUrl,
69
+ authToken: process.env.FG_DASHBOARD_TOKEN,
70
+ };
71
+ }
72
+ //# sourceMappingURL=dashboard-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-client.js","sourceRoot":"","sources":["../../src/utils/dashboard-client.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAsCH,0DA8CC;AAWD,sDAQC;AAxED;;;;;;GAMG;AACI,KAAK,UAAU,uBAAuB,CACzC,OAA+B,EAC/B,MAA6B;IAE7B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC;IAEjE,MAAM,OAAO,GAA2B;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC;IACF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;YAChE,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE;aAC5C,CAAC;QACN,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAKlC,CAAC;QAEF,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACrB,CAAC;IACN,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAClD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,OAAO;QACH,SAAS;QACT,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;KAC5C,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frontend-guardian-core",
3
- "version": "3.5.0",
3
+ "version": "3.5.2",
4
4
  "description": "Core analysis engine for frontend-guardian — AST-based scanning and auto-fixing",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,7 +13,8 @@
13
13
  },
14
14
  "bin": {
15
15
  "fg-core": "bin/fg-core.js",
16
- "fg-lsp": "bin/fg-lsp.js"
16
+ "fg-lsp": "bin/fg-lsp.js",
17
+ "fg-server": "bin/fg-server.js"
17
18
  },
18
19
  "files": [
19
20
  "dist",